a Jellyfin & Subsonic client for the terminal — powered by mpv, Chromecast and UPnP MediaRenderer
mpv chromecast mpris navidrome jellyfin upnp tui
0

Configure Feed

Select the types of activity you want to include in your feed.

Update README for 0.4.0 changes

Shuffle/repeat now work while casting, logs go to a file in TUI mode,
and the workspace layout gained fin-subsonic, fin-media, and
fin-mediarenderer.

+16 -3
+16 -3
README.md
··· 338 338 Find the on-disk config with `fin config --path`; print it with 339 339 `fin config --show`. 340 340 341 + While the TUI runs, logs are written to `fin.log` in the cache directory 342 + (next to `queue.json`) rather than stderr, so they can't corrupt the 343 + display; one-shot CLI commands log to stderr as usual. `-v` / `-vv` and 344 + `RUST_LOG` control the level either way. 345 + 341 346 ## Multiple servers 342 347 343 348 fin authenticates against as many servers as you like — Jellyfin and ··· 430 435 431 436 ## Playback modes & effects 432 437 433 - All of these run only on the local renderer (audio path). Chromecast and 434 - UPnP receivers each do their own thing; toggles no-op on those renderers. 435 - Settings persist to `config.toml` and are mirrored back on next launch. 438 + **Shuffle and repeat work on every renderer** — the queue lives on the 439 + client, so they apply while casting to Chromecast or UPnP too. The audio 440 + *effects* (ReplayGain, crossfade, EQ, bass & treble) run only on the local 441 + renderer; Chromecast and UPnP receivers do their own DSP, so those toggles 442 + no-op there. Settings persist to `config.toml` and are mirrored back on 443 + next launch. 436 444 437 445 ### Shuffle 438 446 ··· 546 554 already streaming. 547 555 - Skipping (`>` / `<`) triggers a `load` for the next queue item 548 556 immediately — no waiting for the current one to finish. 557 + - Shuffle (`z`) and repeat (`Shift+R`) act on this client-side queue, so 558 + they work while casting exactly like local playback. 549 559 - Stopping clears the local queue and stops the receiver's playback. 550 560 551 561 UPnP renderers without a `RenderingControl` service (rare, but it happens) ··· 584 594 │ ├── fin/ # binary — clap CLI + startup 585 595 │ ├── fin-config/ # TOML config file, credentials, mode enums 586 596 │ ├── fin-jellyfin/ # Jellyfin HTTP API client 597 + │ ├── fin-subsonic/ # Subsonic HTTP API client (Navidrome, Airsonic, …) 598 + │ ├── fin-media/ # MediaClient trait over both backends + login probe 599 + │ ├── fin-mediarenderer/ # built-in UPnP MediaRenderer — casting *to* fin 587 600 │ ├── fin-player/ # Renderer trait, queue, symphonia audio path, 588 601 │ │ # mpv video, Chromecast + UPnP, replaygain, 589 602 │ │ # crossfade, queue persistence