Dies ist eine alte Version des Dokuments!
Es ist soweit, ich habe mich entschieden den Aufwand für die Audible Konvertierung zu minimieren. Da ich schon seit längerem Pathon lernen wollte, habe ich mich entschlossen dies mit Python zu implementieren.
Ich will hier beschreiben, wie das Audible Format nach MP3 konvertiert werden kann und wie ich dies implementiert habe.
Eines vorweg: Ich bescheibe keinen Weg Audio Books von DRM Beschränkungen zu befreien, sondern nur wie man selbst gekaufte Audible Inhalt ins MP3 Format bringt, um sie auf Geräten zu nutzen, die das AAX Format nicht unterstützen.
Seit Juli 2015 unterstützt das freiverfügbare Utiliy ffmpeg das Dekodieren von AAX. Der passende Parameter lautet „-activation_bytes xxxxxxxx“. Dies funktioniert problemlos, sobald man den Wert für xxxxxxxx ermittelt hat, dazu aber später. ffmpeg zu benutzen ist allerdings eine Wissenschaft für sich .
Ich bin faul, wollte also eine möglichst elegante Methode entwickeln mit einem Doppelklick alles zu erledigen. Audible Dateien können mit den verschiedensten Programmen zusammenarbeiten, hier musste ich die richtige Wahl treffen. Zur Auswahl stehen:
Wie genau man an die Activation Bytes kommt findet ihr hier als Step-by-Step Anleitung
Bei Itunes habe ich keine Möglichkeit gefunden, an die sogenannten Activation Bytes zu kommen, also habe ich ein wenig recherchieren müssen. Das Ergebnis ist erschrecken simpel, Security by Obscurity war wohl der Vater des Gedanken, ihr werdet es gleich verstehen. Hier fasse ich die Ergebnisse mal zusammen:
0 REG_BINARY 0281B17D000000000001...9 1 REG_BINARY 0291B17D000100000001...2 2 REG_BINARY 02B674C9000200000001...C 3 REG_BINARY 08BB5D48000300000001...9 4 REG_BINARY 02B18034000400000001...D 5 REG_BINARY 02695123000500000001...2 6 REG_BINARY 0514B078000600000001...4 7 REG_BINARY 08A11AF5000700000001...3
hexdump "/cygdrive/c/Users/$USER/AppData/Local/Packages/AudibleInc.AudibleforWindows*/LocalState/AudibleActivation.sys" | head -n 1 | sed -r 's/^.{8}(.{4}) (.{4}).*/\2\1/'
"ffprobe <filename.aax>"
ffprobe version git-2020-03-24-e5d25d1 Copyright (c) 2007-2020 the FFmpeg developers built with gcc 9.2.1 (GCC) 20200122 configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf libavutil 56. 42.101 / 56. 42.101 libavcodec 58. 76.100 / 58. 76.100 libavformat 58. 42.100 / 58. 42.100 libavdevice 58. 9.103 / 58. 9.103 libavfilter 7. 77.100 / 7. 77.100 libswscale 5. 6.101 / 5. 6.101 libswresample 3. 6.100 / 3. 6.100 libpostproc 55. 6.100 / 55. 6.100 [mov,mp4,m4a,3gp,3g2,mj2 @ 000001fa241cda00] [aax] file __**checksum == 1dd2575473028f207648bbad70c2a263f2142847**__ [mov,mp4,m4a,3gp,3g2,mj2 @ 000001fa241cda00] [aax] activation_bytes option is missing! [mov,mp4,m4a,3gp,3g2,mj2 @ 000001fa241cda00] stream 0, timescale not set [aac @ 000001fa241dfd40] Multiple frames in a packet. [aac @ 000001fa241dfd40] Prediction is not allowed in AAC-LC. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\morqu\Audible\Downloads\converted\Erschüttert - Teil 1_B073WV2QXW_LC_64_44100_Stereo.aax': Metadata: major_brand : aax minor_version : 1 compatible_brands: aax M4B mp42isom creation_time : 2020-03-27T13:25:00.000000Z comment : Section 82
checksum == 1dd2575473028f207648bbad70c2a263f2142847
rcrack.exe . -h 1dd2575473028f207648bbad70c2a263f2149847
result ---------------------------------------------------------------- 1dd2575473028f207648bbad70c2a263f2142847 }\xb1\x91\x02 hex:7db19102
Jetzt stellen wir fest, das die Activation Bytes unterschiedlich sind. Bei der ersten und zweiten Methode (mit Hex Editor) erhalten wir „0291B17D“, bei der rcrack Methode und mit Cygwin aus Methode 2 „7db19102“. Was ist denn jetzt richtig?
Hier kommt die Obscurity ins Spiel, denn wenn man den Hex-String „0291B17D“ byteweise (also immer zwei Zeichen) rückwärts liest…. Taaaadaaa… ergibt das „7DB19102“, da hat jemand gedacht „darauf kommt keiner“.
Die Groß-/Kleinschreibung spielt keine Rolle, unsere Activation Bytes sind „7db19102“.