X-Git-Url: https://git.draconx.ca/gitweb/mpdhacks.git/blobdiff_plain/5227a49aa2672e4fae2b118926fa84bb7af6fa24..44faac243210fd4ab72702a9acc2ff6cf7743d55:/mpdthumb.sh diff --git a/mpdthumb.sh b/mpdthumb.sh index 4ff4249..4faf7a6 100755 --- a/mpdthumb.sh +++ b/mpdthumb.sh @@ -79,6 +79,9 @@ Options: 'auto', which queries the server to determine the appropriate method. --no-binarylimit Equivalent to --binarylimit=no + --embedded Attempt to retrieve embedded covers using readpicture. + This requires (and implies) --binarylimit. + --no-embedded Use only album-level covers. This is the default. --version Print a version message and then exit. --help Print this message and then exit. @@ -87,6 +90,7 @@ EOF } opt_binarylimit=auto +opt_embedded=no size=x128 lastarg= @@ -101,6 +105,8 @@ for arg; do --binarylimit=*) opt_binarylimit=${arg#--*=} ;; --no-binarylimit) opt_binarylimit=no ;; --binarylimit) opt_binarylimit=yes ;; + --embedded) opt_embedded=yes ;; + --no-embedded) opt_embedded=no ;; --size=*) size=${arg#--size=} ;; --small) size=56 ;; --size) lastarg=$arg ;; @@ -133,6 +139,13 @@ tmp=`mktemp` exec 5>"$tmp" 6<"$tmp" rm -f "$tmp" +# --embedded implies --binarylimit +case $opt_embedded in +yes) use_embedded=true ;; +*) use_embedded=false ;; +esac +$use_embedded && opt_binarylimit=yes + # Test for binarylimit command in MPD server. We want to minimize data # transfer in order to make cache hits as fast as possible. # @@ -158,34 +171,55 @@ else binarylimit_offset=2147483647 fi -for arg; do - arg=${arg%/*}/ - shift; set x "$@" "$arg"; shift +for file; do + case $file in + */*) dir=${file%/*}/ ;; + *) dir=/ ;; + esac - printf '%s\n' "$arg" | sed '/[ \\"'\'']/ { + if $use_embedded; then + shift; set x "$@" "$file" "$dir"; shift + else + file= + fi + + printf '%s\n' "$dir" ${file:+"$file"} | sed -n '/[ \\"'\'']/ { s/[\\"]/\\&/g s/.*/"&"/ } - s/.*/albumart & '"$binarylimit_offset"'/' >&3; + s/.*/albumart & '"$binarylimit_offset"'/ + 1h + 2s/^albumart/readpicture/p + $ { + g + p + }' >&3; done -<&4 $MPDEXEC --ignore-errors >&5 2>&1 || exit +valid= +<&4 $MPDEXEC --verbose --ignore-errors >&5 2>&1 || exit while read a b <&6; do case $a in - size:) :;; + readpicture|albumart) + prevn=$# file=$1 mode=$a; shift || exit; continue + ;; + size:) + valid=$mode$# + ;; ACK) case $b in - *binarylimit*) printf '%s: %s\n' "$argv0" "$a $b" 1>&2; exit 1 ;; + *'{binarylimit}'*|*'{readpicture}'*) + printf '%s: %s\n' "$argv0" "$a $b" 1>&2; exit 1 ;; esac - - echo; shift || exit; continue ;; + test x"$valid" = x"readpicture$prevn" || echo + continue + ;; *) continue ;; esac # We combine the filename and the size to compute the cache key and # hope this suffices to detect stale entries. Unfortunately MPD does # not currently give us the modified date which would be more useful... - file=$1; shift || exit cache_id=`printf 'MPD:%s:%s' "$file" "$b" | md5sum` cache_id=${cache_id:+${cache_id%% *}_$size.png} @@ -199,7 +233,7 @@ EOF fi # Not cached, retrieve the entire image - $MPDEXEC --binary --download albumart "$file" >&3 || exit + $MPDEXEC --binary --download "$mode" "$file" >&3 || exit <&4 $CONVERT -scale "$size" - "$THUMBNAILDIR/tmp.$cache_id" || { rc=$? rm -f "$THUMBNAILDIR/tmp.$cache_id"; exit $rc; } mv -f "$THUMBNAILDIR/tmp.$cache_id" "$THUMBNAILDIR/$cache_id"