switch directory via unix socket
This commit is contained in:
parent
8cc58b7084
commit
ab5b679896
2
files.go
2
files.go
|
@ -33,7 +33,7 @@ func getRandomFile(dir string) (path string, filename string, error error) {
|
||||||
return dir + "/" + randomImg.Name(), randomImg.Name(), nil
|
return dir + "/" + randomImg.Name(), randomImg.Name(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fileExists(filename string) (bool, error) {
|
func fileExistsInCache(filename string) (bool, error) {
|
||||||
files, err := os.ReadDir("images")
|
files, err := os.ReadDir("images")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
|
5
go.mod
5
go.mod
|
@ -2,4 +2,7 @@ module go-img
|
||||||
|
|
||||||
go 1.23.2
|
go 1.23.2
|
||||||
|
|
||||||
require github.com/disintegration/gift v1.2.1
|
require (
|
||||||
|
github.com/disintegration/gift v1.2.1
|
||||||
|
golang.org/x/image v0.21.0
|
||||||
|
)
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -1,2 +1,4 @@
|
||||||
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=
|
||||||
|
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=
|
||||||
|
|
19
hyprpaper.go
19
hyprpaper.go
|
@ -6,8 +6,23 @@ import (
|
||||||
"os/exec"
|
"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 {
|
func hyprpaperPreload(path string) error {
|
||||||
log.Println("path: ", path)
|
|
||||||
out, err := exec.Command("hyprctl", "hyprpaper", "preload", path).Output()
|
out, err := exec.Command("hyprctl", "hyprpaper", "preload", path).Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -16,7 +31,7 @@ func hyprpaperPreload(path string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func hyprpaperWallpaper(path string) error {
|
func hyprpaperWallpaper(path string) error {
|
||||||
out, err := exec.Command("hyprctl", "hyprpaper", "wallpaper", ","+path).Output()
|
out, err := exec.Command("hyprctl", "hyprpaper", "wallpaper", ",contain:"+path).Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
51
image.go
51
image.go
|
@ -4,11 +4,15 @@ import (
|
||||||
"image"
|
"image"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/disintegration/gift"
|
"github.com/disintegration/gift"
|
||||||
|
|
||||||
_ "image/jpeg"
|
_ "image/jpeg"
|
||||||
"image/png"
|
"image/png"
|
||||||
|
|
||||||
|
_ "golang.org/x/image/webp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ImageFilters struct {
|
type ImageFilters struct {
|
||||||
|
@ -17,31 +21,58 @@ type ImageFilters struct {
|
||||||
Gamma float64
|
Gamma float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadImage(filename string) image.Image {
|
func pickRandomImage(dir string) (string, error) {
|
||||||
f, err := os.Open(filename)
|
dir = config.Root + "/" + dir
|
||||||
log.Println("filename: ", filename)
|
wd, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("os.Open failed: %v", err)
|
return "", err
|
||||||
|
}
|
||||||
|
randomImg, filename, _ := getRandomFile(dir)
|
||||||
|
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
|
||||||
|
|
||||||
|
//check to see if rendered copy already exists
|
||||||
|
fileExists, err := fileExistsInCache(filenameNoExt)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
curr := wd + "/images/" + filenameNoExt
|
||||||
|
if !fileExists {
|
||||||
|
img, err := loadImage(randomImg)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
dst := processImage(img, config)
|
||||||
|
saveImage(curr, dst)
|
||||||
|
} else {
|
||||||
|
log.Println("file already exists in cache. skipping image processing")
|
||||||
|
}
|
||||||
|
return curr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadImage(filename string) (image.Image, error) {
|
||||||
|
f, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
img, _, err := image.Decode(f)
|
img, _, err := image.Decode(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("image.Decode failed: %v", err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return img
|
return img, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func saveImage(filename string, img image.Image) {
|
func saveImage(filename string, img image.Image) error {
|
||||||
log.Println("new filename: ", filename)
|
|
||||||
f, err := os.Create(filename)
|
f, err := os.Create(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("os.Create failed: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
err = png.Encode(f, img)
|
err = png.Encode(f, img)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("png.Encode failed: %v", err)
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func processImage(img image.Image, config Config) image.Image {
|
func processImage(img image.Image, config Config) image.Image {
|
||||||
|
|
48
main.go
48
main.go
|
@ -4,51 +4,31 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"sync"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var config Config
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
var config Config
|
|
||||||
config.load()
|
config.load()
|
||||||
fmt.Printf("%+v\n", config)
|
fmt.Printf("%+v\n", config)
|
||||||
|
|
||||||
//get working directory
|
args := []string{""}
|
||||||
wd, err := os.Getwd()
|
if len(os.Args) > 0 {
|
||||||
if err != nil {
|
args = os.Args[1:]
|
||||||
log.Fatal("couldn't find working directory", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := config.Root + "/chsck"
|
curr, err := pickRandomImage(args[0])
|
||||||
randomImg, filename, _ := getRandomFile(dir)
|
|
||||||
filenameNoExt := strings.TrimSuffix(filename, filepath.Ext(filename))
|
|
||||||
//check to see if rendered copy already exists
|
|
||||||
fileExists, err := fileExists(filenameNoExt)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("failure checking if file exists!", err)
|
log.Fatal("failed to pick image!", err)
|
||||||
}
|
|
||||||
curr := wd + "/images/" + filenameNoExt
|
|
||||||
log.Println("curr: ", curr)
|
|
||||||
if !fileExists {
|
|
||||||
img := loadImage(randomImg)
|
|
||||||
dst := processImage(img, config)
|
|
||||||
saveImage(curr, dst)
|
|
||||||
} else {
|
|
||||||
log.Println("file exists! skipping image processing")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = hyprpaperPreload(curr)
|
hyprpaperSet(curr)
|
||||||
if err != nil {
|
|
||||||
log.Fatal("preload failed!", err)
|
var waitGroup sync.WaitGroup
|
||||||
}
|
waitGroup.Add(1)
|
||||||
err = hyprpaperWallpaper(curr)
|
go server(&waitGroup)
|
||||||
if err != nil {
|
waitGroup.Wait()
|
||||||
log.Fatal("set wallpaper failed!", err)
|
|
||||||
}
|
|
||||||
err = hyprpaperUnloadAll()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("unload all failed!", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func server(waitGroup *sync.WaitGroup) {
|
||||||
|
|
||||||
|
sockfile := "/tmp/bg-go.sock"
|
||||||
|
//Create a Unix domain socket and listen for incoming connections.
|
||||||
|
socket, err := net.Listen("unix", sockfile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
//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)
|
||||||
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
|
go func() {
|
||||||
|
<-c
|
||||||
|
os.Remove(sockfile)
|
||||||
|
os.Exit(1)
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
//Accept incoming
|
||||||
|
conn, err := socket.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
//create store for incoming bytes
|
||||||
|
|
||||||
|
//handle connection in separate goroutine
|
||||||
|
go func(conn net.Conn) {
|
||||||
|
defer conn.Close()
|
||||||
|
//create buffer for incoming data
|
||||||
|
buf := make([]byte, 4096)
|
||||||
|
|
||||||
|
//read data from connection
|
||||||
|
n, err := conn.Read(buf)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
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])
|
||||||
|
// if err != nil {
|
||||||
|
// log.Fatal(err)
|
||||||
|
// }
|
||||||
|
}(conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
func slideshow(dir string) {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue