diff --git a/TARGETS.sh b/TARGETS.sh index e88f1f1..d487b6c 100644 --- a/TARGETS.sh +++ b/TARGETS.sh @@ -24,6 +24,7 @@ ipython:.ipython/profile_default/ipython_config.py gdb:.config/gdb sandbox: chromium:.local/bin/pchromium .local/share/applications/pchromium.desktop -scripts:.local/bin/httpstatus .local/bin/apco .local/bin/bb .local/bin/emoji .local/bin/mksh .local/bin/nato .local/bin/pastas .local/bin/timer .local/bin/tryna .local/bin/trynafail .local/bin/bak .local/bin/cleanup-directory .local/bin/cleanup-directory-log .local/bin/cleanup-downloads .local/bin/gobuild .local/bin/json .local/bin/open .local/bin/py .local/bin/sha .local/bin/showtips .local/bin/weather .local/bin/radio .local/bin/rmt .local/bin/scratch .local/bin/player .local/bin/wake .local/bin/myip .local/bin/genpass .local/bin/gensalt .local/bin/django-create-project .local/bin/mirror-site .local/bin/split-file .local/bin/extract .local/bin/destroy .local/bin/serveit .local/bin/highlight-logs %copypasta +scripts:.local/bin/httpstatus .local/bin/apco .local/bin/bb .local/bin/emoji .local/bin/mksh .local/bin/nato .local/bin/pastas .local/bin/timer .local/bin/tryna .local/bin/trynafail .local/bin/bak .local/bin/cleanup-directory .local/bin/cleanup-directory-log .local/bin/cleanup-downloads .local/bin/gobuild .local/bin/json .local/bin/open .local/bin/py .local/bin/sha .local/bin/showtips .local/bin/weather .local/bin/radio .local/bin/rmt .local/bin/scratch .local/bin/wake .local/bin/myip .local/bin/genpass .local/bin/gensalt .local/bin/django-create-project .local/bin/mirror-site .local/bin/split-file .local/bin/extract .local/bin/destroy .local/bin/serveit .local/bin/highlight-logs %copypasta +music:.local/bin/mpv-service.sh .config/systemd/user/mpv.service .local/bin/player copypasta:.local/bin/copy .local/bin/pasta all:%less %t %note %tmux %zsh %nvim %git" diff --git a/home/user/.config/systemd/user/mpv.service b/home/user/.config/systemd/user/mpv.service new file mode 100644 index 0000000..6860d0e --- /dev/null +++ b/home/user/.config/systemd/user/mpv.service @@ -0,0 +1,18 @@ +[Unit] +Description=MPV Audio Player Service +Documentation=man:mpv(1) +After=sound.target graphical-session.target +Wants=sound.target + +[Service] +Type=simple +ExecStart=%h/.local/bin/mpv-service.sh +Restart=on-failure +RestartSec=5 +Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus +Environment=XDG_RUNTIME_DIR=%t +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=default.target diff --git a/home/user/.local/bin/mpv-service.sh b/home/user/.local/bin/mpv-service.sh new file mode 100755 index 0000000..61a51d2 --- /dev/null +++ b/home/user/.local/bin/mpv-service.sh @@ -0,0 +1,15 @@ +#!/bin/sh +set -eu + +SOCKET_PATH="/tmp/mpv-${USER}.sock" + +rm -f "${SOCKET_PATH}" + +cleanup() { + echo "Stopping MPV service..." + rm -f "${SOCKET_PATH}" + pkill -P $$ mpv || true +} +trap cleanup EXIT TERM INT + +exec mpv --idle --no-video --input-ipc-server="${SOCKET_PATH}" --ytdl-format=worstaudio diff --git a/home/user/.local/bin/player b/home/user/.local/bin/player index d90b155..57bbd6c 100755 --- a/home/user/.local/bin/player +++ b/home/user/.local/bin/player @@ -14,12 +14,11 @@ usage() { Usage: ${PROG} [args] Commands: - run music [PATH] Play local music (default: ~/Music) - run radio Start a radio station - radio Switch current playing instance to a radio station + 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, space Toggle pause + pause, stop, toggle, s Toggle pause help Show this message Radio Channels: @@ -50,32 +49,6 @@ send_cmd() { printf '{ "command": %s }\n' "${1}" | socat - "${SOCKET_PATH}" >/dev/null } -launch_mpv() { - rm -f "${SOCKET_PATH}" - - trap 'rm -f "${SOCKET_PATH}"' INT HUP EXIT TERM - - exec mpv --input-ipc-server="${SOCKET_PATH}" --no-video --ytdl-format=worstaudio "${@}" -} - - -play_playlist() { - playlist="${1:-${HOME}/Music}" - shift || true - - launch_mpv --shuffle "$@" -- "${playlist}" -} - -play_radio() { - channel="${1:-}" - if [ -z "${channel}" ]; then - die "Radio channel required. Usage: ${PROG} run radio " - fi - - url="$(get_radio_url "${channel}")" - launch_mpv "${url}" -} - tune_radio() { channel="${1:-}" if [ -z "${channel}" ]; then @@ -84,7 +57,34 @@ tune_radio() { url="$(get_radio_url "${channel}")" send_cmd "[\"loadfile\", \"${url}\", \"replace\"]" - echo "📻 Switched to: ${channel}" + 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() { @@ -98,7 +98,7 @@ handle_control() { send_cmd '["playlist-prev"]' echo "⬅️ Prev" ;; - pause|space) + pause|stop|toggle|t|s) send_cmd '["cycle", "pause"]' echo "⏯️ Pause toggled" ;; @@ -113,19 +113,13 @@ ACTION="${1:-}" shift 2>/dev/null || true case "${ACTION}" in - run) - subcmd="${1:-help}" - shift || true - case "${subcmd}" in - music) play_playlist "$@" ;; - radio) play_radio "$@" ;; - *) usage; exit 1 ;; - esac - ;; - radio) + radio|tune) tune_radio "$@" ;; - next|n|prev|p|pause|space) + local|music|m) + play_local_playlist "$@" + ;; + next|n|prev|p|pause|stop|toggle|t|s) handle_control "${ACTION}" ;; help|"")