audiotag (4632B)
1 #!/bin/sh 2 # A wrapper for audio taggers for different formats 3 printfq() { printf "'%s'\n" "$(printf '%s' "$1" | sed -e "s/'/'\\''/g")"; } 4 die() { printf '%s\n' "$1" >&2 && exit 1; } 5 6 FILES="" 7 8 while [ $(($#)) -ne 0 ]; do 9 case "$1" in 10 -b|--band) 11 band="$2" 12 shift 2 13 ;; 14 -t|--title) 15 title="$2" 16 shift 2 17 ;; 18 -l|--album) 19 album="$2" 20 shift 2 21 ;; 22 -r|--artist) 23 artist="$2" 24 shift 2 25 ;; 26 -n|--number) 27 number="$2" 28 shift 2 29 ;; 30 -g|--genre) 31 genre="$2" 32 shift 2 33 ;; 34 -i|--image) 35 image="$2" 36 shift 2 37 ;; 38 -x|--extract) 39 spec="$2" 40 shift 2 41 ;; 42 -c|--clear) 43 clear=1 44 shift 45 ;; 46 -h|--help) 47 printf 'Supported usage\n' 48 printf '%s -b albumartist -t title -l album -r artist -n tracknumber -g genre -i IMG_PATH:DESCRIPTION \n' "$0" 49 printf '%s [--extract|-x] "filename_spec" FILE\n' "$0" 50 printf '%s [--clear|-c] FILE\n' "$0" 51 exit 0 52 ;; 53 --) # end arg parsing 54 shift 55 break 56 ;; 57 -*) # unsupported flags 58 echo "Unsupported flag $1" >&2 59 exit 1 60 ;; 61 *) 62 if [ -z "$FILES" ]; then 63 FILES="$1" 64 else 65 FILES="$FILES$(printf '\n%s' "$1")" 66 fi 67 shift 68 ;; 69 esac 70 done 71 72 [ -z "$FILES" ] && die 'Need a file to operate on.' 73 74 printf '%s\n' "$FILES" | while IFS='' read -r file; do 75 [ -f "$file" ] || die "File $file not readable." 76 77 # Clear params, will rebuild them per command 78 set -- 79 80 case "$file" in 81 *.mp3) 82 if [ -n "$clear" ]; then 83 command -v eyeD3 >/dev/null 2>&1 || die 'eyeD3 must be installed.' 84 eyeD3 --remove-all "$file" 85 elif [ -n "$spec" ]; then 86 command -v taffy >/dev/null 2>&1 || die 'taffy must be installed.' 87 taffy --extract "$spec" "$file" 88 else 89 command -v eyeD3 >/dev/null 2>&1 || die 'eyeD3 must be installed.' 90 # v2.3 is more common and compatible than v2.4 91 set -- --to-v2.3 92 [ -n "$band" ] && set -- "$@" -b "$band" 93 [ -n "$title" ] && set -- "$@" -t "$title" 94 [ -n "$album" ] && set -- "$@" -A "$album" 95 [ -n "$artist" ] && set -- "$@" -a "$artist" 96 [ -n "$number" ] && set -- "$@" -n "$number" 97 [ -n "$genre" ] && set -- "$@" -G "$genre" 98 99 if [ -n "$image" ]; then 100 img_path="${image%%:*}" 101 img_desc="${image##*:}" 102 set -- "$@" --add-image "${img_path}:FRONT_COVER:${img_desc}" 103 fi 104 eyeD3 "$@" "$file" 105 fi 106 ;; 107 *.opus) 108 command -v ffmpeg >/dev/null 2>&1 || die 'ffmpeg must be installed.' 109 if [ -n "$clear" ]; then 110 tempdir="$(mktemp -d)" 111 ffmpeg -i "$file" -map_metadata -1 -codec copy "$tempdir/output.opus" \ 112 && mv "$tempdir/output.opus" "$file" \ 113 && rmdir "$tempdir" 114 elif [ -n "$spec" ]; then 115 die 'Extracting from opus filename not yet supported.' 116 else 117 # See https://exiftool.org/TagNames/Vorbis.html#Comments 118 set -- -i "$file" -codec copy 119 [ -n "$band" ] && set -- "$@" -metadata ALBUMARTIST="$band" 120 [ -n "$title" ] && set -- "$@" -metadata TITLE="$title" 121 [ -n "$album" ] && set -- "$@" -metadata ALBUM="$album" 122 [ -n "$artist" ] && set -- "$@" -metadata ARTIST="$artist" 123 [ -n "$number" ] && set -- "$@" -metadata TRACKNUMBER="$number" 124 [ -n "$genre" ] && set -- "$@" -metadata GENRE="$genre" 125 126 tempdir="$(mktemp -d)" 127 ffmpeg "$@" "$tempdir/output.opus" \ 128 && mv "$tempdir/output.opus" "$file" \ 129 && rmdir "$tempdir" 130 fi 131 ;; 132 *.flac) 133 command -v metaflac >/dev/null 2>&1 || die 'metaflac must be installed.' 134 if [ -n "$clear" ]; then 135 metaflac --remove-all-tags "$file" 136 elif [ -n "$spec" ]; then 137 die 'Extracting from flac filename not yet supported.' 138 else 139 [ -n "$band" ] && set -- "$@" --set-tag=ALBUMARTIST="$band" 140 [ -n "$title" ] && set -- "$@" --set-tag=TITLE="$title" 141 [ -n "$album" ] && set -- "$@" --set-tag=ALBUM="$album" 142 [ -n "$artist" ] && set -- "$@" --set-tag=ARTIST="$artist" 143 [ -n "$number" ] && set -- "$@" --set-tag=TRACKNUMBER="$number" 144 [ -n "$genre" ] && set -- "$@" --set-tag=GENRE="$genre" 145 146 if [ -n "$image" ]; then 147 img_path="${image%%:*}" 148 img_desc="${image##*:}" 149 set -- "$@" --import-picture-from="3||${img_desc}||${img_path}" 150 fi 151 152 metaflac "$@" "$file" 153 fi 154 ;; 155 *) 156 die 'File format not (yet) supported.';; 157 esac 158 159 done