· 4 min read
1NOMO
I spearheaded development of a robust, end-to-end platform for operating a linear TV station. This project was designed to compete with an existing local broadcaster by leveraging automation and cost-effective advertising.
I designed the architecture and implemented a system with Python and OBS which delivered 24/7 free-to-air digital TV broadcast in the Port Vila region.
The Heart of the System: Video Management and Playlist Generation
At the core of this platform, I engineered a locally hosted video media management system. This organized a vast library of content, including series, movies, advertisements, public service announcements, bumpers, promos and filler content.
To ensure a smooth and varied broadcast schedule, I developed a playlist generator. This tool utilized user-defined playlist templates composed of repeatable blocks, allowing for flexible and dynamic content scheduling. Each series would increment to the next episode as scheduled automatically and each block would be filled to avoid any blank space in the schedule.
A Template
A Generated Playlist
Ensuring Uninterrupted Broadcast: The Playout Service
One of the most critical components of the system was the playout service. I designed this service to maintain continuous 24/7 playback of the generated playlists. It interfaced with an OBS (Open Broadcaster Software) instance via WebSockets, providing real-time control and ensuring seamless transitions between content pieces.
It also managed local copies of all the content it required for upcoming playlists so it could run disconnected from the backend services and always ensure smooth playback.
Powering Background Operations: Celery Workers
To handle the various background tasks essential for smooth operation, I implemented a system of Celery workers. These workers managed both on-demand and scheduled jobs, including:
- Generating playlists following the blocks and recipes within a playlist template
- Copying media from storage to the playout server for local playback on OBS
- Fetching data from various APIs for use with video overlays
- Indexing the media library and retrieving media metadata from public APIs
Enhancing Viewer Experience: Dynamic Overlays and Live Segments
To enhance the viewing experience, I built a suite of dynamic overlays with Vue.js that periodically displayed live data on top of the video playback. This used features built into OBS which allowed for a “website” overlay on top of media playback and using transparency allowed the video to play through. These overlays included weather updates, news and information about upcoming items in the playlist and more.
Taking it a step further, I created unique segments that temporarily interrupted video playback to deliver timely content such as news updates, COVID-19 information, and local weather forecasts.
Weather Segment
Expanding Reach: Multi-Destination Streaming
Recognizing the importance of reaching viewers across various platforms and beyond the range of our terrestrial tower, I extended the system’s capabilities to support simultaneous streaming to multiple destinations. This feature was implemented using a combination of Nginx with RTMP module, FFmpeg and STunnel for secure tunneling which was required by Facebook Live.
Behind the Scenes: Administrative Tools and Transcoding Pipeline
To empower content curators and streamline backend operations, I developed a suite of internal tools. This included a transcoding pipeline to ensure optimal video quality and compatibility with the playout server. I also created a metadata synchronization system that interfaced with public databases to keep our content information up-to-date.
The playlist tools were the highlight of the system and gave a user-friendly interface to assign playlist templates for each day and manually override the playlist generator before publishing a final playlist.
- python
- celery
- obs