inital commit
This commit is contained in:
commit
85691d11b0
43
README.md
Normal file
43
README.md
Normal file
@ -0,0 +1,43 @@
|
||||
Get a wallpaper based on the time of day. You can get some wallpapers at [Dynamic wallpaper club](https://www.dynamicwallpaper.club/gallery).
|
||||
|
||||
# Usage
|
||||
|
||||
`sunset --file sunset.json` Get the current image to set as a walpaper.
|
||||
|
||||
`sunset --file sunset.json --next` Get the time when the next wallpaper should be set.
|
||||
|
||||
`sunset --file sunset.json --wait` How long to wait to set the next wallpaper.
|
||||
|
||||
If no `file` is provided then it defaults to `./sunset.json`.
|
||||
|
||||
# Sunset.json
|
||||
|
||||
The sunset file must be structured like this:
|
||||
```json
|
||||
{
|
||||
"files": [
|
||||
{
|
||||
"file":"Ghib-0.jpg",
|
||||
"time":"9:30"
|
||||
},
|
||||
{
|
||||
"file":"Ghib-1.jpg",
|
||||
"time":"19:30"
|
||||
},
|
||||
{
|
||||
"file":"Ghib-2.jpg",
|
||||
"time":"8:00"
|
||||
},
|
||||
{
|
||||
"file":"Ghib-3.jpg",
|
||||
"time":"18:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
# Convert heic file to jpeg
|
||||
|
||||
You need imagemagick.
|
||||
|
||||
`mogrify -format jpg Ghib.heic` or `identify Ghib.heic | wc -l` to count the images.
|
155
main.go
Normal file
155
main.go
Normal file
@ -0,0 +1,155 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type sunsetConfig struct {
|
||||
Files []sunsetImage `json:"files"`
|
||||
}
|
||||
|
||||
type sunsetImage struct {
|
||||
File string `json:"file"`
|
||||
Time string `json:"time"`
|
||||
}
|
||||
|
||||
func loadSunsetConfig(filepath string) sunsetConfig {
|
||||
data, err := ioutil.ReadFile(filepath)
|
||||
|
||||
var result sunsetConfig
|
||||
|
||||
err = json.Unmarshal(data, &result)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to load file: ", err.Error())
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func currentIndex(config sunsetConfig) int {
|
||||
currentTime := getCurrentTime()
|
||||
|
||||
var min int = 2401
|
||||
var minIndex int = -1
|
||||
|
||||
for i := 0; i < len(config.Files); i++ {
|
||||
element := getTimeSimple(config.Files[i].Time)
|
||||
|
||||
diff := currentTime - element
|
||||
|
||||
if diff < 0 {
|
||||
diff = 2400 - (diff * -1)
|
||||
}
|
||||
|
||||
if diff < min {
|
||||
min = diff
|
||||
minIndex = i
|
||||
}
|
||||
}
|
||||
|
||||
return minIndex
|
||||
}
|
||||
|
||||
func nextIndex(config sunsetConfig) int {
|
||||
currentTime := getCurrentTime()
|
||||
|
||||
var min int = 2401
|
||||
var minIndex int = -1
|
||||
|
||||
for i := 0; i < len(config.Files); i++ {
|
||||
element := getTimeSimple(config.Files[i].Time)
|
||||
|
||||
diff := element - currentTime
|
||||
|
||||
if diff < 0 {
|
||||
diff = 2400 - (diff * -1)
|
||||
}
|
||||
|
||||
if diff < min {
|
||||
min = diff
|
||||
minIndex = i
|
||||
}
|
||||
}
|
||||
|
||||
return minIndex
|
||||
}
|
||||
|
||||
func getCurrentTime() int {
|
||||
now := time.Now()
|
||||
|
||||
hr := now.Hour()
|
||||
min := now.Minute()
|
||||
|
||||
return hr*100 + min
|
||||
}
|
||||
|
||||
func getTimeSimple(timeString string) int {
|
||||
hr, min := getTime(timeString)
|
||||
|
||||
return hr*100 + min
|
||||
}
|
||||
|
||||
func getNextTime(config sunsetConfig) string {
|
||||
index := nextIndex(config)
|
||||
return config.Files[index].Time
|
||||
}
|
||||
|
||||
func getTime(timeString string) (int, int) {
|
||||
splits := strings.Split(timeString, ":")
|
||||
hr, _ := strconv.ParseInt(splits[0], 10, 32)
|
||||
min, _ := strconv.ParseInt(splits[1], 10, 32)
|
||||
// res, err := time.Parse("15:04", fmt.Sprintf("%02d:%02d", hr, min))
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
return int(hr), int(min)
|
||||
}
|
||||
|
||||
func getNextWait(config sunsetConfig) string {
|
||||
index := nextIndex(config)
|
||||
now := time.Now()
|
||||
nextHr, nextMin := getTime(config.Files[index].Time)
|
||||
|
||||
var diffHr int
|
||||
var diffMin int
|
||||
|
||||
// FIXME still not working
|
||||
if now.Hour() >= nextHr && now.Minute() >= nextMin {
|
||||
fmt.Print("u")
|
||||
diffHr = 24 - (now.Hour() - nextHr)
|
||||
diffMin = 60 - (now.Minute() - nextMin)
|
||||
} else {
|
||||
diffHr = nextHr - now.Hour()
|
||||
diffMin = nextMin - now.Minute()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%dh%dm", diffHr, diffMin)
|
||||
}
|
||||
|
||||
func main() {
|
||||
printNextTime := flag.Bool("next", false, "Print the time to the next change")
|
||||
printNextWait := flag.Bool("wait", false, "Print the time to wait for the next change")
|
||||
configFile := flag.String("file", "./sunset.json", "Specify the file to load")
|
||||
flag.Parse()
|
||||
|
||||
conf := loadSunsetConfig(*configFile)
|
||||
|
||||
if *printNextTime {
|
||||
fmt.Printf("%s", getNextTime(conf))
|
||||
} else if *printNextWait {
|
||||
fmt.Printf("%s", getNextWait(conf))
|
||||
} else {
|
||||
index := currentIndex(conf)
|
||||
absoluteImagePath := path.Join(path.Dir(*configFile), conf.Files[index].File)
|
||||
fmt.Printf("%s", absoluteImagePath)
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user