2016-02-06 23:14:21 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"image"
|
|
|
|
"image/draw"
|
|
|
|
"image/png"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2020-01-08 15:45:37 +01:00
|
|
|
"path"
|
2016-02-06 23:14:21 +01:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2020-01-08 15:45:37 +01:00
|
|
|
const (
|
|
|
|
level = 4
|
|
|
|
width = 550
|
|
|
|
delay = 8 // delay in hours, so that I can see daylight on my wallpaper during the day!
|
|
|
|
)
|
2016-02-06 23:14:21 +01:00
|
|
|
|
|
|
|
type latestData struct {
|
|
|
|
Date string `json:"date"`
|
|
|
|
File string `json:"file"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
// Define work directory and files
|
2020-01-08 15:45:37 +01:00
|
|
|
var (
|
|
|
|
home = os.Getenv("HOME")
|
|
|
|
workDir = path.Join(home, ".himawari")
|
|
|
|
imageFile = path.Join(workDir, "/latest.png")
|
|
|
|
dataFile = path.Join(workDir, "/data")
|
|
|
|
data []byte
|
|
|
|
err error
|
|
|
|
oldData = new(latestData)
|
|
|
|
initData = new(latestData)
|
|
|
|
t time.Time
|
|
|
|
location *time.Location
|
|
|
|
output *image.RGBA
|
|
|
|
out *os.File
|
|
|
|
)
|
|
|
|
|
|
|
|
// Read the last date from dataFile if it exists
|
|
|
|
data, err = ioutil.ReadFile(dataFile)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
|
|
|
data = nil
|
|
|
|
} else {
|
|
|
|
err = json.Unmarshal(data, oldData)
|
|
|
|
if err != nil {
|
|
|
|
oldData = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the data about the last image
|
2020-01-08 15:45:37 +01:00
|
|
|
err = getJSON("http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json", initData)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
log.Fatal("error getting json data from himawari server: ", err)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
|
|
|
|
2020-01-08 15:45:37 +01:00
|
|
|
location, err = time.LoadLocation("Asia/Tokyo")
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("error loading Asia/Tokyo time zone data: ", err)
|
|
|
|
}
|
|
|
|
t, _ = time.ParseInLocation("2006-01-02 15:04:05", initData.Date, location)
|
2016-02-06 23:14:21 +01:00
|
|
|
if oldData != nil && oldData.Date == initData.Date {
|
|
|
|
log.Print("No new image, keeping the old one")
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
t = t.Add(time.Duration(-delay) * time.Hour)
|
|
|
|
|
|
|
|
// Get all the chunks from the latest image and assemble them
|
2020-01-08 15:45:37 +01:00
|
|
|
output = image.NewRGBA(image.Rect(0, 0, level*width, level*width))
|
2016-02-06 23:14:21 +01:00
|
|
|
for x := 0; x < level; x++ {
|
|
|
|
for y := 0; y < level; y++ {
|
|
|
|
url := fmt.Sprintf("http://himawari8.nict.go.jp/img/D531106/%dd/%d/%s_%d_%d.png",
|
|
|
|
level, width, t.Format("2006/01/02/150405"), x, y)
|
|
|
|
|
|
|
|
var buff image.Image
|
2020-01-08 15:45:37 +01:00
|
|
|
err = getPNG(url, &buff)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
err = getPNG(url, &buff)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Error getting png :", url)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
draw.Draw(output, image.Rect(x*width, y*width, (x+1)*width, (y+1)*width), buff, image.Point{0, 0}, draw.Src)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write output to file
|
2020-01-08 15:45:37 +01:00
|
|
|
out, err = os.Create(imageFile)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
err := os.Mkdir(workDir, 0755)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
log.Fatal("error creating output directory:", err)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
2020-01-08 15:45:37 +01:00
|
|
|
out, err = os.Create(imageFile)
|
2016-02-06 23:14:21 +01:00
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
log.Fatal("error creating output file:", err)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
defer out.Close()
|
|
|
|
err = png.Encode(out, output)
|
|
|
|
if err != nil {
|
2020-01-08 15:45:37 +01:00
|
|
|
log.Fatal("Error writing output file:", err)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Write dat file
|
|
|
|
buff, err := json.Marshal(initData)
|
2020-01-08 15:45:37 +01:00
|
|
|
ioutil.WriteFile(dataFile, buff, 0644)
|
2016-02-06 23:14:21 +01:00
|
|
|
|
|
|
|
// Exec feh
|
2020-01-08 15:45:37 +01:00
|
|
|
cmd := exec.Command("feh", "--bg-max", imageFile)
|
2016-02-06 23:14:21 +01:00
|
|
|
err = cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Error launching feh :", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-08 15:45:37 +01:00
|
|
|
func getJSON(url string, target interface{}) (err error) {
|
|
|
|
var r *http.Response
|
|
|
|
r, err = http.Get(url)
|
|
|
|
if err == nil {
|
|
|
|
defer r.Body.Close()
|
|
|
|
err = json.NewDecoder(r.Body).Decode(target)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
2020-01-08 15:45:37 +01:00
|
|
|
return
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
|
|
|
|
2020-01-08 15:45:37 +01:00
|
|
|
func getPNG(url string, image *image.Image) (err error) {
|
|
|
|
var r *http.Response
|
|
|
|
r, err = http.Get(url)
|
|
|
|
if err == nil {
|
|
|
|
defer r.Body.Close()
|
|
|
|
*image, err = png.Decode(r.Body)
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|
2020-01-08 15:45:37 +01:00
|
|
|
return
|
2016-02-06 23:14:21 +01:00
|
|
|
}
|