default: select-download convert refile @tree M4B/ doctor: @echo "Verify required executables are on the path:" just _doc_require_exec_all audible just fzf jq ffmpeg refile-m4b _doc_require_exec_all *exec: for one in {{ exec }} ; do just _doc_require_exec ${one} ; done _doc_require_exec exec: #!/usr/bin/env bash export EXEC=$(which {{ exec }}) if test -z ${EXEC} ; then echo "- MISSING : {{ exec }}" else echo "- OKAY : {{ exec }} => ${EXEC}" fi select-download: #!/usr/bin/env bash SELECTION=$(cat $(just latest-library) | sort -k 2 | fzf -e -m) ASINS="" while IFS= read -r LINE ; do echo "$LINE" export ASIN=$(echo $LINE | cut -d: -f 1) echo "ASIN: $ASIN" ASINS="${ASINS} --asin ${ASIN}" done <<< $SELECTION just _download-asin $ASINS fetch-library: audible library list > library-$(date +%Y-%m-%d).txt @latest-library: ls library-*.txt | tail -n 1 _require_dir *dirs: mkdir {{ dirs }} 2>/dev/null || true _move target *files: mv {{ files }} {{ target }}/ 2>/dev/null || true _download-asin *asins: just _require_dir TEMP cd TEMP && audible download --aax-fallback {{ asins }} just post-download post-download: just _require_dir AAX AAXC just _move AAX/ TEMP/*.aax just _move AAXC/ TEMP/*.aaxc TEMP/*.voucher convert: convert-aax convert-aaxc convert-aax: #!/usr/bin/env bash just _require_dir M4B if [ $(fd --glob 'AAX/*.aax' | wc -l) -gt 0 ] then for F in AAX/*.aax do O=M4B/$(basename $F .aax).m4b ffmpeg \ -y \ -activation_bytes $(jq .activation_bytes ~/.audible/audible.json | tr '\"' ' ') \ -i $F \ -codec copy \ $O rm $F done fi convert-aaxc: #!/usr/bin/env bash just _require_dir M4B if [ $(fd --glob 'AAXC/*.aaxc' | wc -l) -gt 0 ] then for AAXC in AAXC/*.aaxc do VOUCHER="${AAXC%.aaxc}.voucher" M4B="M4B/$(basename ${AAXC%.aaxc}).m4b" just _convert-one-aaxc $AAXC $VOUCHER $M4B done fi _convert-one-aaxc aaxc_file voucher_file m4b_file: #!/usr/bin/env bash export KEY="$(jq .content_license.license_response.key {{ voucher_file }} | tr '\"' ' ')" export IV="$(jq .content_license.license_response.iv {{ voucher_file }} | tr '\"' ' ')" ffmpeg \ -audible_key $KEY \ -audible_iv $IV \ -i {{ aaxc_file }} \ -vn \ -c:a copy \ -map_metadata 0:g \ {{ m4b_file }} && \ rm {{ aaxc_file }} {{ voucher_file }} refile: refile-m4b M4B archive: #!/usr/bin/env bash if [ -d M4B ] && [ -n "${AUDIOBOOK_ARCHIVE}" ] && [ -d "${AUDIOBOOK_ARCHIVE}" ]; then if [ $(fd . M4B | wc -l) -eq 0 ] then echo "WARN: Nothing to be archived" exit 1 fi cd M4B && cp -v -R * "${AUDIOBOOK_ARCHIVE}" just _clean M4B/* else echo "ERROR: No archive specified or no M4B directory" exit 1 fi clean: for target in TEMP/* AAX/* AAXC/* M4B/* ; do just _clean $target ; done _clean target: if [ -f {{ target }} -o -d {{ target }} ] ; then rm -r {{ target }} ; fi