Compare commits
2 Commits
b8714becca
...
f89089b816
Author | SHA1 | Date |
---|---|---|
|
f89089b816 | |
|
0d189c5521 |
34
cmus.go
34
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)
|
||||
}
|
||||
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
electricboogaloo
BIN
electricboogaloo
Binary file not shown.
|
@ -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
|
||||
}
|
26
main.go
26
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
6
parse.go
6
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)
|
||||
|
|
Loading…
Reference in New Issue