YT LIVE STREAMER
The plugin system

Every feature is a
drop-in plugin

The whole app is built on one idea: a folder of Python files. Each one becomes a tab. Load what you need, delete what you don't, or write your own in a few lines.

// how it works
~/streamer_plugins/
Drop a .py file in the folder. That's the install.
loader scans
On launch, each file's Plugin class is imported and on_load() runs.
becomes a tab
add_tab() injects UI; add_api_routes() extends the REST API.
// the catalog

19 plugins, ready to load

All
Core
Library
YouTube
Monitor
Distribute
Inputs
Dev
// write your own

A plugin is one class

Copy the base contract, fill in the parts you need, drop the file in the folder. No build step, no registration, no core edits.

~/streamer_plugins/hello.py
import tkinter as tk

class Plugin:
    name        = "Hello"
    version     = "1.0"
    description = "My first plugin"

    def on_load(self, app):
        # runs once at startup
        self.app = app

    def add_tab(self, app, notebook):
        frame = tk.Frame(notebook, bg="#0f0f0f")
        tk.Label(frame, text="Hello, stream!",
                 bg="#0f0f0f", fg="#fff").pack()
        return ("Hello", frame)

    def add_api_routes(self, flask_app, app):
        # optional: add REST endpoints
        pass
  • on_load(app)
    Runs once at startup. Grab the app reference and read its state.
  • add_tab(app, nb)
    Return a (label, Frame) and your UI becomes a tab. Or return None.
  • add_api_routes(flask, app)
    Register REST endpoints so scripts and bots can reach your plugin.
  • on_start / on_stop(app)
    Hooks fired when the stream goes live or stops.

Load only what you need.

Every plugin is optional. Keep the app lean, or stack all 19 — it's your folder.