Chris Pomeroy
9 days ago 2bca657babf8bec3f9cee673c92eb21f68a68a68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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)