$ show mediacms-io/mediacms
MediaCMS is a production-grade, self-hosted video and media content management platform built as a Django monolith with a React frontend. In production it ingests video, audio, image, and PDF uploads via a chunked Fine Uploader flow, transcodes video through FFmpeg into multiple MP4/HLS renditions matched by configurable encoding profiles, streams them through a customized video.js player, and supports subtitles (manual upload and Whisper transcription), chapter markers, video trimming/editing, playlists, comments with mention notifications, likes, reports, and PostgreSQL full-text search. It ships a REST API under /api/v1/, an editor/manager admin UI, RSS feeds with Yahoo Media RSS extensions, and a small Click-based CLI. The backend is organized into Django apps (files, users, actions, rbac, lti, saml_auth, identity_providers, migrationservice, uploader) with DRF serializers/views, Celery workers for encoding and notifications, Redis as broker, and Nginx serving protected media through an auth_request subrequest. A significant portion is education/LMS-focused: an LTI 1.3 tool provider with deep linking, SAML authentication, RBAC groups mapped to categories, Moodle filter and TinyMCE plugins, and a migration service that imports media, captions, and users from Kaltura, Panopto, and YouTube with quiet-hours scheduling and encrypted credentials. This gives the repository a mild data-pipeline flavor through the migration service, but its dominant character is a full web application. Engineering quality is strong for an open-source Django project: extensive pytest coverage across API, permissions, LTI, SAML, RBAC, migration providers, and pipeline tasks; a large Jest suite for frontend components, hooks, and stores; semantic-release and pre-commit CI; and a clean provider abstraction for migration sources. Weaknesses include legacy webpack-built minified bundles checked into static/, a mix of JSX and TSX across the frontend, duplicated iOS player code between the video-editor and chapters-editor tools, several TODO/FIXME markers, and version-sensitive external dependencies (yt-dlp, Moodle, LTI). Overall it is an actively maintained codebase with several genuinely reusable components, though it carries moderate legacy debt in its frontend tooling.
The LLM identified 6 files worth highlighting for reuse:
Abstract BaseProvider class defining the contract for importing media from external platforms: check_connection, cursor-paginated list_page, fetch_media, and download_renditions. Concrete Kaltura, Panopto, and YouTube providers implement it. Extractable for any platform-to-platform content migration tool.
Implements the LTI 1.3 Deep Linking 2.0 message flow: builds signed JWT responses, validates platform JWTs, and returns resource selections to the tool consumer. The protocol logic is self-contained, covered by dedicated tests, and reusable for any LTI tool provider integration.
Django Feed subclass generating RSS 2.0 with Yahoo Media RSS extensions (media:content, media:thumbnail, media:description) for latest media and search results. Self-contained and extractable for any media site wanting a standards-compliant media feed.
Quiet-hours scheduling logic for migration runs: computes allowed start windows and enforces whether a run is permitted, with timezone awareness and test coverage. Readily reusable for throttled background job schedulers.
Small localStorage wrapper adding a namespace prefix, TTL expiration, and safe JSON (de)serialization. Self-contained client-side cache utility usable in any web project with minimal modification.
Video.js player component that renders chapter markers on the progress bar and shows sprite/thumbnail previews on hover. It lives in a separate frontend-tools package with its own Vite build, demonstrating a clean plugin-component architecture for media players.