#!/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