Highly recommended companion:
📺 What's On TV — EPG TV Guide — live TV guide in Home Assistant integration.
📺 What's On Series and Films Lovelace Card — Now & Soon Playing in Cinemas, Platforms Streaming new series, docs & movies guide, follow favorite series. Home Assistant Lovelace Card.
Use both together for complete entertainment coverage: live TV + streaming + cinema.
- Can't keep up with release dates? Add
"The Bear","Severance","Andor"or"Silo"— the Next Episode sensor tells you exactly how many days until the next episode airs - Following a long-running show? Track
"Grey's Anatomy","NCIS"or"Neighbours"— the Status sensor tells you if it's still running or has been cancelled - Into anime? Add
"Attack on Titan","Jujutsu Kaisen"or"One Piece"— get notified the moment a new episode is confirmed on Crunchyroll - Documentary fan? Search
"Planet Earth","Our Planet"or"100 Foot Wave"— TVmaze covers docs too, and the previous/next episode sensors work identically - Watching a show from another country? Add
"Dark"(Germany),"Money Heist"(Spain),"Squid Game"(Korea) — TVmaze is global, no region restriction - Not sure if a show is coming back? The Status sensor returns
Running,Ended,To Be DeterminedorIn Development— no more Googling "is X cancelled?" - Want a bedtime reminder? If your favourite show airs at 22:00 and you tend to forget, use the airtime attribute in an automation to push a reminder 15 minutes before
- New to Netflix this week? The
new_movies_on_netflixandnew_series_docs_on_netflixsensors update every 6 hours with fresh titles including ratings and overviews - HBO/Max watcher? Set up
[ES] New Series & Docs on Maxand get a weekly Telegram summary of everything that dropped - Subscribe to multiple platforms? Configure ES, PL, HR or any country separately — each entry tracks its own regional catalogue
- Kids content? Add Disney+ and filter by genre_id
16(Animation) or10762(Kids) in your automations - Cinephile on a budget? Add MUBI — it rotates a curated selection of art-house films weekly, and the sensor tells you exactly what arrived
- Don't want to miss a specific actor? Use the
overviewattribute in a template sensor to search for a name across all new releases
- Weekend plans? The
cinema_now_playingsensor shows all films currently in cinemas in your country, not specificaly in your region, with ratings and overviews - Planning ahead?
cinema_upcomingshows confirmed releases for the coming weeks — useful for buying tickets early - Living in a small country like Andorra? The integration automatically falls back to global release data when regional data isn't available, and marks items with
region_fallback: trueso your card can display a note - Automate your Friday routine: trigger an automation every Friday evening that sends you a formatted list of new cinema releases via Telegram — your personal weekly film bulletin
Tip — combine with What's On TV: if a film is premiering on a streaming platform and you also track the same channel in What's On TV, you can cross-reference the two integrations in a template to surface "airing tonight AND newly on Netflix" content.
The TMDB API key is free and takes about 2 minutes to get:
- Go to themoviedb.org
- Fill in username, email and password → verify your email
- Log in and go to Settings (click your avatar, top right) → API
- Click Create → choose Developer (personal use)
- Fill in the form:
- Type of use: Personal
- Application name: anything (e.g.
Home Assistant) - Application URL:
http://localhost(personal use, any URL works) - Application summary:
Personal Home Assistant integration
- Accept the terms → click Submit
- Your API Key (v3 auth) appears immediately on the API page — copy it
The key looks like:
a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4Paste it into the integration config flow when prompted.
- TVmaze — track unlimited TV series and documentaries worldwide (no API key needed)
- Next episode: title, season, number, airdate, airtime, days until air
- Previous episode: title, season, number, airdate
- Series status: Running / Ended / To Be Determined / In Development
- Network or streaming channel with schedule
- Show poster as a
cameraentity (fetched live from TVmaze CDN)
- TMDB Streaming — weekly new movies and series/docs per platform per country
- Platform logo URL included in every sensor (
logo_urlattribute) - Configurable per country — add ES, PL, HR as separate entries
- Platforms fetched live from TMDB for your country — always up to date
- Platform logo URL included in every sensor (
- TMDB Cinema — films currently in cinemas and upcoming releases
- Regional data when available; automatic global fallback for small markets
region_fallbackflag for Lovelace cards to display a disclaimer
- Multi-country — add as many entries as you need, one per country
- Language-aware — titles and overviews returned in the configured language (pl-PL, hr-HR, es-ES…)
- Diagnostics — download a full JSON report from the HA UI (API key redacted)
- Open HACS → Integrations → ⋮ → Custom repositories
- Add
https://github.com/janfajessen/What-s-On-Series-Films---Stream-Cinema-Guide---Home-Assistant— category Integration - Search for What's On Series & Films and install
- Restart Home Assistant
Copy the custom_components/whatson_series_films/ folder to your config/custom_components/ directory and restart.
Go to Settings → Devices & Services → Add Integration → What's On Series & Films.
Step 1 — TMDB: enter your free TMDB API key, your country code (e.g. ES, PL, HR, AD) and optionally a language override (auto-detected from country if left blank).
Step 2 — Platforms: the integration fetches all streaming platforms available in your country live from TMDB and shows them as a list. Select the ones you subscribe to.
Step 3 — Series & Docs: type a name to search TVmaze. Pick from the results. Toggle "Add another" to keep adding. Leave blank to skip.
You can add multiple entries for different countries simultaneously.
| Entity | State | Key attributes |
|---|---|---|
sensor.whatson_series_films_<show>_next_episode |
Episode title | season, episode_number, airdate, airtime, days_until_air, summary |
sensor.whatson_series_films_<show>_previous_episode |
Episode title | season, episode_number, airdate, summary |
sensor.whatson_series_films_<show>_status |
Running / Ended / … | premiered, ended, genres, rating, language |
sensor.whatson_series_films_<show>_network |
Network name | web_channel, schedule_days, schedule_time |
camera.whatson_series_films_<show>_poster |
— | Live poster image from TVmaze CDN |
| Entity | State | Key attributes |
|---|---|---|
sensor.whatson_series_films_<cc>_new_movies_on_<platform> |
Count | movies list, logo_url |
sensor.whatson_series_films_<cc>_new_series_docs_on_<platform> |
Count | shows list, logo_url |
| Entity | State | Key attributes |
|---|---|---|
sensor.whatson_series_films_<cc>_cinema_now_playing |
Count | movies list, region_fallback |
sensor.whatson_series_films_<cc>_cinema_upcoming |
Count | movies list, region_fallback |
Each item in any movies / shows list contains:
title · release_date · vote_average · poster_url · overview · genre_ids · tmdb_id
Examples (<cc> = country code, <platform> = slugified platform name):
sensor.whatson_series_films_breaking_bad_next_episode
sensor.whatson_series_films_es_new_movies_on_netflix
sensor.whatson_series_films_es_cinema_now_playing
sensor.whatson_series_films_pl_new_movies_on_player_pl
sensor.whatson_series_films_pl_cinema_upcoming
sensor.whatson_series_films_hr_new_series_docs_on_hbo_max
camera.whatson_series_films_the_bear_poster
alias: "WS&F — Weekly streaming digest"
trigger:
- platform: time
at: "19:00:00"
variables:
weekday: "{{ now().weekday() }}"
condition:
- condition: template
value_template: "{{ now().weekday() == 4 }}" # Friday
action:
- action: notify.telegram_jan
data:
message: >
🎬 *New this week on Netflix ES*
{% set movies = state_attr('sensor.whatson_series_films_es_new_movies_on_netflix', 'movies') %}
{% if movies %}
{% for m in movies[:5] %}
• {{ m.title }} ({{ m.release_date[:4] }}) ⭐ {{ m.vote_average }}
{% endfor %}
{% else %}
No new movies found.
{% endif %}
📺 *New series & docs*
{% set shows = state_attr('sensor.whatson_series_films_es_new_series_docs_on_netflix', 'shows') %}
{% if shows %}
{% for s in shows[:5] %}
• {{ s.title }} ⭐ {{ s.vote_average }}
{% endfor %}
{% else %}
No new titles found.
{% endif %}alias: "WS&F — Remind me the day before The Bear airs"
trigger:
- platform: template
value_template: >
{{ state_attr('sensor.whatson_series_films_the_bear_next_episode', 'days_until_air') == 1 }}
action:
- action: notify.telegram_jan
data:
message: >
📺 Tomorrow: *The Bear*
S{{ state_attr('sensor.whatson_series_films_the_bear_next_episode', 'season') }}
E{{ state_attr('sensor.whatson_series_films_the_bear_next_episode', 'episode_number') }}
— {{ states('sensor.whatson_series_films_the_bear_next_episode') }}
🕐 {{ state_attr('sensor.whatson_series_films_the_bear_next_episode', 'airtime') }}
📡 {{ states('sensor.whatson_series_films_the_bear_network') }}alias: "WS&F — Weekend cinema bulletin"
trigger:
- platform: time
at: "10:00:00"
condition:
- condition: template
value_template: "{{ now().weekday() == 4 }}" # Friday
action:
- action: notify.telegram_jan
data:
message: >
🍿 *In cinemas this weekend*
{% set films = state_attr('sensor.whatson_series_films_es_cinema_now_playing', 'movies') %}
{% if films %}
{% for f in films | sort(attribute='vote_average', reverse=True) | list[:8] %}
{{ loop.index }}. {{ f.title }} ⭐ {{ f.vote_average }}
{% endfor %}
{% else %}
No regional data available.
{% endif %}
🎬 *Coming soon*
{% set upcoming = state_attr('sensor.whatson_series_films_es_cinema_upcoming', 'movies') %}
{% if upcoming %}
{% for f in upcoming[:5] %}
• {{ f.title }} — {{ f.release_date }}
{% endfor %}
{% else %}
No upcoming data.
{% endif %}alias: "WS&F — Alert when show status changes to Running"
trigger:
- platform: state
entity_id: sensor.whatson_series_films_house_of_the_dragon_status
to: "Running"
action:
- action: notify.telegram_jan
data:
message: >
🎉 *{{ state_attr('sensor.whatson_series_films_house_of_the_dragon_status', 'tvmaze_url') | regex_findall('shows/\d+/([^/]+)') | first | replace('-', ' ') | title }}*
is back! Status changed to Running.
Next episode: {{ states('sensor.whatson_series_films_house_of_the_dragon_next_episode') }}alias: "WS&F — Top rated new on streaming this week"
sequence:
- action: notify.telegram_jan
data:
message: >
⭐ *New this week with rating ≥ 7.5*
{% set platforms = [
'sensor.whatson_series_films_es_new_movies_on_netflix',
'sensor.whatson_series_films_es_new_movies_on_disney',
'sensor.whatson_series_films_es_new_movies_on_max_hbo'
] %}
{% set min_rating = 7.5 %}
{% set results = namespace(items=[]) %}
{% for p in platforms %}
{% set movies = state_attr(p, 'movies') %}
{% if movies %}
{% for m in movies %}
{% if m.vote_average >= min_rating %}
{% set results.items = results.items + [m.title ~ ' ⭐' ~ m.vote_average] %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
{% if results.items %}
{% for item in results.items | unique | sort %}
• {{ item }}
{% endfor %}
{% else %}
Nothing above {{ min_rating }} this week.
{% endif %}alias: "WS&F — Update LED matrix with next episode countdown"
trigger:
- platform: state
entity_id: sensor.whatson_series_films_the_bear_next_episode
action:
- variables:
days: "{{ state_attr('sensor.whatson_series_films_the_bear_next_episode', 'days_until_air') }}"
episode: "{{ states('sensor.whatson_series_films_the_bear_next_episode') }}"
- action: rest_command.wled_text
data:
text: >
{% if days == 0 %}TODAY: {{ episode }}
{% elif days == 1 %}TOMORROW: {{ episode }}
{% else %}{{ days }}d: {{ episode }}
{% endif %}Click the gear icon on the integration card at any time to:
- Add a new series or documentary (TVmaze search)
- Remove an existing series
- Change streaming platforms (re-fetches live list from TMDB)
- Update TMDB key, country or language
The integration reloads automatically after every change.
Settings → Devices & Services → What's On Series & Films → ⋮ → Download diagnostics
Downloads a JSON with coordinator status, entity counts, cinema fallback flags and logo fetch results. TMDB API key is automatically redacted.
All streaming sensor attributes include a logo_url with the official platform logo from TMDB CDN (https://image.tmdb.org/t/p/original/...). Use directly in Lovelace cards.
| Source | Interval |
|---|---|
| TVmaze (show data) | Every 1 hour |
| TMDB (streaming + cinema + logos) | Every 24 hours |
TMDB streaming queries cover the last 14 days so content added mid-week is never missed between restarts.
The integration automatically maps your country code to the correct TMDB language — titles and overviews will be returned in the local language. You can override this in step 1 of the config flow.
| Region | Example countries | Language |
|---|---|---|
| Spain / LATAM | ES, MX, AR, CO, CL | es-ES / es-MX / … |
| Poland | PL | pl-PL |
| Croatia | HR | hr-HR |
| Russia | RU | ru-RU |
| Andorra | AD | ca-AD (Catalan) |
| France | FR | fr-FR |
| Germany | DE | de-DE |
| Italy | IT | it-IT |
| Japan | JP | ja-JP |
| Korea | KR | ko-KR |
| … | 49 countries mapped | … |
- Home Assistant 2026.x
- Python 3.12+
- Free TMDB API key: themoviedb.org/settings/api (optional — TVmaze features work without it)
| Integration | What it adds |
|---|---|
| 📺 What's On TV — EPG TV Guide | Live TV guide — current and upcoming programmes on broadcast channels. Combine with this integration for complete entertainment coverage. |
type: custom:whatson-series-films-cardtype: custom:whatson-series-films-card
title: "What's On"
theme: dark # dark | light
accent: "#e8872a" # any hex colortype: custom:whatson-series-films-card
entities:
- sensor.whatson_series_films_es_cinema_now_playing
- sensor.whatson_series_films_es_new_movies_on_netflix_standard_with_ads
- sensor.whatson_series_films_lupin_status| Option | Type | Default | Description |
|---|---|---|---|
title |
string | (auto from HA language) | Card title |
theme |
dark|light |
dark |
Color theme |
accent |
string | #e8872a |
Accent color (HEX or R,G,B) |
entities |
list | (auto-discover) | Specific sensors to display |
alias: "What's On — New cinema release"
trigger:
- platform: template
value_template: >
{{ state_attr('sensor.whatson_series_films_es_cinema_now_playing', 'movies')
| selectattr('release_date', 'ge', now().strftime('%Y-%m-%d'))
| list | count > 0 }}
action:
- service: notify.telegram_jan
data:
message: >
🎬 New in theaters today:
{% for m in state_attr('sensor.whatson_series_films_es_cinema_now_playing', 'movies')
if m.release_date == now().strftime('%Y-%m-%d') %}
• {{ m.title }} {% if m.vote_average > 0 %}(⭐{{ m.vote_average }}){% endif %}
{% endfor %}alias: "What's On — New episode available"
trigger:
- platform: state
entity_id: sensor.whatson_series_films_lupin_next_episode
from: "No upcoming episode"
action:
- service: notify.telegram_jan
data:
message: >
📺 New episode of **Lupin**!
{{ states('sensor.whatson_series_films_lupin_next_episode') }}alias: "What's On — Weekly highlights"
trigger:
- platform: time
at: "09:00:00"
- platform: template
value_template: "{{ now().weekday() == 4 }}" # Friday
action:
- variables:
movies: "{{ state_attr('sensor.whatson_series_films_es_new_movies_on_netflix_standard_with_ads', 'movies') }}"
- service: telegram_bot.send_message
data:
target:
- "{{ states('input_text.telegram_chat_jan') }}"
message: >
🎬 *New on Netflix this week:*
{% for m in movies[:5] %}
• {{ m.title }}{% if m.vote_average > 0 %} ⭐{{ m.vote_average }}{% endif %}
{% endfor %}template:
- sensor:
- name: "Cinema now playing count"
state: >
{{ state_attr('sensor.whatson_series_films_es_cinema_now_playing', 'movies') | count }}
icon: mdi:ticket-confirmation-outline| 🇪🇸 España / Espanya / Espainia | 🇦🇩 Andorra | 🇦🇱 Shqipëria * | 🇦🇷 Argentina | 🇦🇲 Հայաստան * |
| 🇦🇺 Australia | 🇦🇹 Österreich | 🇦🇼 Aruba * | 🇸🇦 المملكة العربية السعودية | 🇧🇾 Беларусь * |
| 🇧🇪 België / Belgique / Belgien | 🇧🇴 Bolivia * | 🇧🇦 Bosna i Hercegovina / Босна и Херцеговина * | 🇧🇷 Brasil | 🇧🇬 България * |
| 🇨🇦 Canada | 🏝️ Caribbean * | 🇨🇱 Chile | 🇨🇳 中国 * | 🇨🇴 Colombia |
| 🇨🇷 Costa Rica * | 🇨🇮 Côte d'Ivoire * | 🇭🇷 Hrvatska * | 🇨🇿 Česká republika | 🇨🇾 Κύπρος / Kıbrıs * |
| 🇩🇰 Danmark | 🇩🇴 Rep. Dominicana * | 🇪🇨 Ecuador * | 🇪🇬 مصر * | 🇸🇻 El Salvador * |
| 🇪🇪 Eesti * | 🇫🇴 Færøerne / Føroyar * | 🇫🇮 Suomi / Finland | 🇫🇷 France | 🇬🇪 საქართველო * |
| 🇩🇪 Deutschland | 🇬🇭 Ghana * | 🇬🇷 Ελλάδα | 🇬🇹 Guatemala * | 🇭🇳 Honduras * |
| 🇭🇰 Hong Kong / 香港 | 🇭🇺 Magyarország | 🇮🇪 Ireland / Éire | 🇮🇸 Ísland * | 🇮🇳 Bharat भारत |
| 🇮🇩 Indonesia | 🇮🇱 יִשְׂרָאֵל | 🇮🇹 Italia | 🇯🇲 Jamaica * | 🇯🇵 日本 |
| 🇰🇿 Қазақстан * | 🇰🇪 Kenya * | 🇱🇻 Latvija * | 🇱🇧 لبنان * | 🇱🇮 Liechtenstein * |
| 🇱🇾 Libya / ليبيا * | 🇱🇹 Lietuva * | 🇱🇺 Lëtzebuerg / Luxembourg / Luxemburg * | 🇲🇴 Macao / 澳門 * | 🇲🇬 Madagasikara * |
| 🇲🇼 Malawi * | 🇲🇾 Bahasa Melayu * | 🇲🇹 Malta * | 🇲🇺 Mauritius * | 🇲🇽 México |
| 🇲🇰 Северна Македонија * | 🇲🇳 Монгол * | 🇲🇪 Crna Gora / Črna Гора * | 🇲🇦 المغرب * | 🇲🇨 Monaco / Mónegue * |
| 🇲🇿 Moçambique * | 🇳🇦 Namibia * | 🇳🇱 Nederland | 🇳🇨 Nouvelle-Calédonie * | 🇳🇿 New Zealand / Aotearoa |
| 🇳🇮 Nicaragua * | 🇳🇬 Nigeria * | 🇳🇴 Norge / Noreg | 🇵🇰 Pakistan * | 🇵🇦 Panamá * |
| 🇵🇾 Paraguay * | 🇵🇪 Perú * | 🇵🇭 Pilipinas * | 🇵🇱 Polska | 🇵🇸 فلسطين * |
| 🇵🇹 Portugal | 🇵🇷 Puerto Rico * | 🇶🇦 قطر * | 🇷🇴 România | 🇷🇺 Россия |
| 🇷🇸 Gora / Црна Гора * | 🇸🇲 San Marino * | 🏴 Scotland * | 🇸🇬 Singapore / 新加坡 / சிங்கப்பூர் / Singapura | 🇸🇰 Slovensko * |
| 🇸🇮 Slovenija * | 🇿🇦 South Africa * | 🇰🇷 대한민국 | 🇸🇪 Sverige | 🇨🇭 Schweiz / Suisse / Svizzera / Svizra |
| 🇹🇼 Taiwan / 臺灣 | 🇹🇭 ประเทศไทย | 🇹🇷 Türkiye | 🇺🇬 Uganda * | 🇺🇦 Украïна * |
| 🇦🇪 Al-Imarat * | 🇬🇧 United Kingdom / Cymru / Alba | 🇺🇸 United States | 🇺🇾 Uruguay * | 🇺🇿 Oʻzbekiston * |
| 🇻🇦 Città del Vaticano * | 🇻🇪 Venezuela | 🇻🇳 Việt Nam * | 🇿🇲 Zambia * | 🇿🇼 Zimbabwe * |
Availability varies by country. The most common platforms supported:
| Platform | Main countries |
|---|---|
| Netflix | 🌍 Worldwide (190+ countries) |
| Amazon Prime Video | 🌍 Worldwide (200+ countries) |
| Disney+ | 🇺🇸🇬🇧🇪🇸🇫🇷🇩🇪🇮🇹🇦🇺🇨🇦🇯🇵 + more |
| HBO Max / Max | 🇺🇸🇬🇧🇪🇸🇵🇹🇳🇱🇸🇪🇩🇰🇳🇴🇫🇮 + more |
| Apple TV+ | 🌍 Worldwide |
| Hulu | 🇺🇸 |
| Peacock | 🇺🇸 |
| Paramount+ | 🇺🇸🇬🇧🇪🇸🇫🇷🇩🇪🇮🇹🇦🇺🇨🇦 + more |
| Movistar+ | 🇪🇸 |
| 3Cat | 🇪🇸 (Catalunya) |
| RTVE Play | 🇪🇸 |
| Atresplayer | 🇪🇸 |
If this integration is useful to you, consider giving it a ⭐ on GitHub. Or consider supporting development!
MIT License —


