Frank Stellmacher 06140a490b feat(queue): add Now-Playing Info tab with artist bio, song credits and Bandsintown tour dates (#244)
* feat(queue): add Now-Playing Info tab with artist bio, song credits and Bandsintown tour dates

A third tab in the right-side queue panel surfaces context for the
currently playing track:

- Artist card: image + biography from Subsonic getArtistInfo (Last.fm
  "Read more on Last.fm" anchor stripped), with read-more toggle that
  only appears when the bio actually overflows the 4-line clamp.
- Song info: contributor credits from OpenSubsonic contributors[]
  rendered stacked (name prominent, role muted). Section is hidden
  entirely on servers without contributor support, and rows that just
  re-state the main artist under role "artist" are filtered out.
- On tour: optional Bandsintown integration (opt-in, off by default).
  HTTP fetch + JSON parsing happen entirely on the Rust side; the
  frontend wrapper deduplicates concurrent calls and caches results in
  RAM for the session. Limited to 5 events with a "Show N more" toggle.
  When the toggle is off, the section becomes an in-place opt-in card
  with a privacy info-tooltip explaining what data is sent — same
  tooltip is also exposed on the matching toggle in Settings.

Caching: artist info and song detail are memoised by stable IDs across
component remounts, so jumping between tracks of the same album/artist
does not refire the network calls.

Implementation notes:
- Bandsintown app_id "js_app_id" — arbitrary strings (e.g. "psysonic")
  now return HTTP 403 from rest.bandsintown.com; js_app_id is the ID
  Bandsintown's own embeddable widget uses and is broadly accepted.
- Tour items use negative left/right margins so the date badge stays
  visually aligned with the section title while the hover background
  extends slightly past the section edges.
- New i18n namespace nowPlayingInfo across all 8 locales (en, de, fr,
  nl, zh, nb, ru, es) including pluralised "Show N more" forms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(now-playing-info): switch nested flex-columns to block layout to stop content-dependent drift

Repeated reports of the Tour and Song-info sections rendering at
inconsistent x-positions (sometimes left of the section title,
sometimes centred, sometimes correctly aligned) — varying by artist,
sidebar width, and even whether "Show more" was clicked.

Root cause: nested flex-direction: column containers
(.np-info → .np-info-section → .np-info-tour / .np-info-credits) where
the cross-axis (horizontal) sizing on WebKitGTK occasionally inherits
the intrinsic min-content of the longest child. With one
"Naherholungsgebiet/Freizeitgelände Lago Alfredo"-style venue name
that overflows the sidebar, the parent ul gets pushed past 100% width
and the entire layout drifts. min-width: 0 on every level didn't help
because cross-axis stretch in flex-column ignores it for content-driven
overflow.

Fix: collapse all the section/list containers to display: block. Block
layout is content-agnostic — children always render at 100% parent
width, left-aligned, deterministically. Spacing between siblings now
uses the lobotomy selector (`> * + * { margin-top }`).

Only the tour item itself stays flex (badge ↔ meta horizontal layout),
and that one still has overflow: hidden + flex: 1 1 0 + min-width: 0
on the meta column to truncate venue/place text with ellipsis.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Psychotoxical <dev@psysonic.app>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 19:13:18 +02:00
2026-04-20 23:34:05 +02:00
2026-04-19 14:23:14 -03:00
2026-04-20 23:34:05 +02:00

Psysonic Logo

A modern, gorgeous, and blazing fast desktop client for Subsonic API compatible music servers (Navidrome, Gonic, etc.).

Latest Release License: GPL v3 Built with Tauri AUR AUR (bin) Cachix Discord

Warning

Psysonic is under heavy active development. Bugs and rough edges are to be expected. We reserve the right to change, remove, or rework existing features at any time without prior notice.


Join Discord

Have questions, ideas, or just want to hang out? Come chat in our Discord server!


Psysonic is a beautiful desktop music player built completely from the ground up for the modern era. Utilizing Tauri v2 and React, it offers a native-feeling, lightweight, and incredibly fast experience with a stunning UI inspired by the Catppuccin and Nord aesthetics.

Designed specifically for users hosting their own music via Navidrome or other Subsonic API servers, Psysonic aims to be the best way to interact with your personal library.

Psysonic Screenshot

Features

  • 🎨 Wide Theme Selection: Dozens of themes across 8 groups — Open Source Classics (Catppuccin, Nord, Gruvbox, Nightfox, Dracula), Operating Systems, Games, Movies, Series, Social Media, and Psysonic originals. Glassmorphism effects, micro-animations, and a time-based Theme Scheduler for automatic day/night switching.
  • Native Performance: Built with Rust & Tauri — native audio engine (rodio), minimal RAM usage, no Electron overhead.
  • 🎵 Last.fm Integration: Scrobbling, Now Playing, love/unlove, Similar Artists, and top stats — no Navidrome config needed.
  • 🎤 Synchronized Lyrics: Auto-scrolling synced lyrics with click-to-seek in the sidebar and fullscreen player, powered by LRCLIB and your Navidrome server.
  • 📻 Radio & Infinite Queue: Smart Radio sessions from any song or artist, built-in Internet Radio (ICY/HLS), and an Infinite Queue that silently refills when the queue runs out.
  • 🎛️ Advanced Audio: 10-band graphic EQ with custom presets, AutoEQ headphone correction, Replay Gain, gapless playback, and crossfade.
  • 〰️ 10 Seekbar Styles: Waveform, Bar, Thick Bar, Segmented, Line+Dot, Neon, Pulse Wave, Particle Trail, Liquid Fill, and Retro Tape.
  • 🖥️ Fullscreen Player: Album art, animated synced lyrics overlay, and artist image in a dedicated fullscreen view.
  • 📋 Playlists & Library: Full playlist management with drag-and-drop reorder and smart suggestions. Genre browsing, Random Mix, Advanced Search, ratings (15 stars), and multi-select actions.
  • 💾 Device Sync: Export your library to a USB drive or portable device using a configurable filename template.
  • 🖥️ CLI Control: Control playback, switch servers, manage the queue, and more directly from the command line.
  • ⌨️ Customization: Configurable keybindings, UI fonts, global zoom slider, system tray, backup & restore, and in-app auto-update.
  • 🌍 8 Languages: English, German, French, Dutch, Spanish, Chinese, Norwegian, Russian.
  • 🖥️ Cross-Platform: Windows, macOS, and Linux (Arch AUR, .deb, .rpm, NixOS flake).
  • ❄️ NixOS / flakes: First-class flake package with a public Cachix binary cache (psysonic.cachix.org) — nix run github:Psychotoxical/psysonic or add to your system config. See the NixOS install guide.

🗺️ Roadmap

📋 Planned

  • Theme contrast & legibility audit — systematic review of text/background contrast ratios across all themes
  • Accessibility (a11y) — keyboard navigation, screen reader support, ARIA labels
  • More languages

📥 Installation

Navigate to the Releases page and download the installer for your operating system.

🐧 Linux

Quick Install (Recommended):

curl -fsSL https://raw.githubusercontent.com/Psychotoxical/psysonic/main/scripts/install.sh | sudo bash

Manual Installation:

  • Ubuntu / Debian: .deb from GitHub Releases
  • Fedora / RHEL: .rpm from GitHub Releases
  • Any distro (portable): .AppImage from GitHub Releases — chmod +x and run, no install required

Arch Linux (AUR):

Package Type Description
psysonic Source Builds from source using your system's native WebKitGTK (no bundled libs, no EGL/Mesa compatibility issues).
psysonic-bin Binary Pre-compiled version for faster installation.

Tip

The AUR binary package is kindly provided and maintained by kilyabin.

❄️ NixOS (flakes):

🍎 macOS

  • macOS: .dmg (Universal or Apple Silicon) — signed with an Apple Developer ID and notarized by Apple. Gatekeeper opens it with a single click, no xattr workaround required.

Note

Since v1.40.0, macOS builds include an in-app auto-updater: click Install now in the update notification and the signed .app.tar.gz is fetched, verified against the bundled minisign public key, replaced in place, and the app relaunches — all in one step.

🪟 Windows

  • Windows: .exe (NSIS installer)

Warning

SmartScreen Note: Windows SmartScreen might show a warning because the installer isn't signed with an expensive developer certificate. Click on "More info" and then "Run anyway".

🚀 Getting Started

  1. Download and install Psysonic.
  2. Open the app and enter your Subsonic/Navidrome server details (URL, Username, Password).
  3. If applicable, you can provide both an external URL and a local LAN IP. Psysonic allows you to quickly toggle between them in the Settings.
  4. Enjoy your music!

🛠️ Development

If you want to build Psysonic from source or contribute to the project:

Prerequisites

  • Node.js (v18+)
  • Rust (v1.75+)
  • cmake — required to compile the bundled libopus (Opus audio support). Install it before running cargo build or npm run tauri:build:
    • Linux: sudo apt install cmake / sudo pacman -S cmake
    • macOS: brew install cmake
    • Windows: cmake.org/download or winget install cmake
  • OS-specific build dependencies for Tauri (see the Tauri prerequisites guide).

Setup

# Clone the repository
git clone https://github.com/Psychotoxical/psysonic.git
cd psysonic

# Install node dependencies
npm install

# Run in development mode
npm run tauri:dev

# Build for production
npm run tauri:build

🤝 Contributing

Contributions are completely welcome! Whether it is translating the app into a new language, fixing a bug, or proposing a new feature.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📄 License

Distributed under the GNU General Public License v3.0. See LICENSE for more information.

This means: you are free to use, study, and modify Psysonic. If you distribute a modified version, you must release it under the same GPL v3 license and keep the original copyright notice intact. You may not incorporate this code into proprietary software.

🔒 Privacy

Psysonic contains no telemetry or analytics. All third-party integrations (Last.fm, LRCLIB, Discord) are opt-in. See PRIVACY.md for full details.

S
Description
fork a psysonic player for contrib
Readme 58 MiB
Languages
TypeScript 68.9%
Rust 25.7%
CSS 4.7%
JavaScript 0.3%
Shell 0.2%