No description
  • C# 73.6%
  • HTML 21.5%
  • Shell 4.9%
Find a file
leanderkretschmer e9c697b35d
Some checks failed
Build / build (push) Has been cancelled
1.0.0.11: Twitch live via yt-dlp, dates, disk cache, downloads, scheduled refresh
Wide release responding to a batch of live feedback:

- Twitch live playback fixed by dropping the streamlink dependency on
  the user side — yt-dlp resolves twitch.tv/<user> directly into an HLS
  playlist URL and the proxy redirects to it.

- YouTube card release dates: added '--extractor-args
  youtubetab:approximate_date' so flat-playlist entries carry an
  upload_date (parsed from YouTube's relative '2 days ago' strings).
  Flat-playlist stays fast (no per-video fetch) but the cards now
  display a year.

- Disk-cached video lists with stale-while-revalidate so opening a sub
  is instant after a Jellyfin restart. Cache file lives at
  <plugin data>/blkbox-streams/cache/videos-<subId>.json. A stale hit
  returns immediately and kicks a background re-fetch.

- New IScheduledTask 'BlkBox Proxy — refresh subscriptions' runs every
  10 minutes, warming the cache and refreshing Twitch live status for
  IncludeLive subscriptions even when no one is browsing.

- Source-aware add UI: when YouTube or Twitch is selected, Live/VODs
  checkboxes are hidden — only one mode makes sense per source. The
  checkboxes only show for 'Other (yt-dlp)'. Defaults: Twitch → live
  only; YouTube → VODs only.

- Search rows render cleaner: avatar + display name only (no more
  long platform URLs cluttering the list). Add just works.

- Server-side download: POST /Plugins/Grayjay/Save?token=<base64> runs
  yt-dlp with --merge-output-format mp4 into the configured
  DownloadPath. Plugin config page got a 'Downloads folder' field and
  a 'Save a video' form that takes any yt-dlp-supported URL.

- Client-side download: SupportsContentDownloading=true on the channel
  features so Jellyfin's web UI exposes a download action on each
  channel item. The proxy honors ?download=1 to set
  Content-Disposition: attachment.

Required cache key change brings DataVersion to 5 indirectly via the
1.0.0.9 bump; no version bump needed here because subscription content
will be re-fetched naturally by the new RefreshTask.
2026-05-15 17:29:43 +02:00
.github/workflows Initial commit: Grayjay plugin + multi-plugin repo scaffold 2026-05-15 14:40:35 +02:00
plugins/grayjay 1.0.0.11: Twitch live via yt-dlp, dates, disk cache, downloads, scheduled refresh 2026-05-15 17:29:43 +02:00
releases/grayjay 1.0.0.11: Twitch live via yt-dlp, dates, disk cache, downloads, scheduled refresh 2026-05-15 17:29:43 +02:00
scripts Initial commit: Grayjay plugin + multi-plugin repo scaffold 2026-05-15 14:40:35 +02:00
.gitignore Initial commit: Grayjay plugin + multi-plugin repo scaffold 2026-05-15 14:40:35 +02:00
manifest.json 1.0.0.11: Twitch live via yt-dlp, dates, disk cache, downloads, scheduled refresh 2026-05-15 17:29:43 +02:00
README.md Rename plugin to BlkBox Streams (1.0.0.1) 2026-05-15 14:51:05 +02:00

blkbox.stream-plugins

A Jellyfin plugin repository hosting custom plugins for streaming content from external platforms. Add this repository to your Jellyfin server and install plugins directly from the dashboard.

Repository URL

Add this URL under Dashboard → Plugins → Repositories → +:

https://git.blkbox.work/leanderkretschmer/blkbox.stream-plugins/raw/branch/main/manifest.json

Once added, the plugins below show up under Dashboard → Plugins → Catalog.

Plugins

Plugin Description Target Jellyfin
BlkBox Streams Browse YouTube, Twitch, Rumble, Odysee, PeerTube and any of ~1800 yt-dlp sites as Jellyfin libraries. Live streams via streamlink. 10.10+

Repository layout

.
├── manifest.json              # Read by Jellyfin
├── plugins/
│   └── <slug>/
│       ├── src/               # .NET 8 plugin source
│       ├── build.yaml         # Plugin metadata
│       └── README.md
├── releases/
│   └── <slug>/<version>/
│       ├── <slug>-<version>.zip   # The artifact Jellyfin downloads
│       └── meta.json              # Per-version manifest stub
├── scripts/
│   ├── build-release.sh       # Build + zip + checksum + regenerate manifest
│   └── build-manifest.sh      # Regenerate manifest.json only
└── .github/workflows/         # CI build

Adding a new plugin to this repository

  1. Drop a Jellyfin plugin project under plugins/<slug>/src/.
  2. Add a plugins/<slug>/build.yaml with at minimum:
    name: My Plugin
    guid: <new-guid>
    version: 1.0.0.0
    targetAbi: 10.10.0.0
    category: Channel
    owner: leanderkretschmer
    overview: "Short one-liner"
    description: >-
      Longer description here.
    
  3. Run scripts/build-release.sh <slug>.
  4. Commit the new files under plugins/, releases/<slug>/, and the updated manifest.json. Push.

Releasing a new version of an existing plugin

  1. Bump version: in plugins/<slug>/build.yaml (and AssemblyVersion / FileVersion in the csproj if you care about both matching).
  2. scripts/build-release.sh <slug>.
  3. Commit and push.

Jellyfin will see the new version on its next manifest poll and offer the update under Dashboard → Plugins.

Manual rebuild

If you only edited the manifest (renamed a plugin, fixed a description, etc.) and don't need to rebuild any binary:

scripts/build-manifest.sh

Requirements (for builds)

  • .NET 8 SDK
  • zip, jq, md5sum (standard on most Linux distros)

Local testing without pushing

You can serve the repo directory over HTTP for local testing:

python3 -m http.server -d . 8080
# Then in Jellyfin: add http://<host>:8080/manifest.json as a repository

Jellyfin will fetch the manifest, download zips via the URLs inside it (those URLs point at git.blkbox.work, so this mode only works once the repo is pushed unless you also rewrite the manifest URLs to point at your local server).