A(Sync) Interface for internal Audible API written in pure Python.

Overview

Audible

image image image image image Travis CodeFactor image

Audible is a Python low-level interface to communicate with the non-publicly Audible API.

It enables Python developers to create there own Audible services. Asynchronous communication with the Audible API is supported.

For a basic command line interface take a look at my audible-cli package. This package supports:

  • downloading audiobooks (aax/aaxc), cover, PDF and chapter files
  • export library to csv files
  • get activation bytes
  • add own plugin commands

Requirements

  • Python >= 3.6
  • depends on following packages:
    • beautifulsoup4
    • httpx
    • pbkdf2
    • Pillow
    • pyaes
    • rsa

Installation

pip install audible

Read the Doc

The documentation can be found at Read the Docs

Comments
  • Convert books downloaded with licenserequest

    Convert books downloaded with licenserequest

    Books downloaded with

    license, _ = client.post(
       "content/{asin}/licenserequest",
        body={
            "drm_type": "Adrm",
            "consumption_type": "Download",
            "quality":"Extreme"
        }
    )
    content_url = license['content_license']['content_metadata']['content_url']['offline_url']
    

    can’t converted with ffmpeg -activation_bytes ... at this moment.

    Read here

    • https://www.epubor.com/how-to-convert-audible-aaxc-to-mp3.html

    • https://www.reddit.com/r/audible/comments/c1zk2c/axxc_format_drm_and_audible_escape/

    Audible uses a new aaxc format when downloading via audible app on android/iOS or the api. But with this client you can get the response of a licenserequest. Example shorten on many places with ... :

    {
        "content_license": {
            "acr": "CR!...",
            "asin": "B07DDKJH33",
            "content_metadata": {
                "content_url": {
                    "offline_url": "https://dyrrggeck87jc.cloudfront.net/.../bk_adko_003749ade_lc_128_44100_2.aax?voucherId=cdn:...&Policy=...&Signature=...&Key-Pair-Id=..."
                }
            },
            "drm_type": "Adrm",
            "license_response": "...==",
            "message": "Eligibility details:[GrantRightsReason [reasonCode=MEMBERSHIP, reason=No need to verify active offline license when request is not for offline consumption. OWNERSHIP-user does not have expected ownership rights over the parent title asin. OWNERSHIP-title does not qualify for long title child part ownership or customer does not own child part. OWNERSHIP-user has ownership rights. GEO_RIGHTS-user has geo-rights[DE] over the title[B07DDKJH33] in marketplaceId[AN7V1F1VY261K]. TITLE_ATTRIBUTES-title does not have rodizio plan association. GEO_RIGHTS-user has geo-rights[DE] over the title[B07DDKJH33] in marketplaceId[AN7V1F1VY261K]. No need to verify active offline license when request is not for offline consumption. BENEFIT-user has valid Radio benefit associated[RadioStub]. TITLE_ATTRIBUTES-title does not have radio plan association. Client Asin Mapping validation skipped since client id is null. AAA Client with id: ApolloEnv:AudibleApiExternalRouterService/EU/Prod, does not have access to asin: B07DDKJH33. Client does not have plans that support asin benefits.]]. Licensing details:[ADRM license granted]",
            "request_id": "...",
            "status_code": "Granted",
            "voucher_id": "cdn:..."
        },
        "response_groups": [
            "always-returned"
        ]
    }
    

    Maybe someone has the know-how to use this informations to decode the new aaxc format.

    Meanwhile you can grab the audible web page for the download urls. You can use cookies to authenticate like so:

    import audible
    import requests
    
    auth = audible.FileAuthenticator(...)
    cookies = auth.login_cookies
    
    r = requests.get("https://www.audible.com/...", cookies=cookies)
    

    Edit 2022-01-11: Since ffmpeg 4.4 decryption of aaxc files should be build in. You have to use ffmpeg with the --audible_iv and --audible_key options and the correct iv/key pair from the decrypted licenserequest response!

    opened by mkb79 42
  • Constant Captchas

    Constant Captchas

    Describe the bug When I attempt to authenticate, I get constant Captchas. I input the captcha details, but it will not continue

    To Reproduce Steps to reproduce the behavior: Simply running the code below

    import audible
    
    auth = audible.Authenticator.from_login(
        "email",
        "pass",
        locale='us'
    )
    
    with audible.Client(auth=auth) as client:
        library = client.get(
            "1.0/library",
            num_results=1000,
            response_groups="product_desc, product_attrs",
            sort_by="-PurchaseDate"
        )
        for book in library["items"]:
            print(book)
    

    Desktop (please complete the following information):

    • OS: MacOS Catalina
    • Browser Chrome
    opened by hossam-zaki 34
  • Here's the steps I completed.

    Here's the steps I completed.

    pip install audible

    created a test.py file.

    import audible
    
    # for US accounts
    client = audible.Client("myemail", "mypassword", local="us")
    
    # specify a api_version on request
    # default is api_version="1.0"
    # get deprecated version of library
    library = client.get("library/books", api_version="0.0", purchaseAfterDate="01/01/1970", sortInAscendingOrder="true")
    
    print(library)
    

    executed that file. with python3.6

    python3.6 test.py

    the results I got back are.

    Answer for CAPTCHA: audible-api: unable to open X server `' @ error/display.c/DisplayImageCommand/410.

    I realize I need to register, however I have no idea how to go about doing that. Is there any sample code on how to go about doing that?

    bug enhancement 
    opened by cjemorton 18
  • Captcha Login Fails 'KeyError'

    Captcha Login Fails 'KeyError'

    using: audible 0.6.0 Python 3.10

    When trying to login using captcha method, login fails due to an exception 'KeyError'.

    I am using a captcha call back but the guess seems to be coming back correctly on ln 376.

    In line 388 of login.py ( last line in the section below ) it calls the 'get_next_action_from_soup'

         while check_for_captcha(login_soup):
         ...
         
            inputs = get_inputs_from_soup(login_soup)
            inputs["guess"] = guess
            inputs["use_image_captcha"] = "true"
            inputs["use_audio_captcha"] = "false"
            inputs["showPasswordChecked"] = "false"
            inputs["email"] = username
            inputs["password"] = password
    
            method, url = get_next_action_from_soup(login_soup)
    

    inside that method it gets an exception on line 126

    method = form["method"]

    KeyError: method

    The form variable contains the following (<)form action="get" name="ue_backdetect"(>)<input name="ue_back" type="hidden" value="1"/></form>

    Replace (<) with < above

    I have used the captcha on many occasions in the past with success until now.

    opened by CuriousEl3phant502 17
  • Error when trying to get book download URL

    Error when trying to get book download URL

    I'm trying to follow the different examples provided to get a book download URL.

    I'm successfully authenticating and fetching my library. However, I'm getting a 500 error when trying to get the book download URL as follow:

     license = client.post(
                f"content/{child_asin}/licenserequest",
                body={
                    "drm_type": "Adrm",
                    "consumption_type": "Download",
                    "quality": "Extreme"
                }
            )
    content_url = license['content_license']['content_metadata']['content_url']['offline_url']
    

    The error obtained is as follow: audible.exceptions.UnexpectedError: Internal Server Error (500): Unexpected error while servicing request for ASIN: B07231CR59 and ACR: null.

    I tried using the book asin directly and using its child asin. Can you point me in the correct direction?

    opened by lanouettea 12
  • Building an external login URL

    Building an external login URL

    I am building an endpoint that will just return the login URL returned from build_oauth_url

    Heres the code:

    def get_auth_link():
        code_verifier = audible.login.create_code_verifier()
    
        oauth_url = audible.login.build_oauth_url(
            country_code=COUNTRY_CODE,
            domain=DOMAIN,
            market_place_id=MARKETPLACE_ID,
            code_verifier=code_verifier,
            with_username=False
        )
    
        return oauth_url
    

    When I use the link, sign in and get the address bar URL to use from_login_external I get this as a return exception:

    Exception: {'response': {'error': {'code': 'InvalidValue', 'index': 'tGP0Ha5AGkt8rT5f6GvjpwAAAAAAAAABCoOqqcjUmA7AKfxjSct01Cg_pilnvd6EEVWx2HFy9kOVWSGENsmEtLsb4T6TZHp8zL_c87GaD91q9qFKypHaaxu34HHfFjfv5gRHpfla80sRtMspddIA8e63XKV7tPaiRy3JG-wkH8mu1UgOHYwpgnWjmeKY-gSC9oVhl0e86leJkMF25Lluxz-fBorjbap52nclsr9Ml6FmSkUKVLWdbQ==', 'message': 'One or more provided values are invalid.'}}, 'request_id': 'fcd9fbe1-2432-4af5-bfc1-6cf3d1e42ebb'}
    

    I am using the callback on from_login_external to pass in the URL from my custom endpoint like so:

    def audible_login(): 
        #{ id: str, url: str }
        params = request.json
    
        print(params['url'])
    
        def auth_link_url_callback(login_url: str):
            print(login_url)
            return params['url']
    
        auth = audible.Authenticator.from_login_external(COUNTRY_CODE, login_url_callback=auth_link_url_callback)
    
        auth.to_file(params['id'])
    

    I am posting the URL and via a CURL command for testing:

    curl -X POST -H "Content-Type: application/json" -d '{
      "url": "https://www.amazon.com.au/ap/maplanding?openid.assoc_handle=amzn_audible_ios_au&openid.claimed_id=https%3A%2F%2Fwww.amazon.com.au%2Fap%2Fid%2Famzn1.account.AHDJ2REEGR72DEJEMJDUBHMW4PUA&openid.identity=https%3A%2F%2Fwww.amazon.com.au%2Fap%2Fid%2Famzn1.account.AHDJ2REEGR72DEJEMJDUBHMW4PUA&openid.mode=id_res&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.op_endpoint=https%3A%2F%2Fwww.amazon.com.au%2Fap%2Fsignin&openid.response_nonce=2022-01-05T07%3A35%3A16Z-1504074421391324938&openid.return_to=https%3A%2F%2Fwww.amazon.com.au%2Fap%2Fmaplanding&openid.signed=assoc_handle%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Cns.pape%2Cpape.auth_policies%2Cpape.auth_time%2Coa2.authorization_code%2Ccaptcha_verified%2Csigned&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.auth_policies=http%3A%2F%2Fschemas.openid.net%2Fpape%2Fpolicies%2F2007%2F06%2Fnone&openid.pape.auth_time=2022-01-05T07%3A35%3A16Z&openid.sig=kHOEjSvIPKmMI6r1FfL2SjC6fKeRFFkbwFbXkO6t1zs%3D&serial=&openid.oa2.authorization_code=SRCSCKBUVJDQKPfDDWMZAUSg&openid.ns.oa2=http%3A%2F%2Fwww.amazon.com%2Fap%2Fext%2Foauth%2F2&captcha_verified=1&",
      "id": "1"
    }' http://localhost:5000/login_with_url
    
    

    Am I building up the URL wrong? Any advice would be appreciated.

    opened by normal1ze 9
  • When downloading AAXC 403 Forbidden

    When downloading AAXC 403 Forbidden

    When using the example code to download an AAXC from my library I am now receiving 403 Forbidden response codes. This worked fine before, but has just started this month. I'm able to authenticate, and pull down a fresh library list.

    To Reproduce Steps to reproduce the behavior:

    1. Use the example code from download_books_aaxc.py on line 38.

    with httpx.stream("GET", url) as r:

    1. The response comes back as a 403.

    Relevant Dependencies: httpx v0.16.1 audible v0.5.4 (this library)

    I have made no changes in the last few months, and it has worked fine until now. Last known working was late April 2021. But after trying it in the last couple days (with no changes) I now get a 403 forbidden. Can't seem to figure out what is different or the reason for the 403. Audible API change?

    However, if I take the URL that it's attempting to use it will work just fine in the browser (not logged in and all history/cache/cookies cleared). However it seems to download an aax file not an aaxc file. But nonetheless a file is downloaded- no 403. I've never tried to put the URL in the browser before now so I'm not sure what the expected behavior is.

    opened by CuriousEl3phant502 9
  • Australia problems authorizing new device fails

    Australia problems authorizing new device fails

    I'm having problems getting this to work in the Australia Marketpace. Not sure if its just me or everyone. I am able to log in, but authorizing a new device returns an error. Other regions are working fine.

    resp = httpx.post(f"https://api.amazon.{domain}/auth/register", json=body)
    

    Get error 400 BAD REQUEST from:

    Exception: {'response': {'error': {'code': 'InvalidToken', 'index': 'cXZ_xxxx_z95BIfA==', 'message': 'One or more tokens are invalid.'}}, 'request_id': '81d134e1-c0f9-4a83-8dce-xxxx'}

    I verified that a device isn't created at: https://www.amazon.com.au/hz/mycd/digital-console/devicedetails?deviceFamily=AUDIBLE_APP

    But able to log in and register a device from the android app.

    Trying to figure out a way to debug.. Was wondering if there is another Amazon API call that we can call to check that the session was established? Anyway, happy to provide more details or help debug if I can.

    opened by openaudible 9
  • CVF code entry broken due to changes to Amazon Login

    CVF code entry broken due to changes to Amazon Login

    It seems that Amazon has recently changed its Login Security such that the CVF code usually supplied via email to verify a new login has been replaced with a system that lets the user click a link and either allow or deny the login attempt.

    This has broken the CVF flow in the Audible API:

    • The function check_for_cvf no longer fires due to a new HTML layout. A div with id cvf-page-content doesn't exist anymore: https://github.com/mkb79/Audible/blob/a1a7041b2f67f11e6e55dd86dc2eee00f01c5593/src/audible/login.py#L110-L112
    • The code entry system no longer works, I am unsure if the /ap/cvf/verify endpoint is still used in Amazon's new Login flow. The page does some sort of polling and actually supplies the URL it will redirect you to once it detects that authorization has occurred. I am currently tinkering myself to try and figure out a way forward.
    opened by kennedn 9
  • Amazon uses Auth Code Flow with PKCE on latest iOS app

    Amazon uses Auth Code Flow with PKCE on latest iOS app

    I found out today, that Amazon changed the "openid.oa2.response_type" from "token to "code". In result of this, a successfully authorization gives a "authorization_code" instead of a "access_token". In exchange for the authorization code a access token can be requested. But this requires a device registration.

    Amazon still accepts "token" request for now. Maybe this can change in the future.

    documentation 
    opened by mkb79 8
  • Code on login

    Code on login

    I'm using this code auth = audible.LoginAuthenticator( username, password, locale=custom_locale, captcha_callback=custom_captcha_callback, ) to login, but it always asks for "Code: " after solving the captcha. What code ist requested here, where can I find it and is there a way to automatically fill it in or prevent asking for it as I want to use it in an automated script (captcha solver service is working already)? I don't have 2FA set up in amazon and I'm using version 0.2.1 installed via pip

    opened by ts65 8
  • TEST: New device registration method

    TEST: New device registration method

    Need help from users for another method to register a new Audible dummy device!

    Please tell me if the code below let you register a new device or if you get any error message!

    help wanted 
    opened by mkb79 2
  • 错误提示

    错误提示

    我在对接注册设备的时候提示{"response":{"error":{"code":"InvalidValue","index":"RYuYsd_4VoiVF34wpxzEJAAAAAAAAAABv_ARlqvxrJ-jPM4mLFcoeH3O84pv6xnbo-wcRzJIxyyhPjBCuewweBAyzdvpHH8pNWKTMsS-INu_7O68uG5-zO2zLPuh4pw3hCpbGWbU0U2E69sXj2DW1Wg23I_GGku1y0pmefIWzfmLwdMkXSDjzkO7OzK3JzmjmcegCPIihpnSNbodgAtiE06b6cfjDnEcaPoTICxuYcXvy1zOOuXsSAYHULgBTO_XXnJHGw==","message":"One or more provided values are invalid."}},"request_id":"67dde610-45d1-4cef-9c3f-fd4f2f58ddf3"}, 请问怎么处理

    opened by fronEnd-test 18
  • state token for library requests

    state token for library requests

    A library response returns a 13-digit numeric state-token in the response headers.

    Using this state token in the url query on the next request like /1.0/library?state_token=1234567654321 will return only changes since the state take was given.

    If there are no new content, the json response body items list is empty, the total-count header entry is 0 and the state token is in the header is unchanged. If there are changes in the library, a new state token is obtained, which should be used next time.

    documentation 
    opened by mkb79 1
  • Can't filter plus catalog books from 'catalog/products'

    Can't filter plus catalog books from 'catalog/products'

    Hello there, I started working with this repo a few hours ago because I do like the idea of archiving audiobooks.

    This is a plus catalog audiobook so anyone with the subscription can help me with it. ASIN - 1665074620 Title - What Addicts Know I am using Google Colab for this as I like to try new things there and then implement the rest on my server.

    I have a few questions about the usage but before that, I want to know how to download the audiobooks. I don't care about the format (.aax or .aacx) because I can decode either. Which link do I download? The following is my code to get the download URL:

    body = {
        "supported_drm_types" : [
            "Mpeg",
            "Adrm"
        ],
        "quality" : "High",
        "consumption_type" : "Download"
    }
    token = client.post("1.0/content/1665074620/licenserequest", body)
    print(json.dumps(token, indent=3, sort_keys=True))
    

    OUTPUT:

    {
       "content_license": {
          "access_expiry_date": "2024-12-31T12:00:00Z",
          "acr": "CXXXXXX",
          "allowed_users": [
             "amzn1.account.XXXXXXXXXXXXXXXXXXXXXXXXX"
          ],
          "asin": "1665074620",
          "content_metadata": {
             "content_url": {
                "offline_url": "https://dze5l2jxnquy5.cloudfront.net/bk_blak_016548it/28335321/aax/XXXX....XXXX"
             }
          },
          "drm_type": "Adrm",
          "license_id": "XXXXXXXXXXXXXXXXXXXXXXXX",
          "license_response": "y/XXXXXX.....XXXXX",
          "message": "Customer [XXXXXXXXXXXXXXX] has rights to asin [1665074620] for AYCL",
          "refresh_date": "2022-03-18T06:28:07Z",
          "removal_date": "2022-04-27T06:28:07Z",
          "request_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
          "requires_ad_supported_playback": false,
          "status_code": "Granted",
          "voucher_id": "cdn:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
       },
       "response_groups": [
          "always-returned"
       ]
    }
    

    ### When I click the offline_url, I get this following error:

    Screenshot 2022-02-26 at 1 27 22 AM 2

    ##

    At first I thought that my macBook and the Colab instance have different IP Addresses and thats why I can't download it. Then I tried downloading it directly on the colab instance but it still wouldn't download.

    I don't understand what I am doing wrong here. I read the closed thread for downloading files but the first post is from back in 2019 and it doesn't work.

    The other question I have is about only getting the Audible Plus Catalog. I see the plan for it is named "Audible-AYCL" which is not included in plans[]. I created a function for this and I got around it but it would be nice if it was updated.

    ### My whole code:

    !mkdir /content/audible
    import audible, urllib, cv2, json
    from google.colab.patches import cv2_imshow (I am running this in google colab)
    
    DIR_PATH = "/content/audible"
    
    email = "xx"
    pasword = "xx"
    country = "xx"
    
    def cb(captcha_url):
        
        urllib.request.urlretrieve(captcha_url, "/content/audible/captcha.jpg")
        image = cv2.imread('/content/audible/captcha.jpg')
        cv2_imshow(image)
        print(captcha_url)
        answer = input("Answer for CAPTCHA: ")
        answer = str(answer).strip().lower()
        return answer
        !rm /content/captcha.jpg
    
    auth = audible.Authenticator.from_login(
        email,
        pasword,
        locale = country,
        with_username=False,
        captcha_callback=cb
    )
    auth.to_file(DIR_PATH+country)
    
    auth = audible.Authenticator.from_file(DIR_PATH+country)
    client = audible.Client(auth)
    
    body = {
        "supported_drm_types" : [
            "Mpeg",
            "Adrm"
        ],
        "quality" : "High",
        "consumption_type" : "Download"
    }
    token = client.post("1.0/content/1665074620/licenserequest", body)
    
    print(json.dumps(token, indent=3, sort_keys=True))
    
    

    Looking forward to solving this problem. Will update if I find something new.

    opened by hayupadhyaya 5
  • How does the BestSellers sort_by option in the APIs work?

    How does the BestSellers sort_by option in the APIs work?

    Having a hard time understanding how does the BestSellers option in products_sort_by parameter works, for instance in /1.0/catalog/products endpoint. I'm trying to make API calls about the products on audible and sort them by best sellers, yet I'm getting random items in response that are definitely not sorted by best sellers:

    client.get("/1.0/catalog/products", num_results=50, page=0, response_groups=['product_attrs'], products_sort_by=['BestSellers'])

    Am I doing this wrong or is audible just ignoring the parameter?

    opened by Jikeh 1
Releases(v0.8.2)
  • v0.8.2(May 25, 2022)

  • v0.8.1(Apr 21, 2022)

  • v0.8.0(Apr 11, 2022)

    Note

    Auth files created or saved with v0.8.0 are not backward compatible!

    Added

    • full support of pre-Amazon accounts (e.g. refresh access token, deregister device)
    • Client and AsynClient now accepts session kwargs which are bypassed to the underlying httpx Client
    • a respone_callback can now be set to Client and AsyncClient class to allow custom preparation of response output
    • An absolut url (e.g. https://cde-ta-g7g.amazon.com/FionaCDEServiceEngine/sidecar) can now be passed to a client get, post, delete and put method as the path arg. So in most cases the client raw_request method is not needed anymore.

    Changed

    • rename (and rework) Client._split_kwargs to Client._prepare_params
    Source code(tar.gz)
    Source code(zip)
  • v0.7.2(Mar 27, 2022)

  • v0.7.1(Mar 27, 2022)

    Added

    • Authenticator.from_dict to instantiate an Authenticator from dict and Authenticator.to_dict to get authentication data as dict

    Bugfix

    • register a new device with with_username=True results in a server error due to wrong registration domain
    Source code(tar.gz)
    Source code(zip)
  • v0.7.0(Jan 25, 2022)

    Bugfix

    • make sure activation bytes has 8 bytes, otherwise append '0' in front until 8 bytes are reached
    • make sure metadata1 has 8 bytes, otherwise append '0' in front until 8 bytes are reached
    • If installed, use playwright to login with external browser. Please read here how to install playwright. Then use audible.Authenticator.from_login_external(COUNTRY_CODE) for login.
    • fix login issues
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Oct 21, 2021)

    Bugfix

    • Fix a bug when searching for "resend-approval-link" in login page

    Changed

    • switched to auth_code_flow when login (gives an auth code instead of an access token for security purposes)
    • Authenticator.from_login and Authenticator.from_login_external now always register a new device
    • Authenticator now refreshes access_token (when needed) before deregister the device
    • now simulate Audible app version 3.56.2 under iOS version 15.0.0
    • login process now auto-detect next request method and url

    Misc

    • Correct documentation
    • Update example download_books_aaxc.py
    • Bump httpx to v0.20.*

    Remove

    • LoginAuthenticator and FileAuthenticator
    • Authenticator.register_device, Authenticator.re_login and Authenticator.re_login_external
    Source code(tar.gz)
    Source code(zip)
  • v0.5.5(Jul 22, 2021)

    Misc

    • switch from httpx 0.16.x to 0.18.x

    Added

    • logging error messages during login

    Changed

    • extend allowed chars by email check during login
    • instead of raising an exception, invalid email will now be logged as warning

    Misc

    • Add description to the docs, to handling 2FA
    Source code(tar.gz)
    Source code(zip)
  • v0.5.4(Feb 28, 2021)

    Added

    • Provide a custom serial when login
    • Login with Audible username instead of Amazon account for US, UK and DE markteplace

    Bugfix

    • register a device on Australian marketplace

    Misc

    • Redesign Module documentation
    • Rework description of audible-cli package in documentation
    Source code(tar.gz)
    Source code(zip)
  • v0.5.3(Jan 25, 2021)

    Added

    • function activation_bytes.fetch_activation_sign_auth
    • Spain marketplace

    Changed

    • activation_bytes.get_activation_bytes uses the new fetch_activation_sign_auth function, if signing auth method is available. Otherwise activation bytes will be fetched the old way with a player_token.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.2(Jan 8, 2021)

  • v0.5.1(Jan 5, 2021)

    [0.5.1] - 2020-01-05

    Added

    • Fetched activation bytes (with extract=True argument) will be stored to activation_bytes attribute of Authenticator class instance for now. Ignore existing activation bytes and force refresh with auth.get_activation_bytes(force_refresh=True)
    • activation_bytes will be loaded from and save to file. Saved auth files are not backward compatible to previous audible versions so keep old files save.
    • Add Client.raw_request and AsyncClient.raw_request method.
    • Provide a custom Callback with approval_callback keyword argument when login.
    • Add classmethod Authenticator.from_login_external and method Authenticator.re_login_external.
    • Add login_external function to login.py

    Misc

    • Add description how to use pyotp with custom otp callback to docs
    • Add description how to use login external to docs
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Dec 7, 2020)

    [0.5.0] - 2020-12-07

    Added

    • Added support to output the whole activation blob instead of the extracted activation bytes with get_activation_bytes(extract=False, ...).
    • Added support to fetch website cookies for another country with Authenticator.set_website_cookies_for_country.
    • Added Client.put and AsyncClient.put.
    • Added support to solve approval alerts during login

    Changed

    • The FileAuthenticator has been deprecated, use classmethod Authenticator.from_file instead.
    • The Authenticator don't inherit from MutableMapping anymore
    • The Authenticator sets allowed instance attributes at creation to None, not allowed attributes will raise an Exception
    • The LoginAuthenticator has been deprecated, use classmethod Authenticator.from_login instead.
    • Changed internal code base for encryption and decryption metadata. Moved the related code to metadata.py.

    Remove

    • deprecated AudibleAPI

    Misc

    • Added more docstrings and type hints to code base
    • Added support to install Sphinx documentation dependencies with pip install audible[docs].
    • Added a guide to use authentication with Postman.
    • Rework documentation.
    • Added .readthedocs.yml config file
    • Added module description (autodoc) to docs
    • Uses httpx 0.16.* for now
    Source code(tar.gz)
    Source code(zip)
  • v0.4.4(Oct 25, 2020)

  • v0.4.3(Oct 25, 2020)

    FIX: decrypting voucher

    In some cases, decrypting of voucher are incomplete. The last bytes are missing. So a conversion from string to dict with json fails.

    In these situations, only the key and iv from the voucher are returned for now.

    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Oct 15, 2020)

    New:

    • add function audible.aescipher. decrypt_voucher_from_licenserequest

    Changes:

    • update download example to download books in aaxc format and decrypt voucher
    • update to httpx 0.14.x
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Sep 3, 2020)

    • introduce new Client and AsyncClient class
    • AudibleAPI class is deprecated and will be removed on next releases
    • add get_activation_bytes method to the Authenticate classes
    • bugfixes and enhancements
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Jun 15, 2020)

  • v0.3.1a0(Jun 15, 2020)

  • v0.3.0(Jun 4, 2020)

    Changelog

    • switch from requests/aiohttp to httpx
    • rebuild auth flow
    • add access token auth flow
    • add function to refresh website cookies
    • some style recodings
    • bugfixes
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0a1(Jun 2, 2020)

  • v0.3.0a0(Jun 2, 2020)

  • v0.2.3(Jun 1, 2020)

  • v0.2.3a0(May 31, 2020)

  • v0.2.2(May 31, 2020)

  • v0.2.1a3(Aug 14, 2019)

  • v0.2.1a4(Sep 19, 2019)

    add some infos, rewrite code

    • Rewrite codebase,
    • Add store_authentication_cookie, device_info and customer_info to session after device registration (deregister and register new with valid access token to obtain this data
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jul 27, 2019)

    • add async functions
    • split client class (please read README)
    • add :class:Client for backward compatibility to v0.1.6 (will be removed in future releases)
    • some other changes
    Source code(tar.gz)
    Source code(zip)
  • v0.1.6(Jul 19, 2019)

Tethered downgrade 64-bit iDevices vulnerable to checkm8

ra1nstorm Tethered downgrade 64-bit iDevices vulnerable to checkm8 Since the purpose of this tool is to tethered downgrade a device, after restoring p

mini_exploit 65 Nov 08, 2022
A short course on Julia and open-source software development

Advanced Scientific Computing: producing better code This course is taught as a 6-session "nanocourse" at Washington University in St. Louis. See the

Tim Holy 230 Jan 07, 2023
Get you an ultimate lexer generator using Fable; port OCaml sedlex to FSharp, Python and more!

NOTE: currently we support interpreted mode and Python source code generation. It's EASY to compile compiled_unit into source code for C#, F# and othe

Taine Zhao 15 Aug 06, 2022
Rick Astley Language is a rick roll oriented, dynamic, strong, esoteric programming language.

Rick Roll Language / Rick Astley Language A rick roll oriented, dynamic, strong, esoteric programming language. Prolegomenon The reasons that I made t

Rick Roll Programming Language 658 Jan 09, 2023
Aero is an open source airplane intelligence tool. Aero supports more than 13,000 airlines and 250 countries. Any flight worldwide at your fingertips.

Aero Aero supports more than 13,000 airlines and 250 countries. Any flight worldwide at your fingertips. Features Main : Flight lookup Aircraft lookup

Vickey 비키 4 Oct 27, 2021
A simple program to recolour simple png icon-like pictures with just one colour + transparent or white background. Resulting images all have transparent background and a new colour.

A simple program to recolour simple png icon-like pictures with just one colour + transparent or white background. Resulting images all have transparent background and a new colour.

Anna Tůmová 0 Jan 30, 2022
Sailwind Mod Manager

Sailwind Mod Manager The Sailwind Mod Manager is an open source mod manager for the Sailwind community. It currently allows you to browse and download

Max 3 Jul 15, 2022
Morth - Stack Based Programming Language

Morth WARNING! THIS LANGUAGE IS A WORKING PROGRESS. THIS IS JUST A HOBBY PROJECT

Dominik Danner 2 Mar 05, 2022
Repository voor verhalen over de woningbouw-opgave in Nederland

Analyse plancapaciteit woningen In deze notebook zetten we cijfers op een rij om de woningbouwplannen van Nederlandse gemeenten in kaart te kunnen bre

Follow the Money 10 Jun 30, 2022
Zeus - Advanced Punishments with Embeds.

Zeus Advanced Punishments with Embeds. Make sure to put the Discord Bot Token in the " TOKEN = '' " Language Python Features Ban Kick Mute Unmute Warn

2 Jan 05, 2022
Projeto-menu - This project is designed to learn more about control mechanisms in Python programming

Projeto-menu - This project is designed to learn more about control mechanisms in Python programming

Henrik Ricarte 2 Mar 01, 2022
FindUncommonShares.py is a Python equivalent of PowerView's Invoke-ShareFinder.ps1 allowing to quickly find uncommon shares in vast Windows Domains.

FindUncommonShares The script FindUncommonShares.py is a Python equivalent of PowerView's Invoke-ShareFinder.ps1 allowing to quickly find uncommon sha

Podalirius 184 Jan 03, 2023
TinyBar - Tiny MacOS menu bar utility to track price dynamics for assets on TinyMan.org

📃 About A simple MacOS menu bar app to display current coins from most popular

Al 8 Dec 23, 2022
CalHacks 8 Repo: Megha Jain, Gaurav Bhatnagar, Howard Meng, Vibha Tantry

CalHacks8 CalHacks 8 Repo: Megha Jain, Gaurav Bhatnagar, Howard Meng, Vibha Tantry Setup FE Install React Native via Expo, run App.js. Backend Create

0 Aug 20, 2022
Advanced IPv4 Subnet Calculator in Python3

Advanced IPv4 Subnet Calculator in Python3 Table of Contents Getting Started Installation How it works? SVI Configuration Template Previews Getting St

Osama Abbas 1 May 10, 2022
Larvamatch - Find your larva or punk match.

LarvaMatch Find your larva or punk match. UI TBD API (not started) The API will allow you to specify a punk by token id to find a larva match, and vic

1 Jan 02, 2022
An improved version of the common ˙pacman -S˙

BetterPacmanLook An improved version of the common pacman -S. Installation I know that this is probably one of the worst solutions and i will be worki

1 Nov 06, 2021
A parser of Windows Defender's DetectionHistory forensic artifact, containing substantial info about quarantined files and executables.

A parser of Windows Defender's DetectionHistory forensic artifact, containing substantial info about quarantined files and executables.

Jordan Klepser 101 Oct 30, 2022
The Blinker Herald includes helpers to easily emit signals using the excellent blinker library.

Blinker Herald The Blinker Herald includes helpers to easily emit signals using the excelent blinker library. Decorate a function or method with @blin

SatelliteQE 7 Nov 03, 2022
jonny is a stack based programming language

jonny-lang jonny is a stack based programming language also compiling jonny files currently doesnt work on windows you can probably compile jonny file

1 Nov 24, 2021