dotfiles

My personal shell configs and stuff
git clone git://git.alex.balgavy.eu/dotfiles.git
Log | Files | Refs | Submodules | README | LICENSE

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