#!/bin/sh # helper for the music script # dependencies: music, mpv, socat, yt-dlp, ffmpeg, imagemagick # optional dependencies: dwmblocks, libnotify, herbe FAVDIR="${XDG_MUSIC_DIR:-$HOME/music}/favorite" DLDIR="${XDG_MUSIC_DIR:-$HOME/music}/download" CACHE="${XDG_CACHE_HOME:-$HOME/.cache}" IMG="nsxiv" getpath() { tmp="$(printf '{ "command": ["get_property", "path"] }\n'\ | socat - /tmp/mpvsocket)" tmp="${tmp#{\"data\":\"}" path="${tmp%\",\"request_id\":0,\"error\":\"success\"\}}" } getvol() { tmp="$(printf '{ "command": ["get_property", "volume"] }\n'\ | socat - /tmp/mpvsocket)" tmp="${tmp#{\"data\":}" printf '%s\n' "${tmp%.000000,\"request_id\":0,\"error\":\"success\"\}}" } download() { mkdir -p "$1" notify-send "Downloading '$path' to '$1'" if yt-dlp -f "ba" -x --embed-thumbnail --audio-format mp3\ -o"%(title)s [%(id)s].%(ext)s" -P "$1" "$path"; then notify-send "'$path' successfuly downloaded to '$2'" return 0 else notify-send "Error: '$path' couldn't be downloaded" return 1 fi } addtofav() { case $path in *youtube.com*) download "$FAVDIR" ;; *) mkdir -p "$FAVDIR" if cp "$path" "$FAVDIR"; then notify-send "'$path' was copied to '$FAVDIR'" return 0 else notify-send "'$path' couldn't be copied to '$FAVDIR'" return 1 fi ;; esac } getthumbnail() { mkdir -p "$CACHE" case $path in *youtube.com*) yt-dlp --skip-download --force-overwrites --write-thumbnail\ -o "$CACHE/thumbnail" "$path" > /dev/null 2>&1 &&\ magick "$CACHE/thumbnail.webp" "$CACHE/thumbnail.jpg" ;; *) ffmpeg -y -i "$path" "$CACHE/thumbnail.jpg" 2> /dev/null ;; esac } main() { if ! pgrep -x music >/dev/null; then kill -35 "$(pidof dwmblocks)" herbe "Error: There is no music playing"\ "Do you want to play some ?" && music return 1 fi cmd="${1:-$(printf '⏯️pause/play\n⏭️next\n⏮️prev\n📢volume\n🔳stop ⭐favorite\n⬇️download\n🖼️thumbnail' | dmenu -i -p "musiccmd")}" case "$cmd" in cycle|*pause|*play) printf 'cycle pause\n' | socat - /tmp/mpvsocket kill -35 "$(pidof dwmblocks)" ;; *next) printf 'playlist-next\n' | socat - /tmp/mpvsocket ;; *prev) printf 'playlist-prev\n' | socat - /tmp/mpvsocket ;; *volume) printf '{ "command": ["set_property", "volume", %s] }\n'\ "${2:-$(true | dmenu -p "Current volume: $(getvol)")}"\ | socat - /tmp/mpvsocket 1> /dev/null ;; *stop) printf 'stop\n' | socat - /tmp/mpvsocket kill -35 "$(pidof dwmblocks)" ;; *favorite|fav) getpath addtofav ;; *download) getpath download "$DLDIR" ;; *thumbnail) getpath if getthumbnail; then $IMG "$CACHE/thumbnail.jpg" else notify-send "Error: can't get thumbnail" return 1 fi ;; path) getpath printf '%s\n' "$path" ;; vol) getvol ;; esac } main "$@"