#!/bin/sh set -eu PROG="$(basename "${0}")" SOCKET_PATH="/tmp/mpv-${USER}.sock" die() { echo "Error: $*" >&2 exit 1 } usage() { cat < [args] Commands: radio Switch to a radio station local, music [PATH] Switch to local music playlist (default: ~/Music) next, n Next track prev, p Previous track pause, stop, toggle, s Toggle pause help Show this message Radio Channels: lofi, fallout, wasteland, retrofm, rusradio, rock, phonk, dorognoe EOF } get_radio_url() { channel="${1:-}" case "${channel}" in lofi) echo 'https://radiorecord.hostingradio.ru/lofi96.aacp' ;; fallout) echo 'http://fallout.fm:8000/falloutfm1.ogg' ;; wasteland) echo 'http://wasteland.su:8080/radio' ;; retrofm) echo 'http://hls-01-retro.emgsound.ru/12/128/playlist.m3u8' ;; rusradio) echo 'https://rusradio.hostingradio.ru/rusradio128.mp3' ;; rock) echo 'https://radiorecord.hostingradio.ru/rock96.aacp' ;; phonk) echo 'https://radiorecord.hostingradio.ru/phonk96.aacp' ;; dorognoe) echo 'https://dorognoe.hostingradio.ru:8000/dorognoe' ;; *) die "Unknown radio channel '${channel}'. Available: lofi/fallout/wasteland/retrofm/rusradio/rock/phonk/dorognoe" ;; esac } send_cmd() { if [ ! -S "${SOCKET_PATH}" ]; then die "MPV socket not found at '${SOCKET_PATH}'. Is mpv running?" fi printf '{ "command": %s }\n' "${1}" | socat - "${SOCKET_PATH}" >/dev/null } tune_radio() { channel="${1:-}" if [ -z "${channel}" ]; then die "Radio channel required. Usage: ${PROG} radio " fi url="$(get_radio_url "${channel}")" send_cmd "[\"loadfile\", \"${url}\", \"replace\"]" echo "📻 Switched to radio: ${channel}" } play_local_playlist() { playlist_path="${1:-${HOME}/Music}" if [ ! -e "${playlist_path}" ]; then die "Path not found: ${playlist_path}" fi if command -v realpath >/dev/null 2>&1; then playlist_path="$(realpath "${playlist_path}")" fi escaped_path=$(printf '%s' "${playlist_path}" | sed 's/\\/\\\\/g; s/"/\\"/g') send_cmd '["set", "pause", "yes"]' sleep 0.1 send_cmd "[\"loadfile\", \"${escaped_path}\", \"replace\"]" sleep 0.1 send_cmd '["set", "pause", "yes"]' sleep 0.1 send_cmd '["playlist-shuffle"]' sleep 0.1 send_cmd '["playlist-next"]' sleep 0.1 send_cmd '["set", "pause", "no"]' echo "🎵 Switched to local playlist: ${playlist_path}" } handle_control() { action="${1}" case "${action}" in next|n) send_cmd '["playlist-next"]' echo "➡️ Next" ;; prev|p) send_cmd '["playlist-prev"]' echo "⬅️ Prev" ;; pause|stop|toggle|t|s) send_cmd '["cycle", "pause"]' echo "⏯️ Pause toggled" ;; *) usage exit 1 ;; esac } ACTION="${1:-}" shift 2>/dev/null || true case "${ACTION}" in radio|tune) tune_radio "$@" ;; local|music|m) play_local_playlist "$@" ;; next|n|prev|p|pause|stop|toggle|t|s) handle_control "${ACTION}" ;; help|"") usage ;; *) echo "Unknown command: ${ACTION}" >&2 usage exit 1 ;; esac