· 4 min read

1NOMO

A comprehensive linear TV station platform. Broadcast free-to-air in Port Vila, Vanuatu.

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.

Diagram

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.

media management

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

playlist template

A Generated Playlist

scheduled template

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
Share:
Back to Projects