A tiny static site showing what's currently playing at every Cineplex theatre in Canada — every movie, every format (Regular, IMAX, UltraAVX, ScreenX, 4DX, VIP, and their modifiers like 3D, D-BOX, Laser Projection, Dolby Atmos) — filterable and visually distinguishable by format.
Live at: https://ariesyous.github.io/cinescan/
-
data/theatres.jsonis a checked-in manifest of all ~152 Cineplex theatres across Canada (CineplextheatreId, a slug, display name, city, province, and its output data file). It's generated byscripts/fetch-theatres.mjs, not hand-edited — re-run that script when a theatre opens/closes. -
scripts/scrape.mjsqueries Cineplex's (undocumented) theatrical API for every theatre indata/theatres.jsonand keeps every movie/format. To keep the daily request volume sane across 152 theatres, it probes in two phases:- Near window (~14 days, every theatre): matches Cineplex's normal contiguous published window, all formats kept.
- Deep window (out to 6 months ahead): only for theatres that turned out to have an IMAX screen in the near window, and only keeps IMAX sessions from that far out — this is what catches tentpole IMAX advance ticket sales without probing everywhere for everything. Every other format (ScreenX, 4DX, UltraAVX, VIP, etc.) is only probed within the near window.
Each theatre's results are written to its own file under
data/(e.g.data/cineplex-cinemas-vaughan.json); a theatre that fails entirely for a run is skipped, leaving its last known-good file untouched, without blocking the others. -
.github/workflows/scrape.ymlruns the scraper via GitHub Actions and commits thedata/*.jsonfiles when they change. The near window runs 12 times a day (roughly 8am, 1-10pm, and 1am ET, "quick" mode); the deep window only runs once a week (Thursday 1pm ET, "deep" mode, riding along with that slot's near-window run), since IMAX advance-sale dates don't change often enough to justify probing them on every run. A quick run carries forward the previous deep run's far-future days untouched rather than dropping them. It can also be triggered manually (workflow_dispatch, with amodeinput) from the Actions tab or viagh workflow run scrape.yml. -
index.html/style.css/app.jsare a plain static page (no build step) that fetchesdata/theatres.jsonto build a drill-down region picker — a handful of big buttons for GTA/Montreal/Vancouver/Everywhere Else, then cities (or provinces, under Everywhere Else), then a persistent list of that area's theatres so you can switch between them without re-navigating — plus a breadcrumb to jump back up, and a search box as a quick alternate way to jump straight to a theatre (Scotiabank Theatre Toronto shown by default). It then fetches the selected theatre's data file and renders it as a responsive calendar. Every session shows color-coded badges for its raw Cineplex format tags, and a filter bar above the calendar lets visitors toggle formats on/off. Past days and past showtimes drop off automatically since the scraper's window always starts at "today." -
GitHub Pages deploys straight from the
masterbranch root, so a push (including the scraper's own automated commits) redeploys the live site.
Since the Cineplex API is unofficial and reverse-engineered, it may change or break without notice — the scraper is written to skip bad/missing days rather than overwrite good data with empty results, and to leave a theatre's data file untouched entirely if every request for it fails.
MIT — see LICENSE.