# `Laev.Calendar`
[🔗](https://github.com/alexdont/laev/blob/main/lib/laev/calendar.ex#L1)

Release calendar for the watchlist: when episodes of pinned shows/anime
air, and when pinned movies hit theaters / digital (digital = the moment
proper WEB releases replace cams).

Sources — one lookup per watchlist entry, disk-cached 6h:
  * anime  → AniList, searched with status RELEASING/NOT_YET_RELEASED so
    a franchise name resolves to its currently-airing season; the airing
    schedule lists upcoming episodes with exact timestamps.
  * tv     → TMDB's latest season episode list (announced future episodes
    carry air dates).
  * movies → TMDB release dates (earliest digital + theatrical).

Events are string-keyed maps (JSON round-trip): "date" (ISO), "label",
"kind" ("episode"|"digital"|"theatrical"), plus enough context to jump
into the watch flow ("type", "tmdb_id", "title", "season", "episode",
"anime", "search_title").

# `cached_events`

The next-7-days pulse, from the disk cache ONLY — never fetches, so the
home screen stays instant. Stale/missing entries are re-warmed in the
background for the next launch. Includes yesterday (things that just
dropped). Dated events only, sorted.

# `events`

All calendar events for the watchlist, window-filtered, date-sorted.

# `warm`

Pre-fetch one entry's schedule into the disk cache, detached — called
when a title is pinned, so opening the calendar later is all cache hits.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
