Source Code
Pathé Movie Skill
Summary
- Always talk to the
https://www.pathe.nl/apiendpoints with the required browserlike headers (seescripts/pathe_movie.py). - Use the config at
config/pathe_movie_config.jsonto know which cinemas to assume unless the user explicitly names a different cinema. - Rely on
scripts/pathe_movie.pyfor reusable helpers (sanitizing queries, fuzzy matching, best-match selection, and fetching downstream endpoints). - When uncertain, reference
references/api.mdfor payload shape, field names, and expected response structures.
Search flow
- Clean the user’s movie name by removing filler words (
the,a,an,of,in,on,for,and). - Call
/api/search/full?q=...with the sanitized query. - If multiple entries return, run a fuzzy title match (difflib) to pick the closest
title. Keep theslug,poster(useposter.lg), andcontentRatingfields for later requests. - If a poster is required, return the
poster.lgURL (fall back toposter.md/posterPathwhen necessary).
Movie detail flow
- Given a slug, call
/api/show/{slug}?language=nl. - Pull
contentRating.descriptionandsynopsis(some entries havenull; handle gracefully) plus any extras such asgenres,directors,actors, andtrailersas context. - Poster references now live under
posterPathbefore falling back to the search response’sposter.
Cinema flow
- Query
/api/show/{slug}/cinemas?language=nl. Filter the returned cinema keys againstapprovedCinemasin the config unless the user asks for others. - For each cinema we need more detail about, call
/api/cinema/{cinema}?language=nlto fetch the officialname,citySlug, andservices/alertsmetadata.
Showtimes
- Use
/api/show/{slug}/showtimes/{cinema}?language=ento get schedules. Responses are dictionaries keyed by date (YYYY-MM-DD). Each value is an array of showtimes; every entry contains at least atimestring (plusscreen, optionallanguage,format, etc.). - If the array is empty, return a note that there are currently no scheduled showings.
Testing notes
- Ran
/api/search/full?q=matrixto confirm the payload includesslug,title,poster,contentRating, andgenres. - Called
/api/show/the-matrix-41119to verifycontentRating.description,synopsis, andposterPathfields; the synopsis can be null and the posterPath may be missing, so always null-check. - Queried
/api/cinema/pathe-zaandamto inspect the returnedname,citySlug, and service metadata (there is noshowslist, so the cinema object is mostly static info). - Hit
/api/show/iron-lung-51335/showtimes/pathe-zaandamto confirm the endpoint returns a list; it was empty for that slug, showing you must handle zero-showtime responses. - Pulled
/api/shows?language=nlto understand the bulk structure: dozens of entries withslug,posterPath,contentRating,genres, andnext24ShowtimesCount.
Media delivery notes
- Always download poster images (and extra stills) locally before sending them through WhatsApp. Save them under
/tmpor another temporary location so the gateway can read the file. - When the user explicitly requests a poster via WhatsApp, attach the local path in the
messagetoolmediafield (e.g.,/tmp/bluey_poster.jpg). The WhatsApp docs describe that outbound media accepts local paths, so this ensures the actual image is delivered instead of a URL. - Keep the text part of the
messagetool call descriptive (e.g., "Here’s the Bluey poster you asked for"), and rely on the downloaded file for the visual.
Follow these instructions whenever the user asks about search, posters, descriptions, cinema availability, or showtimes so the skill always produces accurate Pathé Netherlands results.