diff --git a/kunst b/kunst index f133e89..9d0a8f4 100755 --- a/kunst +++ b/kunst @@ -9,14 +9,16 @@ VERSION=1.3.4 COVER=/tmp/kunst.jpg -MUSIC_DIR=~/Music -SIZE=250x250 -POSITION="+0+0" -ONLINE_ALBUM_ART=false +MUSIC_DIR="${KUNST_MUSIC_DIR:-~/Music}" +SIZE="${KUNST_SIZE:-250x250}" +POSITION="${KUNST_POSITION:-+0+0}" +ONLINE_ALBUM_ART="" +PROG_NAME=$(basename "$0") show_help() { -printf "%s" "\ -usage: kunst [-h] [--size \"px\"] [--position \"+x+y\"][--music_dir \"path/to/dir\"] [--silent] [--version] + printf "%s" "\ +usage: kunst [-h|--help] [--size \"px\"] [--position \"+x+y\"] + [--music_dir \"path/to/dir\"] [--verbose] [--version] ┬┌─┬ ┬┌┐┌┌─┐┌┬┐ ├┴┐│ ││││└─┐ │ @@ -28,15 +30,24 @@ optional arguments: --size what size to display the album art in --position the position where the album art should be displayed --music_dir the music directory which MPD plays from - --silent dont show the output + --verbose show the output --force-online force getting cover from the internet --version show the version of kunst you are using " } +log() { + [ "$VERBOSE" ] && echo "$PROG_NAME: $1" +} + +logError() { + echo "$PROG_NAME: $1" >&2 + exit 1 +} + # Parse the arguments -options=$(getopt -o h --long position:,size:,music_dir:,version,force-online,silent,help -- "$@") +options=$(getopt -o h --long 'position:,size:,music_dir:,version,force-online,verbose,help' -- "$@") eval set -- "$options" while true; do @@ -54,18 +65,18 @@ while true; do MUSIC_DIR=$1 ;; -h|--help) - show_help - exit + show_help + exit + ;; + --version) + echo $VERSION + exit ;; - --version) - echo $VERSION - exit - ;; --force-online) ONLINE_ALBUM_ART=true ;; - --silent) - SILENT=true + --verbose) + verbose=true ;; --) shift @@ -84,109 +95,112 @@ EOF is_connected() { - # Check if internet is connected. We are using api.deezer.com to test - # if the internet is connected because if api.deezer.com is down or - # the internet is not connected this script will work as expected - if ping -q -c 1 -W 1 api.deezer.com >/dev/null; then - connected=true - else - [ ! "$SILENT" ] && echo "kunst: unable to check online for the album art" - connected=false - fi + # Check if internet is connected. We are using api.deezer.com to test + # if the internet is connected because if api.deezer.com is down or + # the internet is not connected this script will work as expected + if ping -q -c 1 -W 1 api.deezer.com >/dev/null; then + connected=true + else + log "unable to check online for the album art" + connected=false + fi } get_cover_online() { - # Check if connected to internet - is_connected + # Check if connected to internet + is_connected - if [ "$connected" == false ];then - ARTLESS=true - return - fi + if [ "$connected" == false ];then + ARTLESS=true + return + fi # If the current playing song ends with .mp3 or something similar, remove # it before searching for the album art because including the file extension # reduces the chance of good results in the search query QUERY=$(mpc current | sed 's/\.[^.]*$//' | iconv -t ascii//TRANSLIT -f utf8) - # Try to get the album cover online from api.deezer.com - API_URL="https://api.deezer.com/search/autocomplete?q=$QUERY" && API_URL=${API_URL//' '/'%20'} - echo $API_URL - # Extract the albumcover from the json returned - IMG_URL=$(curl -s "$API_URL" | jq -r '.playlists.data[0].picture_big') + # Try to get the album cover online from api.deezer.com + API_URL="https://api.deezer.com/search/autocomplete?q=$QUERY" && API_URL=${API_URL//' '/'%20'} + log "fetching $API_URL" + # Extract the albumcover from the json returned + JSON=$(curl -s "$API_URL") + ALBUM=$(echo "$JSON" | jq -r '.tracks.data[0].album.picture_big' | sed 's/null//'); + ARTIST=$(echo "$JSON" | jq -r '.tracks.data[0].artist.picture_big' | sed 's/null//'); + IMG_URL="${ALBUM:-$ARTIST}" - if [ "$IMG_URL" = '' ] || [ "$IMG_URL" = 'null' ];then - [ ! "$SILENT" ] && echo "error: cover not found online" - ARTLESS=true - else - [ ! "$SILENT" ] && echo "kunst: cover found online" - curl -o "$COVER" -s "$IMG_URL" - ARTLESS=false - fi + if [ "$IMG_URL" = '' ] || [ "$IMG_URL" = 'null' ];then + log "cover not found online" + ARTLESS=true + else + log "cover found online" + curl -o "$COVER" -s "$IMG_URL" + ARTLESS=false + fi } find_album_art(){ # Check if the user wants to get the album art from the internet, - # regardless if the curent song has an embedded album art or not - if [ "$ONLINE_ALBUM_ART" == true ];then - [ ! "$SILENT" ] && echo "kunst: getting cover from internet" - get_cover_online + # regardless if the current song has an embedded album art or not + if [ ! -z "$ONLINE_ALBUM_ART" ]; then + log "getting cover from internet" + get_cover_online return fi - # Extract the album art from the mp3 file and dont show the messsy - # output of ffmpeg - ffmpeg -i "$MUSIC_DIR$(mpc current -f %file%)" "$COVER" -y &> /dev/null + # Extract the album art from the mp3 file and dont show the messsy + # output of ffmpeg + ffmpeg -i "$MUSIC_DIR$(mpc current -f %file%)" "$COVER" -y &> /dev/null - # Get the status of the previous command - STATUS=$? + # Get the status of the previous command + STATUS=$? - # Check if the file has a embbeded album art - if [ "$STATUS" -eq 0 ];then - [ ! "$SILENT" ] && echo "kunst: extracted album art" - ARTLESS=false - else + # Check if the file has a embbeded album art + if [ "$STATUS" -eq 0 ];then + log "extracted album art" + ARTLESS=false + else DIR="$MUSIC_DIR$(dirname "$(mpc current -f %file%)")" - [ ! "$SILENT" ] && echo "kunst: inspecting $DIR" + log "inspecting $DIR" - # Check if there is an album cover/art in the folder. - # Look at issue #9 for more details + # Check if there is an album cover/art in the folder. + # Look at issue #9 for more details for CANDIDATE in "$DIR/cover."{png,jpg}; do if [ -f "$CANDIDATE" ]; then STATUS=0 ARTLESS=false convert "$CANDIDATE" $COVER &> /dev/null - [ ! "$SILENT" ] && echo "kunst: found cover.png" + log "found cover.png" fi done fi - if [ "$STATUS" -ne 0 ];then - [ ! "$SILENT" ] && echo "error: file does not have an album art" - get_cover_online - fi + if [ "$STATUS" -ne 0 ];then + log "file does not have an album art" + get_cover_online + fi } update_cover() { find_album_art - if [ "$ARTLESS" == false ]; then - convert "$COVER" -resize "$SIZE" "$COVER" &> /dev/null - [ ! "$SILENT" ] && echo "kunst: resized album art to $SIZE" - fi + if [ "$ARTLESS" == false ]; then + convert "$COVER" -resize "$SIZE" "$COVER" &> /dev/null + log "resized album art to $SIZE" + fi } pre_exit() { - # Get the proccess ID of kunst and kill it. + # Get the proccess ID of kunst and kill it. # We are dumping the output of kill to /dev/null # because if the user quits sxiv before they # exit kunst, an error will be shown # from kill and we dont want that - kill -9 "$(cat /tmp/kunst.pid)" &>/dev/null + kill -9 "$(cat /tmp/kunst.pid)" &>/dev/null } @@ -195,54 +209,46 @@ main() { dependencies=(sxiv convert bash ffmpeg mpc jq mpd) for dependency in "${dependencies[@]}"; do type -p "$dependency" &>/dev/null || { - echo "error: Could not find '${dependency}', is it installed?" >&2 - exit 1 + logError "could not find '${dependency}', is it installed?" } done - [ "$KUNST_MUSIC_DIR" != "" ] && MUSIC_DIR="$KUNST_MUSIC_DIR" - [ "$KUNST_SIZE" != "" ] && SIZE="$KUNST_SIZE" - [ "$KUNST_POSITION" != "" ] && POSITION="$KUNST_POSITION" + # Flag to run some commands only once in the loop + FIRST_RUN=true - # Flag to run some commands only once in the loop - FIRST_RUN=true + while true; do + update_cover - while true; do - update_cover + if [ "$ARTLESS" == true ];then + # Dhange the path to COVER because the music note + # image is a png not jpg + COVER=/tmp/kunst.png - if [ "$ARTLESS" == true ];then - # Dhange the path to COVER because the music note - # image is a png not jpg - COVER=/tmp/kunst.png - - # Decode the base64 encoded image and save it - # to /tmp/kunst.png - echo "$MUSIC_NOTE" | base64 --decode > "$COVER" - fi - - if [ ! "$SILENT" ];then - echo "kunst: swapped album art to $(mpc current)" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - + # Decode the base64 encoded image and save it + # to /tmp/kunst.png + echo "$MUSIC_NOTE" | base64 --decode > "$COVER" fi - if [ "$FIRST_RUN" == true ]; then - FIRST_RUN=false + log "swapped album art to $(mpc current)" - # Display the album art using sxiv - sxiv -g "$SIZE$POSITION" -b "$COVER" -N "Kunst" & + if [ "$FIRST_RUN" == true ]; then + FIRST_RUN=false - # Save the process ID so that we can kill - # sxiv when the user exits the script - echo $! >/tmp/kunst.pid - fi + # Display the album art using sxiv + sxiv -g "$SIZE$POSITION" -b "$COVER" -N "Kunst" & - # Waiting for an event from mpd; play/pause/next/previous - # this is lets kunst use less CPU :) - while true; do - mpc idle player &>/dev/null && (mpc status | grep "\[playing\]" &>/dev/null) && break - done - [ ! "$SILENT" ] && echo "kunst: received event from mpd" - done + # Save the process ID so that we can kill + # sxiv when the user exits the script + echo $! >/tmp/kunst.pid + fi + + # Waiting for an event from mpd; play/pause/next/previous + # this is lets kunst use less CPU :) + while true; do + mpc idle player &>/dev/null && (mpc status | grep "\[playing\]" &>/dev/null) && break + done + log "received event from mpd" + done } # Disable CTRL-Z because if we allowed this key press,