diff --git a/cmus.go b/cmus.go index ca2c0cd..fbfb34b 100644 --- a/cmus.go +++ b/cmus.go @@ -1,9 +1,9 @@ package main import ( - "strings" - "os/exec" - "fmt" + "fmt" + "os/exec" + "strings" ) func CmusRemoteOutput() ([]string, error) { @@ -17,20 +17,22 @@ func CmusRemoteOutput() ([]string, error) { return resp, err } -func getAttribute(input []string, prefix string) (string, error) { +func getAttribute(input []string, prefix ...string) (string, error) { var attr string - for i := range input { - has := strings.HasPrefix(input[i], prefix) - if has { - attr = input[i] + // probably more efficent to simply parse first selected list of prefixes, but i'd prefer it be first prefix in the preferred order + for p := range prefix { + for i := range input { + has := strings.HasPrefix(input[i], prefix[p]) + if has { + attr = input[i] + attr, b := strings.CutPrefix(attr, prefix[p]) + if !b { + return "", fmt.Errorf("prefix \"%v\" in \"%v\" does not exist", prefix, attr) + } + + return attr, nil + } } } - - attr, b := strings.CutPrefix(attr, prefix) - if !b { - return "", fmt.Errorf("did not find prefix \"%v\"", prefix) - } - - return attr, nil + return "", fmt.Errorf("prefixes \"%v\" were not found", prefix) } - diff --git a/electricboogaloo b/electricboogaloo index c39286c..71b0f61 100755 Binary files a/electricboogaloo and b/electricboogaloo differ diff --git a/image.go b/image.go new file mode 100644 index 0000000..e36221e --- /dev/null +++ b/image.go @@ -0,0 +1,59 @@ +package main + +import ( + "bytes" + "image" + _ "image/gif" + "image/jpeg" + _ "image/png" + "os" + + "golang.org/x/image/draw" +) + +func retrieveArt(path string) ([]byte, error) { + + //streaming PC is primarily flacs, so flacs first, then mp3s, then check for covers in folder, finally just use a default image if none of the above exist. + switch { + case hasFlacTrackArt(path): + return getFlacArt(path) + case hasMp3TrackArt(path): + return getMP3Art(path) + case hasCoverArtFile(path): + return getCoverArtFile(path) + default: + return getDefaultArt() + } +} + +func writeArtFile(orig []byte) (string, error) { + imageSize := 700 + pathOut := "/run/user/1000/albumcover.jpg" + img := make([]byte, 0) + imgBuffIn, imgBuffOut := bytes.NewBuffer(orig), bytes.NewBuffer(img) + imgOrig, _, err := image.Decode(imgBuffIn) + if err != nil { + return "", err + } + + f, err := os.Create(pathOut) + if err != nil { + return "", err + } + defer f.Close() + + imgOut := image.NewRGBA(image.Rect(0, 0, imageSize, imageSize)) + + draw.ApproxBiLinear.Scale(imgOut, imgOut.Rect, imgOrig, imgOrig.Bounds(), draw.Over, nil) + + err = jpeg.Encode(imgBuffOut, imgOut, nil) + if err != nil { + return "", err + } + + _, err = f.Write(imgBuffOut.Bytes()) + if err != nil { + return "", err + } + return pathOut, nil +} diff --git a/main.go b/main.go index 254952b..e6f915a 100644 --- a/main.go +++ b/main.go @@ -27,7 +27,7 @@ func main() { panic(err) } - artist, err := getAttribute(out, "tag artist ") + artist, err := getAttribute(out, "tag artist ", "tag albumartist ", "tag composer ") if err != nil { panic(err) } @@ -39,30 +39,34 @@ func main() { if err != nil { panic(err) } - + path, err := getAttribute(out, "file ") + if err != nil { + panic(err) + } + art, err := retrieveArt(path) + artFile, err := writeArtFile(art) for i := range scil.SceneItems { if scil.SceneItems[i].SourceName == "Artist" { - updateTextItem(client, scil.SceneItems[i], artist) + updateItem(client, scil.SceneItems[i], artist, "text") } if scil.SceneItems[i].SourceName == "Song" { - updateTextItem(client, scil.SceneItems[i], title) + updateItem(client, scil.SceneItems[i], title, "text") } if scil.SceneItems[i].SourceName == "Album" { - updateTextItem(client, scil.SceneItems[i], album) + updateItem(client, scil.SceneItems[i], album, "text") + } + if scil.SceneItems[i].SourceName == "Art" { + updateItem(client, scil.SceneItems[i], artFile, "file") } } } - - -func updateTextItem(client *goobs.Client, sI *typedefs.SceneItem, text string) { +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["text"] = text + params.InputSettings[key] = value _, err := client.Inputs.SetInputSettings(params) if err != nil { log.Fatal(err) } } - - diff --git a/parse.go b/parse.go index 24ba014..d91f3f5 100644 --- a/parse.go +++ b/parse.go @@ -65,8 +65,8 @@ func hasMp3TrackArt(s string) bool { return false } -func hasCoverJpg(s string) bool { - exts := []string{".jpg", ".jpeg", ".png", ".gif"} // 'hasCoverJpg' is a misnomer, check all sane image types +func hasCoverArtFile(s string) bool { + exts := []string{".jpg", ".jpeg", ".png", ".gif"} // check all sane image types dir := filepath.Dir(s) file, err := os.Open(dir) if err != nil { @@ -117,7 +117,7 @@ func getMP3Art(s string) ([]byte, error) { return nil, fmt.Errorf("no image found") } -func getCoverJpg(s string) ([]byte, error) { +func getCoverArtFile(s string) ([]byte, error) { exts := []string{".jpg", ".jpeg", ".png", ".gif"} dir := filepath.Dir(s) file, err := os.Open(dir)