Media Pipeline
Anime app — catalogue, library and automation
A media catalogue platform I built and operate on my own infrastructure. The interesting part is not the catalogue — there are plenty of those — but the automated flow that keeps the library current: it discovers new titles, manages downloads, matches every folder on disk to its catalogue entry, and leaves a person only what it cannot decide from evidence. ASP.NET Core backend on PostgreSQL; operations panel and public site in Next.js.
Akashani · app in production
The app in numbers
titles in the catalogue
143,638
verified folders
3,723
episodes downloaded
39,049
Figures fetched from Akashani's public API and refreshed every 3 seconds while this page is visible.
These are the current numbers for Akashani, the anime app running in production. They are fetched from its public API and refreshed every 3 seconds while this page is visible.
Architecture
The backend is a modular monolith: eight domain modules, each with its own controllers, services and DTOs, over a single PostgreSQL database with EF Core. Eighteen background jobs cover metadata synchronisation against external APIs, disk scanning, the download queue, description translation and the daily database backup. Progress reaches the panel in real time over SignalR. I avoided a repository layer except where the queries justified it: one exception, not a rule.
A catalogue that keeps itself current
The app syncs titles, metadata and relations from AniList, and refreshes episode counts and airing dates with Jikan data. Scheduled jobs detect changes and newly aired episodes so the catalogue and library do not rely on constant manual updates.
Automatic episode downloads
The system finds episodes missing from associated folders and adds them to a persistent queue. Workers try the available sources, track progress and errors, and can pause or retry work without losing the queue state.
Matching folders to anime
When scanning storage, the pipeline reads each folder's signals — title, season, format and episodes — finds catalogue candidates and weighs the evidence to match it to the right anime. Clear matches are resolved automatically; ambiguous or conflicting cases go to a review queue where a person can confirm or correct the association.
A folder structure connected to the library
Each association links a real storage folder to its catalogue entry. Episode scans keep track of which files exist, how many episodes are present and whether a series is complete; that data drives availability in the app and is reconciled after association changes.
Spanish translations
A background process translates synopses and episode titles into Spanish. Translations are stored separately from the original content, so the interface can display localized text without replacing the source metadata.
Legacy video conversion for browser playback
Legacy files that browsers cannot play are converted in the background to compatible MP4. Before replacing the original, the system validates the converted file and its duration; if conversion fails or is interrupted, the original stays in place so the episode is not lost.
An operations console for the library
The admin panel brings together the download queue and history, folder matching, association review, translations, conversions and background-job status. That makes it possible to monitor and correct the full workflow from one place.