Files
streamctl/cmd/streamcli/commands/commands.go
2024-06-30 23:51:12 +01:00

135 lines
3.6 KiB
Go

package commands
import (
"context"
"encoding/json"
"fmt"
"os"
"github.com/facebookincubator/go-belt/tool/logger"
"github.com/spf13/cobra"
"github.com/xaionaro-go/streamctl/pkg/streamcontrol"
obs "github.com/xaionaro-go/streamctl/pkg/streamcontrol/obs/types"
twitch "github.com/xaionaro-go/streamctl/pkg/streamcontrol/twitch/types"
youtube "github.com/xaionaro-go/streamctl/pkg/streamcontrol/youtube/types"
"github.com/xaionaro-go/streamctl/pkg/streamd/client"
)
var (
// Access these variables only from a main package:
Root = &cobra.Command{
Use: os.Args[0],
PersistentPreRun: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
l := logger.FromCtx(ctx).WithLevel(LoggerLevel)
ctx = logger.CtxWithLogger(ctx, l)
cmd.SetContext(ctx)
logger.Debugf(ctx, "log-level: %v", LoggerLevel)
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
logger.Debug(ctx, "end")
},
}
StreamStart = &cobra.Command{
Use: "stream-start",
Args: cobra.ExactArgs(0),
Run: streamStart,
}
StreamStatus = &cobra.Command{
Use: "stream-status",
Args: cobra.ExactArgs(0),
Run: streamStatus,
}
LoggerLevel = logger.LevelWarning
)
func init() {
Root.AddCommand(StreamStart)
Root.AddCommand(StreamStatus)
Root.PersistentFlags().Var(&LoggerLevel, "log-level", "")
Root.PersistentFlags().String("remote-addr", "localhost:3594", "the path to the config file")
StreamStart.PersistentFlags().String("title", "", "stream title")
StreamStart.PersistentFlags().String("description", "", "stream description")
StreamStart.PersistentFlags().String("profile", "", "profile")
}
func assertNoError(ctx context.Context, err error) {
if err != nil {
logger.Panic(ctx, err)
}
}
func streamStart(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
remoteAddr, err := cmd.Flags().GetString("remote-addr")
assertNoError(ctx, err)
streamD := client.New(remoteAddr)
title, err := cmd.Flags().GetString("title")
assertNoError(ctx, err)
description, err := cmd.Flags().GetString("description")
assertNoError(ctx, err)
_profileName, err := cmd.Flags().GetString("profile")
assertNoError(ctx, err)
profileName := streamcontrol.ProfileName(_profileName)
logger.Debugf(
ctx,
"title == '%s'; description == '%s'; profile == '%s'",
title, description, profileName,
)
isEnabled := map[streamcontrol.PlatformName]bool{}
for _, platID := range []streamcontrol.PlatformName{
twitch.ID, youtube.ID,
} {
_isEnabled, err := streamD.IsBackendEnabled(ctx, platID)
assertNoError(ctx, err)
isEnabled[platID] = _isEnabled
}
cfg, err := streamD.GetConfig(ctx)
assertNoError(ctx, err)
if isEnabled[youtube.ID] {
err := streamD.StartStream(ctx, youtube.ID, title, description, cfg.Backends[youtube.ID].StreamProfiles[profileName])
assertNoError(ctx, err)
}
if isEnabled[twitch.ID] {
err := streamD.StartStream(ctx, twitch.ID, title, description, cfg.Backends[twitch.ID].StreamProfiles[profileName])
assertNoError(ctx, err)
}
}
func streamStatus(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
remoteAddr, err := cmd.Flags().GetString("remote-addr")
assertNoError(ctx, err)
streamD := client.New(remoteAddr)
for _, platID := range []streamcontrol.PlatformName{
obs.ID, twitch.ID, youtube.ID,
} {
isEnabled, err := streamD.IsBackendEnabled(ctx, platID)
assertNoError(ctx, err)
if !isEnabled {
continue
}
status, err := streamD.GetStreamStatus(ctx, platID)
assertNoError(ctx, err)
statusJSON, err := json.Marshal(status)
assertNoError(ctx, err)
fmt.Printf("%10s: %s\n", platID, statusJSON)
}
}