package main import ( "log" "time" "github.com/andreykaipov/goobs" "github.com/andreykaipov/goobs/api/requests/inputs" "github.com/andreykaipov/goobs/api/requests/sceneitems" "github.com/andreykaipov/goobs/api/typedefs" ) /* TODO: 1. Set password with a flag instead of text in the code 3. Change Panic(err) to code that doesn't crash the program if it fails 4. Document functions */ func main() { // change this password lol! sleepTime := 2.0 client, err := goobs.New("localhost:4455", goobs.WithPassword("lwihuN0OUVTMeCMM")) if err != nil { panic(err) } defer client.Disconnect() params := sceneitems.NewGetSceneItemListParams().WithSceneName("cmus") scil, err := client.SceneItems.GetSceneItemList(params) if err != nil { panic(err) } out, err := CmusRemoteOutput() if err != nil { panic(err) } path, err := getAttribute(out, "file ") if err != nil { panic(err) } var prevPath string for { out, err = CmusRemoteOutput() if err != nil { panic(err) } path, err = getAttribute(out, "file ") if err != nil { panic(err) } if path != prevPath { artist, err := getAttribute(out, "tag artist ", "tag albumartist ", "tag composer ") if err != nil { log.Printf("%v does not have an artist listed.", path) artist = "Unknown" } title, err := getAttribute(out, "tag title ") if err != nil { log.Printf("%v does not have an title listed.", path) title = "Unknown" } album, err := getAttribute(out, "tag album ") if err != nil { log.Printf("%v does not have an album listed.", path) album = "Single" } art, err := retrieveArt(path) artFile, err := writeArtFile(art) for i := range scil.SceneItems { if scil.SceneItems[i].SourceName == "Artist" { updateItem(client, scil.SceneItems[i], artist, "text") } if scil.SceneItems[i].SourceName == "Song" { updateItem(client, scil.SceneItems[i], title, "text") } if scil.SceneItems[i].SourceName == "Album" { updateItem(client, scil.SceneItems[i], album, "text") } if scil.SceneItems[i].SourceName == "Art" { updateItem(client, scil.SceneItems[i], artFile, "file") } } } time.Sleep(time.Duration(sleepTime) * time.Second) prevPath = path } } func updateItem(client *goobs.Client, sI *typedefs.SceneItem, value string, key string) { params := inputs.NewSetInputSettingsParams().WithInputName(sI.SourceName).WithInputUuid(sI.SourceUuid) params.InputSettings = make(map[string]any) params.InputSettings[key] = value _, err := client.Inputs.SetInputSettings(params) if err != nil { log.Fatal(err) } }