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)

use Notepad++ for real-time sync after python appending new log text

FTP远程log同步工具 使用Notepad++配合来获取实时更新的log文档效果 适用于FTP协议的log远程同步工具,配合MT管理器开启FTP服务器使用,通过Notepad++监听文本变化,更便捷的使用电脑查看方法注入打印后的信息 功能 过滤器 对每行要打印的文本使用回调函数筛选,支持链式调用

Liuhaixv 1 Oct 17, 2021
Run-Your-Own Firefox Sync Server

Run-Your-Own Firefox Sync Server This is an all-in-one package for running a self-hosted Firefox Sync server. It bundles the "tokenserver" project for

Mozilla Services 1.7k Dec 30, 2022
2 Way Sync Between Notion Database and Google Calendar

Notion-and-Google-Calendar-2-Way-Sync 2 Way Sync Between a Notion Database and Google Calendar WARNING: This repo will be undergoing a good bit of cha

null 248 Dec 26, 2022
Sync SiYuanNote & Yuque.

SiyuanYuque Sync SiYuanNote & Yuque. Install Use pip to install. pip install SiyuanYuque Execute like this: python -m SiyuanYuque Remember to create a

Clouder 23 Nov 25, 2022
An application to see if your Ethereum staking validator(s) are members of the current or next post-Altair sync committees.

eth_sync_committee.py Since the Altair upgrade, 512 validators are randomly chosen every 256 epochs (~27 hours) to form a sync committee. Validators i

null 4 Oct 27, 2022
msImpersonate - User account impersonation written in pure Python3

msImpersonate v1.0 msImpersonate is a Python-native user impersonation tool that is capable of impersonating local or network user accounts with valid

Joe Helle 90 Dec 16, 2022
:snake: Complete C99 parser in pure Python

pycparser v2.20 Contents 1 Introduction 1.1 What is pycparser? 1.2 What is it good for? 1.3 Which version of C does pycparser support? 1.4 What gramma

Eli Bendersky 2.8k Dec 29, 2022
An ultra fast cross-platform multiple screenshots module in pure Python using ctypes.

Python MSS from mss import mss # The simplest use, save a screen shot of the 1st monitor with mss() as sct: sct.shot() An ultra fast cross-platfo

Mickaël Schoentgen 799 Dec 30, 2022
Ikaros is a free financial library built in pure python that can be used to get information for single stocks, generate signals and build prortfolios

Ikaros is a free financial library built in pure python that can be used to get information for single stocks, generate signals and build prortfolios

Salma Saidane 64 Sep 28, 2022
Project based on pure python with OOP

Object oriented programming review Object oriented programming (OOP) is among the most used programming paradigms (if not the most common) in the indu

Facundo Abrahan Cerimeli 1 May 9, 2022
An kind of operating system portal to a variety of apps with pure python

pyos An kind of operating system portal to a variety of apps. Installation Run this on your terminal: git clone https://github.com/arjunj132/pyos.git

null 1 Jan 22, 2022
Necst-lib - Pure Python tools for NECST

necst-lib Pure Python tools for NECST. Features This library provides: something

NANTEN2 Group 5 Dec 15, 2022
This is a far more in-depth and advanced version of "Write user interface to a file API Sample"

Fusion360-Write-UserInterface This is a far more in-depth and advanced version of "Write user interface to a file API Sample" from https://help.autode

null 4 Mar 18, 2022
Yunqi Chen 7 Oct 30, 2022
An async API wrapper for Dress To Impress written in Python.

dti.py An async API wrapper for Dress To Impress written in Python. Some notes: For the time being, there are no front-facing docs for this beyond doc

Steve C 1 Dec 14, 2022
python DroneCAN code generation, interface and utilities

UAVCAN v0 stack in Python Python implementation of the UAVCAN v0 protocol stack. UAVCAN is a lightweight protocol designed for reliable communication

DroneCAN 11 Dec 12, 2022
Custom python interface to xstan (a modified (cmd)stan)

Custom python interface to xstan (a modified (cmd)stan) Use at your own risk, currently everything is very brittle and will probably be changed in the

null 2 Dec 16, 2021
apysc is the Python frontend library to create html and js file, that has ActionScript 3 (as3)-like interface.

apysc apysc is the Python frontend library to create HTML and js files, that has ActionScript 3 (as3)-like interface. Notes: Currently developing and

simonritchie 17 Dec 14, 2022
A simplified python interface to COPASI.

BasiCO This project hosts a simplified python interface to COPASI. While all functionality from COPASI is exposed via automatically generated SWIG wra

COPASI 8 Dec 21, 2022