just-audible/justfile

146 lines
3.4 KiB
Makefile

default: recent
recent: select-download-recent convert refile
@tree M4B/
full: select-download-full 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-recent:
just select-download library-recent.txt
select-download-full:
just select-download $(just latest-library)
select-download library:
#!/usr/bin/env bash
SELECTION=$(cat {{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:
#!/usr/bin/env bash
set -e
PREVIOUS=$(just latest-library)
audible library list | sort > library-$(date +%Y-%m-%d).txt
CURRENT=$(just latest-library)
comm -23 $CURRENT $PREVIOUS > library-recent.txt
echo "New additions:"
cat library-recent.txt
@latest-library:
ls library-*.txt | grep -v recent | 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 . 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
else
echo No AAX to convert
fi
convert-aaxc:
#!/usr/bin/env bash
just _require_dir M4B
if [ $(fd . 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
else
echo No AAXC to convert
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