109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |