From 03e35203112d8a80456854b3afa76147a8743451 Mon Sep 17 00:00:00 2001 From: Siddharth Dushantha Date: Fri, 27 Mar 2020 20:05:03 +0100 Subject: [PATCH] Fixed the whole thing --- kunst | 235 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 106 insertions(+), 129 deletions(-) diff --git a/kunst b/kunst index 395119a..e4b0d51 100755 --- a/kunst +++ b/kunst @@ -4,105 +4,99 @@ # ┴ ┴└─┘┘└┘└─┘ ┴ # Created by Siddharth Dushantha # -# Dependencies: sxiv or imv, bash, ffmpeg, mpc, jq, mpd +# Dependencies: sxiv, imagemagick, bash, ffmpeg, mpc, jq, mpd -VERSION=1.2.6 + +VERSION=1.2.4 COVER=/tmp/kunst.jpg MUSIC_DIR=~/Music/ -WIDTH=250 -SIZE="${WIDTH}x${WIDTH}" +SIZE=250x250 POSITION="+0+0" + show_help() { - echo "usage: kunst [-h] [--size "px"] [--position "+x+y"] [--viewer ] [--music_dir "path/to/dir"] [--silent] [--version]" - echo " " - echo "┬┌─┬ ┬┌┐┌┌─┐┌┬┐" - echo "├┴┐│ ││││└─┐ │" - echo "┴ ┴└─┘┘└┘└─┘ ┴" - echo "Download and display album art or display embedded album art" - echo " " - echo "optional arguments:" - echo " -h, --help show this help message and exit" - echo " --size what size to display the album art in" - echo " --position the position where the album art should be displayed" - echo " --viewer whether to use imv or sxiv" - echo " --music_dir the music directory which MPD plays from" - echo " --silent dont show the output" - echo " --version show the version of kunst you are using" +printf "%s" "\ +usage: kunst [-h] [--size \"px\"] [--position \"+x+y\"][--music_dir \"path/to/dir\"] [--silent] [--version] + +┬┌─┬ ┬┌┐┌┌─┐┌┬┐ +├┴┐│ ││││└─┐ │ +┴ ┴└─┘┘└┘└─┘ ┴ +Download and display album art or display embedded album art + +optional arguments: + -h, --help show this help message and exit + --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 + --version show the version of kunst you are using +" } + # Parse the arguments options=$(getopt -o h --long position:,size:,music_dir:,version,silent,help -- "$@") eval set -- "$options" while true; do - case "$1" in - --size) - shift - SIZE=$1 - ;; - --position) - shift - POSITION=$1 - ;; - --viewer) - shift - VIEWER=$1 - ;; - --music_dir) - shift - MUSIC_DIR=$1 - ;; - -h | --help) - show_help + case "$1" in + --size) + shift; + SIZE=$1 + ;; + --position) + shift; + POSITION=$1 + ;; + --music_dir) + shift; + MUSIC_DIR=$1 + ;; + -h|--help) + show_help exit - ;; + ;; --version) - echo $VERSION + echo $VERSION exit ;; - --silent) - SILENT=true - ;; - --) - shift - break - ;; - esac - shift + --silent) + SILENT=true + ;; + --) + shift + break + ;; + esac + shift done -# If available, use imv instead of sxiv on Wayland, -# unless specified otherwise by the user. -if [ -n "$SWAYSOCK" ] || [ "$XDG_SESSION_TYPE" = 'wayland' ] \ - && [ -z "$VIEWER" ] && command -v imv >/dev/null; then - VIEWER=imv -fi - # This is a base64 endcoded image which will be used if # the file does not have an emmbeded album art. # The image is an image of a music note -read -d '' MUSIC_NOTE </dev/null; then connected=true else - [ ! $SILENT ] && echo "kunst: unable to check online for the album art" + [ ! "$SILENT" ] && echo "kunst: unable to check online for the album art" connected=false fi } + get_cover_online() { # Check if connected to internet is_connected - if [ $connected == false ]; then + if [ "$connected" == false ];then ARTLESS=true return fi @@ -111,81 +105,76 @@ get_cover_online() { API_URL="https://api.deezer.com/search/autocomplete?q=$(mpc current)" && API_URL=${API_URL//' '/'%20'} # Extract the albumcover from the json returned - IMG_URL=$(curl -s --ssl "$API_URL" | jq -r '.playlists.data[0] | .picture_big') + IMG_URL=$(curl -s "$API_URL" | jq -r '.playlists.data[0] | .picture_big') - if [ "$IMG_URL" = '' ] || [ "$IMG_URL" = 'null' ]; then - [ ! $SILENT ] && echo "error: cover not found online" + 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 --ssl $IMG_URL + [ ! "$SILENT" ] && echo "kunst: cover found online" + curl -o "$COVER" -s "$IMG_URL" ARTLESS=false fi } + update_cover() { # Extract the album art from the mp3 file and dont show the messsy # output of ffmpeg - ffmpeg -loglevel error -i "$MUSIC_DIR/$(mpc current -f %file%)" $COVER -y + ffmpeg -i "$MUSIC_DIR$(mpc current -f %file%)" "$COVER" -y &> /dev/null # 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" + if [ "$STATUS" -eq 0 ];then + [ ! "$SILENT" ] && echo "kunst: extracted album art" ARTLESS=false else - DIR="$MUSIC_DIR/$(dirname "$(mpc current -f %file%)")" - [ ! $SILENT ] && echo "kunst: inspecting $DIR" + DIR="$MUSIC_DIR$(dirname "$(mpc current -f %file%)")" + [ ! "$SILENT" ] && echo "kunst: inspecting $DIR" # Check if there is an album cover/art in the folder. # Look at issue #9 for more details - # use same regex to find album art as mpDris2 - candidates=$( - find "$DIR" -type f \ - | grep -iE '/(([0-9| |-]*)?)(album|cover|\.?folder|front).*\.(gif|jpeg|jpg|png)$' - ) - while read -r CANDIDATE; do - if [ -f "$CANDIDATE" ]; then - STATUS=0 - ARTLESS=false - ffmpeg -loglevel error -i "$CANDIDATE" -vframes 1 $COVER -y - [ ! $SILENT ] && echo "kunst: found cover $CANDIDATE" - break - fi - done <<<"$candidates" # use here string so loop changes vars in main process - fi + 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" + fi + done + fi - if [ $STATUS -ne 0 ]; then - [ ! $SILENT ] && echo "error: file does not have an album art" + if [ "$STATUS" -ne 0 ];then + [ ! "$SILENT" ] && echo "error: file does not have an album art" get_cover_online fi # Resize the image to 250x250 - if [ $ARTLESS == false ]; then - ffmpeg -loglevel error -i $COVER -vframes 1 -vf scale=$WIDTH:-1 $COVER -y - [ ! $SILENT ] && echo "kunst: resized album art to $SIZE" + if [ "$ARTLESS" == false ]; then + convert "$COVER" -resize "$SIZE" "$COVER" &> /dev/null + [ ! "$SILENT" ] && echo "kunst: resized album art to $SIZE" fi } pre_exit() { # Get the proccess ID of kunst and kill it. - # We are dumping the output of kill to /dev/null - # because if the user quits the image viewer - # before they exit kunst, an error will be shown - # from kill and we dont want that - kill -9 $(cat /tmp/kunst.pid) &>/dev/null - + # 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" + } main() { - - [ -z $KUNST_MUSIC_DIR ] && MUSIC_DIR=$KUNST_MUSIC_DIR - [ -z $KUNST_SIZE ] && SIZE=$KUNST_SIZE - [ -z $KUNST_POSITION ] && POSITION=$KUNST_POSITION + + [ "$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 @@ -194,56 +183,44 @@ main() { update_cover - if [ $ARTLESS == true ]; then + 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 + 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 ' ' - + fi - if [ ! $SILENT ]; then - echo "kunst: swapped album art to $(mpc current)" - printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - - fi - - if [ $FIRST_RUN == true ]; then + if [ "$FIRST_RUN" == true ]; then FIRST_RUN=false - # Display the album art - if [ "$VIEWER" = 'imv' ]; then - # if running SwayWM, tell sway to resize the imv window - [ -n "$SWAYSOCK" ] \ - && swaymsg for_window '[app_id="^imv$" title="^imv.*\/tmp\/kunst\.(jpg|png)"]' resize set width "$WIDTH" px height "$WIDTH" px - imv "$COVER" & - else - sxiv -g $SIZE$POSITION -b $COVER -N "Kunst" & - fi - # Save the process ID so that we can kill the - # image viewer when the user exits the script + # Display the album art using sxiv + sxiv -g "$SIZE$POSITION" -b "$COVER" -N "Kunst" & + + # 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 + mpc idle player &>/dev/null && (mpc status | grep "\[playing\]" &>/dev/null) && break done - - [ ! $SILENT ] && echo "kunst: received event from mpd" - - if [ "$VIEWER" = 'imv' ]; then - imv-msg "$(cat /tmp/kunst.pid)" close all - imv-msg "$(cat /tmp/kunst.pid)" open "$COVER" - fi + [ ! "$SILENT" ] && echo "kunst: received event from mpd" done } # Disable CTRL-Z because if we allowed this key press, -# then the script would exit but, the image viewer -# would still be running +# then the script would exit but, sxiv would still be +# running trap "" SIGTSTP trap pre_exit EXIT