From 80a49ca59a38178234ca6a13a051345f768d5b6e Mon Sep 17 00:00:00 2001 From: andrzej Date: Tue, 29 Oct 2024 16:18:21 +0100 Subject: [PATCH] rudimentary slideshow functionality --- config.go | 3 ++- config.json | 3 ++- files.go | 16 ++++++++-------- image.go | 3 +++ main.go | 25 ++++++++++++------------- server.go | 18 +++++++----------- slideshow.go | 24 +++++++++++++++++++++++- 7 files changed, 57 insertions(+), 35 deletions(-) diff --git a/config.go b/config.go index 168e136..f57ce23 100644 --- a/config.go +++ b/config.go @@ -8,7 +8,8 @@ import ( type Config struct { ImageFilters - Root string + Root string + Duration int } func (config *Config) load() { diff --git a/config.json b/config.json index 35f3eaa..ff0cab5 100644 --- a/config.json +++ b/config.json @@ -3,5 +3,6 @@ "colorize":[ 247,40,60 ], "contrast":-35, "gamma":0.8, -"root":"/home/andrzej/bgs" +"root":"/home/andrzej/bgs", +"duration":10 } diff --git a/files.go b/files.go index da7a83a..33cfac4 100644 --- a/files.go +++ b/files.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "math/rand" "os" "regexp" @@ -12,25 +13,24 @@ func getRandomFile(dir string) (path string, filename string, error error) { return "", "", err } - // for _, file := range files { fmt.Println(file.Name(), file.IsDir()) - // } - var randomIndex int var randomImg os.DirEntry for { randomIndex = rand.Intn(len(files)) randomImg = files[randomIndex] //re-roll if you get a directory - if files[randomIndex].IsDir() == false { - break + if files[randomIndex].IsDir() { + fmt.Printf("%v is a directory\n", randomImg.Name()) + continue } //re-roll if not a recognised image type isImage, _ := regexp.Match(".jpg$|.jpeg$|.png$|.bmp$|.webp$", []byte(randomImg.Name())) - if isImage { - break + if !isImage { + fmt.Printf("%v is not a recognised image format\n", randomImg.Name()) + continue } + return dir + "/" + randomImg.Name(), randomImg.Name(), nil } - return dir + "/" + randomImg.Name(), randomImg.Name(), nil } func fileExistsInCache(filename string) (bool, error) { diff --git a/image.go b/image.go index cda0d95..e8c4644 100644 --- a/image.go +++ b/image.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "image" "log" "os" @@ -38,6 +39,7 @@ func pickRandomImage(dir string) (string, error) { curr := wd + "/images/" + filenameNoExt if !fileExists { img, err := loadImage(randomImg) + fmt.Printf("failed to load image %v", randomImg) if err != nil { return "", err } @@ -52,6 +54,7 @@ func pickRandomImage(dir string) (string, error) { func loadImage(filename string) (image.Image, error) { f, err := os.Open(filename) if err != nil { + return nil, err } defer f.Close() diff --git a/main.go b/main.go index 982646f..444c2d5 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "log" + // "log" "os" "sync" ) @@ -10,25 +10,24 @@ import ( var config Config func main() { - var err error config.load() fmt.Printf("%+v\n", config) - args := []string{""} - if len(os.Args) > 0 { - args = os.Args[1:] + //TODO: make this logic interface more neatly with the slideshow channel + var dir string + args := os.Args[1:] + if len(args) > 0 { + dir = args[0] + } else { + dir = "" } - curr, err := pickRandomImage(args[0]) - if err != nil { - log.Fatal("failed to pick image!", err) - } - - hyprpaperSet(curr) - var waitGroup sync.WaitGroup waitGroup.Add(1) - go server(&waitGroup) + slideshowDir := make(chan string) + go server(slideshowDir) + go slideshow(slideshowDir) + slideshowDir <- dir waitGroup.Wait() } diff --git a/server.go b/server.go index 290b60c..b740a24 100644 --- a/server.go +++ b/server.go @@ -6,11 +6,10 @@ import ( "os" "os/signal" "strings" - "sync" "syscall" ) -func server(waitGroup *sync.WaitGroup) { +func server(slideshowDir chan string) { sockfile := "/tmp/bg-go.sock" //Create a Unix domain socket and listen for incoming connections. @@ -18,6 +17,7 @@ func server(waitGroup *sync.WaitGroup) { if err != nil { panic(err) } + log.Println("listening on unix domain socket...") //cleanup sockfile //TODO: this only works when the program is killed from outside. Make it work via defer() too? @@ -51,17 +51,13 @@ func server(waitGroup *sync.WaitGroup) { } str := strings.TrimSpace(string(buf[:n])) - newbg, err := pickRandomImage(str) - if err != nil { - panic(err) - } - hyprpaperSet(newbg) - - // // Echo the data back to the connection - // _, err = conn.Write(buf[:n]) + slideshowDir <- str + // newbg, err := pickRandomImage(str) // if err != nil { - // log.Fatal(err) + // panic(err) // } + // hyprpaperSet(newbg) + }(conn) } diff --git a/slideshow.go b/slideshow.go index bce00f4..19a80b7 100644 --- a/slideshow.go +++ b/slideshow.go @@ -1,5 +1,27 @@ package main -func slideshow(dir string) { +import ( + "log" + "time" +) +func slideshow(ch <-chan string) { + dir := <-ch + ticker := time.NewTicker(time.Duration(config.Duration) * time.Minute) + go func() { + for { + img, err := pickRandomImage(dir) + if err != nil { + panic(err) + } + hyprpaperSet(img) + select { + case dir = <-ch: + log.Println("directory set!") + continue + case <-ticker.C: + continue + } + } + }() }