import httpx import audible import json from audible.aescipher import decrypt_voucher_from_licenserequest from audible.activation_bytes import ( extract_activation_bytes, fetch_activation_sign_auth ) _audible_auth = audible.Authenticator.from_file('./audible_auth_') ab = fetch_activation_sign_auth(auth=_audible_auth) ab = extract_activation_bytes(ab) _actbytes = ab _bearer_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJjOWZlOGUyOS0xZjM3LTQ1OWEtOWJiOS02NDg3ZjNjNDNiNGUiLCJ1c2VybmFtZSI6InJvb3QiLCJpYXQiOjE3NTAwNDA1MDl9.kDueJYRlXna-IRZu5jDjTUjwGYp0y01P9TdNw4d5PeE' # noqa E501 _header = { "Authorization": f"Bearer {_bearer_token}" } _metadata = {} def get_local_items(limit, library_id): with httpx.Client(base_url="https://bookshelf.darkurthe.net/api/", headers=_header) as c: items = c.get(f'libraries/{library_id}/items?limit={limit}', timeout=20.0).json() return items['results'] def get_audible_books() -> list: ''' Downloads a list of audiobooks from audible. Returns: list: A list of books and details in dictionary format ''' with audible.Client(auth=_audible_auth) as client: library = client.get( "1.0/library/", num_results=1000, response_groups="product_desc, product_attrs", sort_by="-PurchaseDate" ) books = library['items'] return books def find_asin_for_book(title, a_books): search = [book for book in a_books if book['title'] in title] if search: return search[0]['asin'] else: print(f"Title not found {title}") def update_bookshelf(book_id, book_title, book_asin): print(f"Will update {book_title}/{book_id} with asin: {book_asin}") data = {"metadata": {"asin": book_asin}} with httpx.Client(base_url="https://bookshelf.darkurthe.net/api/", headers=_header) as c: update = c.patch(f'items/{book_id}/media', json=data) if update.status_code == 200: print(f"Updated {book_title}") else: print(f"There was a problem updating {book_title}: Status code: {update.status_code}") return audible_books = get_audible_books() books = get_local_items(0, '0507d3fe-db57-4e6f-bb18-a0c09cd6f196') for x in books: if x['media']['metadata']['asin'] is None: # print({x['media']['metadata']['title']}) asin = find_asin_for_book(x['media']['metadata']['title'], audible_books) x_title = x['media']['metadata']['title'] x_id = x['id'] if asin: update_bookshelf(x_id, x_title, asin)