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)
|