termusic logo

termusic

Terminal music and podcast player in Rust with a server/TUI split, rusty, MPV and GStreamer backends, tag editor, and YouTube downloads via yt-dlp.

termusic is a terminal music and podcast player written in Rust. It was started as a rewrite of the Go player GOMU to avoid data race problems. It has a TUI frontend that talks to a separate server over a protobuf-based protocol, and it includes a built-in tag editor and a podcast database.

Playback is handled by one of three backends. The default is rusty, which is based on Symphonia. MPV and GStreamer backends can be enabled with the mpv and gst features. The README gives a per-backend support matrix covering MP4/M4A, MP3, OGG, FLAC, ADTS, WAV/AIFF, CAF and MKV/WebM containers. It also covers the AAC, MP3, FLAC, Vorbis, Opus, ADPCM and PCM codecs. Opus in the rusty backend needs the rusty-libopus feature. The rusty-soundtouch feature enables SoundTouch as the speed modifier. MPRIS media control is supported through D-Bus on Linux.

Tracks can be downloaded from sources such as YouTube, NetEase, Migu and KuGou using yt-dlp, with ffmpeg for post-processing. Album covers can be shown inside the terminal with the cover feature, or through an Ueberzug implementation with cover-ueberzug. Configuration lives in server.toml and tui.toml, plus a themes/ directory, under ~/.config/termusic/ on Linux, ~/Library/Application Support/termusic/ on macOS and %APPDATA%\termusic\ on Windows. It is aimed at users who want a local, terminal-based music and podcast library on Linux, macOS or Windows.

termusic main view

termusic tag editor

Alternatives & related tools

add a badge to your README

Maintain termusic? Show that it's featured on trmn. The badge links back to this page.

Featured on trmn
Markdown
[![Featured on trmn](https://www.trmn.sh/badge/termusic.svg)](https://www.trmn.sh/tools/termusic?utm_source=badge)
HTML
<a href="https://www.trmn.sh/tools/termusic?utm_source=badge"><img src="https://www.trmn.sh/badge/termusic.svg" alt="Featured on trmn" height="20"></a>