Sage and Pepper's Musings

Life through the eyes of two German Shepherds and their staff.


Building StreamSync: How I Solved My “What’s On Tonight?” Problem

A streaming calendar that actually knows what I want to watch

https://github.com/spbutterworth/WhatsOnTonight


The Problem Every Streaming Subscriber Knows

Picture this: You’re subscribed to Netflix, Prime Video, Disney+, HBO Max, and Hulu. You’ve got a carefully curated IMDB watchlist with dozens of shows you want to catch. And yet, somehow, you keep missing new episodes because you can’t remember which show airs when, on which platform.

I got tired of the mental gymnastics. So I built StreamSync.

What Is StreamSync?

StreamSync is a personal streaming calendar system that bridges the gap between your IMDB watchlist and the chaotic world of streaming schedules. It answers the question I found myself asking every evening: “Is anything I actually care about airing tonight?”

The system pulls shows from my IMDB watchlist, enriches them with episode data, tracks streaming schedules across major platforms, and delivers it all through a clean calendar interface—complete with notifications so I never miss a premiere again.

The Technical Journey

Choosing the Foundation

I went with what I know: Oracle 23ai for the database. Some might raise an eyebrow at using Oracle for a personal project, but there’s something to be said for working with tools you understand deeply. Oracle’s robust handling of complex queries and reliable performance made it a natural choice.

The backend runs on Python Flask, which gave me the flexibility to integrate multiple APIs without getting bogged down in framework complexity. The frontend uses a glass-morphism design with electric violet, neon pink, and cyan accents—because if I’m going to stare at a calendar every day, it might as well look like it belongs on a spaceship.

The Architecture

StreamSync’s database schema includes eight tables and two views:

  • Shows and Episodes: Core data imported from IMDB and enriched via OMDb API
  • Streaming Schedules: Real-time data from TVmaze API covering Netflix, Prime Video, Disney+, HBO Max, Hulu, and more
  • Calendar Events: Generated entries for the iCalendar feed
  • User Preferences: Notification settings, timezone configuration, platform subscriptions

The modular architecture separates concerns cleanly—database operations, API integrations, and web interface each live in their own modules. This saved me countless hours during debugging.

The IMDB Integration Challenge

Here’s something I learned the hard way: you can’t just scrape IMDB watchlists anymore. Their authentication requirements have tightened significantly. After banging my head against the wall trying to automate the import, I pivoted to CSV export—IMDB still lets you export your watchlist as a CSV file, and honestly, it’s more reliable anyway.

The import process reads the CSV, validates the data, and kicks off API enrichment to pull episode counts, air dates, and other metadata.

API Integrations

Two APIs power the data enrichment:

OMDb API handles show and episode metadata. It’s straightforward, well-documented, and gives me everything I need about individual shows.

TVmaze API is the real hero for streaming schedules. It tracks what’s airing across platforms in real-time, which means StreamSync always knows when the next episode of your favorite show drops.

Oracle-Specific Gotchas

A few lessons for anyone mixing Oracle with Python:

  1. LISTAGG behaves differently than PostgreSQL’s STRING_AGG. If you’re coming from PostgreSQL, expect to adjust your aggregation queries.
  2. CLOB fields need careful handling. When aggregating text data, you’ll need to cast to VARCHAR2 or handle the LOB objects explicitly.
  3. The oracledb library doesn’t support all connection parameters. I spent an embarrassing amount of time debugging why my ‘encoding’ parameter was being rejected.

The “What’s On Tonight” Feature

This is the heart of StreamSync. Every evening, the system cross-references my watchlist against that day’s streaming schedule and highlights matches. No more scrolling through platform homepages hoping to spot something familiar. If a show I care about is airing, I know about it.

The Stack

ComponentTechnology
DatabaseOracle 23ai (Docker)
BackendPython Flask
APIsOMDb, TVmaze
CalendariCalendar feed generation
NotificationsGmail integration
FrontendGlass-morphism UI with Playfair Display

The whole system runs on port 5003, with the database on 1522, configured for Chicago timezone.

What I Learned

Separation of concerns matters. When something breaks (and it will), knowing exactly which module to investigate saves hours.

CSV imports beat web scraping. It’s less elegant, but infinitely more reliable when dealing with sites that don’t want to be scraped.

Build for your timezone. Calendar events work better with floating local time than UTC conversion. Your 8 PM show should show up at 8 PM, not require mental math.

Iterate aggressively. StreamSync went through a complete rebuild. The first version worked, but the architecture was messy. Starting fresh with lessons learned produced something I actually enjoy maintaining.

What’s Next

The core system is solid. Future enhancements I’m considering:

  • Mobile-friendly interface improvements
  • Smart recommendations based on viewing patterns
  • Multi-user support for household watchlists
  • Integration with additional streaming platforms as they emerge

The Takeaway

StreamSync started as a personal itch that needed scratching. It turned into a full-stack project that reinforced everything I love about building systems: taking a messy real-world problem, designing a clean data model, integrating external services, and wrapping it all in an interface that makes the complexity invisible.

If you’re drowning in streaming subscriptions and losing track of what to watch, maybe it’s time to build your own solution. Or at least export that IMDB watchlist and see what you’ve been missing.


Built with Oracle 23ai, Python Flask, and the eternal frustration of too many streaming services.



Leave a comment