Files
webradio/README.org
2025-12-25 10:12:08 +01:00

9.6 KiB

Config Webradio

Einleitung

Rofi Skript zur Wiedergabe von Webradio-Streams. Start mit Strg + Alt + w oder via Klick auf das Symbol in Polybar. Rechtsklick auf das Symbol zeigt den aktuellen Titel nochmals an, indem die aktuelle Titel-Datei gelöscht wird.

Abhängigkeiten:

  • mpv
  • socat
  • dunst
  • ttf-font-awesome
  • ttf-ubuntu-font-family
  • rofi

Senderliste

Sender, die aktuell implementiert sind.

  • DASDING
  • 1LIVE
  • 1LIVEdiggi
  • SUNSHINE_LIVE
  • SWR3
  • WDR2

Eintrag in sxhkdrc

Hier der Eintrag, der in /home/$USER/.config/sxhkd/sxhkdrc gemacht werden muss.

# webradio
ctrl + alt + w
  ~/.config/rofi/webradio.sh

Modul in Polybar

Hier die Definition des Moduls in der Polybar Konfiguration in /home/$USER/.config/polybar/config.ini.

[module/webradio]
type = custom/script
interval = 3
exec = ~/.config/bspwm/scripts/webradio.sh
click-left = ~/.config/rofi/webradio.sh
click-right = rm -f /tmp/webradio_title
format-foreground = ${colors.foreground-white}
format-background = ${colors.background-blue}
format-prefix = ""
label = " %output% "

Startskript und Config für Rofi

Skript

Skript, welches das Rofi-Menü startet.

#!/usr/bin/env bash
#      __      __     _____
#     /  \    /  \   /  __ \
#    / /\ \  / /\ \  | |__| |    Manuel Prinz (MP)
#   / /  \ \/ /  \ \ |  ___/
#  / /    \__/    \ \| |
# /_/              \_\_|
#
# description:      Webradio with rofi and mpv
# last change:      25.12.2025

# defining variables for radiostations
dasding="DASDING"
einslive="1LIVE"
einslivediggi="1LIVEdiggi"
sunshinelive="SUNSHINE_LIVE"
swr3="SWR3"
wdr2="WDR2"
stop="beenden"

# other variables
path_logo="/home/$USER/Nextcloud/webradio"

