#!/bin/bash
set -euo pipefail
SUPPORTED_FMS=(
"清晨音乐台,
https://lhttp.qingting.fm/live/4915/64k.mp3"
"AsiaFM 亚洲音乐台,
https://lhttp.qingting.fm/live/4581/64k.mp3"
)
CURRENT_PID=""
SELECTED_NUM=""
CURRENT_PLAY_NAME=""
MAX_NUM=${#SUPPORTED_FMS[@]}
print_radio_info() {
echo "节目列表:"
for idx in "${!SUPPORTED_FMS[@]}"; do
IFS=',' read -r name url <<< "${SUPPORTED_FMS[$idx]}"
local num=$((idx + 1))
if [[ "$SELECTED_NUM" =~ ^[0-9]+$ && "$num" -eq "$SELECTED_NUM" ]]; then
printf " \033[31m[%2d] %s\033[0m\n" "$num" "$name"
else
printf " %2d %s\n" "$num" "$name"
fi
done
}
play_radio() {
local radio_num="$1"
local index=$((radio_num - 1))
IFS=',' read -r radio_name radio_url <<< "${SUPPORTED_FMS[$index]}"
if ps -p "$CURRENT_PID" >/dev/null 2>&1; then
kill "$CURRENT_PID" >/dev/null 2>&1
wait "$CURRENT_PID" 2>/dev/null
fi
SELECTED_NUM="$radio_num"
CURRENT_PLAY_NAME="$radio_name"
mpg123 -q "$radio_url" >/dev/null 2>&1 < /dev/null &
CURRENT_PID=$!
if ! ps -p "$CURRENT_PID" >/dev/null; then
echo -e "播放失败!"
CURRENT_PID=""
CURRENT_PLAY_NAME=""
SELECTED_NUM=""
fi
}
main_loop() {
while true; do
clear
print_radio_info
read -r -p "请输入节目编号( 1-$MAX_NUM )或 q 退出: " user_input
if [[ "$user_input" =~ ^[qQ]$ ]]; then
echo "正在退出播放器..."
if ps -p "$CURRENT_PID" >/dev/null 2>&1; then
kill "$CURRENT_PID" >/dev/null 2>&1
wait "$CURRENT_PID" 2>/dev/null
fi
clear
exit 0
fi
if ! [[ "$user_input" =~ ^[0-9]+$ ]]; then
echo -n "错误:请输入有效的数字或 q 退出!"
sleep 1
continue
fi
if [[ "$user_input" -lt 1 || "$user_input" -gt "$MAX_NUM" ]]; then
echo -n "错误:无效的节目编号!请输入 1-$MAX_NUM 之间的数字"
sleep 1
continue
fi
play_radio "$user_input"
done
}
play_radio 1
main_loop