#!/usr/bin/env -S julia -O0 --compile=min --color=yes --startup-file=no
using JSON3, HTTP, Dates, TimeZones, DataStructures, PrettyTables, Printf
schedule_url = "https://smtgvs.weathernews.jp/a/solive_timetable/timetable.json"
titles = Dict(
"ウェザーニュースLiVE・モーニング" => "Morning",
"ウェザーニュースLiVE・サンシャイン" => "Sunshine",
"ウェザーニュースLiVE・コーヒータイム" => "Coffee Time",
"ウェザーニュースLiVE・アフタヌーン" => "Afternoon",
"ウェザーニュースLiVE・イブニング" => "Evening",
"ウェザーニュースLiVE・ムーン " => "Moon",
"ウェザーニュースLiVE" => "",
)
function dl(url)
res = HTTP.get(url)
return JSON3.read(res.body)
end
function shortperiod(p)
abbrev = Dict{DataType,String}(
Day => "d",
Hour => "h",
Minute => "m",
Second => "s",
Millisecond => "ms"
)
return "$(p.value)$(abbrev[typeof(p)])"
end
function shortduration(d)
return d.periods .|> shortperiod |> p -> join(p, " ")
end
function fmt(v, _, j)
if j == 5
return canonicalize(v) |> shortduration
else
return v
end
end
function massage_fn(zone, leading_zero)
td = Date(now(tz"Asia/Tokyo"))
ymd = yearmonthday(td)
zn = ZonedDateTime(now(), localzone())
zero_adjustment = if leading_zero
0
else
1
end
return function massage(item)
if (item[:hour] == "00:00")
# The closed variable ymd may be mutated.
ymd = yearmonthday(td + Dates.Day(zero_adjustment))
zero_adjustment += 1
end
hms = (map(i -> replace(i, r"^0" => "") |> n -> parse(Int64, n), split(item[:hour], ":"))..., 0)
t = ZonedDateTime(ymd..., hms..., tz"Asia/Tokyo")
n = DataStructures.OrderedDict{Symbol,Any}()
n[:caster] = item[:caster]
n[:title] = titles[item[:title]]
n[:t] = t
n[:t2] = astimezone(t, zone)
n[:diff] = n[:t] - zn
return n
end
end
function main()
zone = localzone()
s = dl(schedule_url)
s2 = map(massage_fn(zone, s[1][:hour] == "00:00"), s)
pretty_table(s2,
header=["caster", "title", "Asia/Tokyo", zone.name, "diff"],
formatters=fmt)
localtime = now(localzone())
japantime = now(tz"Asia/Tokyo")
@printf "%27s %s\n" "Asia/Tokyo" japantime
@printf "%27s %s\n" zone.name localtime
end
if abspath(PROGRAM_FILE) == @__FILE__
main()
end