import configparser from requests import get import os import json import sys class AudibleBook(object): def __init__(self, filePath): self.filePath = filePath self.metadata = json.loads(os.popen('ffprobe -i {} -show_format \ -print_format json'.format(filePath)).read())['format']['tags'] self.chapters = json.loads(os.popen('ffprobe -i {} -print_format json \ -show_chapters -loglevel error -sexagesimal'.format(self.filePath)) .read())['chapters'] # getMetadata() returns audio metadata for a given filepath. def getMetadata(self): return self.metadata # getChapters() returns chapter metadata for a given filepath. def getChapters(self): return self.chapters # getTitle() returns audiobook title. def getTitle(self): return self.getMetadata()['title'] # getHash() returns the hash of a given file. def getHash(filePath): with open(filePath, 'rb') as f: f.seek(653) data = f.read(20) f.close() return data.hex() # getActivationBytes returns the bytes needed to decrypt a given hash. def getActivationBytes(filehash): headers = {'User-Agent': 'audible-converter'} response = get('https://aax.api.j-kit.me/api/v2/activation/{}'.format(filehash), headers=headers) return json.loads(response.text)['activationBytes'] # createConfig() creates a config file. def createConfig(configFilePath, filePath): activationBytes = getActivationBytes(getHash(filePath)) f = open(configFilePath, 'w') f.write('activationBytes={}'.format(activationBytes)) f.close() configFilePath='./settings.conf' audibleBookPath=sys.argv[1] # Check if config file exists and creates one if needed. if not os.path.exists(configFilePath): print('Creating config file') createConfig(configFilePath, audibleBookPath) configString = '[Settings]\n' + open(configFilePath).read() configParser = configparser.RawConfigParser() configParser.read_string(configString) book = AudibleBook(audibleBookPath) for c in book.getChapters(): start=c['start'] end=c['end'] title=c['tags']['title'] print(start, end, title) #os.system('ffmpeg -i {} -acodec copy -vcodec copy -ss {} -t {} OUTFILE-{}.m4a'.format(filePath, start, end, title)) print(book.getTitle()) print(configParser.get('Settings', 'activationBytes'))