138 lines
5.3 KiB
Markdown
138 lines
5.3 KiB
Markdown
# rkt-web-player
|
|
|
|
Een audioplayer met webinterface, gebouwd op de bestaande Racket-pakketten:
|
|
|
|
- `racket-audio` voor lokale weergave en metadata;
|
|
- `racket-upnp` en `racket-sonos` voor ontdekking van netwerkspelers;
|
|
- `racket-audio-dlna` voor het publiceren en afspelen van lokale bestanden;
|
|
- `racket-mimetypes`, `simple-ini` en `simple-log` voor ondersteunende taken.
|
|
|
|
## Starten
|
|
|
|
De gekoppelde ontwikkelpackages kunnen direct worden gebruikt:
|
|
|
|
```console
|
|
racket main.rkt D:\Muziek
|
|
```
|
|
|
|
Standaard opent de speler `http://127.0.0.1:8080/`. Iedere opgegeven map wordt
|
|
een afzonderlijke muziekbibliotheek. Bij het starten wordt alleen de inhoud van
|
|
de eerste rootmap gelezen; er vindt geen recursieve bibliotheekscan plaats.
|
|
|
|
```console
|
|
racket main.rkt --port 8090 --no-browser D:\Muziek D:\Podcasts
|
|
```
|
|
|
|
Met een klein INI-bestand zijn vaste defaults mogelijk:
|
|
|
|
```ini
|
|
[server]
|
|
listen-ip=127.0.0.1
|
|
port=8080
|
|
|
|
[player]
|
|
dlna-port=8734
|
|
|
|
[libraries]
|
|
muziek=D:\Muziek
|
|
podcasts=D:\Podcasts
|
|
|
|
[playback-agents]
|
|
7b4776ef27104e8eb9f7ea2c622ce76ca23de4260b0f94e6880d321017b32a0e4=true
|
|
```
|
|
|
|
Start dat bestand met `racket main.rkt --config rkt-web-player.ini`. Iedere key
|
|
onder `[libraries]` is de zichtbare bibliotheeknaam; de waarde is de lokale of
|
|
UNC-rootmap. Het oudere `[library] paths=D:\Muziek;D:\Podcasts` blijft eveneens
|
|
ondersteund.
|
|
|
|
## Werking
|
|
|
|
De interface volgt de informatiearchitectuur van `rktplayer`, maar is
|
|
responsive en geschikt voor muis, toetsenbord en touch. Links staat de lazy
|
|
mappenbrowser met trackinformatie; rechts staan playlisttabs en de huidige
|
|
playlist. Een map wordt pas recursief gelezen wanneer die met **afspelen** of
|
|
**toevoegen** wordt gekozen. Trackmetadata wordt eveneens pas op dat moment
|
|
geladen. Bij de huidige track toont de webinterface embedded album-art uit de
|
|
audio-tags. Als die ontbreekt, worden naast het audiobestand ook `cover`,
|
|
`folder` en `front` met een JPEG- of PNG-extensie geprobeerd.
|
|
|
|
De webinterface praat met een kleine JSON-API onder `/api`. Lokale weergave
|
|
wordt pas geïnitialiseerd bij het eerste afspeelcommando. De knop naast de
|
|
uitvoerkeuze start UPnP-discovery; gevonden Sonos-zones worden als logische
|
|
groepen aangeboden en niet nogmaals als losse UPnP-renderers.
|
|
|
|
Playlisttabs kunnen worden toegevoegd, geselecteerd, hernoemd door dubbel te
|
|
klikken en verwijderd. Tracks kunnen worden afgespeeld, verwijderd en met
|
|
drag-and-drop verplaatst. De tabs zijn in deze versie alleen in het geheugen
|
|
aanwezig en worden niet na een herstart hersteld.
|
|
|
|
De server luistert standaard alleen op localhost. Geef alleen bewust een
|
|
LAN-adres aan `--listen-ip`; de webinterface bevat nog geen
|
|
gebruikersauthenticatie.
|
|
|
|
## Windows playback agent
|
|
|
|
Een lichte playback agent kan op een Windows-laptop draaien en meldt zichzelf
|
|
via HTTP bij de centrale RKT Web Player aan. De agent opent geen inkomende
|
|
netwerkpoort. Hij pollt de server voor opdrachten en rapporteert daarbij zijn
|
|
actuele afspeelstatus.
|
|
|
|
Start vanuit de broncode:
|
|
|
|
```console
|
|
racket player-agent.rkt
|
|
```
|
|
|
|
Dezelfde GUI kan vanuit een ander Racket-programma worden gestart:
|
|
|
|
```racket
|
|
#lang racket/base
|
|
|
|
(require rkt-web-player/player-agent)
|
|
|
|
(run-player-agent)
|
|
```
|
|
|
|
De GUI bewaart de server-URL, de gekozen naam en een eenmalig gegenereerde
|
|
256-bit applicatie-ID in `rkt-web-player-agent.ini` in de gebruikersspecifieke
|
|
Racket-configuratiemap. Vul als server bijvoorbeeld `http://192.168.1.10:8080`
|
|
in. De naam wordt in dezelfde agent-GUI ingesteld. Na registratie verschijnt
|
|
de agent met die naam als uitvoer van type `AGENT`; de server volgt latere
|
|
naamswijzigingen bij registratie en polling. De server laat een agent alleen
|
|
toe wanneer zijn volledige applicatie-ID vooraf als key onder
|
|
`[playback-agents]` staat en de waarde niet `false` is. Een onbekende ID krijgt
|
|
HTTP 403 en wordt niet als uitvoerpunt aangemaakt. De agent toont in dat geval
|
|
zijn ID en meldt dat de serverbeheerder deze eerst aan de INI moet toevoegen.
|
|
|
|
Onder **Afspelen** toont de agent het playlistnummer, de huidige track en
|
|
bestandsnaam, afspeeltoestand, verstreken en totale tijd, bitdiepte,
|
|
samplefrequentie, kanaalaantal en decoderformaat.
|
|
|
|
Een geselecteerde track wordt volledig naar een tijdelijk bestand gedownload
|
|
voordat `racket-audio` de weergave start. Tijdens het afspelen stuurt de server
|
|
al een `prefetch`-opdracht voor de volgende playlisttrack. De agent bewaart
|
|
daardoor maximaal het huidige en het volgende bestand lokaal. Bij de overgang
|
|
opent de agent het vooraf opgehaalde bestand direct bij decoder-EOF. Daardoor
|
|
blijven polling en netwerkvertraging buiten het tijdkritische audiopad en kan
|
|
`racket-audio` de volgende track achter de nog uitspelende uitvoerbuffer zetten.
|
|
De server wordt bijgewerkt zodra het nieuwe music-id werkelijk hoorbaar is en
|
|
stuurt vervolgens de daaropvolgende prefetch. Tijdelijke bestanden worden
|
|
opgeruimd zodra ze niet meer nodig zijn en bij afsluiten van de agent.
|
|
|
|
Een systeemvakfunctie is voorlopig niet opgenomen. De agent start geen
|
|
PowerShell-proces of andere externe tray-helper.
|
|
|
|
De allowlist voorkomt dat een onbekende agent zich als uitvoerpunt registreert
|
|
of opdrachten en tijdelijke media ontvangt. Het applicatie-ID is een gedeeld
|
|
toegangstoken en vervangt geen transportbeveiliging of gebruikersauthenticatie.
|
|
Gebruik de agent en server alleen op een vertrouwd LAN zolang de HTTP-server
|
|
geen TLS heeft.
|
|
|
|
## Controleren
|
|
|
|
```console
|
|
raco test private/library.rkt private/player.rkt
|
|
raco setup --check-pkg-deps rkt-web-player
|
|
```
|