diff --git a/modules/home/wayland/apps/eww/bar/scripts/radio b/modules/home/wayland/apps/eww/bar/scripts/radio index 1b43ba1..812599a 100755 --- a/modules/home/wayland/apps/eww/bar/scripts/radio +++ b/modules/home/wayland/apps/eww/bar/scripts/radio @@ -1,108 +1,108 @@ -#!/usr/bin/env bash - -function get_time_ms { - date -u +%s%3N -} - -URL_BASE="https://www.radiorecord.ru/api" - -MPV_PID_FILE="/tmp/mpv_radio_pid" -RADIO_ID_FILE="/tmp/radio_id" - -STATIONS="[]" - -PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) -RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) -RADIO_URL="" -INFO='{"id":null,"artist":null,"song":null,"image600":null}' -PAUSED=$(( $PID == 0 || $RADIO_ID == 0 ? 1 : 0 )) -STATUS="{}" - -get_radio() { - echo "$STATIONS" | jq -r --argjson sel_id "$RADIO_ID" 'map(select(.id == $sel_id)).[0]' -} - -get_song() { - echo $(curl -s "$URL_BASE/station/history/?id=$RADIO_ID" | jq '.result.history[0] | ({id, artist, song, image600})') -} - - -update() { - PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) - RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) - PAUSED=$(( $PID == 0 && $RADIO_ID > 0 ? 1 : 0 )) -} - -start() { - STATIONS=$(curl -s "$URL_BASE/stations/" | jq --argjson ids '[507,522,523,536,537,42532,42602]' '.result.stations | map(select(.id | IN($ids[]))) | map({id, title, stream_hls, icon_fill_white})') - RADIO_URL=$(get_radio | jq -r '.stream_hls') - if [ "$PAUSED" = 0 ]; then - kill -9 $PID - fi - mpv "$RADIO_URL" & echo $! > "$MPV_PID_FILE" - echo $RADIO_ID > "$RADIO_ID_FILE" -} - - -toggle() { - if [ "$PAUSED" = 1 ]; then - echo $RADIO_ID $PID - start - else - kill -9 "$PID" - rm -f $MPV_PID_FILE - fi -} - -status() { - echo $(jq -cnr --argjson pid "$PID" --argjson stations "$STATIONS" --argjson radio_id "$RADIO_ID" --argjson is_paused "$PAUSED" --argjson info "$INFO" '{"is_paused": $is_paused, "song": $info, "radio": $radio_id, "stations": $stations}') -} - - -status_loop() { - STATUS=$(status) - echo $STATUS - STATIONS=$(curl -s "$URL_BASE/stations/" | jq --argjson ids '[507,522,523,536,537,42532,42602]' '.result.stations | map(select(.id | IN($ids[]))) | map({id, title, stream_hls, icon_fill_white})') - last_time_info=0 - last_time=0 - while true; do - current_time=$(get_time_ms) - delta=$((current_time - last_time)) - delta_i=$((current_time - last_time_info)) - if [[ $delta -gt 1000 ]]; then - PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) - RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) - PAUSED=$(( $PID == 0 && $RADIO_ID > 0 ? 1 : 0 )) - NEW_STATUS=$(status) - if [[ "$NEW_STATUS" != "$STATUS" ]]; then - STATUS=$NEW_STATUS - echo $STATUS - fi - last_time=$current_time - fi - if [[ $delta_i -gt 15000 ]]; then - if [ "$PAUSED" = 1 ]; then - INFO="{\"id\":null,\"artist\":null,\"song\":null,\"image600\": \"$(get_radio | jq -r '.icon_fill_white')\"}" - else - INFO=$(echo "$INFO" "$(get_song)" | jq -s ' reduce .[] as $item ( {}; . + ( - reduce ($item | to_entries[]) as $entry ( {}; if $entry.value != null then .[$entry.key] = $entry.value else . end - )) )') - fi - last_time_info=$current_time - fi - done -} - -# Main script -case "$1" in - "start") - RADIO_ID=$2 - start - ;; - "toggle") - toggle - ;; - *) - status_loop - ;; -esac +#!/usr/bin/env bash + +get_time_ms() { + date -u +%s%3N +} + +URL_BASE="https://www.radiorecord.ru/api" + +MPV_PID_FILE="/tmp/mpv_radio_pid" +RADIO_ID_FILE="/tmp/radio_id" + +STATIONS="[]" + +PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) +RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) +RADIO_URL="" +INFO='{"id":null,"artist":null,"song":null,"image600":null}' +PAUSED=$(( $PID == 0 || $RADIO_ID == 0 ? 1 : 0 )) +STATUS="{}" + +get_radio() { + echo "$STATIONS" | jq -r --argjson sel_id "$RADIO_ID" 'map(select(.id == $sel_id)).[0]' +} + +get_song() { + echo $(curl -s "$URL_BASE/station/history/?id=$RADIO_ID" | jq '.result.history[0] | ({id, artist, song, image600})') +} + + +update() { + PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) + RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) + PAUSED=$(( $PID == 0 && $RADIO_ID > 0 ? 1 : 0 )) +} + +start() { + STATIONS=$(curl -s "$URL_BASE/stations/" | jq --argjson ids '[507,522,523,536,537,42532,42602]' '.result.stations | map(select(.id | IN($ids[]))) | map({id, title, stream_hls, icon_fill_white})') + RADIO_URL=$(get_radio | jq -r '.stream_hls') + if [ "$PAUSED" = 0 ]; then + kill -9 $PID + fi + mpv "$RADIO_URL" & echo $! > "$MPV_PID_FILE" + echo $RADIO_ID > "$RADIO_ID_FILE" +} + + +toggle() { + if [ "$PAUSED" = 1 ]; then + echo $RADIO_ID $PID + start + else + kill -9 "$PID" + rm -f $MPV_PID_FILE + fi +} + +status() { + echo $(jq -cnr --argjson pid "$PID" --argjson stations "$STATIONS" --argjson radio_id "$RADIO_ID" --argjson is_paused "$PAUSED" --argjson info "$INFO" '{"is_paused": $is_paused, "song": $info, "radio": $radio_id, "stations": $stations}') +} + + +status_loop() { + STATUS=$(status) + echo $STATUS + STATIONS=$(curl -s "$URL_BASE/stations/" | jq --argjson ids '[507,522,523,536,537,42532,42602]' '.result.stations | map(select(.id | IN($ids[]))) | map({id, title, stream_hls, icon_fill_white})') + last_time_info=0 + last_time=0 + while true; do + current_time=$(get_time_ms) + delta=$((current_time - last_time)) + delta_i=$((current_time - last_time_info)) + if [[ $delta -gt 1000 ]]; then + PID=$( [ -e "$MPV_PID_FILE" ] && cat "$MPV_PID_FILE" || echo 0 ) + RADIO_ID=$( [ -e "$RADIO_ID_FILE" ] && cat "$RADIO_ID_FILE" || echo 0 ) + PAUSED=$(( $PID == 0 && $RADIO_ID > 0 ? 1 : 0 )) + NEW_STATUS=$(status) + if [[ "$NEW_STATUS" != "$STATUS" ]]; then + STATUS=$NEW_STATUS + echo $STATUS + fi + last_time=$current_time + fi + if [[ $delta_i -gt 15000 ]]; then + if [ "$PAUSED" = 1 ]; then + INFO="{\"id\":null,\"artist\":null,\"song\":null,\"image600\": \"$(get_radio | jq -r '.icon_fill_white')\"}" + else + INFO=$(echo "$INFO" "$(get_song)" | jq -s ' reduce .[] as $item ( {}; . + ( + reduce ($item | to_entries[]) as $entry ( {}; if $entry.value != null then .[$entry.key] = $entry.value else . end + )) )') + fi + last_time_info=$current_time + fi + done +} + +# Main script +case "$1" in + "start") + RADIO_ID=$2 + start + ;; + "toggle") + toggle + ;; + *) + status_loop + ;; +esac