PROJEKT · Terminalapp · Aktiv
NPLAY
Min skräddarsydda terminalspelare för musik, radio och poddar. En keyboard-first TUI som numera är min huvudsakliga ljudspelare.
ANVÄNDER REGELBUNDET
Min spelare i terminalen
NPLAY är en terminalbaserad TUI-spelare som jag byggt för mina egna behov. Musik, radio och poddar samlade i ett snabbt, resurssnålt och tangentbordsstyrt gränssnitt. Den är skräddarsydd efter hur jag faktiskt lyssnar och har efter hand blivit min huvudsakliga musikspelare.
Jag har också NIRUPLAY när jag vill ha en vanlig desktopapp, men i praktiken gillar jag NPLAY betydligt mer. Den har därför fått ersätta kew och cmus i vardagen. kew använde jag under flera år och cmus har hängt med betydligt längre än så.
NPLAY började som ett ganska enkelt experiment, men har utvecklats till ett betydligt mer komplett program. Jag fortsätter att förbättra det efter hand som jag upptäcker saker jag saknar eller vill göra annorlunda.
Källkoden finns på GitHub.
Musik, radio, poddar och Spotify i samma TUI
NPLAY 1.5.7 samlar lokala musikfiler, Navidrome/Subsonic, Spotify, Sveriges Radio, egna radioströmmar, SR-poddar och YouTube Audio i samma gränssnitt.
Det är en av de saker jag uppskattar mest. Jag behöver inte växla mellan flera olika program beroende på vad jag vill lyssna på. Allt finns på samma ställe och styrs med tangentbordet.
Global Quick Play med / söker bland de aktiverade källorna. Jag kan också slå av och på olika musikkällor direkt i programmet.
Spotify är en valbar integration som kräver egen konfiguration och autentisering. För uppspelningen används librespot när det finns tillgängligt. På så sätt kan Spotify ingå i samma uppspelningsmiljö som resten av musiken.
Det lokala musikbiblioteket skannas rekursivt från en eller flera musikmappar. Jag kan bläddra bland artister, album, spår och mappar, se nyligen tillagd musik eller slumpa fram något att lyssna på. Indexeringen sker inkrementellt i bakgrunden och kan även uppdateras manuellt.
Omslag hämtas från musikmappar eller extraheras ur inbäddad artwork utan att originalfilerna behöver ändras.
Uppspelning, köer och spellistor
NPLAY är byggt för att behålla sammanhanget i det jag lyssnar på. Startar jag ett album eller en spellista fortsätter uppspelningen automatiskt genom innehållet.
Det finns en persistent uppspelningskö, lokala spellistor som kan blanda musik från olika källor, favoriter och historik.
Senaste spår, uppspelningsposition, volym, kö och uppspelningssammanhang sparas mellan sessioner. Däremot startar inte musiken automatiskt när jag öppnar NPLAY igen. Det senaste spåret återställs i stället så att jag själv kan välja att fortsätta.
ReplayGain-normalisering är aktiverad som standard och kan anpassas med Auto, Track eller Album, preamp och skydd mot clipping. Gapless är valbart.
Repeat kan användas för ett enskilt spår eller ett helt sammanhang. Shuffle finns både som vanlig slumpning och Smart Shuffle, som försöker undvika nyligen spelade spår och alltför täta upprepningar av samma artist.
Now Playing visar aktuell uppspelning, nästa spår och relevanta inställningar.
Terminalen är själva gränssnittet
NPLAY använder mpv som uppspelningsmotor och är byggt med tangentbordet i centrum.
b öppnar Browse, / öppnar Quick Play, Ctrl+N visar Now Playing och ? öppnar hjälpen.
Det finns också ett kommandoläge med : som fungerar ungefär som ett litet eget shell. Där finns Tab completion, kommandohistorik med upp och ner, Esc för att avbryta och kommandon för bland annat bibliotek, kö, normalisering, gapless, shuffle och repeat.
Now Playing kan visas i Normal-, Artwork- eller Visualizer-läge. I Kitty kan omslag visas direkt i terminalen, medan andra terminaler får en anpassad textbaserad presentation när grafikstödet saknas.
CAVA används för ljudvisualisering och kan utnyttja hela terminalens bredd. Rendering och uppdatering av tidsindikatorer är separerade från resten av gränssnittet för att hålla spelaren responsiv och undvika onödigt flimmer.
Jag gillar just det här med terminalprogram. Det är snabbt, funktionellt och utan en massa grafiska element som egentligen inte behövs.
Lyssningsstatistik och synkronisering till hemsidan
En av de större funktionerna som tillkommit är den inbyggda lyssningsstatistiken.
NPLAY registrerar lyssningstid lokalt och kan sammanställa statistik över bland annat artister, album, låtar, musikkällor och lyssningsperioder.
Statistiken lagras i en lokal SQLite-databas och är oberoende av om jag har internetuppkoppling eller inte.
Jag har också byggt en separat synkronisering mot min hemsida. När den är aktiverad skickas lyssningshändelser över HTTPS till ett särskilt API på n.rudolfsson.net. På hemsidan kan jag sedan presentera min musikstatistik och lyssningshistorik.
Synkroniseringen använder en persistent kö. Om servern inte går att nå ligger händelserna kvar lokalt och kan skickas senare. Händelser markeras som synkroniserade först när servern har bekräftat mottagningen.
Det här är också en del av tanken med min hemsida. Jag vill hellre samla sådant jag skapar och använder på min egen webbplats än vara beroende av externa sociala plattformar.
Teman och anpassning
NPLAY har flera teman, bland annat Niru Noir, Satie och C. Larsson, och kan även anpassas efter aktuellt Omarchy-tema.
Gränssnittet är avsiktligt minimalistiskt. Fokus ligger på musik, läsbarhet och snabb navigering snarare än dekoration.
Konfigurationen finns under ~/.config/nplay/, medan bibliotek, statistik och programtillstånd lagras separat och persistent. Det gör att själva programkoden kan uppdateras utan att spellistor, favoriter, historik och andra användardata behöver försvinna.
NPLAY utvecklas främst för Linux och används bland annat på Arch/Omarchy och Debian. Målet är att det ska fungera bra även på andra distributioner, med vissa skillnader beroende på tillgängliga beroenden och integrationer.
Fortsatt utveckling
NPLAY är fortfarande ett projekt under aktiv utveckling. Version 1.5.7 innehåller bland annat förbättringar kring hanteringen av tidsstämplar i lyssningsstatistiken, efter att jag upptäckt att en felaktig händelse kunde blockera synkroniseringen.
Det finns säkert mer att förbättra och fler idéer kommer efter hand. Men det fina är att jag redan använder NPLAY dagligen och kan utveckla det utifrån verkliga behov.
Det är egentligen så jag tycker bäst om att bygga program. Börja med något jag själv saknar, få det att fungera och sedan fortsätta förbättra det utan att göra det mer komplicerat än nödvändigt.
Projektet finns på GitHub: nirucon/nplay där källkod, installationsanvisningar och fortsatt utveckling finns tillgängliga.
Python · TUI/curses · mpv · SQLite · CAVA · Kitty · Navidrome/Subsonic · Sveriges Radio · YouTube Audio