Back

2026

Practice projectNot maintained

CutCrew

Movie metadata and streaming backend · built by Vikrant Kumar

A movie and series streaming app that pulls IMDb details and playable links from dozens of sources and shows them in one place.

A practice project to learn scraping and backend design. The backend is my main work here; the frontend is basic. It isn't hosted anymore.

Node.jsExpressTypeScriptMongoDBMongoosePythonFastAPIReactViteTailwind CSS

The problem

Finding something to watch means checking IMDb for details and then hunting across a dozen sites for a link that actually plays. Every site has its own layout and its own naming, and half the links are dead. I wanted one app where you search a title, see proper IMDb data (rating, plot, cast, seasons) and press play, with the backend doing all the searching and matching.

Decisions and why

My own IMDb API instead of a paid metadata service

I wrapped a set of Python IMDb scrapers in a small FastAPI service (search, title details, genre filters, episodes, trending) and deployed it separately. The main backend calls it like any other API, so there are no API keys or rate-limited free tiers, and the scraping code stays out of the Node server.

Database first, scrape only on a miss

Search, title pages and genre rows always check MongoDB first. Only when a title isn't there does the backend call the IMDb API, save the result and return it. The catalogue grows with use, repeat visits are instant, and a seeder script plus a nightly cron job fill it ahead of time.

Streaming sources as plug-in modules

Each source is a small TypeScript folder with the same four functions: search, details, episodes and stream. A build script bundles each one into plain CommonJS, and the backend loads whatever is in the build folder at runtime. Adding or fixing a source means changing one folder, not the server.

Two-step matching so the wrong movie never plays

Sources name titles loosely, and searching for 'Dune' returns several films. The backend checks the top results from a source in parallel and accepts one only if its IMDb id matches. If no source gives an id, it falls back to a normalised title match plus release year within one year. Sources are tried in turn until one passes.

Short-lived cache for stream links

Playable links expire, so storing them forever would serve dead links. Each movie and each episode keeps its resolved stream with a timestamp. For three hours it is served straight from the database, and after that it is fetched fresh from the source and saved again.

The hardest part

Turning messy source pages into clean seasons and episodes. Every source lists episodes differently ('S02E05', 'Season 2 Episode 5', or just a list), so the backend reads the season and episode numbers out of each title, groups them into seasons and stores them on the series. It keeps a cached stream for each episode, so next and previous episode work from the player. Sources also go down or change their layout all the time, so every call is wrapped on its own: a broken source is logged and skipped, the next one is tried, and the title is still saved with its IMDb data even if no link is found.