Repository navigation
Releases: Loafer19/vivi
Release list
Vivi v0.10.0
Highlights: new Equalizer, Chapter Thumbnails and AcoustID plugins; SponsorBlock undo, Scrobbler with Last.fm, and Subtitle Auto-Sync with managed helpers; Auto-tagger Deezer/iTunes/Last.fm/Discogs sources with per-field source and optional LRCLIB synced lyrics; plugin marketplace at plugins.viviplayer.app with What’s new and vivi://plugin deep links; viviplayer.app site; install.sh, AUR/Flathub/winget/Scoop packaging.
Added
- Equalizer plugin (
equalizer1.0.0, #74): Flat, Bass, Vocal, Rock, Night and Custom presets via mpvequalizer/superequalizer(Alt+E/Alt+Shift+E). Uses labelled filter@vivi-eqplug, separate from the built-in Audio-panel EQ (@vivi-eq), which stays. - Chapter Thumbnails plugin (
chapter-thumbnails1.0.0, #75): seek-bar hover previews and chapter list thumbnails cached per file (system ffmpeg or Vivi’s media build fromhelper-ffmpeg-v8.0-2);Alt+Hshows the chapter list. Core loads the cache viavivi-preview-frames/vivi-chapter-thumbs. - AcoustID plugin (
acoustid1.0.0, #76):Alt+Ifingerprints the playing file (systemfpcalcor a managed Chromaprint download), looks up AcoustID + MusicBrainz, opens the Auto-tagger review with a rename proposal from a pattern. - Auto-tagger (#79, #80): extra sources Deezer, iTunes Search, Last.fm (genres) and Discogs (optional token); each proposed field shows its source. Optional Embed synced lyrics from LRCLIB into MP3 (SYLT+USLT), FLAC/Ogg/Opus (
LYRICS) and M4A (©lyr). - Auto-tagger review dialog: Review changes… / Review all files… with before/after per field, checkboxes, cover candidates (Cover Art Archive), Apply selected/all/Skip, and Undo from a per-apply backup.
- Plugin marketplace at https://plugins.viviplayer.app: searchable catalog with categories, per-plugin pages (screenshots, changelog, older downloads, permissions, Open in Vivi), Atom feed (
/feed.xml). Listings inplugins/<id>/store.toml. Browse shows What’s new for pending updates from the catalog changelog. - vivi://plugin/ deep links open the plugin in Settings → Extensions → Browse (
x-scheme-handler/vivi). Catalog URL is https://plugins.viviplayer.app/index.json with GitHub Pages fallback (https://loafer19.github.io/vivi/index.json). - viviplayer.app (https://viviplayer.app): SEO site (canonicals, Open Graph, sitemap, SoftwareApplication JSON-LD);
install.shat https://viviplayer.app/install.sh. GitHub Pages remains a mirror. - install.sh: on Arch builds
vivi-binwith makepkg; elsewhere installs the release tarball into~/.localwith SHA256SUMS check;--uninstall; container tests in CI. - Add Subtitles → From Computer (Figma, #51): To This File / To This Folder, From Computer / From OpenSubtitles, folder breadcrumb, video–subtitle pairing and Save.
- Distribution packaging: AUR
vivi-bin/vivi-git, Flathub submission files, winget and Scoop manifests; CI checks (makepkg + namcap, flatpak-builder-lint); release workflow bumps versions and checksums. - Helper ffmpeg-media / ffprobe-media (
helper-ffmpeg-v8.0-2): video decoders, swscale, JPEG/raw frames and PCM out for Chapter Thumbnails and Subtitle Auto-Sync (#75, #72).
Changed
- SponsorBlock 1.1.0 (#73): skip notice with undo (
Alt+Shift+K); works for local files named with[video id](YouTube plugin downloads). - Scrobbler 1.1.0 (#77): Last.fm (desktop auth, signed scrobbles) alongside ListenBrainz; separate offline queue per service.
- Subtitle Auto-Sync 1.1.0 (#72): system alass first, else verified alass 2.0.0 + shared media ffmpeg download; manual offset nudging (
Alt+Z/Alt+X, larger steps with Shift) saved per file. - YouTube plugin 1.2.0: managed ffmpeg is Vivi’s minimal static build (~6 MB per platform instead of ~150 MB), checksums pinned (
helper-ffmpeg-v8.0-1). - Marketplace: real plugin screenshots (Xvfb), hidden cards stay hidden under category/search filters.
Downloads
| Platform | File |
|---|---|
| Linux (any distro) | Vivi-v0.10.0-x86_64.AppImage: chmod +x and run. libmpv is bundled. |
| Linux tarball | vivi-v0.10.0-linux-x86_64.tar.gz: needs mpv and sqlite installed. |
| Arch / Omarchy | PKGBUILD (vivi-bin): makepkg -si in a folder with it. |
| Linux Flatpak | vivi-v0.10.0-x86_64.flatpak: flatpak install --user vivi-v0.10.0-x86_64.flatpak (needs the Flathub remote for the runtime). |
| Windows x64 | vivi-v0.10.0-windows-x86_64.zip: unzip and run vivi.exe (libmpv-2.dll included). |
| macOS (Apple Silicon, experimental) | vivi-v0.10.0-macos-arm64.zip: unsigned; right-click → Open the first time. |
Checksums: SHA256SUMS.
Full Changelog: v0.9.1...v0.10.0
Vivi v0.9.1
Highlights: Discord Rich Presence and Remote Control become downloadable plugins with small native helpers, a new YouTube & yt-dlp plugin (playlists, sizes, downloads; manages its own yt-dlp and ffmpeg), an MCP server for AI agents, radio lyrics, a visualizer fed by mpv's real output, and the Inter font bundled in the Flatpak and AppImage.
Added
- MCP server for AI agents (#68): new
vivi-mcpbinary (stdio transport, std + serde_json only) that controls a running Vivi over a private local socket ($XDG_RUNTIME_DIR/vivi.sock, mode 0600). Tools: play/pause/stop, seek, volume, open file or URL, queue list/add/play/next/previous, now-playing status, library search, subtitles on/off, EQ presets; resourcesvivi://statusandvivi://playlist. Off by default: Settings → General → Remote control orVIVI_IPC=1. Docs with client configs indocs/mcp.mdand on the site; scripted client test intests/mcp.rs. - Radio lyrics (Lyrics plugin): on network streams, every change of the stream title (
icy-title, elsemedia-title) is parsed as "Artist - Title" (decorations like "(Radio Edit)" and "feat." dropped) and looked up on LRCLIB (/api/get, then/api/search, also matching "Title - Artist"). Ads, jingles, station IDs and titles equal to the station name are skipped; results are cached in memory and in~/.cache/vivi/lyrics(misses too). Plain lyrics are shown as a scrollable block because the song's start is unknown; the Radio lyrics setting can switch to Approximate sync (synced lines timed from the title change, plus Radio sync offset in seconds) or Off. - YouTube & yt-dlp plugin (
youtube): list a video or playlist URL into the playlist (Alt+Upastes from the clipboard), estimated size per quality, download video or audio only into a chosen folder with progress toasts. Uses a recent system yt-dlp, otherwise manages (verifies, updates) its own copy from the official GitHub releases. Vivi appends that copy's folder toPATH, so the Flatpak streams YouTube with it. - The YouTube plugin uses a system ffmpeg, or downloads a verified static ffmpeg + ffprobe (BtbN builds for Linux/Windows, osxexperts.net for macOS) only when a download needs it (1080p+ merging, mp3/m4a/opus conversion); only that managed copy is updated. Its size is shown in Browse and before it downloads.
- Flatpak and AppImage bundle the Inter UI font (
share/vivi/fonts, used throughSLINT_FONT_PATH); the Flatpak may reach Discord's IPC socket.
Changed
- Visualizer reads mpv's real output (#71): instead of decoding the file a second time with symphonia (local files only, EQ not reflected) and a synthetic animation for streams, a labelled
affilter (@vivi-viz, kept last in the chain) measures 48 log-spaced bands (30 Hz–14 kHz) with lavfibandpass+astatsand streams them, timestamped, to a localhost socket; the visualizer picks the frame matchingtime-pos. Works for network streams and reflects the EQ, compressor, reverb and other audio filters. The filter is only installed while a visualizer mode is showing. - Discord Rich Presence and Remote Control moved out of the core into downloadable plugins (
discord,remote-control, same ids so settings carry over). Each is a Lua script plus a small native helper (vivi-discord,vivi-remote, sources inhelpers/) that talks to mpv over its JSON IPC. Thediscord-rich-presencecrate is gone from Vivi. - Plugin packages can ship per-platform native helpers: manifest
binaries, catalogneeds/binarieswith one sha256 per platform asset, built by CI for Linux x86_64/aarch64, Windows x64 and macOS. Browse shows the size including the helper, or "Not available for ". - Packages get their folder as script-opt
<id>-pkgdir, can save their own settings (vivi-setting) and open a folder dialog (vivi-pick-folder); action settings can set a buttonlabel.
Fixed
- Downloadable plugins declared
min_vivi = 0.8.0, but packages exist only since 0.9.0; they now say 0.9.0 (new patch versions of A-B Loop, Night Mode, Playback Statistics, Scene Chapters, ListenBrainz Scrobbler, SponsorBlock, Subtitle Auto-Sync).
Downloads
| Platform | File |
|---|---|
| Linux (any distro) | Vivi-v0.9.1-x86_64.AppImage: chmod +x and run. libmpv is bundled. |
| Linux tarball | vivi-v0.9.1-linux-x86_64.tar.gz: needs mpv and sqlite installed. |
| Arch / Omarchy | PKGBUILD (vivi-bin): makepkg -si in a folder with it. |
| Linux Flatpak | vivi-v0.9.1-x86_64.flatpak: flatpak install --user vivi-v0.9.1-x86_64.flatpak (needs the Flathub remote for the runtime). |
| Windows x64 | vivi-v0.9.1-windows-x86_64.zip: unzip and run vivi.exe (libmpv-2.dll included). |
| macOS (Apple Silicon, experimental) | vivi-v0.9.1-macos-arm64.zip: unsigned; right-click → Open the first time. |
Checksums: SHA256SUMS.
Full Changelog: v0.9.0...v0.9.1
Vivi v0.9.0
Highlights: Network Streams (radio now-playing card and visualizer, IPTV via iptv-org, music genres and SomaFM, M3U import), a loading spinner and error toast for streams, physical-keycode shortcuts, chapter thumbnails, EQ preset import/export, Figma-accurate dialogs, filters and miniplayer, Discord Rich Presence and Remote Control, downloadable plugins (Auto-tagger, Free Music, ListenBrainz, Subtitle Sync, SponsorBlock, Scene Chapters, A-B Loop, Night Mode, Playback Stats), an AppImage cut from 106 MB to 44 MB, and a Flatpak build.
Added
- Equalizer per the Figma components frame (#45): preamp + 10 vertical band sliders (60 Hz–16 kHz) with editable dB boxes, ON/OFF switch, Open/Close Equalizer bar and a presets dropdown with VLC's 18 presets (Flat, Classical, Club, Dance, Full bass, Full bass & treble, …) and their icons, plus custom presets (New Preset, rename, delete; edits follow the selected custom preset). Applied as a labelled mpv
af(@vivi-eq, lavfivolume+equalizerchain; preamp uses VLC's convention, 12 dB = unity) and saved in~/.config/vivi/fx.toml. - Filter panels (#46) with collapsible Expand/Collapse Settings boxes: video adjustments (hue, brightness, contrast, saturation, gamma, sharpen, debanding, film grain), crop (top/bottom/left/right with link), colours & effects (colour extraction, colour threshold/chroma key, negate, posterize, gradient map, cartoon, sepia), audio compressor (RMS/peak, attack, release, threshold, ratio, knee, makeup), reverb and delay/echo. Each group is one labelled mpv
vf/aflavfi filter (@vivi-video,@vivi-crop,@vivi-color,@vivi-comp,@vivi-reverb,@vivi-delay), has Reset and persists infx.toml. - Open Network Stream dialog redrawn from Figma (#47): several links at once (one per line, validated), optional playlist name (saves an
.m3uand plays it), recent streams, yt-dlp hint kept. - New Playlist dialog (#48): title, thumbnail (saved next to the
.m3uand shown in the library), files by picker or drag & drop, remove before saving. Create playlist in the library opens it. - Miniplayer variants per Figma (#49): queue above the video with “N items · 2h 3m”, sort, remove-selected and add, drag handles to reorder and per-item lengths; compact overlay with ×/⧉ corners, centred transport and an edge progress bar; info strip with title, folder and subtitle track.
- Downloadable plugins: plugins no longer have to be built in. A package is a zip with
manifest.toml(id, name, semver version,min_vivi, entry script, permissions, settings) and an mpv Lua/JS script. The catalogplugins/index.json(published at https://loafer19.github.io/vivi/index.json) lists each package's download URL, sha256 and size. Design, options considered (mpv script packages now, WASM later, native libraries rejected) and the install/update model:docs/plugins-architecture.mdand the site page Plugin distribution. - Settings → Extensions tabs: Installed (built-in, downloaded, mpv scripts; Update / Roll back / Uninstall for packages) and Browse (catalog cards with version, author, size, permissions and Install / Update / Uninstall). Installing shows the requested permissions first. Downloads and catalog checks run on background threads; packages are verified against their sha256, unpacked safely into a staging folder and switched in atomically under
~/.local/share/vivi/plugins/<id>/<version>/, keeping the previous version for rollback. - Update checks: the catalog is fetched at startup at most once a day ("Check for plugin updates daily", on by default) or with Check now, cached in
~/.cache/vivi/plugin-index.json; a toast announces available updates.VIVI_PLUGIN_INDEXoverrides the catalog URL. - Package settings appear in Extensions like built-in ones and reach the script as mpv
script-opts(applied live); action settings are sent as script messages. - Three downloadable plugins: A-B Loop & Frame Step (#59), Night Mode (#60), Playback Statistics (#66).
- Keys Vivi does not use (and all
Altcombinations) are forwarded to mpv, so key bindings of scripts and packages work. scripts/package-plugins.pybuilds deterministic package zips and regenerates the index entries; the Plugins workflow checks Lua syntax and the index, publishes each new version as a releaseplugin-<id>-v<version>(never marked latest) and verifies the uploaded sha256.- Auto-tagger built-in plugin (#69, includes AcoustID tagging #65): identifies songs by Chromaprint fingerprint (
fpcalcwhen installed, else the bundledrusty-chromaprint) on AcoustID, or by tags / file name with a MusicBrainz search; MusicBrainz lookups (≤ 1 request/s, descriptive User-Agent) give title, artist, album, album artist, date, track, genre and ids, and the Cover Art Archive the front cover. A preview dialog lists candidates with a per-field diff; Write tags / Write all write with lofty. Originals are backed up once to~/.local/share/vivi/tag-backups/and Restore puts them back. Tag folder… batch-identifies a library folder and lists only confident matches. The AcoustID application key is an optional setting. - Free Music built-in plugin (#70): searches CC / public-domain music on the Internet Archive (no key) and Jamendo (client ID setting), shows each track's licence and attribution, previews the stream in the player and downloads to
~/Music/Free Music/<Artist>/with tags, cover, licence URL and attribution (also in a.licence.txt). - Network Streams built-in plugin (#67): a streams browser (separate from the Open Network Stream dialog) with Internet radio from radio-browser.info (search, top voted, by country, by genre; no key), M3U / IPTV playlist import from a file or URL, saved and recent streams, and stream info (ICY title, codec, bitrate, buffer).
- Audio-only network streams show a Now playing card (station name and logo, current ICY title, codec / bitrate / sample rate) and the visualizer animates from a synthetic signal, since streams cannot be decoded a second time.
- With M3U / IPTV playlist selected, text that is not a file or URL searches radio stations by name and genre instead (the source switches to Radio: search); Choose file… picks a playlist; the placeholder follows the source; percent-encoded names (
01.%20J.%20S.%20BACH…) are decoded.
- Discord Rich Presence built-in plugin (#57, off by default): title, artist and progress in Discord via its IPC socket (
discord-rich-presencecrate, worker thread, reconnects), privacy option to hide names; needs a Discord application ID. - Remote Control built-in plugin (#58, off by default): local web page for phones (play/pause, seek, volume, previous/next, queue, cover art), LAN-only connections, PIN with lockout, port setting. No new dependencies (std TCP server).
- Subtitle Auto-Sync package (#56):
Alt+Y/ Sync current subtitle aligns the selected external subtitle to the audio withalass(oralass-cli) orffsubsync, whichever is installed, in the background; the result is saved as<name>.synced.<ext>next to the original and loaded. A clear message with install hints when neither tool is found. - SponsorBlock package (#64): skips sponsor / self-promotion / interaction (configurable) segments in YouTube streams, automatically or on
Alt+K, and marks them as chapters on the seek bar. Uses the privacy-preserving hash-prefix API; no key. - Scene Chapters & Thumbnails package (#62): ffmpeg scene detection (
Alt+Jor automatic) addsScene Nchapters to videos without chapters and saves a JPEG thumbnail per chapter, cached under~/.local/share/vivi/plugin-data/scene-chapters/. - ListenBrainz Scrobbler package (#63): now playing, listens after 50 % or 4 min, offline queue sent in batches, status and Send queued listens now actions. Last.fm is not included (needs a signed browser auth flow).
- Network Streams: TV (iptv-org): TV: by country and TV: by category list the iptv-org countries/categories (iptv-org.github.io/api); Play on one loads its playlist (cached for a day in
~/.cache/vivi/iptv/), typing filters channels by name, rows show channel logos, and channels play as video. A word typed into the M3U source now searches iptv-org channels instead of radio stations; pasted URLs and files still import as before. - Network Streams: music: Music: genres browses radio-browser.info tags by station count plus Popular (top voted) and Trending (top clicked) and opens the top stations of a genre; Music: SomaFM lists SomaFM channels with logos.
- Stream loading overlay (core player): while a network stream opens or buffers (before the first frame/audio, or paused for cache) a spinner with the stream name is shown instead of a black screen; it hides on playback start, and a failed open shows an error toast.
- Equalizer preset import/export (#61): custom presets can be exported to and imported from JSON files.
- Chapter thumbnails (#62): the side panel's Chapters list shows the thumbnails saved by Scene Chapters.
- Packaging: Flatpak manifest, AppStream metainfo and a CI job that builds a
.flatpakbundle (#29). The AppImage now bundles a slim libmpv (decoders-only FFmpeg, no mpv CLI, zstd -19), cutting it from 106 MB to 44 MB; the Windows zip is smaller too.
Fixed
- Shortcuts with modifiers are forwarded to mpv by physical key (winit KeyCode mapped to US-QWERTY mpv names), so they work with any keyboard layout; the Cyrillic table stays as a fallback.
- Plugin package key combos (A-B Loop Alt+A/B/C, Night Mode Alt+N, Statistics Alt+S) gave no feedback on Wayland: mpv's OSD is only drawn into the video frame, so with no video (idle, audio files, UI on top) their messages were invisible. Packages now also send
script-message vivi-toast <text>, which Vivi shows as a toast (A-B Loop 1.0.1, Night Mode 1.0.2, Playback Statistics 1.0.1). - Alt/Ctrl combos t...
Plugin youtube 1.2.0
Vivi plugin package youtube 1.2.0. Install it from Settings → Extensions → Browse. sha256: a3d40879ab81380ba8f8453d015a9b302f5d2e1a23d733981b41637742e64857
Plugin youtube 1.1.2
Vivi plugin package youtube 1.1.2. Install it from Settings → Extensions → Browse. sha256: ee4751481313a840f177595bea35ba8f1044d2a1975690a9fc07eab71afa3b62
Plugin youtube 1.1.1
Vivi plugin package youtube 1.1.1. Install it from Settings → Extensions → Browse. sha256: 86148757d5ca3dcb93a79d2bf07ac3e26388fadfe92a1d4eb4235fe169693cdd
Plugin youtube 1.1.0
Vivi plugin package youtube 1.1.0. Install it from Settings → Extensions → Browse. sha256: 9c2c5fb4f702cc1b37c577e0de634bc1e6814a2bb725e6991a0cf84246be2385
Plugin youtube 1.0.0
Vivi plugin package youtube 1.0.0. Install it from Settings → Extensions → Browse. sha256: 19f02c796ff0e8e887be5e1d2d6a95e83fe771794e5ebd0292a5f622c680b07d
Plugin subtitle-sync 1.1.0
Vivi plugin package subtitle-sync 1.1.0. Install it from Settings → Extensions → Browse. sha256: 322de5e9e22069c36c1b16ab7361a8bad32ad8eab6bfbf7710a97d1c4cab3d1d
Plugin subtitle-sync 1.0.1
Vivi plugin package subtitle-sync 1.0.1. Install it from Settings → Extensions → Browse. sha256: 36aeb9d0a9012dcede8c99d3ce5aabb7cae037282b2557cb7f1a9a07a52f7c11

