make platform agnostic
This commit is contained in:
parent
80a49ca59a
commit
3d8197d7ae
23
config.go
23
config.go
|
@ -2,24 +2,35 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/adhocore/jsonc"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
ImageFilters
|
ImageFilters
|
||||||
Root string
|
ImagesDir string
|
||||||
Duration int
|
Duration int
|
||||||
|
Cache string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) load() {
|
func (config *Config) load() {
|
||||||
configRaw, err := os.ReadFile("./config.json")
|
configRaw, err := os.ReadFile("./config.jsonc")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Couldn't open config file!", err)
|
log.Fatal("Couldn't open config file!\n", err)
|
||||||
}
|
}
|
||||||
|
j := jsonc.New()
|
||||||
|
configRaw = j.Strip(configRaw)
|
||||||
err = json.Unmarshal(configRaw, &config)
|
err = json.Unmarshal(configRaw, &config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Couldn't unmarshal config!", err)
|
log.Fatal("Couldn't unmarshal config!\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
homeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("could not get home directory!", err)
|
||||||
|
}
|
||||||
|
config.Cache = homeDir + "/" + config.Cache + "/"
|
||||||
|
//TODO: make directories if they don't
|
||||||
|
config.ImagesDir = homeDir + "/" + config.ImagesDir + "/"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
|
|
||||||
"colorize":[ 247,40,60 ],
|
|
||||||
"contrast":-35,
|
|
||||||
"gamma":0.8,
|
|
||||||
"root":"/home/andrzej/bgs",
|
|
||||||
"duration":10
|
|
||||||
}
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
//All directories are relevant to the home folder, and will be created if they do not exist
|
||||||
|
{
|
||||||
|
"colorize":[ 247,40,60 ],
|
||||||
|
"contrast":-35,
|
||||||
|
"gamma":0.8,
|
||||||
|
"imagesDir":"bgs",
|
||||||
|
"duration":10,
|
||||||
|
"cache":"slideshow" //this is where
|
||||||
|
}
|
3
files.go
3
files.go
|
@ -29,12 +29,13 @@ func getRandomFile(dir string) (path string, filename string, error error) {
|
||||||
fmt.Printf("%v is not a recognised image format\n", randomImg.Name())
|
fmt.Printf("%v is not a recognised image format\n", randomImg.Name())
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
//TODO: re-roll if you get the same image
|
||||||
return dir + "/" + randomImg.Name(), randomImg.Name(), nil
|
return dir + "/" + randomImg.Name(), randomImg.Name(), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func fileExistsInCache(filename string) (bool, error) {
|
func fileExistsInCache(filename string) (bool, error) {
|
||||||
files, err := os.ReadDir("images")
|
files, err := os.ReadDir(config.Cache)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
8
go.mod
8
go.mod
|
@ -4,5 +4,13 @@ go 1.23.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/disintegration/gift v1.2.1
|
github.com/disintegration/gift v1.2.1
|
||||||
|
github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740
|
||||||
golang.org/x/image v0.21.0
|
golang.org/x/image v0.21.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/adhocore/jsonc v0.10.0
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a // indirect
|
||||||
|
gopkg.in/ini.v1 v1.62.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
)
|
||||||
|
|
19
go.sum
19
go.sum
|
@ -1,4 +1,23 @@
|
||||||
|
github.com/adhocore/jsonc v0.10.0 h1:YjNX9TojBfxQJ4kuoiNqVR5SFqu1YBEMsm+HxWnxbOI=
|
||||||
|
github.com/adhocore/jsonc v0.10.0/go.mod h1:Ar4gd3i83+1Z+5M5SG6Vrfw9q3TO544OwLXH4+ZhWTE=
|
||||||
github.com/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc=
|
github.com/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc=
|
||||||
github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI=
|
github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740 h1:X6IDPPN+zrSClp0Q+JiERA//d8L0WcU5MqcGeulCW1A=
|
||||||
|
github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740/go.mod h1:WYwPVmM/8szeItLeWkwZSLRvQgrvsvstRzgznR8+E4Q=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
|
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
|
||||||
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
|
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
|
||||||
|
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
|
55
hyprpaper.go
55
hyprpaper.go
|
@ -1,55 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"log"
|
|
||||||
"os/exec"
|
|
||||||
)
|
|
||||||
|
|
||||||
func hyprpaperSet(path string) {
|
|
||||||
|
|
||||||
err := hyprpaperPreload(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("preload failed!", err)
|
|
||||||
}
|
|
||||||
err = hyprpaperWallpaper(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("set wallpaper failed!", err)
|
|
||||||
}
|
|
||||||
err = hyprpaperUnloadAll()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("unload all failed!", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func hyprpaperPreload(path string) error {
|
|
||||||
out, err := exec.Command("hyprctl", "hyprpaper", "preload", path).Output()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return checkHyprctlError(out)
|
|
||||||
}
|
|
||||||
|
|
||||||
func hyprpaperWallpaper(path string) error {
|
|
||||||
out, err := exec.Command("hyprctl", "hyprpaper", "wallpaper", ",contain:"+path).Output()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return checkHyprctlError(out)
|
|
||||||
}
|
|
||||||
|
|
||||||
func hyprpaperUnloadAll() error {
|
|
||||||
out, err := exec.Command("hyprctl", "hyprpaper", "unload", "unused").Output()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return checkHyprctlError(out)
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkHyprctlError(out []byte) error {
|
|
||||||
str := string(out)
|
|
||||||
if str != "ok\n" {
|
|
||||||
return errors.New(str)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
12
image.go
12
image.go
|
@ -23,11 +23,9 @@ type ImageFilters struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func pickRandomImage(dir string) (string, error) {
|
func pickRandomImage(dir string) (string, error) {
|
||||||
dir = config.Root + "/" + dir
|
|
||||||
wd, err := os.Getwd()
|
dir = config.ImagesDir + dir
|
||||||
if err != nil {
|
fmt.Printf("getting random file from %v\n", dir)
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
randomImg, filename, _ := getRandomFile(dir)
|
randomImg, filename, _ := getRandomFile(dir)
|
||||||
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
|
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
|
||||||
|
|
||||||
|
@ -36,11 +34,11 @@ func pickRandomImage(dir string) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
curr := wd + "/images/" + filenameNoExt
|
curr := config.Cache + filenameNoExt
|
||||||
if !fileExists {
|
if !fileExists {
|
||||||
img, err := loadImage(randomImg)
|
img, err := loadImage(randomImg)
|
||||||
fmt.Printf("failed to load image %v", randomImg)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Printf("failed to load image %v", randomImg)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
dst := processImage(img, config)
|
dst := processImage(img, config)
|
||||||
|
|
14
main.go
14
main.go
|
@ -14,7 +14,12 @@ func main() {
|
||||||
config.load()
|
config.load()
|
||||||
fmt.Printf("%+v\n", config)
|
fmt.Printf("%+v\n", config)
|
||||||
|
|
||||||
//TODO: make this logic interface more neatly with the slideshow channel
|
var waitGroup sync.WaitGroup
|
||||||
|
waitGroup.Add(1)
|
||||||
|
slideshowDir := make(chan string)
|
||||||
|
go server(slideshowDir)
|
||||||
|
go slideshow(slideshowDir)
|
||||||
|
|
||||||
var dir string
|
var dir string
|
||||||
args := os.Args[1:]
|
args := os.Args[1:]
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
|
@ -22,12 +27,7 @@ func main() {
|
||||||
} else {
|
} else {
|
||||||
dir = ""
|
dir = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
var waitGroup sync.WaitGroup
|
|
||||||
waitGroup.Add(1)
|
|
||||||
slideshowDir := make(chan string)
|
|
||||||
go server(slideshowDir)
|
|
||||||
go slideshow(slideshowDir)
|
|
||||||
slideshowDir <- dir
|
slideshowDir <- dir
|
||||||
|
|
||||||
waitGroup.Wait()
|
waitGroup.Wait()
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ func server(slideshowDir chan string) {
|
||||||
log.Println("listening on unix domain socket...")
|
log.Println("listening on unix domain socket...")
|
||||||
|
|
||||||
//cleanup sockfile
|
//cleanup sockfile
|
||||||
//TODO: this only works when the program is killed from outside. Make it work via defer() too?
|
|
||||||
c := make(chan os.Signal, 1)
|
c := make(chan os.Signal, 1)
|
||||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -28,6 +27,7 @@ func server(slideshowDir chan string) {
|
||||||
os.Remove(sockfile)
|
os.Remove(sockfile)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}()
|
}()
|
||||||
|
defer os.Remove(sockfile)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
//Accept incoming
|
//Accept incoming
|
||||||
|
@ -36,8 +36,6 @@ func server(slideshowDir chan string) {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//create store for incoming bytes
|
|
||||||
|
|
||||||
//handle connection in separate goroutine
|
//handle connection in separate goroutine
|
||||||
go func(conn net.Conn) {
|
go func(conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
11
slideshow.go
11
slideshow.go
|
@ -1,20 +1,27 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/reujab/wallpaper"
|
||||||
)
|
)
|
||||||
|
|
||||||
func slideshow(ch <-chan string) {
|
func slideshow(ch <-chan string) {
|
||||||
dir := <-ch
|
dir := <-ch
|
||||||
ticker := time.NewTicker(time.Duration(config.Duration) * time.Minute)
|
ticker := time.NewTicker(time.Duration(config.Duration) * time.Second)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
img, err := pickRandomImage(dir)
|
img, err := pickRandomImage(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
hyprpaperSet(img)
|
fmt.Printf("setting wallpaper: %v\n", img)
|
||||||
|
err = wallpaper.SetFromFile(img)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("failed to set wallpaper!", err)
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
case dir = <-ch:
|
case dir = <-ch:
|
||||||
log.Println("directory set!")
|
log.Println("directory set!")
|
||||||
|
|
Loading…
Reference in New Issue