Compare commits

...

3 Commits

3 changed files with 54 additions and 27 deletions

Binary file not shown.

View File

@ -87,7 +87,8 @@ func processBGColor(path string) (float64, error) {
b &= b >> 8
//a &= a >> 8
// 25 becomes 0x19, 36 is close to 10% of 256
fmt.Printf("0x%02x %02x %02x %02x\n", 25, r, g, b)
//fmt.Printf("0x%02x %02x %02x %02x\n", 25, r, g, b)
// it wants it abgr for some reason
rgba := fmt.Sprintf("0x%02x%02x%02x%02x", 25, b, g, r)
rgbaInt, err := strconv.ParseInt(rgba, 0, 64)

82
main.go
View File

@ -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,20 +25,26 @@ func init() {
}
func main() {
// change this password lol!
sleepTime := 1.0
client, err := goobs.New("localhost:4455", goobs.WithPassword(password))
if err != nil {
log.Fatalf("Authentication failed, password %v absent or incorrect.", password)
}
defer client.Disconnect()
params := sceneitems.NewGetSceneItemListParams().WithSceneName("cmus")
scil, err := client.SceneItems.GetSceneItemList(params)
cmusParams := sceneitems.NewGetSceneItemListParams().WithSceneName("cmus")
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()
if err != nil {
log.Fatalf("%v\nCmus is likely not running.", err.Error())
@ -47,17 +53,14 @@ func main() {
if err != nil {
log.Fatal(err.Error())
}
var prevPath string
for {
out, err = CmusRemoteOutput()
if err != nil {
log.Fatalf("%v\nCmus is likely not running.", err.Error())
}
path, err = getAttribute(out, "file ")
if err != nil {
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)
@ -73,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)
@ -88,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)
}
}
}
@ -122,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)
}