# Get answer from user via rofi
selected_option=$(echo "$dasding
$einslive
$einslivediggi
$sunshinelive
$swr3
$wdr2
$stop" | rofi -dmenu\
                  -i\
                  -p "Webradio"\
                  -config "~/.config/rofi/webradio.rasi"\
                  -line-margin 3\
                  -line-padding 10)

# Do something based on selected radiostation
if [ "$selected_option" == "$dasding" ]
then
    killall mpv
    mpv https://liveradio.swr.de/d9zadj3/dasding/ --input-ipc-server=/tmp/mpv &
    echo DASDING dasding_logo.png > /tmp/radiostation
elif [ "$selected_option" == "$einslive" ]
then
    killall mpv
    mpv http://wdr-1live-live.icecast.wdr.de/wdr/1live/live/mp3/128/stream.mp3 --input-ipc-server=/tmp/mpv &
    echo 1LIVE einslive_logo.jpg > /tmp/radiostation
elif [ "$selected_option" == "$einslivediggi" ]
then
    killall mpv
    mpv http://wdr-1live-diggi.icecast.wdr.de/wdr/1live/diggi/mp3/128/stream.mp3 --input-ipc-server=/tmp/mpv &
    echo 1LIVE_DIGGI einslivediggi_logo.png > /tmp/radiostation
elif [ "$selected_option" == "$swr3" ]
then
    killall mpv
    mpv https://liveradio.swr.de/sw282p3/swr3/play.mp3 --input-ipc-server=/tmp/mpv &
    echo SWR3 swr3_logo.jpg > /tmp/radiostation
elif [ "$selected_option" == "$sunshinelive" ]
then
    killall mpv
    mpv https://stream.sunshine-live.de/2000er/mp3-192/stream.sunshine-live.de --input-ipc-server=/tmp/mpv &
    echo SUNSHINE_LIVE sunshinelive_logo.png > /tmp/radiostation
elif [ "$selected_option" == "$wdr2" ]
then
    killall mpv
    mpv http://wdr-wdr2-rheinland.icecast.wdr.de/wdr/wdr2/rheinland/mp3/128/stream.mp3 --input-ipc-server=/tmp/mpv &
    echo WDR2 wdr2_logo.png > /tmp/radiostation
elif [ "$selected_option" == "$stop" ]
then
    if test -e "/tmp/mpv"; then
        # read station name and logo
        radiostation=`cat /tmp/radiostation | awk '{print $1}'`
        radiostation_logo=`cat /tmp/radiostation | awk '{print $2}'`

        dunstify -t 5000 -a "Webradio: $radiostation" -I "$path_logo/$radiostation_logo" "wird beendet"
        killall mpv
        rm -f /tmp/mpv
        rm -f /tmp/radiostation
        rm -f /tmp/webradio_title
    else
        dunstify -t 5000 -a "Webradio:" "läuft nicht"
    fi
else
    dunstify -t 5000 -a "Webradio:" "keine Auswahl getroffen"
fi

Config

Hier wird das Aussehen vom Rofi-Menü definiert.

/*******************************************************
 ,* ROFI configs i3 powermenu for EndeavourOS
 ,* Maintainer: joekamprad <joekamprad@endeavouros.com>
 ,*******************************************************/

configuration {
    show-icons:             false;
    icon-theme:             "Arc-X-D";
    scroll-method:          0;
    disable-history:        false;
    sidebar-mode: 		    false;
}

@import "~/.config/rofi/arc_dark_transparent_colors.rasi"

window {
    background-color:               @background;
    border:                         2;
    border-radius:                  8px;
    padding:                        10;
    transparency:                   "real";
    width:                          200px;
    location:                       center;
    y-offset:                       30;
}
listview {
    lines:                          7;
    columns:                        1;
    scrollbar:                      false;
}
element {
    border:  0;
    padding: 1px ;
}
element-text {
    background-color: inherit;
    text-color:       inherit;
}
element.normal.normal {
    background-color: @normal-background;
    text-color:       @normal-foreground;
}
element.normal.urgent {
    background-color: @urgent-background;
    text-color:       @urgent-foreground;
}
element.normal.active {
    background-color: @active-background;
    text-color:       @active-foreground;
}
element.selected.normal {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
element.selected.urgent {
    background-color: @selected-urgent-background;
    text-color:       @selected-urgent-foreground;
}
element.selected.active {
    background-color: @selected-active-background;
    text-color:       @selected-active-foreground;
}
element.alternate.normal {
    background-color: @alternate-normal-background;
    text-color:       @alternate-normal-foreground;
}
element.alternate.urgent {
    background-color: @alternate-urgent-background;
    text-color:       @alternate-urgent-foreground;
}
element.alternate.active {
    background-color: @alternate-active-background;
    text-color:       @alternate-active-foreground;
}
scrollbar {
    width:        2px ;
    border:       0;
    handle-color: @scrollbar-foreground;
    handle-width: 4px ;
    padding:      0;
}
mode-switcher {
    border:       2px 0px 0px ;
    border-color: @separatorcolor;
}
button {
    spacing:    0;
    text-color: @normal-foreground;
}
button.selected {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
inputbar {
    spacing:    0;
    text-color: @normal-foreground;
    padding:    1px ;
}
case-indicator {
    spacing:    0;
    text-color: @normal-foreground;
}
entry {
    spacing:    0;
    text-color: @input-foreground;
    placeholder: "";
}
prompt {
    spacing:    0;
    text-color: @prompt-foreground;
}
inputbar {
    children:   [ prompt,textbox-prompt-colon,entry,case-indicator ];
}
textbox-prompt-colon {
    expand:     false;
    str:        ":";
    margin:     0px 0.3em 0em 0em ;
    text-color: @prompt-foreground;
}

Polybar Skript

Dieses Skript wird als Modul vom Typ custom/script in Polybar eingefügt.

#!/usr/bin/env bash
#      __      __     _____
#     /  \    /  \   /  __ \
#    / /\ \  / /\ \  | |__| |    Manuel Prinz (MP)
#   / /  \ \/ /  \ \ |  ___/
#  / /    \__/    \ \| |
# /_/              \_\_|
#
# description:      Script webradio for Polybar
# last change:      25.12.2025

## variables ##
msgID="11111"
mpvsocket="/tmp/mpv"
path_logo="/home/$USER/Nextcloud/webradio"
file_title="/tmp/webradio_title"

## function displaytime: displays the time in human readable format
displaytime() {
  local T=$1
  #local D=$((T/60/60/24))
  local H=$((T/60/60%24))
  local M=$((T/60%60))
  local S=$((T%60))
  #(( $D > 0 )) && printf '%d:' $D
  (( $H > 0 )) && printf '%02d:' $H
  (( $M > 0 )) && printf '%02d:' $M
  #(( $D > 0 || $H > 0 || $M > 0 ))
  printf '%02d\n' $S
}

# is mpv running?
if test -e "$mpvsocket"; then
    # read actual title
    act_title=`echo '{ "command": ["get_property", "media-title"] }' | socat - /tmp/mpv | awk -F\" '{print $4}'`

    # read playtime and convert to human readable format
    playtime=`echo '{ "command": ["get_property", "playback-time"] }' | socat - /tmp/mpv | awk -F: '{print $2}' | awk -F, '{print $1}' | awk -F. '{print $1}'`
    playtime_act=$(displaytime $playtime)

    # read station name and logo
    radiostation=`cat /tmp/radiostation | awk '{print $1}'`
    radiostation_logo=`cat /tmp/radiostation | awk '{print $2}'`

    # title file exist?
    if test -e "$file_title"; then
        title_check=`cat /tmp/webradio_title`
        # actual title equals NOT the name in the title file?
        if [[ "$title_check" != "$act_title" ]]; then
            echo $act_title > $file_title
            dunstify -t 5000 -a "Webradio: $radiostation" -r $msgID -I "$path_logo/$radiostation_logo" "$act_title"
        fi
    else
        # if title file not exists
        echo $act_title > $file_title
        dunstify -t 5000 -a "Webradio: $radiostation" -r $msgID -I "$path_logo/$radiostation_logo" "$act_title"
    fi

    # echo play symbol and playtime to polybar
    echo " $playtime_act"
else
    # Webradio is not running
    echo ""
fi