Version 2021.3.18 (13 mar 2021)
 - Replace TorrentStates.FORCE_DOWNLOAD='forceDL' with TorrentStates.FORCED_DOWNLOAD='forcedDL'

Version 2021.2.17 (7 feb 2021)
 - Generally refactor requests.py so it's better and easier to read
 - Persist a Requests Session between API calls instead of always creating a new one...small perf benefit
 - Move auth endpoints back to a dedicated module
 - Since attrdict is apparently going to break in Python 3.10 and it is no longer maintained, i've vendored a modified version (fixes #45).
 - Created handle_hashes decorator to hide the cruft of continuing to support hash and hashes arguments

Version 2021.1.16 (26 jan 2021)
 - Support qBittorrent v4.3.3 and Web API v2.7 (...again)
 - New torrents/renameFile and torrents/renameFolder endpoints
 - Retrieve app api version when needed instead of caching
 - Stop verifying and removing individual parameters when they aren't supported

Version 2020.12.15 (27 dec 2020)
 - Support qBittorrent v4.3.2 and Web API v2.7
 - torrents/add supports adding torrents with tags via "tags" parameter
 - app/preferences supports toggling internationalized domain name (IDN) support via "idn_support_enabled"
 - BREAKING CHANGE: for torrents/add, "is_root_folder" (or "root_folder") is superseded by "content_layout"
 - For torrents/delete, "delete_files" now defaults to False instead of required being explicitly passed

Version 2020.12.14 (6 dec 2020)
 - Add support for non-standard API endpoint paths (Fixes #37)
 - Allows users to leverage this client when qBittorrent is configured behind a reverse proxy.
  - For instance, if the Web API is being exposed at "http://localhost/qbt/", then users can instantiate via Client(host='localhost/qbt') and all API endpoint paths will be prefixed with "/qbt".
 - Additionally, the scheme (i.e. http or https) from the user will now be respected as the first choice for which scheme is used to communicate with qBittorrent.
  - However, users still don't need to even specify a scheme; it'll be automatically determined on the first connection to qBittorrent.
 - Neither of these should be breaking changes, but if you're instantiating with an incorrect scheme or an irrelevant path, you may need to prevent doing that now.

Version 2020.11.13 (29 nov 2020)
 - Support qBittorrent v4.3.1 and Web API v2.6.1
 - Path of torrent content now available via content_path from torrents/info

Version 2020.11.12 (16 nov 2020)
 - Fix support for raw bytes for torrent_files in torrents_add() for Python 3. Fixes #34.

Version 2020.10.11 (29 oct 2020)
 - Support qBittorrent v4.3.0.1 and Web API v2.6
 - Due to qBittorrent changes, /search/categories no longer returns anything and /rss/renameRule works again

Version 2020.10.10 (7 oct 2020)
 - Advertise support for Python 3.9

Version 2020.9.9 (12 sept 2020)
 - Only request enum34 for Python 2

Version 2020.8.8 (14 aug 2020)
 - Support adding torrents from raw torrent files as bytes or file handles. Fixes #23.
 - Introduce TorrentStates enum for qBittorrent list of torrent states.

Version 2020.7.7 (26 jul 2020)
 - Update tests and misc small fixes.

Version 2020.7.6 (25 jul 2020)
 - Re-release of v2020.7.5.

Version 2020.7.5 (25 jul 2020)
 - Add RTD documentation.

Version 2020.6.4 (9 jun 2020)
 - Bug fix release. Reorganized code and classes to be more logical.
 - Started returning None from many methods that were returning Requests Responses.
 - Content-Length header is now explicitly sent as "0" for any POSTs without a body.
 - Endpoint input parameters "hash" and "hashes" are renamed to "torrent_hash" and "torrent_hashes". "hash" and "hashes" remain supported.
 - search_uninstall_plugin now works. search_enable_plugin now supports multiple plugins.
 - Torrent.download_limit now only return the value instead of a dictionary. Torrent.upload_limit now works.
 - Drop advertising Python 2.6 and 3.4 support; add PyPy3 support.
 - Implement test suite and CI that can test all supported qBittorrent versions on all pythons.

Version 2020.5.3 (11 may 2020)
 - Include currently supported qBittorrent version in README. Fixes #11.

Version 2020.4.2 (25 apr 2020)
 - Add support for rss/markAsRead and rss/matchingArticles. Added in v2.5.1. Fixes #10

Version 2020.4.1 (25 apr 2020)
 - Add stalled(), stalled_uploading(), and stalled_downloading() to torrents.info interaction. Added in Web API v2.4.1.
 - Implement torrent file renaming. Added in Web API v2.4.0. Fixes #3.
 - Since versioning was botched last release, implement calendar versioning.
 - List of files returned from torrents_files() now contains file ID in 'id'.

Version 6.0.0 (22 apr 2020)
 - Performance gains for responses with payloads...especially for large payloads.
 - Fixes #6. Adds support for SIMPLE_RESPONSES for the entire client and individual methods.

Version 0.5.2 (19 apr 2020)
 - Fixes #8. Remove whitespace from in setPreferences requests for older qBittorrent versions.

Version 0.5.1 (2 jan 2020)
 - Add Python3.8 version for PyPI
 - Move project from beta to stable for PyPI

Version 0.5.0 (2 jan 2020)
 - Make Web API URL derivation more robust...thereby allowing the client to actually work on Python3.8 (#5)
 - Allow port to be discretely specified during Client instantiation (#4)
 - Enhance request retry logic and expose retry configuration

Version 0.4.2 (5 dec 2019)
 - Improve organization and clarity of README
 - Better document exceptions
 - Clarify torrent file handling exceptions better with proper exceptions
 - Clean up the request wrapper exception handling
 - Fix HTTP 404 handling to find and return problematic torrent hashes

Version 0.4.1 (4 dec 2019)
 - Round out support for tags with qBittorrent v4.2.0 release
 - Remove upper-bound version requirements for requests and urllib3

Version 0.4 (4 dec 2019)
 - Support for qBittorrent v4.2.0 release
 - Add support for app/buildInfo
 - Add support for transfer/banPeers and torrents/addPeers
 - Add support for torrents/addTags, torrents/removeTags, torrents/tags, torrents/createTags, and torrents/deleteTags

Version 0.3.3 (29 sept 2019)
 - Fix useAutoTMM to autoTMM for client.torrents_add() so auto torrent management works
 - Add support to refresh RSS items introduced in qBittorrent v4.1.8

Version 0.3.2 (28 jun 2019)
 - Restore python 2 compatibility
 - Allow exceptions to be imported directly from package instead of only exceptions module

Version 0.3 (1 jun 2019)
 - Finalized interaction layer interfaces

Version 0.2 (13 may 2019)
 - Introduced the "interaction layer" for transparent interaction with the qBittorrent API.

Version 0.1 (7 may 2019)
 - Complete implementation of qBittorrent WebUI API 2.2.
 - Each API endpoint is available via the Client class.
 - Automatic re-login is supported in the event of login expiration.
