Terminal user interface for SomaFM internet radio
Project description
SomaFM TUI Player
SomaFM TUI Player is a modern terminal application for listening to SomaFM โ the legendary internet radio with over 40 unique channels.
The app combines a minimalist interface, rich features, and low resource consumption, making it ideal for terminal-based workflows.
๐ Features
Core Features
- ๐ป 40+ Radio Channels โ Access all SomaFM channels directly from your terminal
- ๐ต Track Metadata โ Real-time display of artist and track title
- โค๏ธ Favorites โ Save favorite channels with local persistence
- ๐จ Color Themes โ 20+ built-in themes (dark and light)
- ๐ Volume Control โ Adjust volume and mute toggle
- โฑ Sleep Timer โ Auto-shutdown with configurable timer
- ๐ Search โ Quick channel search by name and description
- ๐ Usage-Based Sorting โ Channels sorted by listening history
System Integration
- ๐ง MPRIS/D-Bus โ Linux media keys integration (play/pause/next/previous)
- ๐ฅ System Tray โ System tray support (via compatible environments)
- โจ๏ธ Vim Navigation โ
j/kkey navigation for Vim users - ๐ฆ AUR Package โ Easy installation on Arch Linux via AUR
๐ฆ Installation
Arch Linux (Recommended)
Install from AUR (Arch User Repository):
paru -S somafm_tui
# or
yay -S somafm_tui
Manual installation from AUR:
git clone https://aur.archlinux.org/somafm_tui.git
cd somafm_tui
makepkg -si
After installation, run the app with:
somafm-tui
Installation from Source
# Clone the repository
git clone https://github.com/zsh-ncursed/somafm_tui.git
cd somafm_tui
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run the application
python -m somafm_tui
Installation via pip
Install directly from PyPI (when available):
pip install somafm-tui
Or install from the repository:
pip install git+https://github.com/zsh-ncursed/somafm_tui.git
After pip installation, the somafm-tui command will be available in your PATH.
Shell Scripts
Quick launch using provided scripts:
# Fish shell
./somafm.fish
# Bash/Zsh
./somafm.sh
Dependencies
- Python 3.8+
- MPV โ Media player for stream playback
- python-requests โ HTTP client for API requests
- python-mpv โ MPV Python bindings
- python-dbus-next โ D-Bus integration for MPRIS (optional)
Installing Dependencies on Different Distributions
Arch Linux:
sudo pacman -S python mpv python-requests python-mpv python-dbus-next
Ubuntu/Debian:
sudo apt-get install python3 python3-pip mpv libmpv-dev
pip install requests mpv dbus-next
Fedora:
sudo dnf install python3 python3-pip mpv mpv-libs
pip install requests mpv dbus-next
โจ๏ธ Controls
Interactive Mode
Launch the application:
somafm-tui
Navigation
| Key | Action |
|---|---|
โ / โ or j / k |
Navigate channel list |
Enter or l |
Play selected channel |
PgUp / PgDn or v / b |
Increase/decrease volume |
/ |
Search channels |
? |
Toggle help window |
Esc |
Exit search / close help |
f |
Add current track to favorites |
Ctrl+F |
Toggle channel favorite (heart icon) |
t |
Cycle through color themes |
q |
Quit application |
Playback
| Key | Action |
|---|---|
Space |
Toggle play/pause |
h |
Stop playback |
r |
Cycle bitrate (if available) |
s |
Set sleep timer |
Command-Line Interface
The application supports various CLI arguments for automation and quick actions:
# Show help
somafm-tui --help
# List all available channels
somafm-tui --list-channels
# Search for channels
somafm-tui --search "drone"
# Show favorite channels
somafm-tui --favorites
# List available themes
somafm-tui --list-themes
# Play specific channel with custom settings
somafm-tui --play dronezone --volume 70 --theme dracula
# Set sleep timer from command line
somafm-tui --sleep 30
# Disable MPRIS integration
somafm-tui --no-dbus
# Combine multiple options
somafm-tui -p groovesalad -v 50 -t monochrome -s 60
MPRIS (Media Keys)
When D-Bus support is enabled (dbus_allowed: true in config), the app responds to system media keys:
- Play/Pause โ Toggle playback
- Next โ Next channel
- Previous โ Previous channel
- Stop โ Stop playback
โ๏ธ Configuration
Config File
Configuration is stored in ~/.somafm_tui/somafm.cfg
# Configuration file for SomaFM TUI Player
#
# theme: Color theme
# dbus_allowed: Enable MPRIS/D-Bus support for media keys (true/false)
# dbus_send_metadata: Send channel metadata over D-Bus (true/false)
# dbus_send_metadata_artworks: Send channel picture with metadata over D-Bus (true/false)
# dbus_cache_metadata_artworks: Cache channel picture locally for D-Bus (true/false)
# volume: Default volume (0-100)
#
[somafm]
theme = default
dbus_allowed = false
dbus_send_metadata = false
dbus_send_metadata_artworks = false
dbus_cache_metadata_artworks = true
volume = 100
Configuration Examples
Basic setup with custom volume:
[somafm]
theme = dracula
volume = 80
dbus_allowed = false
Full MPRIS integration (Linux desktop):
[somafm]
theme = github-dark
dbus_allowed = true
dbus_send_metadata = true
dbus_send_metadata_artworks = true
dbus_cache_metadata_artworks = true
volume = 70
Minimal configuration (no D-Bus, default theme):
[somafm]
theme = default
dbus_allowed = false
volume = 100
Available Themes
Run somafm-tui --list-themes to see all available themes:
Dark Themes
| Theme | Description |
|---|---|
default |
Default Dark โ Classic dark theme with high contrast |
dracula |
Dracula โ Popular dark theme with pink and cyan accents |
github-dark |
GitHub Dark โ GitHub's official dark theme |
gruvbox |
Gruvbox Dark โ Retro terminal theme with warm colors |
monokai |
Monokai Pro โ Vibrant theme with pastel colors |
nord |
Nord โ Arctic blue theme with cool tones |
one-dark |
One Dark โ Atom's default dark theme |
solarized-dark |
Solarized Dark โ Balanced contrast with cyan/blue |
tokyo-night |
Tokyo Night Storm โ Deep blue/purple theme |
ayu-dark |
Ayu Dark โ Minimal dark theme with bright accents |
ayu-mirage |
Ayu Mirage โ Dark theme with warm sunset colors |
night-owl |
Night Owl โ Dark theme optimized for late night coding |
catppuccin |
Catppuccin Mocha โ Pastel dark theme |
cobalt |
Cobalt โ Classic blue dark theme |
zenburn |
Zenburn โ Low contrast dark theme |
everforest |
Everforest Dark โ Nature-inspired dark theme |
kanagawa |
Kanagawa Dragon โ Japanese-inspired dark theme |
snazzy |
Snazzy โ Hyper terminal's popular theme |
monochrome-dark |
Monochrome โ Pure black and white theme |
Light Themes
| Theme | Description |
|---|---|
one-light |
One Light โ Atom's light theme |
github-light |
GitHub Light โ GitHub's official light theme |
solarized-light |
Solarized Light โ Balanced contrast light theme |
ayu-light |
Ayu Light โ Clean light theme with orange accents |
material-light |
Material Light โ Google Material Design light theme |
See themes.json for complete color definitions.
Enabling MPRIS
For Linux media keys integration, set:
dbus_allowed = true
dbus_send_metadata = true
The app will then appear in media control systems (GNOME, KDE, etc.)
๐ Data Structure
Directories
| Path | Purpose |
|---|---|
~/.somafm_tui/somafm.cfg |
Configuration file |
~/.somafm_tui/channel_favorites.json |
Favorite channels |
~/.somafm_tui/channel_usage.json |
Listening history |
/tmp/.somafmtmp/ |
Temporary files and cache |
/tmp/.somafmtmp/cache/ |
Channel cache |
Data Formats
Favorites (channel_favorites.json):
["dronezone", "beatblender", "groovesalad"]
History (channel_usage.json):
{
"dronezone": 1709481600,
"beatblender": 1709395200
}
๐ง Troubleshooting
Error: "MPV player is not installed"
Ensure MPV is installed on your system:
# Check installation
mpv --version
# Install (Arch Linux)
sudo pacman -S mpv
# Install (Ubuntu/Debian)
sudo apt-get install mpv
# Install (Fedora)
sudo dnf install mpv
Error: "Failed to fetch channels"
Check your internet connection and SomaFM API availability:
# Test API connectivity
curl https://api.somafm.com/channels.json
# Check DNS resolution
ping api.somafm.com
# If using a firewall, ensure outbound HTTPS (port 443) is allowed
Solutions:
- Check your internet connection
- Verify SomaFM API is accessible:
curl -I https://api.somafm.com/channels.json - If behind a proxy, set environment variables:
export HTTP_PROXY=http://proxy:port export HTTPS_PROXY=https://proxy:port
- Clear channel cache and retry:
rm -rf /tmp/.somafmtmp/cache/channels.json somafm-tui
Error: "No channel playing" or playback issues
-
Check stream URL availability:
# Test stream connectivity mpv --really-verbose "https://ice1.somafm.com/dronezone-128-mp3"
-
Reset configuration:
rm ~/.somafm_tui/somafm.cfg somafm-tui -
Check audio output:
- Ensure system volume is not muted
- Verify audio device is selected correctly in MPV
Emojis Display Incorrectly
The app automatically uses ASCII symbols in terminals without Unicode support. To force ASCII, ensure TERM is set correctly:
export TERM=xterm-256color
Add to your shell configuration (~/.bashrc or ~/.zshrc):
export TERM=xterm-256color
MPRIS Not Working
- Ensure
dbus_allowed = truein config - Verify
python-dbus-nextis installed:pip show dbus-next
- Check D-Bus service is running:
systemctl --user status dbus
- Verify app appears in media controllers:
playerctl --list-all - Restart the application after configuration changes
Sleep Timer Not Working
- Maximum sleep timer is 480 minutes (8 hours)
- Check if timer is active: look for
โฑ MM:SSin bottom right corner - Cancel and re-set timer if needed:
- Press
sto open sleep overlay - Enter minutes (1-480)
- Press Enter to confirm
- Press
High CPU Usage
-
Disable MPRIS if not needed:
dbus_allowed = false
-
Reduce cache update frequency (if applicable)
-
Check for background processes:
ps aux | grep somafm
Logs and Debugging
Enable verbose logging:
somafm-tui --verbose
View logs:
# Real-time log viewing
tail -f /tmp/.somafmtmp/somafm.log
# Last 50 lines
tail -n 50 /tmp/.somafmtmp/somafm.log
Common log messages:
Using cached channelsโ Cache is working correctlyTimeout fetchingโ Network issues, retrying automaticallyMPRIS service disabledโ D-Bus integration is off (expected ifdbus_allowed = false)
๐ Screenshots
(Add screenshots to the docs/ folder)
๐ค Contributing
We welcome contributions! Please read CONTRIBUTING.md before submitting pull requests.
Reporting Bugs
- Check existing issues first
- Include app version (
somafm-tui --versionor from PKGBUILD) - Attach logs from
/tmp/.somafmtmp/somafm.log
Feature Requests
- Describe the desired functionality
- Explain how it improves user experience
๐ License
Distributed under the MIT License. See LICENSE for details.
๐ Acknowledgments
- SomaFM โ For amazing radio and open API
- python-mpv โ For excellent MPV Python bindings
- dbus-next โ For modern D-Bus library for Python
๐ฌ Contact
- GitHub: zsh-ncursed/somafm_tui
- AUR: somafm_tui
- Email: zsh.ncursed@gmail.com
๐บ Roadmap
- Listening history export
- Last.fm integration (scrobbling)
- Support for other streaming services
- GUI settings via ncurses dialogs
Made with โค๏ธ for quality internet radio lovers
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file somafm_tui-0.7.0.tar.gz.
File metadata
- Download URL: somafm_tui-0.7.0.tar.gz
- Upload date:
- Size: 86.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a52634380bc1691ecbb392e046ebc089a74dfeafa0561df9d05438c182917e5
|
|
| MD5 |
ad0f46203e812a32b9935b79a4c37f58
|
|
| BLAKE2b-256 |
a1282c50a47fe6b5990bd83ced8f9020b8259a8cc14b2a52e5bee995c836cc0a
|
File details
Details for the file somafm_tui-0.7.0-py3-none-any.whl.
File metadata
- Download URL: somafm_tui-0.7.0-py3-none-any.whl
- Upload date:
- Size: 58.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6b27177507ec5ef20878c30a84ec965406f6627029ead572bf69e88546fe919
|
|
| MD5 |
a130adb6ccbb2f4c7c99fba569c5d0c9
|
|
| BLAKE2b-256 |
521f6c49b51ff1c6c07e28b67b2bd49337318a65a99e6c8fddb0ed44f74717e8
|