aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: de2357c672c66353b143dc5faa38e27692375b93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main

import (
	"encoding/json"
	"fmt"
	"image"
	"image/draw"
	"image/png"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
	"time"
)

var level = 4
var width = 550
var delay = 8 // delay in hours, so that I can see daylight on my wallpaper during the day!

type latestData struct {
	Date string `json:"date"`
	File string `json:"file"`
}

func main() {
	// Define work directory and files
	var home = os.Getenv("HOME")
	var work_dir = home + "/.himawari"
	var image_file = work_dir + "/latest.png"
	var dat_file = work_dir + "/data"

	// Read the last date from dat_file if it exists
	data, err := ioutil.ReadFile(dat_file)
	oldData := new(latestData)
	if err != nil {
		data = nil
	} else {
		err = json.Unmarshal(data, oldData)
		if err != nil {
			oldData = nil
		}
	}

	// Get the data about the last image
	initData := new(latestData)
	err = getJson("http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json", initData)
	if err != nil {
		log.Fatal("error getting json :", err)
	}

	location, _ := time.LoadLocation("Asia/Tokyo")
	t, _ := time.ParseInLocation("2006-01-02 15:04:05", initData.Date, location)
	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
	output := image.NewRGBA(image.Rect(0, 0, level*width, level*width))
	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
			err = getPng(url, &buff)
			if err != nil {
				err = getPng(url, &buff)
				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
	out, err := os.Create(image_file)
	if err != nil {
		err := os.Mkdir(work_dir, 0755)
		if err != nil {
			log.Fatal("error creating :", err)
		}
		out, err = os.Create(image_file)
		if err != nil {
			log.Fatal("error creating :", err)
		}
	}
	defer out.Close()
	err = png.Encode(out, output)
	if err != nil {
		log.Fatal("Error writing output:", err)
	}

	// Write dat file
	buff, err := json.Marshal(initData)
	ioutil.WriteFile(dat_file, buff, 0644)

	// Exec feh
	cmd := exec.Command("feh", "--bg-max", image_file)
	err = cmd.Run()
	if err != nil {
		log.Fatal("Error launching feh :", err)
	}
}

func getJson(url string, target interface{}) error {
	r, err := http.Get(url)
	if err != nil {
		return err
	}
	defer r.Body.Close()

	return json.NewDecoder(r.Body).Decode(target)
}

func getPng(url string, image *image.Image) error {
	r, err := http.Get(url)
	if err != nil {
		return err
	}
	defer r.Body.Close()

	*image, err = png.Decode(r.Body)
	return err
}