A Jellyfin plugin that auto-generates virtual TV channels from your media library. Each genre in your library becomes a channel with a deterministic weekly schedule, giving you a classic channel-surfing experience.
Works with all Jellyfin clients out of the box!
- Scans your library for movies and TV episodes and groups them by genre
- Creates a virtual Live TV channel per genre (Action, Comedy, Drama, etc.)
- Generates a deterministic weekly schedule using a seeded shuffle — the same week always produces the same lineup, so the guide stays consistent across devices
- Streams the current item at the correct seek position via FFmpeg concat, so you drop into whatever is "on" right now
All settings are in Dashboard > Plugins > TvGuide.
| Setting | Default | Description |
|---|---|---|
| Video bitrate (kbps) | 4000 | H.264 bitrate for the HLS stream. Range: 500–40000. |
| Audio bitrate (kbps) | 384 | AAC stereo bitrate. Range: 64–512. |
These control the source quality generated by the plugin. Jellyfin may still remux or transcode afterward depending on client capabilities.
Genre channels are auto-generated from your library. For each genre channel you can:
- Enable/disable — toggle the checkbox to include or exclude it from Live TV
- Rename — enter a display name to override the genre label
- Manage content — click "Content" to expand the item list; uncheck items to exclude them from the channel
Custom channels are manually curated:
- Click Add Channel to create a new custom channel
- Expand "Content" to search for and add Movies or Series
- Remove items with the X button
Click Show Library to browse all Movies and Series with their current channel assignments. Click any item to expand checkboxes for assigning/unassigning it to channels.
AI-powered suggestions for assigning unassigned library items to custom channels.
| Setting | Default | Description |
|---|---|---|
| OpenAI API Key | (empty) | Your OpenAI API key. Required for suggestions. |
| OpenAI Model | gpt-5-mini | The model to use for suggestions. |
To use:
- Enter your OpenAI API key and click Save
- Create at least one custom channel
- Click Get Suggestions — the plugin sends your custom channel names and unassigned library items to OpenAI and returns recommendations
- Each suggestion shows the item, target channel, and reasoning
- Click the checkmark to accept a suggestion (adds the item to the channel) or X to reject it
- Accept All applies all remaining suggestions at once
- Click Save to persist accepted changes
Items already in a genre channel or custom channel are excluded from suggestions.
The weekly schedule is deterministic — the same seed produces the same lineup. To get a fresh shuffle:
- Go to Dashboard > Plugins > TvGuide
- Scroll to the Schedule section
- Click Reshuffle Schedule
This increments the schedule seed, clears all cached schedules, and stops active HLS streams. Any viewers will reconnect to the new schedule automatically. The schedule epoch is saved in the plugin configuration, so it persists across restarts.
Requires Bazel 9+.
bazel build //:TvGuide //:runtime_depsThe output DLLs are at bazel-bin/TvGuide/net9.0/TvGuide.dll and bazel-bin/runtime_deps_out/.
- In Jellyfin, go to Dashboard > Plugins > Repositories
- Add a new repository with the URL:
https://raw.githubusercontent.com/mattboardman/TvGuide/main/manifest.json - Go to Catalog, find TvGuide under Live TV, and install it
- Restart Jellyfin
- Go to Dashboard > Scheduled Tasks > Live TV > Refresh Guide and run it — your genre channels will appear under Live TV > Guide
- Build the plugin (see above)
- Copy the DLLs and
meta.jsoninto your Jellyfin plugins directory:
mkdir -p /var/lib/jellyfin/data/plugins/TvGuide_1.0.0.0
cp bazel-bin/TvGuide/net9.0/TvGuide.dll /var/lib/jellyfin/data/plugins/TvGuide_1.0.0.0/
cp bazel-bin/runtime_deps_out/*.dll /var/lib/jellyfin/data/plugins/TvGuide_1.0.0.0/
cp meta.json /var/lib/jellyfin/data/plugins/TvGuide_1.0.0.0/- Restart Jellyfin
- Go to Dashboard > Scheduled Tasks > Live TV > Refresh Guide and run it — your genre channels will appear under Live TV > Guide
- Update the Jellyfin package versions in
paket.dependencies - Run
paket updateto resolve the new versions and regeneratepaket.lock:bazel-$(basename $(pwd))/external/rules_dotnet++dotnet+dotnet_x86_64-unknown-linux-gnu/dotnet tool run paket update --group tvguide_deps - Regenerate the Bazel dependency file from the updated lock:
bazel run @rules_dotnet//tools/paket2bazel:paket2bazel -- \ --dependencies-file $(pwd)/paket.dependencies \ --output-folder $(pwd)
- Update
targetAbiinmeta.jsonandTARGET_ABIin.github/workflows/release.yml - Verify the build:
bazel build //:TvGuide
