Skip to content

Media

Obsidience Media is an optional, independent media server and catalogue. Jellyfin owns the catalogue, client delivery and per-user resume; Obsidience adds discovery, explicit acquisition, a native Media pane and ordinary capability receipts. The television is one optional Home device; native clients use the catalogue independently. Media bytes never pass through the model or the Harness, and the integration defaults disabled.

Component Upstream Pinned License Role
Jellyfin jellyfin/jellyfin 12.2.0 (ca0f16eb7c19), official image by digest GPL-2.0 Catalogue, native clients, resume, native live TV
Tiramisu MrRobotoGit/tiramisu 1.11.4 (1d761b88b9cd) plus one local patch GPL-3.0 Virtual-file (FUSE) provider and source-search bridge
rclone rclone/rclone 1.75.2 (distribution package) MIT Read-only WebDAV mount of TorBox's cached files
Prowlarr Prowlarr/Prowlarr 2.6.5.5623 (official release) GPL-3.0 Authenticated source discovery (indexers) only
TorBox torbox.app (service) API, no code service terms Cached-only debrid acquisition

Upstream checked 2026-10-19: Jellyfin 12.2 is current and contains the security fixes published with 12.0; rclone 1.75.2 and Prowlarr 2.6.5.5623 are the latest releases; Tiramisu v1.11.8 (2026-10-17) is ahead of the patched 1.11.4.

Why these components

Jellyfin is a mature, self-hosted catalogue with native clients on every device, so the TV, desktop and phones play the same library without a custom player protocol. Tiramisu, rclone and Prowlarr each fill one narrow role behind authenticated loopback interfaces; none of their dashboards, schedulers or automation stacks is enabled.

Flow

flowchart LR
  owner["Owner request<br/>(voice, chat, Media pane)"] --> exec["Executive<br/>media.library / media.acquire"]
  exec -->|"metadata, candidates"| disc["Discovery<br/>Cinemeta identity,<br/>Prowlarr sources"]
  exec -->|"one exact registration"| tb["TorBox<br/>(cached only)"]
  exec -->|"source add"| tir["Tiramisu<br/>owner-only sockets"]
  tb --> rc["rclone WebDAV mount<br/>read-only"]
  tir --> fuse["Tiramisu FUSE mount"]
  rc --> jf["Jellyfin<br/>catalogue"]
  fuse --> jf
  local["Local libraries<br/>read-only"] --> jf
  jf --> clients["Native clients<br/>desktop, phone"]
  jf --> tuner["Media tuner<br/>(optional Home TV route)"]
  exec -->|"targeted refresh,<br/>exact readback"| jf
  • Acquisition is explicit. One owner request registers one exact, opaque candidate; registration reconciles existing account state first and never replays an uncertain request. TorBox acquisitions are cached-only; there is no fallback to uncached transfer or local BitTorrent.
  • Catalogue refresh is targeted. Registration queues a refresh of the exact configured library and reads back the exact path; it never starts a whole-library scan.
  • Mount lifecycles are owned. Each provider service drains its readers before an ordinary unmount; Jellyfin is bound to the mounts it reads.

Boundary

File Owns
obsidience/media/ Units and helpers: obsidience-media-jellyfin.container, -tiramisu, -torbox and -prowlarr services, torbox-mount, connect-torbox (device login), provider-launch, the Tiramisu patch and the module README
harness/media/service.py, config.py The API-lifetime catalogue client and the private configuration contract
harness/media/jellyfin.py, progress.py Jellyfin REST reads, exact library refresh and resume reporting
harness/media/tiramisu.py, torbox.py, torbox_files.py, discovery.py, sources.py Provider adapters and the local file admission contract
harness/capabilities/media/ The media.library and media.acquire Tools; they use only the adapters' public functions
tv/host/tuner.py Media playback owner for the optional Home TV destination; retained compatibility path

Configuration

The private obsidience/state/media.json (never committed) selects:

Key Content
enabled Master switch (default false)
catalogue url, instance_id, user_id and the encrypted credential name of one Jellyfin user
roots Non-overlapping id, path, catalogue_path mappings; virtual roots add mount_path, optional provider: torbox and library_name
acquisition, discovery, debrid, music Optional acquisition, source discovery, TorBox and music delivery settings

No credential value belongs in this file, the repository, command arguments or logs. Connect a TorBox account with obsidience/media/connect-torbox (the provider's device login; the token is stored as a user-scoped encrypted credential). Module documentation: obsidience/media/README.md.