torttube/docs/install.md
Kayos 4aa6cc658d M6 — cross-compile aarch64-musl + addon.zip + install docs
scripts/build-addon-zip.sh runs the whole pipeline from a host with ssh
lucy:
- one-shot messense/rust-musl-cross:aarch64-musl container builds the
  sidecar static (6.2MB stripped). Doesn't mutate crafting-table.
- fetches yt-dlp_linux_aarch64 from the upstream release page so Tier 2
  + Tier 3 work on the Pi (LibreELEC ships no Python YouTube tools)
- packages everything into plugin.video.torttube.zip with the Kodi
  install-from-zip layout
- drops the zip at /mnt/user/downloads/torttube/ on Lucy SMB

Cargo.toml swaps rustypipe to default-features=false +
rustls-tls-webpki-roots so the cross-compile is openssl-free.

addon.xml drops the unused script.module.requests requirement — main.py
only uses Python stdlib + Kodi's own modules.

docs/install.md walks the Kodi UI flow + a smoke curl that fires
Player.Open via JSON-RPC. Pi-side smoke is pending Cobb's install on
192.168.0.158.
2026-05-23 08:54:46 -07:00

2.6 KiB

Installing torttube on the LibreELEC RPi

The addon ships as a single plugin.video.torttube-<version>.zip that contains the Python addon, a static aarch64 sidecar binary, and yt-dlp's aarch64 release binary (for Tier 2/3 fallback). Nothing else needs to be installed on the Pi.

Build the zip (Sulkta-internal)

bash scripts/build-addon-zip.sh
# → /mnt/user/downloads/torttube/plugin.video.torttube-0.0.1.zip on Lucy

The script cross-compiles the sidecar in a throwaway messense/rust-musl-cross:aarch64-musl container, fetches yt-dlp's official yt-dlp_linux_aarch64 release binary, packages everything, drops the result at /mnt/user/downloads/torttube/ (Lucy SMB).

Install on the Pi (Kodi UI flow)

  1. On the Pi: Settings → File manager → Add source → enter smb://lucy/downloads/ → name it lucy-downloads.
  2. Settings → Add-ons → Install from zip file → lucy-downloadstorttube/plugin.video.torttube-<version>.zip.
  3. Kodi installs, the addon appears under Video add-ons.

Unsigned addons need Settings → System → Add-ons → Unknown sources ON.

Verify

After install, fire the smoke from any LAN client:

curl -u ***REMOVED*** -H "Content-Type: application/json" \
  -X POST http://192.168.0.158:8080/jsonrpc -d '{
    "jsonrpc": "2.0", "id": 1, "method": "Player.Open",
    "params": {"item": {"file":
      "plugin://plugin.video.torttube/?action=play&id=dQw4w9WgXcQ"}}}'

The TV should switch to playback of "Never Gonna Give You Up" within a few seconds (rustypipe resolve takes ~1s, then Kodi starts the stream).

Troubleshooting

  • Black screen + "no stream URL" notification: rustypipe returned separate audio + video streams (DASH-style), and we're picking the video stream which may be video-only. This is the M3 known gap — needs the audio+video merge work in M3+. Workaround: try a video that yt-dlp's tier-2 path can resolve to a combined format; the sidecar falls back automatically.
  • Sidecar crashes: cat /storage/.kodi/temp/kodi.log | grep torttube on the Pi. Sidecar logs to stderr; Kodi captures those.
  • yt-dlp permission denied: addon's bin/ dir needs +x. The zip preserves perms but if you copied files manually, chmod +x bin/*.
  • HTTPS errors from sidecar: it bundles rustls + webpki roots, so no system CA store needed. If you see "invalid certificate", your Pi clock is wrong (LibreELEC's NTP failed).

Updating

Just rebuild + bump the version in addon/plugin.video.torttube/addon.xml, re-run build-addon-zip.sh, install the new zip from the same SMB location. Kodi will treat it as an upgrade if the version is higher.