Terminal Music and Podcast Player written in Rust

March 30, 2026 ยท View on GitHub

Build status crates.io dependency status MSRV

Listen to music and podcasts freely as both in freedom and free of charge!

Main view Tag editor

Freedom: As time goes by, online service providers control pretty much everything we listen to. Complicated copyright issues make things worse. If my favorite song cannot be found on a website, I'll probably just not listen to them for years.

Free of charge: You can download from YouTube, NetEase, Migu and KuGou for free. No need to register for monthly paid memberships.

As a contributor of GOMU, I met serious problems during development. The main problem is data race condition. So I rewrote the player in rust, and hope to solve the problem.

Supported Formats

Below are the audio formats supported by the various backends.

In the case that metadata is not supported, an attempt will still be made to play the file.

ContainerRustyMPVGstreamerMetadata
MP4 / M4AYesYesYesYes
MP3YesYesYesYes
OGGYesYesYesYes
FLACYesYesYesYes
ADTSYesYesYesYes
WAV / AIFFYesYesYesYes
CAFYesYesYesNo
MKV / WebMYesYesYesNo
CodecRustyMPVGstreamer
AAC-LCYesYesYes
HE-AACNoYesYes
MP3 / MP2 / MP1YesYesYes
FLACYesYesYes
WAVYesYesYes
VORBISYesYesYes
OPUSNo*1YesYes
ADPCMYesYesYes
PCMYesYesYes

*1: Opus codec is supported in rusty backend if feature rusty-libopus is enabled.

Installation

Requirements

MSRV

The minimal Rust version required to build this project is 1.88.0.

Note that using non-default features might increase the MSRV.

Dependencies

Linux
Package name (ubuntu)Package name (arch)RequiredBuild-time-onlyFeatureDescriptionMSRV
gitgitXXversion control
clangclangXXGeneral Build tools (and sqlite compile)
protobuf-compilerprotobufXXcommunication protocol between server and client(tui)
libdbus-1-devdbusXunknownMPRIS media control
libasound2-devalsa-libXunknownALSA headers
yt-dlpyt-dlpDownload some tracks
ffmpegffmpegPost-Processing for yt-dlp
mpvmpvmpvMPV Backend
gstreamergstreamergstGstreamer Backend
libopuslibopusXrusty-libopusOpus codec support in rusty backend1.89.0
ueberzugppueberzugppcover-ueberzugUeberzug protocol support
libstdc++6gcc-libsrusty-soundtouchSoundtouch requires linking to libstdc++

Windows

All the packages here can be installed via various sources, for ease of install the winget package name is listed.

Package name (winget)Alternative SourceRequiredBuild-time-onlyFeatureDescriptionMSRV
Git.GitXXversion control
Microsoft.VisualStudio.BuildToolsXXGeneral Windows (C++) build tools
Google.ProtobufXXcommunication protocol between server and client(tui)
yt-dlpDownload some tracks
ffmpegPost-Processing for yt-dlp
unknownmpvMPV Backend
unknowngstGstreamer Backend
unavailablelibopus official siteXrusty-libopusOpus codec support in rusty backend1.89.0
see list belowXrusty-soundtouchSoundtouch requires linking to libstdc++
Windows rusty-soundtouch

Compiling feature rusty-soundtouch on windows requires a bunch extra dependencies that are otherwise not required.

It is recommended to just use the pre-built binaries by Github Actions to avoid installing ~2GB of extra C++ Dependencies and potentially having to mess around with dependencies.

If you actually still wanted to compile this yourself, you will need:

  1. Install C++ CMake tools for Windows via Microsoft.VisualStudio.BuildTools (or also known as Visual Studio Installer)
  2. Install a Clang compiler At the time of writing, Microsoft.VisualStudio.BuildTools does not provide a clang.dll / libclang.dll, which the cc crate needs for building C++. Instead, simply install llvm via winget: winget install llvm

This should be everything and feature rusty-soundtouch should compile without problems.

Backends

Default backend: rusty

BackendRequirements
Symphonia(rusty)On Linux libasound2-dev is required for building.
GStreamerGStreamer
MPVMPV

There are extra features for some backends: Note that they are not enabled by default and potentially increase non-rust dependencies.

FeatureBackendDescriptionExtra DependenciesMSRV
rusty-simdrustyEnable SIMD instructions
rusty-soundtouchrustyEnable soundtouch compilation and use as default speed-modifier
rusty-libopusrustyEnable libopus support to support opus fileslibopus1.89.0

Album cover support

To display covers in the terminal itself, feature cover can be enabled. To only enable specific protocols for cover support, see tui/Cargo.toml#features.

Feature cover-ueberzug will require some ueberzug implementation to be present at runtime.

Files

Configuration

Configuration files can be found in:

SystemPath
Linux~/.config/termusic/
Mac~/Library/Application Support/termusic/
Windows%APPDATA%\termusic\

Files & Folders:

PathsDescription
server.tomlFor server configuration
tui.tomlFor TUI configuration
themes/Extra Themes to be selected in the Config Editor
playlist.logThe Playlist storing the current playlist/queue
library2.dbThe Indexed Music library
data.dbThe Podcast Database

Logs

By default logs can be found in:

SystemPath
Linux/tmp/
Mac/tmp/(?)
Windows%TMP%\

Files:

FilesDescription
termusic-server.logThe server logs
termusic-tui.logThe TUI logs

The default log level is WARNING (can be changed via RUST_LOG).

Note that log files are only created on the first log line to be saved.

Official Install Sources

Cargo

cargo install termusic termusic-server --locked

cargo-binstall

cargo binstall termusic termusic-server

From Source

git clone https://github.com/tramhao/termusic.git
cd termusic
make

Then install with:

make install

By default, termusic can display album covers in Kitty or iTerm2. If you need album covers displayed on other terminals, you can enable the sixel protocol or use a ueberzug implementation(x11/xwayland only).

To build all backends and all cover protocols and install them in your home:

make full

Finally, you can run it with:

~/.local/share/cargo/bin/termusic

To build with all backends and all cover protocols without copying binaries elsewhere:

make all-backends

Unofficial Install Sources

The following are ways to install termusic, but may differ in configuration and support.

They are not maintained by the termusic project itself.

Arch Linux

Arch Linux users can install termusic from the official repositories using pacman.

pacman -S termusic

Arch Linux GIT (AUR)

Arch Linux users can install termusic-git from the AUR using pamac or any other AUR helper.

pamac install termusic-git

macOS

macOS users can install termusic from Homebrew through its Formula

brew install termusic

NetBSD

NetBSD users can install termusic from the official repositories.

pkgin install termusic

Nix/NixOS

Either in the user's environment:

nix-env --install termusic

Or declaratively in /etc/nixos/configuration.nix:

{
    environment.systemPackagess = with pkgs; [
      ...
      termusic
    ];
}

Availability

Packaging status

TODO

  • Better interface to adjust timestamp of lyric.
  • Rating and sync support.
  • Multiple root and easy switch.
  • Save playlists.
  • Listen to rss feeds/Podcasts. Need a new layout.

Contributing and issues ๐Ÿค๐Ÿป

Contributions, bug reports, new features and questions are welcome! ๐Ÿ˜‰ If you have any question or concern, or you want to suggest a new feature, or you want just want to improve termusic, feel free to open an issue or a PR.

Please follow our contributing guidelines

Contributors

hasezoey

Thanks

License

MIT License for main part of code. GPLv3 for Podcast code under lib/src/podcast/mod.rs. Comes from shellcaster.