Dan playliste med radiostationer fra Rhythmbox

Publiceret: 2. oktober 2020 / Ændret: 5. oktober 2020

Jeg bruger Rhythmbox som radio på min bærbare computer. Tilsyneladende er det ikke muligt at eksportere en playliste med radiostationerne fra Rhythmbox — men heldigvis kan en bash-terminal bruges til mange ting 🙂

Som input bruges rhythmdb.xml (filen læses kun), indholdet manipuleres og skrives som en m3u-fil i musik-mappe i home. Filnavnet indeholder tidspunkt for oprettelsen for at undgå overskrivning af eksisterende fil.

Jeg bruger xmlstarlet – det er ret svært at sætte sig ind i brugen af programmet, eftersom manualen er næsten ikke-eksisterende. Der er dog en UserGuide. Efter at have søgt en del på nettet og prøvet mig frem har jeg fået noget som er ganske brugbart.

Forklaring til mine valg som de afspejles i kommandoen:

Udtræk radiostationer ("@type = 'iradio'") med rating større end 2 (dvs 3-5 stjerner).

Der er defineret en variabel NL (–var NL -n -b), og stien til data-records i xml-dokumentet.

Sortering på "title" (ascending, tekst-felt og ignorer upper/lover case).

Indsæt m3u-info (#EXTINF:0,) foran title, dernæst NyLinje (tidligere nævnte vaiabel) og location (URL) til stationen med linjeskift (-n) efter recorden.

En m3u-info (#EXTM3U) indsættes som 1. linje ved hjælp af sed og det hele skrives til en fil.

xmlstarlet sel -T -t \
    --var NL -n -b -m "/rhythmdb/entry" \
    -s A:T:- "title" \
    -i "@type = 'iradio'" -i "rating > 2" -v \
    'concat("#EXTINF:0,",title,$NL,location)' -n \
    ~/.local/share/rhythmbox/rhythmdb.xml \
    | sed '1i #EXTM3U' \
    > ~/Musik/MineStationer_$(date "+%Y%m%d_%H%M%S").m3u

Forældet:

Nedenstående er en første-udgave inden jeg stiftede bekendtskab med xmlstarlet. Jeg lader løsningen stå, da den kan bruges som eksempel på hvad man man med sed og og et par kommandoer mere.

Først fjernes alle linjeskift fra rhythmdb.xml.

Herefter indsættes linjeskift efter alle , dvs. alle musiknumre og radiostationer får en (lang) linje hver.

Dernæst udtrækkes alle internet-stationer (iradio), og jeg sorterer dem alfabetisk.

Alt fra linje-start til stationsnavn (title) bliver erstattet med m3u-etiket (#EXTINF plus lidt mere), alt efter stationsnavn og til web-adressen bliver erstattet med et linjeskift, og alt efter web-adressen bliver slettet, og der indsættes en m3u-etiket (#EXTM3U) som første linje (alt dette sker i samme sed-kommando).

Til sidst sendes det hele gennem perl for at ændre html-entiteter til UTF-tegn (f.eks. bliver ä til et ä så Kärnten ser pæn ud) og ned i en fil (/tmp/MineStationer.m3u)

tr -d "\n" < ~/.local/share/rhythmbox/rhythmdb.xml \
   | sed 's|</entry>|\n|g' | grep "iradio" | sort \
   | sed 's|^.*<title>|#EXTINF:0,|;s|</title>.*<location>|\n|;s|</location>.*$||;1i #EXTM3U' \
   | perl -n -mHTML::Entities -mutf8 -e 'binmode(STDOUT, ":utf8"); print HTML::Entities::decode_entities($_) ;' \
   > /tmp/MineStationer.m3u