Radioserver na Raspberry PI: serverová část
Zobrazení: 15
Odborný postup, jak na Raspberry Pi postavit jednoduchý radioserver s Icecastem a Liquidsoapem: playlisty v M3U s lokálními cestami, automatické generování konfigurace, systemd služba a přehrávání přes HTTPS reverzní proxy v Apache. Tento článek popisuje serverovou část řešení. Neřeší tvorbu playlistů z databáze ani webové rozhraní.
Tento článek řeší čistě serverovou část. Předpokládáme, že playlisty .m3u už vznikají nějakým jiným způsobem (ručně, skriptem, webem, databází). Tvorbu .m3u ani webové UI zde záměrně neřešíme.
Co budeme stavět
- Icecast poběží lokálně na
127.0.0.1:8000. - Liquidsoap bude pro každou stanici generovat mount
/slug.mp3. - Playlisty budou v
/var/lib/radiojakoslug.m3us lokálními cestami na MP3. - Systemd template jednotka
radio@.servicespustí jednu stanici. - Wrapper jednotka
radio.servicespustí/restartuje všechny stanice podle/var/lib/radio/*.m3u. - Apache HTTPS vhost bude proxyovat
/radio/stream/na Icecast.
Bezpečnostní zásady
- Icecast nevystavujeme přímo do internetu. Necháme ho na localhost a ven pustíme jen Apache s TLS.
- Nastavíme silná hesla v Icecastu (minimálně
source-password). - Liquidsoap poběží pod samostatným uživatelem
liquidsoap.
Úskalí: Liquidsoap na Debian Trixie/arm64
Na některých sestaveních Debian Trixie/arm64 se novější balík Liquidsoap chová nestabilně (pády při output.icecast). V praxi se osvědčilo použít stabilní verzi z Debian Bookworm (například 2.1.3) přes APT pinning. Pokud máš Bookworm a vše běží, pinning řešit nemusíš.
Krok jedna: instalace balíků
Nainstalujeme Icecast, Apache a nástroje.
sudo bash -lc '
set -e
LOG=/tmp/radio_01_install.log
exec > >(tee "$LOG") 2>&1
apt update
apt install -y icecast2 apache2 ffmpeg curl ca-certificates
echo "DONE. LOG: $LOG"
'
Krok dva: konfigurace Icecast (localhost, hesla)
Uprav soubor /etc/icecast2/icecast.xml tak, aby Icecast poslouchal pouze na localhost a aby source-password odpovídalo tomu, co pak dáme do Liquidsoapu.
Minimální důležité části (doplň si vlastní hesla):
<!-- /etc/icecast2/icecast.xml (výřez) -->
<listen-socket>
<bind-address>127.0.0.1</bind-address>
<port>8000</port>
</listen-socket>
<authentication>
<source-password>ZMEN_ME_STRONG_SOURCE_PASS</source-password>
<admin-password>ZMEN_ME_STRONG_ADMIN_PASS</admin-password>
<relay-password>ZMEN_ME_STRONG_RELAY_PASS</relay-password>
</authentication>
Restart a ověření:
sudo bash -lc '
set -e
LOG=/tmp/radio_02_icecast_restart_check.log
exec > >(tee "$LOG") 2>&1
systemctl enable --now icecast2
systemctl restart icecast2
echo "== curl localhost icecast headers =="
curl -sS -I http://127.0.0.1:8000/ | head -n 20
echo "DONE. LOG: $LOG"
'
Krok tři: Liquidsoap verze (Bookworm stabilní, Trixie pinning)
Varianta A: jsi na Bookworm
Pokud jsi na Bookworm a Liquidsoap běží stabilně, můžeš zůstat u repozitáře systému.
Varianta B: jsi na Trixie/arm64 a Liquidsoap padá
Typový postup pinningu na Bookworm (přizpůsob si podle svého systému). Cílem je držet stabilní větev (například 2.1.x).
sudo bash -lc '
set -e
LOG=/tmp/radio_03_liquidsoap_pinning.log
exec > >(tee "$LOG") 2>&1
# Bookworm repo (pokud už existuje, nepřidávej duplicitně)
cat > /etc/apt/sources.list.d/bookworm.list <<EOF
deb http://deb.debian.org/debian bookworm main
EOF
# Pin Liquidsoap na Bookworm
mkdir -p /etc/apt/preferences.d
cat > /etc/apt/preferences.d/liquidsoap.pref <<EOF
Package: liquidsoap
Pin: release n=bookworm
Pin-Priority: 990
EOF
apt update
# Instalace (verze se může lišit; cílem je stabilní 2.1.x)
apt install -y liquidsoap ffmpeg
liquidsoap --version || true
echo "DONE. LOG: $LOG"
'
Krok čtyři: adresáře a uživatel
Budeme používat:
/var/lib/radio– playlisty.m3ua případně runtime výstupy/etc/radio– generované.liqkonfigurace/var/log/radio– logy Liquidsoapu
sudo bash -lc '
set -e
LOG=/tmp/radio_04_dirs_user.log
exec > >(tee "$LOG") 2>&1
mkdir -p /var/lib/radio /etc/radio /var/log/radio
# uživatel pro Liquidsoap
adduser --system --group --home /nonexistent --no-create-home liquidsoap 2>/dev/null || true
chown -R root:root /etc/radio
chmod 0755 /etc/radio
chown -R liquidsoap:liquidsoap /var/log/radio
chmod 0755 /var/log/radio
# playlisty: zapisuje sem typicky web nebo admin, nastav dle potřeby
chown -R root:www-data /var/lib/radio
chmod 2775 /var/lib/radio
echo "== perms =="
ls -ld /var/lib/radio /etc/radio /var/log/radio
echo "DONE. LOG: $LOG"
'
Krok pět: playlisty M3U v /var/lib/radio
Každá stanice je jeden soubor /var/lib/radio/<slug>.m3u. Obsahuje lokální cesty na MP3. Příklad:
#EXTM3U
#EXTINF:-1,Ukázková skladba
/mnt/media/music/ukazka.mp3
Poznámka k úskalím: Pokud některé soubory vypadají jako MP3, ale ve skutečnosti nejsou dekódovatelné (například „obalené“ formátem, který začíná jinou signaturou než běžná MP3), Liquidsoap je může přeskočit nebo může stanice hrát ticho. Řešení je filtrovat playlisty tak, aby obsahovaly pouze skutečně validní MP3.
Krok šest: skripty – generování runtime playlistu a .liq
V praxi se osvědčilo mít dva kroky:
make-runtime-m3u.sh– vygeneruje<slug>.runtime.m3u(například vyhodí řádky komentářů, případně může později filtrovat soubory).make-liq.sh– vygeneruje/etc/radio/<slug>.liqse správnou syntaxi pro Liquidsoap 2.1.x.
Skript make-runtime-m3u.sh
sudo bash -lc '
set -e
LOG=/tmp/radio_05a_make_runtime_script.log
exec > >(tee "$LOG") 2>&1
cat > /etc/radio/make-runtime-m3u.sh <<"EOF"
#!/bin/bash
set -euo pipefail
slug="$1"
SRC="/var/lib/radio/${slug}.m3u"
OUT="/var/lib/radio/${slug}.runtime.m3u"
# pokud playlist neexistuje, skonči úspěšně (wrapper může volat i dřív)
if [ ! -s "$SRC" ]; then
exit 0
fi
# základ: ponecháme jen neprázdné řádky a vyhodíme komentáře
# rozšíření (filtrování souborů) může přijít později
(
echo "#EXTM3U"
grep -v "^[[:space:]]*#" "$SRC" | sed "/^[[:space:]]*$/d"
) > "$OUT"
echo "WROTE: $OUT"
echo "TRACKS: $(grep -vc "^[[:space:]]*#" "$OUT" || true)"
EOF
chmod 0755 /etc/radio/make-runtime-m3u.sh
chown root:root /etc/radio/make-runtime-m3u.sh
echo "DONE. LOG: $LOG"
'
Skript make-liq.sh
Uprav v něm heslo SOURCE_PASSWORD, aby sedělo na source-password v Icecastu.
sudo bash -lc '
set -e
LOG=/tmp/radio_05b_make_liq_script.log
exec > >(tee "$LOG") 2>&1
cat > /etc/radio/make-liq.sh <<"EOF"
#!/bin/bash
set -euo pipefail
slug="$1"
PLAY="/var/lib/radio/${slug}.runtime.m3u"
OUT="/etc/radio/${slug}.liq"
LOGFILE="/var/log/radio/${slug}.liq.log"
SOURCE_PASSWORD="ZMEN_ME_STRONG_SOURCE_PASS"
# bez runtime playlistu nemá smysl startovat (ale nepadáme tvrdě)
if [ ! -s "$PLAY" ]; then
exit 0
fi
cat > "$OUT" <<EOL
# Auto-generated station config for ${slug}
settings.log.file.set(true)
settings.log.file.path.set("${LOGFILE}")
p = playlist("${PLAY}")
s = mksafe(p)
output.icecast(
%mp3,
host="127.0.0.1",
port=8000,
user="source",
password="${SOURCE_PASSWORD}",
mount="/${slug}.mp3",
name="${slug}",
genre="Radio",
description="${slug}",
s
)
EOL
chown root:root "$OUT"
chmod 0644 "$OUT"
echo "WROTE: $OUT"
EOF
chmod 0755 /etc/radio/make-liq.sh
chown root:root /etc/radio/make-liq.sh
echo "DONE. LOG: $LOG"
'
Krok sedm: systemd – template jednotka pro stanice
Každá stanice je instance radio@<slug>.service. Před startem se vygeneruje runtime playlist a .liq.
sudo bash -lc '
set -e
LOG=/tmp/radio_06_systemd_template.log
exec > >(tee "$LOG") 2>&1
cat > /etc/systemd/system/radio@.service <<"EOF"
[Unit]
Description=Radio station %i (Liquidsoap)
After=network.target icecast2.service
Wants=icecast2.service
[Service]
Type=simple
User=liquidsoap
Group=liquidsoap
WorkingDirectory=/var/lib/radio
ExecStartPre=/etc/radio/make-runtime-m3u.sh %i
ExecStartPre=/etc/radio/make-liq.sh %i
ExecStart=/usr/bin/liquidsoap /etc/radio/%i.liq
Restart=on-failure
RestartSec=2
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/var/lib/radio /var/log/radio
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
echo "DONE. LOG: $LOG"
'
Krok osm: wrapper služba radio.service (start/stop/restart všech stanic)
Wrapper projde /var/lib/radio/*.m3u a spustí/restartuje radio@<slug>.service. Wrapper úmyslně vždy končí úspěchem, aby restart jedné služby neblokoval celý orchestration, i když jedna stanice zrovna selže. Chyby jsou v logu a v journalech konkrétní instance.
Wrapper skript
sudo bash -lc '
set -e
LOG=/tmp/radio_07a_wrapper_script.log
exec > >(tee "$LOG") 2>&1
cat > /usr/local/sbin/radio-all.sh <<"EOF"
#!/bin/bash
set -euo pipefail
DIR="/var/lib/radio"
action="${1:-restart}"
if [ "$action" != "start" ] && [ "$action" != "stop" ] && [ "$action" != "restart" ]; then
echo "Usage: $0 {start|stop|restart}"
exit 2
fi
shopt -s nullglob
m3us=( "$DIR"/*.m3u )
shopt -u nullglob
if [ ${#m3us[@]} -eq 0 ]; then
echo "OK: no stations found in $DIR (*.m3u)"
exit 0
fi
echo "Stations:"
for f in "${m3us[@]}"; do
echo " - $(basename "$f" .m3u)"
done
for f in "${m3us[@]}"; do
slug="$(basename "$f" .m3u)"
echo "==> $action: radio@${slug}.service"
/bin/systemctl "$action" "radio@${slug}.service" || echo "WARN: $action failed for $slug (continuing)"
done
exit 0
EOF
chmod 0755 /usr/local/sbin/radio-all.sh
chown root:root /usr/local/sbin/radio-all.sh
echo "DONE. LOG: $LOG"
'
Wrapper systemd jednotka radio.service
sudo bash -lc '
set -e
LOG=/tmp/radio_07b_wrapper_unit.log
exec > >(tee "$LOG") 2>&1
cat > /etc/systemd/system/radio.service <<"EOF"
[Unit]
Description=Radio (wrapper: start/stop/restart all stations)
After=network.target icecast2.service
Wants=icecast2.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/radio-all.sh start
ExecStop=/usr/local/sbin/radio-all.sh stop
ExecReload=/usr/local/sbin/radio-all.sh restart
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now radio.service
echo "DONE. LOG: $LOG"
'
Krok devět: Apache HTTPS vhost + reverse proxy
Fiktivní příklad: server má IP 203.0.113.10, vhost běží na portu 4436 a stream je dostupný přes /radio/stream/. Icecast zůstává na 127.0.0.1:8000.
Instalace a povolení modulů
sudo bash -lc '
set -e
LOG=/tmp/radio_08a_apache_modules.log
exec > >(tee "$LOG") 2>&1
apt install -y apache2
a2enmod ssl proxy proxy_http rewrite headers
systemctl enable --now apache2
systemctl reload apache2
echo "DONE. LOG: $LOG"
'
Vytvoření self-signed certifikátu (ukázka)
V produkci použij Let’s Encrypt. Pro test a interní použití lze self-signed:
sudo bash -lc '
set -e
LOG=/tmp/radio_08b_selfsigned.log
exec > >(tee "$LOG") 2>&1
mkdir -p /etc/ssl/private /etc/ssl/certs
openssl req -x509 -newkey rsa:2048 -sha256 -days 365 \
-nodes \
-keyout /etc/ssl/private/radio.key \
-out /etc/ssl/certs/radio.crt \
-subj "/CN=203.0.113.10"
chmod 0600 /etc/ssl/private/radio.key
echo "DONE. LOG: $LOG"
'
Celý vhost soubor (kompletní)
# /etc/apache2/sites-available/radio-4436.conf
<VirtualHost 203.0.113.10:4436>
ServerName radio.example.test
SSLEngine on
SSLCertificateFile /etc/ssl/certs/radio.crt
SSLCertificateKeyFile /etc/ssl/private/radio.key
# Doporučené hlavičky (volitelné)
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
# /radio/stream -> Icecast
RedirectMatch 301 ^/radio/stream$ /radio/stream/
ProxyPass /radio/stream/ http://127.0.0.1:8000/ retry=0 timeout=600
ProxyPassReverse /radio/stream/ http://127.0.0.1:8000/
ErrorLog /var/log/apache2/radio-4436_error.log
CustomLog /var/log/apache2/radio-4436_access.log combined
</VirtualHost>
Aktivace vhostu:
sudo bash -lc '
set -e
LOG=/tmp/radio_08c_enable_vhost.log
exec > >(tee "$LOG") 2>&1
cat > /etc/apache2/sites-available/radio-4436.conf <<"EOF"
<VirtualHost 203.0.113.10:4436>
ServerName radio.example.test
SSLEngine on
SSLCertificateFile /etc/ssl/certs/radio.crt
SSLCertificateKeyFile /etc/ssl/private/radio.key
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
RedirectMatch 301 ^/radio/stream$ /radio/stream/
ProxyPass /radio/stream/ http://127.0.0.1:8000/ retry=0 timeout=600
ProxyPassReverse /radio/stream/ http://127.0.0.1:8000/
ErrorLog /var/log/apache2/radio-4436_error.log
CustomLog /var/log/apache2/radio-4436_access.log combined
</VirtualHost>
EOF
a2ensite radio-4436.conf
apache2ctl configtest
systemctl reload apache2
echo "DONE. LOG: $LOG"
'
Krok deset: spuštění a ověření
Spuštění všech stanic přes jednu službu:
sudo bash -lc '
set -e
LOG=/tmp/radio_09a_start_all.log
exec > >(tee "$LOG") 2>&1
systemctl restart radio.service
echo "== wrapper status =="
systemctl status radio.service --no-pager | sed -n "1,120p" || true
echo "== running instances =="
systemctl list-units --type=service --state=running --no-pager | grep -E "radio@" || true
echo "DONE. LOG: $LOG"
'
Ověření mountu přímo na localhost:
sudo bash -lc '
set -e
LOG=/tmp/radio_09b_check_mounts.log
exec > >(tee "$LOG") 2>&1
echo "== Icecast sources =="
curl -sS http://127.0.0.1:8000/status-json.xsl | head -n 260
echo "DONE. LOG: $LOG"
'
Poslech přes HTTPS proxy (příklad):
https://203.0.113.10:4436/radio/stream/banjoband.mp3https://203.0.113.10:4436/radio/stream/chambermood.mp3
Diagnostika a typické chyby
Chyba: mount vrací 404
- Liquidsoap se nepřipojil do Icecastu (špatné heslo, port, user).
- Playlist je prázdný nebo ukazuje na neexistující soubory.
- Soubory nejsou dekódovatelné (nejsou to reálné MP3).
Rychlá diagnostika logu dané stanice:
sudo bash -lc '
set -e
LOG=/tmp/radio_10_diag_one_station.log
exec > >(tee "$LOG") 2>&1
slug="banjoband"
echo "== systemd status =="
systemctl status "radio@${slug}.service" --no-pager || true
echo
echo "== journal tail =="
journalctl -u "radio@${slug}.service" -n 200 --no-pager || true
echo
echo "== liquidsoap file log tail =="
tail -n 200 "/var/log/radio/${slug}.liq.log" 2>/dev/null || true
echo "DONE. LOG: $LOG"
'
Chyba: Liquidsoap syntax error
Ujisti se, že používáš syntaxi pro Liquidsoap 2.x, tedy output.icecast(%mp3, ...). Varianta output.icecast.mp3(...) v některých verzích neexistuje a vede k chybám.
Chyba: nestabilita na Trixie
Pokud se Liquidsoap náhodně ukončuje (SIGSEGV), použij stabilní verzi (Bookworm) a drž ji pinningem. V reálném provozu je to rozdíl mezi „jede to“ a „padá to“.
Závěr
Máš hotový serverový základ: M3U playlisty v /var/lib/radio, automatické generování .liq, spouštění přes systemd a bezpečné zpřístupnění streamu přes Apache HTTPS reverse proxy. Generování M3U a webové ovládání patří do navazujícího článku.
- Předchozí článek: Rozhovor s Chatem GPT o programu pro kalkulačku Casio
- Následující článek: Radioserver na Raspberry PI: webová část
- Všechny články rubriky
Napište komentář
Rozhovor s Michalem o Betwindu, část 1
Rozhovor s Michalem Králem o kapele Betwind jako pokračování mojí kytarové cesty. V první části nahrávka písně Figure
jaký šel, takového potkal
Jak se dnešní přísloví odráží v našem životě a jak naše chování a postoje ovlivňují lidi, které potkáváme?
Rozhovor s Michalem o Betwindu, část 2
Rozhovor s Michalem Králem o kapele Betwind jako pokračování mojí kytarové cesty. Ve druhé části píseň Ophelia
Přání k Vánocům
Vánoční přání a nahrávka Chtíc, aby spal
Kráva zajíce nedohoní
Dnešní přísloví pojednává o realistických očekáváních a limitech schopností a o důležitosti přizpůsobení nároků reálným možnostem.
Kiksylend na Portě
Jaké to bylo na letošní portě? Působení Kiksylendu na legendárním hudebním festivalu, nahrávky písní Kavárenský povaleč, Kateřina a MDŽ a dále…
Dvakrát měř, jednou řež, aneb v podstatě, prostě, tedy a vlastně
Podívejme se na význam přísloví „Dvakrát měř, jednou řež“. Kdy se unáhlené kroky ukazují jako chyby? Proč je někdy lepší chvíli přemýšlet, než jednat?
Vzpomínky nejen školní, část 1: Gymnázium
Úsměvné vzpomínky na léta nejen školní. Přeji příjemný poslech
Vzpomínky nejen školní, část 4: Gymnázium naposledy
Závěrečný díl školních vzpomínek
Vzpomínky nejen školní, část 3: Gymnázium potřetí
Již třetí pokračování školních vzpomínek, tentokráte bude o panu řediteli a o gymnaziálním biologovi a chemikovi v jedné osobě. Přeji příjemný poslech
Foto z koncertů skupiny NAŠKRK, část I.
Galerie mých fotografií z koncertu skupiny NAŠKRK pořízené 15. 11. 2002. Foto: Roman Vokurek
Foto z koncertů skupiny NAŠKRK, část II.
Galerie mých fotografií z koncertu skupiny NAŠKRK v sále hotelu v Moravském Krumlově pořízené 7. března 2003. Foto: Roman Vokurek
Mariánská kaple v zimě
Fotky z lokality zvané jako Mariánská studánka mezi obcemi Moravský Krumlov a Rokytná, tentokráte pod sněhovou pokrývkou. Fotky pořízeny 10. 12. 2023…
K pramenům řeky Rokytné II.
Druhá výprava k pramenům posvátné řeky Rokytné tentokráte vedoucí z Moravského Krumlova do Tulešic. Průzkum proveden 19. 5. 2023. Autorem fotografií…
Výstup na Velký Lopeník
Druhá hřebenová výprava v nejkrásnějších horách světa, tedy v Bílých Karpatech, tentokráte zasvěcena dobytí Velkého Lopeníku (911 mnm). Výstup po…
Podzim v Moravském Krumlově, část II.
Výběr podzimních fotografií z Moravského Krumlova. Snímky pořízeny 12. 11. 2023. Foto: Petra
K pramenům řeky Rokytné III.
Třetí výprava k pramenům posvátné řeky Rokytné tentokráte vedoucí z Tulešic do Tavíkovic. Průzkum neprobádanou, neprostupnou, nedotčenou, divokou,…
Zima v Moravském Krumlově, část II.
Výběr zimních fotografií z Moravského Krumlova. Snímky pořízeny 2. 12. 2023. Foto: Petra
Jaro v Moravském Krumlově, část II.
Jarní galerie pořízená z moravskokrumlovského zámeckého parku 5. 5. 2024. Foto: Petra
K pramenům řeky Rokytné I.
Výprava k pramenům řeky Rokytné, část první od soutoku s Jihlavou v Ivančicích do Moravského Krumlova. Průzkum proveden 22. 4. 2022. Autorem…
Vražda Reeny Virk
V roce 1997 zmizela čtrnáctiletá Reena Virk z jihoasijské rodiny ve Victorii na ostrově Vancouver. Rekonstruujeme osudnou noc, vyšetřování, soudy s…
Vražda Pauly Gallant
V této epizodě se ponoříme do případu vraždy Pauly Gallant. Prozkoumáme, jak vyšetřovatelé využili kontroverzní policejní taktiku známou jako "Mr.…
Zvrhlý pár Paul Bernardo a Karla Homolka
V této mrazivé epizodě se ponoříme do jednoho z nejděsivějších případů kanadské kriminalistiky. Paul Bernardo a Karla Homolka byli na první pohled…
Vraždící policista
Jednoho chladného zářijového dne roku 1918 Mary Wilsonová, mladá nastávající matka, za podezřelých okolností krátce po příjezdu do Saskatoonu zmizí.…
Vražda Wayna Millarda
Epizoda o záhadné vraždě Wayna Millarda, úspěšného kanadského podnikatele a otce známého Delenna Millarda. Prozkoumáme okolnosti jeho smrti, která…
Zmizení Laury Babcock
V této epizodě se ponoříme do případu vraždy Laury Babcock, mladé ženy z Toronta, která záhadně zmizela v roce 2012. Prozkoumáme okolnosti jejího…
Vražda Tima Bosmy
Tim Bosma, kanadský otec a manžel, zmizel v květnu 2013 poté, co s dvěma neznámými muži odjel na testovací jízdu svého nákladního vozu, který…
Zločiny Russella Williamse
Na konci ledna 2010 ze svého domu beze stopy zmizela sedmadvacetiletá Jessica Lloyd. Kdo je za tento čin zodpovědný? Na policii je zavolán muž, aby…
Vraždy Roberta Picktona
Během osmdesátých a devadesátých let minulého století se začali ztrácet ženy z místa známého jako Downtown Eastside v kanadské metropoli Vancouver v…
Vyvraždění rodiny Johnson-Bentley
V srpnu 1982 se šest členů jedné rodiny vydalo na dvoutýdenní kempování na odlehlé místo ve Wells Parku v Britské Kolumbii. O měsíc později byly…
Výlet do neznáma
Píseň z alba Rozpaky, inspirovaná neznámou dívkou v modrém... Text i hudba byli napsány 9. 12. 2018.
Podzim
Báseň a píseň z alba Rozpaky vydaná v roce 2019. Báseň byla napsána za letní noci 21. 8. 2016, nevzpomínám si přesně, ale myslím, že nad sklenkou whisky.
Třešně a led
Píseň z alba Rozpaky inspirovaná událostmi prvních lednových dní roku 2003. Píseň patří všem, kteří toho roku tragicky zahynuli... Text byl napsán 4. 7. 2016. Hudba byla napsána 27. 8. 2016.
Světem vcelku
Píseň z alba Rozpaky. Inspirace všeobímající, tak trochu osobní výpověď. Pojednání o věcech těžko pochopitelných. Text byl napsán 29. 11. 2015. Hudba byla napsána v lednu 2016.
Změna
Píseň z alba Rozpaky inspirovaná podzimními událostmi roku 2003. Text byl napsán 24. 8. 2016. Hudba byla napsána 20. 12. 2018.
Čumísek
Píseň z alba Rozpaky inspirovaná událostmi roku 2003. Text byl napsán 9. 7. 2016. Hudba byla napsána 17. 12. 2018.
Takový jako tento
Píseň z alba Rozpaky inspirovaná jak jinak nešťastnou láskou. Hudba původně z anglickým textem byla napsána v září 2003. Text byl napsán 20. 2. 2016.
Služby zdarma
Píseň z alba Rozpaky inspirovaná nehynoucí touhou všelijakých obchodníků prodat vám cokoli. Text i hudba byli napsány 10. 5. 2017.
Málem omylem
Vzpomínka na první červencové dny roku 2003. Pokud se vám náhodou něco někdy nepovede, nesahejte na alkohol, je to velice zlý pán a nemá slitování. Text písně byl napsán 8. 5. 2017.
Tak dávno
Vzpomínka na první červencové dny roku 2003. Text i hudba byli napsány 10. 5. 2017.






Komentáře: 0