weathernews.jl

#!/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
Edit

Pub: 18 Jul 2023 02:55 UTC

Edit: 16 Nov 2024 23:35 UTC

Views: 19377