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: just _require_dir M4B [ -f AAX/*.aax ] && 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 || true convert-aaxc: just _require_dir M4B [ -f AAXC/*.aaxc ] && for AAXC in AAXC/*.aaxc ; \ do \ VOUCHER="${AAXC%.aaxc}.voucher" ; \ M4B="M4B/$(basename ${AAXC%.aaxc}).m4b" ; \ just _convert-one-aaxc $AAXC $VOUCHER $M4B ; \ done || true _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: [ -d "${AUDIOBOOK_ARCHIVE}" ] || (echo "ERROR: No archive specified" ; exit 1) [ -f M4B/* ] || (echo "WARN: Nothing to be archived" ; exit 1) cd M4B && cp -v -R * "${AUDIOBOOK_ARCHIVE}" just _clean M4B 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