TMedia
ActiveCustom Media Server — Tower (Unraid NAS) — ~70TB / ~90k files
A Python/Flask media server built from scratch to replace Emby for a large personal library. Hardware-accelerated HLS transcoding, TMDB metadata enrichment, and a native tvOS app built in SwiftUI. Built because off-the-shelf solutions had too many compromises for a library this size.
Emby and Jellyfin work fine for most libraries. At ~90k files with a mix of movies, TV, foreign content, and a large subtitle management pipeline, the gaps started showing — library scan times, metadata quirks, subtitle handling, and a client experience that was always someone else's priority.
TMedia is built for exactly this library and nothing else. No feature bloat from trying to serve every use case. The tvOS client does exactly what's needed: browse, play, pick audio track, pick subtitle, continue watching.
The Flask server scans the library, enriches metadata via TMDB, and builds an SQLite catalog. Playback is HLS — ffmpeg segments the source file on demand using VAAPI hardware acceleration on the i9-11900K's integrated graphics, serving adaptive bitrate streams to the client.
The tvOS app (SwiftUI, AVPlayer) connects to the server on the LAN and streams directly. Library browsing, playback state sync, and continue-watching all work natively without relying on any cloud service.
Hardware-accelerated transcoding
VAAPI via Intel integrated graphics. Handles real-time HLS segmentation for 4K sources without taxing the CPU.
Native tvOS app
SwiftUI/AVPlayer client. Browsing, playback controls, audio/subtitle track selection, and continue-watching state.
Subtitle integration
Tight integration with SubStation for generation, translation, and selection. Multiple language tracks surfaced cleanly in the player.
TMDB enrichment
Automatic metadata fetch — posters, backdrops, descriptions, cast. Local SQLite cache so it doesn't hammer the API.
Server fully deployed and in daily use. tvOS client running on simulator (tvOS 16.1) — the 2015 MacBook Pro can't target tvOS 26 on Xcode 14. A hardware upgrade is on the list before the app goes to a real device.