summarylogtreecommitdiffstats
path: root/exiftool.patch
blob: edc00331796854c4ca34432631403b80ad6a1e52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
diff --git a/kunst b/kunst
index 9d0a8f4..9b12827 100755
--- a/kunst
+++ b/kunst
@@ -12,6 +12,8 @@ COVER=/tmp/kunst.jpg
 MUSIC_DIR="${KUNST_MUSIC_DIR:-~/Music}"
 SIZE="${KUNST_SIZE:-250x250}"
 POSITION="${KUNST_POSITION:-+0+0}"
+COVER_NAMES=${KUNST_COVER_NAMES:-"folder|cover|front"}
+COVER_EXT=${KUNST_COVER_EXT:-"jpg|png"}
 ONLINE_ALBUM_ART=""
 PROG_NAME=$(basename "$0")
 
@@ -152,7 +154,23 @@ find_album_art(){
 
     # 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
+    if [ "$(type -p exiftool &>/dev/null)" ]; then
+        SONG="$MUSIC_DIR/$(mpc --format "%file%" current)"
+        PICTURE_TAG="-Picture"
+
+        if [ "$SONG" = *".m4a" ]; then
+            PICTURE_TAG="-CoverArt"
+        fi
+        # Extract album cover using perl-image-exiftool
+        exiftool -b "$PICTURE_TAG" "$SONG"  > "$COVER"
+        # Check if image is valid
+        img_data=$(identify "$COVER" 2>&1)
+        if [ "$img_data" = *"insufficient"* ]; then
+            return 1
+        fi
+    else
+        ffmpeg -i "$MUSIC_DIR/$(mpc current -f %file%)" "$COVER" -y &> /dev/null
+    fi
 
     # Get the status of the previous command
     STATUS=$?
@@ -162,19 +180,21 @@ find_album_art(){
         log "extracted album art"
         ARTLESS=false
     else
-        DIR="$MUSIC_DIR$(dirname "$(mpc current -f %file%)")"
+        DIR="$MUSIC_DIR/$(dirname "$(mpc current -f %file%)")"
+        # prevent iterating the entire $MUSIC_DIR if mpc experiences an error
+        [ "$DIR" == "$MUSIC_DIR"/. ] && ARTLESS=true && return 1
         log "inspecting $DIR"
 
         # 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
+        # Look at issues #9 and #45 for more details
+        while IFS= read -r CANDIDATE; do
             if [ -f "$CANDIDATE" ]; then
                 STATUS=0
                 ARTLESS=false
                 convert "$CANDIDATE" $COVER &> /dev/null
-                log "found cover.png"
+                log "found $(basename "$CANDIDATE")"
             fi
-        done
+        done < <(find "$DIR" -type f | grep -i -E -- "($COVER_NAMES).($COVER_EXT)")
     fi
 
     if [ "$STATUS" -ne 0 ];then
@@ -220,12 +240,8 @@ main() {
         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
-
             # Decode the base64 encoded image and save it
-            # to /tmp/kunst.png
+            # to /tmp/kunst.jpg
             echo "$MUSIC_NOTE" | base64 --decode > "$COVER"
         fi
 
@@ -235,7 +251,9 @@ main() {
             FIRST_RUN=false
 
             # Display the album art using sxiv
-            sxiv -g "$SIZE$POSITION" -b "$COVER" -N "Kunst" &
+            # If sxiv is closed, kill the script as well with the trap at the end of
+            # the script (see issue #48).
+            (sxiv -g "$SIZE$POSITION" -b "$COVER" -N "Kunst"; kill -USR1 0) &
 
             # Save the process ID so that we can kill
             # sxiv when the user exits the script
@@ -257,4 +275,6 @@ main() {
 trap "" SIGTSTP
 
 trap pre_exit EXIT
+trap 'exit 1' TERM HUP INT
+trap 'exit 0' USR1
 main