{"id":13622438,"url":"https://github.com/ping/odmpy","last_synced_at":"2025-04-05T09:05:58.862Z","repository":{"id":49987503,"uuid":"117052191","full_name":"ping/odmpy","owner":"ping","description":"A simple command line manager for OverDrive/Libby loans. Download your library loans from the command line.","archived":false,"fork":false,"pushed_at":"2024-09-03T22:19:56.000Z","size":7790,"stargazers_count":387,"open_issues_count":15,"forks_count":24,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-03-29T08:06:53.705Z","etag":null,"topics":["audiobook","audiobooks","ebook","ebooks","libby","libraries","overdrive"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ping.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://buymeacoffee.com/ping/"]}},"created_at":"2018-01-11T04:58:05.000Z","updated_at":"2025-03-26T06:42:25.000Z","dependencies_parsed_at":"2022-09-16T03:24:55.554Z","dependency_job_id":"c032b995-a7e6-4e12-a882-9e6685343adc","html_url":"https://github.com/ping/odmpy","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ping%2Fodmpy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ping%2Fodmpy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ping%2Fodmpy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ping%2Fodmpy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ping","download_url":"https://codeload.github.com/ping/odmpy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247312077,"owners_count":20918344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audiobook","audiobooks","ebook","ebooks","libby","libraries","overdrive"],"created_at":"2024-08-01T21:01:19.170Z","updated_at":"2025-04-05T09:05:58.753Z","avatar_url":"https://github.com/ping.png","language":"Python","funding_links":["https://buymeacoffee.com/ping/","https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee\u0026emoji=\u0026slug=ping\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Bree\u0026outline_colour=000000\u0026coffee_colour=ffffff","https://www.buymeacoffee.com/ping"],"categories":["Python"],"sub_categories":[],"readme":"# odmpy\n\nA command line manager for OverDrive/Libby loans. Originally a python port of [overdrive](https://github.com/chbrown/overdrive), it now supports downloading of various loan types such as **audiobooks**, **eBooks**, and **magazines** via [Libby](https://help.libbyapp.com/en-us/6103.htm).\n\nodmpy also has useful features for audiobooks such as adding of chapters metadata and merging of multipart files into a single `.mp3` or `.m4b` (requires [ffmpeg](https://ffmpeg.org/)).\n\nWorks on Linux, macOS, and Windows.\n\nRequires Python \u003e= 3.7.\n\n![Screenshot](https://user-images.githubusercontent.com/104607/222746903-0089bea5-ba3f-4eef-8e14-b4870a5bbb27.png)\n\n## Features\n\n1. Downloads the audio files for an audiobook loan, with additional options to:\n   - merge files into a single `.mp3` or `.m4b` file\n   - add chapters information into the audio file(s)\n2. Download eBook (EPUB/PDF) loans as `.acsm` files or as `.epub` files (with `--direct`)\n3. Download magazine loans as `.epub` files\n4. Return or renew loans\n\n[![Buy me a coffee](https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee\u0026emoji=\u0026slug=ping\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Bree\u0026outline_colour=000000\u0026coffee_colour=ffffff)](https://www.buymeacoffee.com/ping)\n\n## Install\n\nYou must already have [Python](https://wiki.python.org/moin/BeginnersGuide/Download) installed on your system. If you wish to use the merge feature for audiobooks, you will also need to install [ffmpeg](https://ffmpeg.org/download.html).\n\n```bash\n# Install / Update to specific version\npython3 -m pip install git+https://git@github.com/ping/odmpy.git@0.8.1 --upgrade\n\n# Install / Update from latest source\npython3 -m pip install git+https://git@github.com/ping/odmpy.git --upgrade --force-reinstall\n\n# Uninstall\npython3 -m pip uninstall odmpy\n```\n\n## Usage\n\n\u003e ### ⚠️ Breaking\n\u003e \n\u003e From version 0.7, the `--retry/-r` option has been moved to the base `odmpy` command (similar to `--timeout/-t`) for consistency\n\u003e  ```bash\n\u003e  # previously\n\u003e  odmpy dl --retry 3 \"MyLoan.odm\"\n\u003e  odmpy libby --retry 3\n\u003e\n\u003e  # now\n\u003e  odmpy --retry 3 dl \"MyLoan.odm\"\n\u003e  odmpy --retry 3 libby\n\u003e  ```\n\n### General information\n```\nusage: odmpy [-h] [--version] [-v] [-t TIMEOUT] [-r RETRIES]\n             [--noversioncheck]\n             {libby,libbyreturn,libbyrenew,dl,ret,info} ...\n\nManage your OverDrive loans\n\noptions:\n  -h, --help            show this help message and exit\n  --version             show program's version number and exit\n  -v, --verbose         Enable more verbose messages for debugging.\n  -t TIMEOUT, --timeout TIMEOUT\n                        Timeout (seconds) for network requests. Default 10.\n  -r RETRIES, --retry RETRIES\n                        Number of retries if a network request fails. Default\n                        1.\n  --noversioncheck      Do not check if newer version is available.\n\nAvailable commands:\n  {libby,libbyreturn,libbyrenew,dl,ret,info}\n                        To get more help, use the -h option with the command.\n    libby               Download audiobook/ebook/magazine loans via Libby.\n    libbyreturn         Return loans via Libby.\n    libbyrenew          Renew loans via Libby.\n    dl                  Download from an audiobook loan file (odm).\n    ret                 Return an audiobook loan file (odm).\n    info                Get information about an audiobook loan file (odm).\n\nVersion 0.8.1. [Python 3.10.6-darwin] Source at https://github.com/ping/odmpy\n```\n\n### Download via Libby\n\nTo download from Libby, you must already be using Libby on a [compatible](https://help.libbyapp.com/en-us/6105.htm) device. \n\nYou will be prompted for a Libby setup code the first time you run the `libby` command. To get a code, follow the instructions [here](https://help.libbyapp.com/en-us/6070.htm). You should only need to do this once.\n\n```\nusage: odmpy libby [-h] [--settings SETTINGS_FOLDER] [--ebooks] [--magazines]\n                   [--noaudiobooks] [-d DOWNLOAD_DIR] [-c] [-m]\n                   [--mergeformat {mp3,m4b}] [--mergecodec {aac,libfdk_aac}]\n                   [-k] [-f] [--nobookfolder]\n                   [--bookfolderformat BOOK_FOLDER_FORMAT]\n                   [--bookfileformat BOOK_FILE_FORMAT]\n                   [--removefrompaths ILLEGAL_CHARS] [--overwritetags]\n                   [--tagsdelimiter DELIMITER] [--id3v2version {3,4}] [--opf]\n                   [-r OBSOLETE_RETRIES] [-j] [--hideprogress] [--direct]\n                   [--keepodm] [--latest N] [--select N [N ...]]\n                   [--selectid ID [ID ...]]\n                   [--exportloans LOANS_JSON_FILEPATH] [--reset] [--check]\n                   [--debug]\n\nInteractive Libby Interface for downloading loans.\n\noptions:\n  -h, --help            show this help message and exit\n  --settings SETTINGS_FOLDER\n                        Settings folder to store odmpy required settings, e.g. Libby authentication.\n  --ebooks              Include ebook (EPUB/PDF) loans (experimental). An EPUB/PDF (DRM) loan will be downloaded as an .acsm file\n                        which can be opened in Adobe Digital Editions for offline reading.\n                        Refer to https://help.overdrive.com/en-us/0577.html and \n                        https://help.overdrive.com/en-us/0005.html for more information.\n                        An open EPUB/PDF (no DRM) loan will be downloaded as an .epub/.pdf file which can be opened\n                        in any EPUB/PDF-compatible reader.\n  --magazines           Include magazines loans (experimental).\n  --noaudiobooks        Exclude audiobooks.\n  -d DOWNLOAD_DIR, --downloaddir DOWNLOAD_DIR\n                        Download folder path.\n  -c, --chapters        Add chapter marks (experimental). For audiobooks.\n  -m, --merge           Merge into 1 file (experimental, requires ffmpeg). For audiobooks.\n  --mergeformat {mp3,m4b}\n                        Merged file format (m4b is slow, experimental, requires ffmpeg). For audiobooks.\n  --mergecodec {aac,libfdk_aac}\n                        Audio codec of merged m4b file. (requires ffmpeg; using libfdk_aac requires ffmpeg compiled with libfdk_aac support). For audiobooks. Has no effect if mergeformat is not set to m4b.\n  -k, --keepcover       Always generate the cover image file (cover.jpg).\n  -f, --keepmp3         Keep downloaded mp3 files (after merging). For audiobooks.\n  --nobookfolder        Don't create a book subfolder.\n  --bookfolderformat BOOK_FOLDER_FORMAT\n                        Book folder format string. Default \"%(Title)s - %(Author)s\".\n                        Available fields:\n                          %(Title)s : Title\n                          %(Author)s: Comma-separated Author names\n                          %(Series)s: Series\n                          %(ReadingOrder)s: Series Reading Order\n                          %(Edition)s: Edition\n                          %(ID)s: Title/Loan ID\n  --bookfileformat BOOK_FILE_FORMAT\n                        Book file format string (without extension). Default \"%(Title)s - %(Author)s\".\n                        This applies to only merged audiobooks, ebooks, and magazines.\n                        Available fields:\n                          %(Title)s : Title\n                          %(Author)s: Comma-separated Author names\n                          %(Series)s: Series\n                          %(ReadingOrder)s: Series Reading Order\n                          %(Edition)s: Edition\n                          %(ID)s: Title/Loan ID\n  --removefrompaths ILLEGAL_CHARS\n                        Remove characters in string specified from folder and file names, example \"\u003c\u003e:\"/\\|?*\"\n  --overwritetags       Always overwrite ID3 tags.\n                        By default odmpy tries to non-destructively tag audiofiles.\n                        This option forces odmpy to overwrite tags where possible. For audiobooks.\n  --tagsdelimiter DELIMITER\n                        For ID3 tags with multiple values, this defines the delimiter.\n                        For example, with the default delimiter \";\", authors are written\n                        to the artist tag as \"Author A;Author B;Author C\". For audiobooks.\n  --id3v2version {3,4}  ID3 v2 version. 3 = v2.3, 4 = v2.4\n  --opf                 Generate an OPF file for the downloaded audiobook/magazine/ebook.\n  -r OBSOLETE_RETRIES, --retry OBSOLETE_RETRIES\n                        Obsolete. Do not use.\n  -j, --writejson       Generate a meta json file (for debugging).\n  --hideprogress        Hide the download progress bar (e.g. during testing).\n  --direct              Process the download directly from Libby without \n                        downloading an odm/acsm file. For audiobooks/eBooks.\n  --keepodm             Keep the downloaded odm and license files. For audiobooks.\n  --latest N            Non-interactive mode that downloads the latest N number of loans.\n  --select N [N ...]    Non-interactive mode that downloads loans by the index entered.\n                        For example, \"--select 1 5\" will download the first and fifth loans in order of the checked out date.\n                        If the 5th loan does not exist, it will be skipped.\n  --selectid ID [ID ...]\n                        Non-interactive mode that downloads loans by the loan ID entered.\n                        For example, \"--selectid 12345\" will download the loan with the ID 12345.\n                        If the loan with the ID does not exist, it will be skipped.\n  --exportloans LOANS_JSON_FILEPATH\n                        Non-interactive mode that exports loan information into a json file at the path specified.\n  --reset               Remove previously saved odmpy Libby settings.\n  --check               Non-interactive mode that displays Libby signed-in status and token if authenticated.\n  --debug               Debug switch for use during development. Please do not use.\n```\n\nThere are non-interactive options available:\n\n- Export loans information to a json file\n   ```bash\n   # export current loans in json\n   odmpy libby --exportloans \"path/to/loans.json\"\n   ```\n- Download the latest N number of loans in order of checkout\n   ```bash\n   # download latest checked out loan\n   odmpy libby --latest 1\n   ```\n- Download selected loans\n   ```bash\n   # download 3rd and 5th loans in order of checkout\n   odmpy libby --select 3 5\n   ```\n\n#### eBooks\n\n_Experimental Feature_\n\nUsing the `--ebooks` option will allow you to download/return/renew EPUB/PDF eBook loans. Information about the different eBook formats available can be found [here](https://help.overdrive.com/en-us/0012.html).\n\nFor EPUB/PDF DRM loans, `odmpy` will download an [`.acsm` file](https://help.overdrive.com/en-us/0577.html) for use with [Adobe Digital Editions (ADE)](https://help.libbyapp.com/en-us/6059.htm) by default.\n\nFor loans available as an \"Open EPUB\" or \"Open PDF\", the actual DRM-free `.epub`/`.pdf` book file will be downloaded. There is no option to download the `.acsm` file for open formats.\n\n##### The `--direct` option\n\nUsing the `--direct` option with EPUB DRM loans will download the web Libby version of the eBook as an `.epub`. This is _different_ from the `.epub` that you get when you use an `.acsm` loan file with ADE.\n\nThis option is not recommended because the `.epub` downloaded may not work well with your reader. Use this as an alternative if you cannot use the `.acsm` file for whatever reason.\n\nThe `--direct` option does not affect PDF eBook loans. These will continue to be downloaded as `.acsm` or `.pdf`.\n\n#### Magazines\n\n_Experimental Feature_\n\nUsing the `--magazines` option will allow you to download/return/renew magazine loans.\n\nOnly magazines that have [readable individual articles](https://help.libbyapp.com/en-us/6215.htm) can be downloaded. \n\nWhen downloading, `odmpy` will download the web Libby version of the magazine as an `.epub`. This is _different_ from the Libby app downloaded copy (for offline reading) and is usually smaller in file size.\n\nWhile the magazine `.epub` has been tested to work reasonably well on an eInk Kindle (after conversion), Moon+ Reader (Android), iBooks (macOS), and [calibre viewer](https://manual.calibre-ebook.com/viewer.html), how well the `.epub` works will depend on your reading device and the magazine contents.\n\nIt is recommended that you use a different book folder and file format for magazine. For example:\n```bash\n# file will be downloaded as './National Geographic/National Geographic-Jan 01 2023.epub\"\nodmpy libby --magazines --downloaddir \"./\" --bookfolderformat \"%(Title)s\" --bookfileformat \"%(Title)s-%(Edition)s\"\n```\n\n### Return via Libby\n```\nusage: odmpy libbyreturn [-h] [--settings SETTINGS_FOLDER] [--ebooks]\n                         [--magazines] [--noaudiobooks]\n\nInteractive Libby Interface for returning loans.\n\noptions:\n  -h, --help            show this help message and exit\n  --settings SETTINGS_FOLDER\n                        Settings folder to store odmpy required settings, e.g. Libby authentication.\n  --ebooks              Include ebook (EPUB/PDF) loans.\n  --magazines           Include magazines loans.\n  --noaudiobooks        Exclude audiobooks.\n```\n\n### Renew via Libby\n```\nusage: odmpy libbyrenew [-h] [--settings SETTINGS_FOLDER] [--ebooks]\n                        [--magazines] [--noaudiobooks]\n\nInteractive Libby Interface for renewing loans.\n\noptions:\n  -h, --help            show this help message and exit\n  --settings SETTINGS_FOLDER\n                        Settings folder to store odmpy required settings, e.g. Libby authentication.\n  --ebooks              Include ebook (EPUB/PDF) loans.\n  --magazines           Include magazines loans.\n  --noaudiobooks        Exclude audiobooks.\n```\n\n\n### Legacy `.odm` Commands\n\nThese commands are still supported but are expected to be less popular as OverDrive app users are encouraged to [switch over to Libby](https://www.overdrive.com/apps/libby/switchtolibby).\n\n\u003cdetails\u003e\u003csummary\u003eDownload with an .odm loan file\u003c/summary\u003e\n\n```\nusage: odmpy dl [-h] [-d DOWNLOAD_DIR] [-c] [-m] [--mergeformat {mp3,m4b}]\n                [--mergecodec {aac,libfdk_aac}] [-k] [-f] [--nobookfolder]\n                [--bookfolderformat BOOK_FOLDER_FORMAT]\n                [--bookfileformat BOOK_FILE_FORMAT]\n                [--removefrompaths ILLEGAL_CHARS] [--overwritetags]\n                [--tagsdelimiter DELIMITER] [--id3v2version {3,4}] [--opf]\n                [-r OBSOLETE_RETRIES] [-j] [--hideprogress]\n                odm_file\n\nDownload from an audiobook loan file (odm).\n\npositional arguments:\n  odm_file              ODM file path.\n\noptions:\n  -h, --help            show this help message and exit\n  -d DOWNLOAD_DIR, --downloaddir DOWNLOAD_DIR\n                        Download folder path.\n  -c, --chapters        Add chapter marks (experimental). For audiobooks.\n  -m, --merge           Merge into 1 file (experimental, requires ffmpeg). For audiobooks.\n  --mergeformat {mp3,m4b}\n                        Merged file format (m4b is slow, experimental, requires ffmpeg). For audiobooks.\n  --mergecodec {aac,libfdk_aac}\n                        Audio codec of merged m4b file. (requires ffmpeg; using libfdk_aac requires ffmpeg compiled with libfdk_aac support). For audiobooks. Has no effect if mergeformat is not set to m4b.\n  -k, --keepcover       Always generate the cover image file (cover.jpg).\n  -f, --keepmp3         Keep downloaded mp3 files (after merging). For audiobooks.\n  --nobookfolder        Don't create a book subfolder.\n  --bookfolderformat BOOK_FOLDER_FORMAT\n                        Book folder format string. Default \"%(Title)s - %(Author)s\".\n                        Available fields:\n                          %(Title)s : Title\n                          %(Author)s: Comma-separated Author names\n                          %(Series)s: Series\n                          %(Edition)s: Edition\n                          %(ID)s: Title/Loan ID\n  --bookfileformat BOOK_FILE_FORMAT\n                        Book file format string (without extension). Default \"%(Title)s - %(Author)s\".\n                        This applies to only merged audiobooks, ebooks, and magazines.\n                        Available fields:\n                          %(Title)s : Title\n                          %(Author)s: Comma-separated Author names\n                          %(Series)s: Series\n                          %(Edition)s: Edition\n                          %(ID)s: Title/Loan ID\n  --removefrompaths ILLEGAL_CHARS\n                        Remove characters in string specified from folder and file names, example \"\u003c\u003e:\"/\\|?*\"\n  --overwritetags       Always overwrite ID3 tags.\n                        By default odmpy tries to non-destructively tag audiofiles.\n                        This option forces odmpy to overwrite tags where possible. For audiobooks.\n  --tagsdelimiter DELIMITER\n                        For ID3 tags with multiple values, this defines the delimiter.\n                        For example, with the default delimiter \";\", authors are written\n                        to the artist tag as \"Author A;Author B;Author C\". For audiobooks.\n  --id3v2version {3,4}  ID3 v2 version. 3 = v2.3, 4 = v2.4\n  --opf                 Generate an OPF file for the downloaded audiobook/magazine/ebook.\n  -r OBSOLETE_RETRIES, --retry OBSOLETE_RETRIES\n                        Obsolete. Do not use.\n  -j, --writejson       Generate a meta json file (for debugging).\n  --hideprogress        Hide the download progress bar (e.g. during testing).\n```\n\n#### Unable to download odm files?\n\nOverDrive no longer shows the odm download links for macOS 10.15 (Catalina) and newer.\nThere are many ways to get around this but the easiest for me was to use a \n[bookmarklet](https://support.mozilla.org/en-US/kb/bookmarklets-perform-common-web-page-tasks).\nFollow the instructions in this [gist](https://gist.github.com/ping/b58ae66359691db1d08f929a9e57a03d)\nto get started.\n\nAlternatively, if you have switched over to Libby, `odmpy` now\nsupports direct from Libby downloads through the `libby` command.\n\n```bash\n# view available options\nodmpy libby -h\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eReturn an .odm\u003c/summary\u003e\n\n```\nusage: odmpy ret [-h] odm_file\n\nReturn an audiobook loan file (odm).\n\npositional arguments:\n  odm_file    ODM file path.\n\noptions:\n  -h, --help  show this help message and exit\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eInformation about an .odm\u003c/summary\u003e\n\n```\nusage: odmpy info [-h] [-f {text,json}] odm_file\n\nGet information about an audiobook loan file (odm).\n\npositional arguments:\n  odm_file              ODM file path.\n\noptions:\n  -h, --help            show this help message and exit\n  -f {text,json}, --format {text,json}\n                        Format for output.\n```\n\n\u003c/details\u003e\n\n[`.odm`](https://help.overdrive.com/en-us/0577.html) files have to be downloaded from your library's OverDrive site and are meant for use with OverDrive's [now legacy app](https://company.overdrive.com/2021/08/09/important-update-regarding-libby-and-the-overdrive-app/).\n\n\n### Examples\n\n```bash\n\n# Start the Libby interface to select an audiobook loan to download\n# The `libby` command shares almost all of the download options as `dl`\n# Example, downloads will be saved in MyLoans/\nodmpy libby -d \"MyLoans/\"\n\n# View and download ebook (EPUB) loans as `.acsm` files\nodmpy libby --ebooks\n\n# View and download magazines loans as `.epub` files\nodmpy libby --magazines\n\n# Download via Libby without generating the odm file\nodmpy libby --direct\n\n# Download via Libby your latest loan non-interactively\nodmpy libby --direct --latest 1\n\n# Return loans via Libby\nodmpy libbyreturn\n\n# Renew loans via Libby\nodmpy libbyrenew\n\n# Download a book via an odm file to MyLoans/\nodmpy dl -d \"MyLoans/\" \"MyLoans/Book1.odm\"\n\n# Return Book1.odm\nodmpy ret \"MyLoans/Book1.odm\"\n\n# Get information about a loan Book1.odm\nodmpy info \"MyLoans/Book1.odm\"\n\n```\n\n`odmpy` also supports the reading of command options from a file. For example:\n\n```bash\nodmpy libby @example.dl.conf\n\nodmpy dl @example.dl.conf MyLoans/MyBook.odm\n```\nwhere [`example.dl.conf`](example.dl.conf) contains the command arguments values\n\n## Credits\n\n- [overdrive](https://github.com/chbrown/overdrive)\n- [pylibby](https://github.com/lullius/pylibby)\n\n## Contributing\n\n[![Coverage](https://ping.github.io/odmpy/coverage/badge.svg)](https://ping.github.io/odmpy/coverage/)\n\nThis repository uses [black](https://github.com/psf/black) to ensure consistent formatting.\nThe [CI Actions](https://github.com/ping/odmpy/blob/master/.github/workflows/lint-test.yml)\ncurrently configured also include lint tests using [flake8](https://github.com/pycqa/flake8),\n[pylint](https://github.com/PyCQA/pylint) and [mypy](https://github.com/python/mypy).\n\n```bash\n# 1. Install requirements for dev\npip3 install -r requirements-dev.txt --upgrade\n\n# 2. Make changes\n\n# 3. Check for linting errors\nsh dev-lint.sh\n```\n\n## Disclaimer\n\nThis is not affliated, endorsed or certified by OverDrive. To use odmpy, you must already have access to OverDrive services via a valid library account. Use at your own risk.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fping%2Fodmpy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fping%2Fodmpy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fping%2Fodmpy/lists"}