// YouTube read from a program: a search, videos with their lengths and counts, a channel and its
// uploads, durations, and what the day's quota has cost.
//
//   YOUTUBE_API_KEY=... quillo run youtube_data.qwe
//   then open /search, /videos, /channel, /durations, /ids and /failures
//
// YOUTUBE_API_URL reaches a test server. A search costs 100 of a day's 10000 units.

use "youtube_data.qwer"

route GET /search {
    let r = youtube_search("rust programming", { type: "video", order: "viewCount" }, 70)?
    let spent = youtube_quota_spent()
    { total: r.total, got: len(r.items), first: r.items[0], spent: spent, unbounded: youtube_search("x", {}, 0).error }
}

route GET /videos {
    let ids = map(range(0, 120), (i) => `vid${100000 + i}0`)
    let many = youtube_videos(ids)?
    let few = youtube_videos(["vid1000020", "nosuchvideo", "hiddenstats"])?
    { asked: len(ids), got: len(many), first: many[0], few: map(few, (v) => v.id), hidden: few[1].likes, live: few[1].clock }
}

route GET /channel {
    let by_handle = youtube_channel("@quillo")?
    let by_id = youtube_channel(by_handle.id)?
    let lists = youtube_playlists(by_id.id, 0)?
    let items = youtube_playlist_items(by_id.uploads, 0)?
    {
        channel: by_handle, same: by_id.title == by_handle.title, hidden: youtube_channel("UChidden")?.subscribers,
        none: youtube_channel("@nobody")?,
        lists: len(lists), items: len(items), last: items[len(items) - 1], capped: len(youtube_playlist_items(by_id.uploads, 60)?),
    }
}

route GET /durations = {
    full: youtube_duration("PT1H2M3S")?,
    minutes: youtube_duration("PT15M")?,
    days: youtube_duration("P1DT1S")?,
    weeks: youtube_duration("P1W2DT1H")?,
    live: youtube_duration("P0D")?,
    clocks: [youtube_clock(3723), youtube_clock(63), youtube_clock(5), youtube_clock(90000)],
    bad: youtube_duration("1H").error,
    half: youtube_duration("PT").error,
    tail: youtube_duration("PT5").error,
}

route GET /ids = {
    watch: youtube_video_id("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=42s")?,
    short: youtube_video_id("https://youtu.be/dQw4w9WgXcQ?si=abc")?,
    shorts: youtube_video_id("https://www.youtube.com/shorts/dQw4w9WgXcQ")?,
    embed: youtube_video_id("https://www.youtube.com/embed/dQw4w9WgXcQ")?,
    plain: youtube_video_id("dQw4w9WgXcQ")?,
    bad: youtube_video_id("https://example.com/").error,
}

route GET /failures = {
    quota: youtube_channel("UCquota").error,
    key: youtube_channel("UCkeyinvalid").error,
    waited: youtube_channel("UCbusy")?.title,
    missing: youtube_playlist_items("PLnosuch", 0).error,
}
