diff --git a/AAXtoMP3 b/AAXtoMP3 index 293de3f..143a114 100755 --- a/AAXtoMP3 +++ b/AAXtoMP3 @@ -1,10 +1,38 @@ #!/usr/bin/env bash -set -o errexit -o noclobber -o nounset -o pipefail - +# ======================================================================== +# Command Line Options +usage=$'\nUsage: AAXtoMP3.sh [--flac] [--aac] [--opus ] [--single] [--authcode ]\n[--output_dir ] {FILES}\n' codec=libmp3lame extension=mp3 mode=chaptered +auth_code= +targetdir= + +while true; do + case "$1" in + -f | --flac ) codec=flac; extension=flac; shift ;; + -a | --aac ) codec=copy; extension=m4a; mode=single ;shift ;; + -o | --opus ) codec=libopus; extension=ogg; shift ;; + -s | --single ) mode=single; shift ;; + -t | --target_dir ) targetdir="$2"; shift 2 ;; + -A | --authcode ) auth_code="$2"; shift 2 ;; + -d | --debug ) DEBUG=1; shift ;; # Not so secret flag for debug output. to use in code [ $DEBUG == 1 ] && sample=2 + -h | --help ) printf "$usage" $0 ; exit ;; + -- ) shift; break ;; + * ) break ;; + esac +done + +if [ "$#" -eq 0 ]; then + printf "$usage" $0 + exit 1 +fi + +# ======================================================================== +# Variable validation +set -o errexit -o noclobber -o nounset -o pipefail + GREP=$(grep --version | grep -q GNU && echo "grep" || echo "ggrep") if ! [[ $(type -P "$GREP") ]]; then @@ -14,30 +42,29 @@ if ! [[ $(type -P "$GREP") ]]; then exit 1 fi -if [ "$#" -eq 0 ]; then - echo "Usage: bash AAXtoMP3.sh [--flac] [--single] AUTHCODE {FILES}" - exit 1 -fi - -if [[ "$1" = '--flac' ]] -then - codec=flac - extension=flac - shift -fi - -if [[ "$1" == '--single' ]] -then - mode=single - shift -fi - -if [ ! -f .authcode ]; then - auth_code=$1 - shift -else +# Obtain the authcode from either the command line, local directory or home directory. +if [ -z $auth_code ]; then + if [ -r .authcode ]; then auth_code=`head -1 .authcode` + elif [ -r ~/.authcode ]; then + auth_code=`head -1 ~/.authcode` + fi fi +if [ -z $auth_code ]; then + echo "ERROR Missing authcode" + echo "$usage" + exit 1 +fi + +# Check the target dir for if set if it is writable +if [[ ! -w "${targetdir}" || ! -d "${targetdir}" ]] ; then + echo "ERROR Target Directory is not writable: \"$targetdir\"" + echo "$usage" + exit 1 +fi + +# ======================================================================== +# Utility Functions debug() { echo "$(date "+%F %T%z") ${1}" @@ -67,6 +94,8 @@ normalize_whitespace() { echo $* } +# ======================================================================== +# Main Transcode Loop for path do debug "Decoding ${path} with auth code ${auth_code}..." @@ -74,21 +103,29 @@ do save_metadata "${path}" genre=$(get_metadata_value genre) artist=$(get_metadata_value artist) - title=$(get_metadata_value title) - output_directory="$(dirname "${path}")/${genre}/${artist}/${title}" + title=$(get_metadata_value title | sed 's/'\:'/'-\ '/g' | xargs -0) + if [ ! -z targetdir ] ; then + output_directory="${targetdir}/${genre}/${artist}/${title}" + else + output_directory="$(dirname "${path}")/${genre}/${artist}/${title}" + fi mkdir -p "${output_directory}" full_file_path="${output_directory}/${title}.${extension}" + # This is the primary transcode. All the heavy lifting is here. "${playlist_file}" @@ -105,7 +142,16 @@ do read -r -u9 _ _ chapter chapter_title="${title} - $(printf %0${#chaptercount}d $chapternum) ${chapter}" chapter_file="${output_directory}/${chapter_title}.${extension}" - ... +bash AAXtoMP3 [-f|--flac] [-s|--single] [-a|--authcode ] [-o|--output_dir ] ... bash AAXtoM4A [AUTHCODE] ... bash AAXtoM4B [AUTHCODE] ... ``` @@ -52,9 +52,9 @@ bash AAXtoM4B [AUTHCODE] ... ### Defaults * Specifying the AUTHCODE. In order of __precidence__. - 1. __[AUTHCODE]__ The command line option. With the highest precidence. + 1. __--authcode [AUTHCODE]__ The command line option. With the highest precidence. 2. __.authcode__ If this file is placed in the current working directory and contains only the authcode it is used if the above is not. - 3. __~/.aaxto_config__ a global config file for all the tools. And is used as the default if none of the above are specified. + 3. __~/.authcode__ a global config file for all the tools. And is used as the default if none of the above are specified. Note: At least one of the above must be specified. The code must also match the encoding for the user that owns the AAX file(s). ## Anti-Piracy Notice