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)

Entitlement AND Hardened Runtime Check

Python3 script for macOS to recursively check /Applications and also check /usr/local/bin, /usr/bin, and /usr/sbin for binaries with problematic/interesting entitlements. Also checks for hardened run

Cedric Owens 79 Nov 16, 2022
Trusted sessions for falcon using itsdangerous.

Falcon signed sessions This project allows you to easily add trusted cookies to falcon, it works by storing a signed cookie in the client's browser us

Ward 1 Feb 08, 2022
Would upload anything I do with/related to brainfuck

My Brainfu*k Repo Basically wanted to create something with Brainfu*k but realized that with the smol brain I have, I need to see the cell values real

Rafeed 1 Mar 22, 2022
Protocol Buffers for the Rest of Us

Protocol Buffers for the Rest of Us Motivation protoletariat has one goal: fixing the broken imports for the Python code generated by protoc. Usage He

Phillip Cloud 76 Jan 04, 2023
List Less Than Ten with python

List Less Than Ten with python

PyLaboratory 0 Feb 07, 2022
Intelligent Employer Profiling Platform.

Intelligent Employer Profiling Platform Setup Instructions Generating Model Data Ensure that Python 3.9+ and pip is installed. Install project depende

Harvey Donnelly 2 Jan 09, 2022
Mahadi-6 - This Is Bangladeshi All Sim 6 Digit Cloner Tools

BANGLADESHI ALL SIM 6 DIGIT CLONER TOOLS TOOLS $ apt update $ apt upgrade $ apt

MAHADI HASAN AFRIDI 2 Jan 23, 2022
Insert a Spotify Playlist, Get a list of YouTube URLs from it.

spotbee This is a module that spits out YouTube URLs from Spotify Playlist URLs Why use this? It is asynchronous which makes it compatible to use with

Nishant Sapkota 10 Apr 06, 2022
A 3-line lisp implementation

Nanolisp The download page of many a language harbors deep senses of forboding, of evil lurking in its native lair. You feel that the language is not

5 Jun 17, 2022
Starscape is a Blender add-on for adding stars to the background of a scene.

Starscape Starscape is a Blender add-on for adding stars to the background of a scene. Features The add-on provides the following features: Procedural

Marco Rossini 5 Jun 24, 2022
Paintbot - Forward & Inverse Kinematics

PAINTBOT - FORWARD & INVERSE KINEMATICS: Overview: We built a simulation of a RRR robot shown in the figure below. The robot has 3 links and is connec

Alex Lin 1 Oct 21, 2021
Python implementation of the Lox language from Robert Nystrom's Crafting Interpreters

pylox Python implementation of the Lox language from Robert Nystrom's Crafting Interpreters. https://craftinginterpreters.com. This only implements th

David Beazley 37 Dec 28, 2022
TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner.

TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner

GonVas 180 Oct 08, 2022
API Rate Limit Decorator

ratelimit APIs are a very common way to interact with web services. As the need to consume data grows, so does the number of API calls necessary to re

Tomas Basham 574 Dec 26, 2022
A python script developed to process Windows memory images based on triage type.

Overview A python script developed to process Windows memory images based on triage type. Requirements Python3 Bulk Extractor Volatility2 with Communi

CrowdStrike 245 Nov 24, 2022
A system for assigning and grading notebooks

nbgrader Linux: Windows: Forum: Coverage: Cite: A system for assigning and grading Jupyter notebooks. Documentation can be found on Read the Docs. Hig

Project Jupyter 1.2k Dec 26, 2022
Slimbook Battery 4 is the new version with new features that improves battery control and increases battery duration in laptops.

Slimbookbattery Slimbook Battery 4 is the new version with new features that improves battery control and increases battery duration in laptops. This

SLIMBOOK TEAM 128 Dec 28, 2022
Meilleur outil de hacking Zapp en 2021 pour Termux

WhatsApp-Tool Meilleur outil de hacking Zapp en 2021 pour Termux Cet outil est le seul prennant en compte les dernières mises à jour de WhatsApp. FONC

2 Aug 17, 2022
WordPress-style shortcodes for Python

Python Shortcodes WordPress-style shortcodes for Python Create and use WordPress-style shortcodes in your Python based app. Example # static output de

Bob 1 Dec 22, 2021
GDIT: Geometry Dash Info Tool

GDIT: Geometry Dash Info Tool This is the first large script that allows you to quickly get information from the Geometry Dash server

dezz0xY 2 Jan 09, 2022