/
main.go
140 lines (122 loc) · 2.62 KB
/
main.go
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
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"bytes"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"flag"
"log"
"os"
"time"
"github.com/soh335/ical"
"github.com/soh335/icalparser"
)
type progADay struct {
Date string `json:"date"`
Progs []prog `json:"progs"`
}
type prog struct {
TimeS string `json:"time_s"`
TimeSUnd int `json:"time_s_und"`
TimeE string `json:"time_e"`
TimeEUnd int `json:"time_e_und"`
Nodisp int `json:"nodisp"`
Media string `json:"media"`
Ttl string `json:"ttl"`
Form string `json:"form"`
Saiho string `json:"saiho"`
Shutsuen string `json:"shutsuen"`
Biko string `json:"biko"`
MatchID string `json:"matchID"`
}
const (
timeLayout = "2006-01-02 15:04:05"
)
var (
loc *time.Location
tzid = flag.String("tzid", "Asia/Tokyo", "tzid")
calname = flag.String("calname", "サッカー男子 リオ五輪アジア最終予選", "calname")
)
func main() {
flag.Parse()
if err := _main(); err != nil {
log.Fatal(err)
}
}
func _main() error {
{
var err error
loc, err = time.LoadLocation(*tzid)
if err != nil {
return err
}
}
var progDays []progADay
if err := json.NewDecoder(os.Stdin).Decode(&progDays); err != nil {
return err
}
components := []ical.VComponent{}
for _, progADay := range progDays {
for _, prog := range progADay.Progs {
if prog.Form != "live" {
continue
}
component, err := prog.event()
if err != nil {
return err
}
components = append(components, component)
}
}
cal := ical.NewBasicVCalendar()
cal.PRODID = *calname
cal.X_WR_CALNAME = *calname
cal.X_WR_CALDESC = *calname
cal.X_WR_TIMEZONE = loc.String()
cal.VComponent = components
var b bytes.Buffer
if err := cal.Encode(&b); err != nil {
return err
}
o, err := icalparser.NewParser(&b).Parse()
if err != nil {
return err
}
if _, err := icalparser.NewPrinter(o).WriteTo(os.Stdout); err != nil {
return err
}
return nil
}
func (p *prog) event() (*ical.VEvent, error) {
start, err := time.ParseInLocation(timeLayout, p.TimeS, loc)
if err != nil {
return nil, err
}
end, err := time.ParseInLocation(timeLayout, p.TimeE, loc)
if err != nil {
return nil, err
}
uid, err := p.uid()
if err != nil {
return nil, err
}
component := &ical.VEvent{
UID: uid,
DTSTAMP: start,
DTSTART: start,
DTEND: end,
SUMMARY: p.Ttl,
DESCRIPTION: p.Shutsuen,
TZID: loc.String(),
}
return component, nil
}
func (p *prog) uid() (string, error) {
var b bytes.Buffer
if err := json.NewEncoder(&b).Encode(p); err != nil {
return "", err
}
h := sha1.New()
h.Write(b.Bytes())
return hex.EncodeToString(h.Sum(nil)), nil
}