Skip to content

Media Dashboard

A wall-display card that aggregates media content from four sources into a single glanceable view with poster art, external ratings, local theater showtimes, and a preference system.

Overview

The media dashboard shows what's worth watching right now across four categories:

  • In Theaters -- movies playing this week at the configured theaters, matched title-by-title against that day's showtime listings and ranked by quality and popularity; when showtime data is unavailable the row falls back to TMDb's now-playing list
  • Plex Movies -- recently added movies on the home Plex server, ranked by runtime and rating
  • Plex Shows -- recently added TV shows on the home Plex server, quality scored using a 50-minute episode runtime normalization instead of the 120-minute movie baseline
  • Coming Soon -- upcoming theatrical and streaming releases

Users can like or dismiss items. Liked items float to the top; dismissed items move to a collapsible "Hidden" section with a restore button. All preferences persist across restarts.

Cards

Compact Card

The compact card sits on the wall display alongside other dashboard cards. It shows 3 posters at a time with category tabs at the bottom. Arrows paginate by 3 posters. The card auto-rotates categories every 15 seconds when not being interacted with.

Detail Popup

Tapping the compact card opens the detail popup with all four categories as horizontally scrollable poster rows. Each row has scroll arrows for quick navigation. Tapping a poster loads its full detail panel with:

  • Ratings row with Kometa-style icons: TMDb, IMDb, Rotten Tomatoes critics (tomato), and RT audience (popcorn) -- fresh/rotten icon variants based on 60% threshold
  • MPAA certification, runtime, and genre names
  • Director, theatrical release date, and worldwide box office revenue
  • Movie tagline in italics
  • Synopsis
  • Like/unlike toggle and dismiss button
  • Collapsible 7-day showtime schedule grouped by day, with theater summaries

Dismissed items appear in a "Hidden (N)" toggle below each category's poster row. Expanding it shows dimmed posters with a restore button.

Data Sources

Source What it provides Refresh cadence
Tautulli Recently added Plex movies and shows, poster images via pms_image_proxy Every 2 hours
TMDb Now-playing and upcoming movies, popularity/vote metadata, poster CDN, director/certification/revenue via detail endpoint Every 12 hours
SerpApi Theater showtimes via Google search for configured local cinemas, one search per theater with the locale pinned to US English Once per calendar day
MDbList External ratings aggregator -- IMDb, Rotten Tomatoes (critics + audience), Metacritic; enriches items during each refresh On each refresh

Architecture

The system uses the standard AppDaemon relay script pattern for card-to-app communication:

Lovelace Cards (JS)
  │ callService("script", "media_dashboard_relay", { command, payload })
  ▼
Home Assistant (relay script fires event)
  │ media_dashboard_command event
  ▼
media_dashboard_app (AppDaemon)
  │ Orchestrates fetchers, publishes sensors
  ▼
sensor.media_dashboard_status  ──▶  Cards read attributes
sensor.media_dashboard_detail  ──▶  Detail panel reads on demand

Poster images are downloaded to /media/ and synced to /config/www/ via a shell command, so HA can serve them as /local/ URLs.

Ranking

All items are scored using a unified heuristic combining three factors:

Factor Weight Measures
Quality 45% TMDb score (0-10) or runtime as a proxy for Plex items (TV shows use 50min episode normalization; movies use 120min)
Recency 25% How recently released or added (newer = higher)
Prominence 30% TMDb popularity (log-scale), vote count, genre presence

Liked items are boosted to the top of their category after scoring.

Showtime freshness

Showtimes are fetched once per calendar day and cached on disk, so tapping a poster costs no API call. Freshness is judged by calendar day, not by an hour count:

Cache In Theaters row Detail panel
Fetched today Films with showtimes at the configured theaters Showtimes for today onward
Fetched yesterday Same, still showtime-backed Showtimes with a "fetched yesterday" note; past days dropped
Older or missing TMDb now-playing fallback "Showtimes not available (last fetched ...)"
  • App README: appdaemon/apps/media_dashboard_app/README.md
  • Card files: appdaemon/apps/media_dashboard_app/cards/
  • Providers: appdaemon/providers/media_providers/