diff --git a/electricboogaloo b/electricboogaloo index a89db02..0337e0d 100755 Binary files a/electricboogaloo and b/electricboogaloo differ diff --git a/main.go b/main.go index d85d13b..1db4bc2 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "log" "time" @@ -13,9 +14,8 @@ import ( /* TODO: -1. Transition effect when swapping songs -2. Has/Get code in parse could probably be done with an interface instead? (is it worth it?) -3. Document functions +1. Scene transition is jumpy sometimes, probably doesn't like the 'cmus' scene changing while the scene item 'cmus' in 'streaming' is mid transition. (add a delay?) +1. Document functions */ var password string @@ -25,7 +25,6 @@ func init() { } func main() { - // change this password lol! sleepTime := 1.0 client, err := goobs.New("localhost:4455", goobs.WithPassword(password)) if err != nil { @@ -33,12 +32,17 @@ func main() { } defer client.Disconnect() cmusParams := sceneitems.NewGetSceneItemListParams().WithSceneName("cmus") - scil, err := client.SceneItems.GetSceneItemList(cmusParams) + streamParams := sceneitems.NewGetSceneItemListParams().WithSceneName("stream") + cmusSCIL, err := client.SceneItems.GetSceneItemList(cmusParams) if err != nil { // i should force create the scene if it does not exist. but this is solely for me. // failing in this way is probably smarter since it forces to arrange the scene how i want it. log.Fatalf("Expecting a scene named \"cmus\", but the scene was not found.\n%v", err.Error()) } + streamSCIL, err := client.SceneItems.GetSceneItemList(streamParams) + if err != nil { + log.Fatalf("Expecting a scene named \"stream\", but the scene was not found.\n%v", err.Error()) + } var prevPath string for { out, err := CmusRemoteOutput() @@ -50,6 +54,13 @@ func main() { log.Fatal(err.Error()) } if path != prevPath { + //stream scene + for _, sI := range streamSCIL.SceneItems { + if sI.SourceName == "cmus" { + enableItem(client, "stream", sI, false) + } + } + //cmus scene artist, err := getAttribute(out, "tag artist ", "tag albumartist ", "tag composer ") if err != nil { log.Printf("%v does not have an artist listed.", path) @@ -65,7 +76,6 @@ func main() { log.Printf("%v does not have an album listed.", path) album = "Single" } - art, err := retrieveArt(path) if err != nil { log.Fatal(err) @@ -80,21 +90,27 @@ func main() { log.Printf("Could not determine color, setting to default color.\n%v", err) color = 0xff424242 } - for i := range scil.SceneItems { - if scil.SceneItems[i].SourceName == "Artist" { - updateItem(client, scil.SceneItems[i], artist, "text") + for _, sI := range cmusSCIL.SceneItems { + if sI.SourceName == "Artist" { + updateItem(client, sI, artist, "text") } - if scil.SceneItems[i].SourceName == "Song" { - updateItem(client, scil.SceneItems[i], title, "text") + if sI.SourceName == "Song" { + updateItem(client, sI, title, "text") } - if scil.SceneItems[i].SourceName == "Album" { - updateItem(client, scil.SceneItems[i], album, "text") + if sI.SourceName == "Album" { + updateItem(client, sI, album, "text") } - if scil.SceneItems[i].SourceName == "Art" { - updateItem(client, scil.SceneItems[i], artFile, "file") + if sI.SourceName == "Art" { + updateItem(client, sI, artFile, "file") } - if scil.SceneItems[i].SourceName == "Color" { - updateItem(client, scil.SceneItems[i], color, "color") + if sI.SourceName == "Color" { + updateItem(client, sI, color, "color") + } + } + // stream scene + for _, sI := range streamSCIL.SceneItems { + if sI.SourceName == "cmus" { + enableItem(client, "stream", sI, true) } } } @@ -114,3 +130,21 @@ func updateItem(client *goobs.Client, sI *typedefs.SceneItem, value any, key str log.Fatal(err) } } + +func enableItem(client *goobs.Client, sceneName string, sI *typedefs.SceneItem, enabled bool) { + params := sceneitems.NewSetSceneItemEnabledParams().WithSceneName(sceneName).WithSceneUuid(sI.SourceUuid).WithSceneItemId(sI.SceneItemID).WithSceneItemEnabled(enabled) + _, err := client.SceneItems.SetSceneItemEnabled(params) + if err != nil { + log.Printf("could not set %v to %v.\n%v\n", sI.SourceName, enabled, err) + } +} + +func getItemSettings(client *goobs.Client, sI *typedefs.SceneItem) { + params := inputs.NewGetInputSettingsParams().WithInputName(sI.SourceName).WithInputUuid(sI.SourceUuid) + gis, err := client.Inputs.GetInputSettings(params) + if err != nil { + // this is a helper function, it should not be running usually. this is fine for debugging/development + log.Fatal(err) + } + fmt.Printf("%v\n", gis) +}