4.4.0 (2021-03-19)
------------------
**Added**

- **Interfaces:**

  - :code:`Trakt['movies']` :code:`recommended()`
  - :code:`Trakt['shows']` :code:`recommended()`

4.3.0 (2021-03-19)
------------------
**Added**

- **Interfaces:**

  - :code:`Trakt['movies']` :code:`popular()`
  - :code:`Trakt['shows']` :code:`popular()`

**Changed**

- Updated "arrow" requirement to support v1.0.0 (#91)
- Updated "requests" requirement to exclude v2.16.0 (#88)

4.2.0 (2020-06-29)
------------------
**Added**

- **Interfaces:**

  - :code:`Trakt['lists']` :code:`popular()`, :code:`trending()`
  - :code:`Trakt['users/*']` :code:`get()`, :code:`follow()`, :code:`unfollow()`
  - :code:`Trakt['users/*/watched']` :code:`get()`, :code:`movies()`, :code:`shows()`

- **Objects:**

  - :code:`PublicList`

- **Properties:**

  - :code:`Media`

    - :code:`plays`
    - :code:`last_updated_at`
    - :code:`last_watched_at`
    - :code:`reset_at`

4.1.0 (2020-05-28)
------------------
**Added**

- Documentation is now generated for a number of modules that were previously missing

- **Interfaces:**

  - :code:`Trakt['sync/watchlist']`

    - Now supports the :code:`sort` parameter

  - :code:`Trakt['users/*/following']`
  - :code:`Trakt['users/*/friends']`
  - :code:`Trakt['users/*/history']`
  - :code:`Trakt['users/*/ratings']`
  - :code:`Trakt['users/*/watchlist']`

- **Methods:**

  - :code:`Trakt['sync/history']` :code:`seasons()`, :code:`episodes()`
  - :code:`Trakt['sync/ratings']` :code:`all()`

- **Objects:**

  - :code:`User`

**Changed**

- **Methods:**

  - :code:`Trakt['users/*/lists']` :code:`create()` now cleans the provided :code:`username` parameter.

4.0.0 (2020-05-15)
------------------
**BREAKING**

- :code:`pagination=True` now always returns a :code:`PaginationIterator` with:
   - :code:`total_items` - Total number of items
   - :code:`total_pages` - Total number of pages
   - :code:`get(page)` - Fetch the specified page
   - :code:`__iter__` - Iterate over all items, automatically requesting the next page as required
- :code:`Trakt['search'].lookup()` now always returns a list of matched items *(previously a list was only returned when more than one item was returned)*

**Added**

- Pages can now be requested without using :code:`pagination=True` by using the :code:`page` and :code:`per_page` parameters on:
   - :code:`Trakt['movies']` :code:`trending()`
   - :code:`Trakt['search']` :code:`lookup()`, :code:`query()`
   - :code:`Trakt['shows']` :code:`trending()`
   - :code:`Trakt['sync/history']` :code:`get()`, :code:`movies()`, :code:`shows()`
   - :code:`Trakt['sync/ratings']` :code:`get()`, :code:`movies()`, :code:`shows()`, :code:`seasons()`, :code:`episodes()`
   - :code:`Trakt['sync/watchlist']` :code:`get()`, :code:`seasons()`, :code:`episodes()`
   - :code:`Trakt['users']` :code:`likes()`
   - :code:`Trakt['users/*/lists/*']` :code:`items()`
- :code:`Trakt['users/*/lists/*'].items()` now supports a :code:`media` parameter (#76)

3.2.0 (2020-03-17)
------------------
**Added**

- Exposed episode runtime (#69)
- Support :code:`extended` parameter on list :code:`items()` function (#71)

3.1.0 (2019-10-22)
------------------
**Added**

- Support for absolute episode numbers (#63)
- Support for rating votes (#68)

**Changed**

- Dropped support for Python 3.4

3.0.0 (2018-10-26)
------------------
**Added**

- Implemented the show progress interface (#60)
- Support for the :code:`extended` parameter on sync methods (#57)

**Changed**

- Requests that raise exceptions are now retried (with :code:`retry=True`)
- Dropped support for Python 2.6, 3.3

**Fixed**

- Issue disabling pagination on watchlist requests (#62)

2.14.1 (2017-03-07)
-------------------
**Added**

- :code:`__future__` imports to :code:`trakt/hooks.py`

2.14.0 (2017-03-07)
-------------------
**Added**

- Support for Python 3.6
- Package version is now automatically written into the :code:`trakt.version` module on :code:`python setup.py egg_info`
- :code:`__future__` imports for more consistent Python 3 compatibility
- :code:`SummaryMapper.episode` method now accepts the "parse_show" parameter
- Interfaces:

  - :code:`Trakt['calendars']` (#56)

**Changed**

- Dropped support for Python 3.2
- Cleaned up documentation
- Switched to pbr setup configuration
- Ordering of import statements has been updated to be more consistent

**Tests**

- Replaced usage of :code:`responses` in tests with :code:`httmock`
- Updated :code:`tox.ini` with additional test environments and flake8 plugins
- Improved the :code:`fixtures` directory structure

**Travis CI**

- Switched to using "tox-travis", instead of running pytest directly
- Releases are now automatically uploaded to PyPI and GitHub Releases

2.13.0 (2017-02-16)
-------------------
**Added**

- :code:`Trakt['sync/playback'].delete(<id>)` method (#54)

2.12.0 (2017-01-11)
-------------------
**Added**

- Improved token refreshing *(and added the "oauth.refresh" and "oauth.refresh.rejected" events)*
- `RequestFailedError` exception will now be raised if no response was returned (if `exceptions=True`)
- :code:`Trakt.http.keep_alive` property *(defaults to :code:`True`)*
- :code:`Trakt.http.ssl_version` property *(defaults to :code:`None` / :code:`PROTOCOL_TLS` / :code:`PROTOCOL_SSLv23`)*

**Changed**

- Switched default API endpoint to https://api.trakt.tv
- SSL protocol version is now automatically negotiated with the server *(instead of defaulting to TLS v1.0)*
- Warning will now be displayed if a deadlock is detected inside token refresh events
- Fixed some inconsistencies in the handling of error responses
- Updated bundled emitter module (fuzeman/PyEmitter@3c558c7c2bc3ae07cb1e8e18b2c1c16be042c748)
- Interfaces:

  - :code:`Trakt['search']`

    - Updated to use the new search endpoints

- Methods:

  - :code:`Trakt['search'].lookup`

    - Now supports the :code:`extended` parameter

  - :code:`Trakt['search'].query`

    - Now supports the :code:`fields` and :code:`extended` parameters

**Fixed**

- :code:`@authenticated` decorator wasn't applied to some methods, resulting in tokens not being refreshed
- Exception raised when :code:`Trakt['scrobble']` methods are provided "app_version" or "app_date" parameters
- Error responses weren't being returned correctly with :code:`parse=False`
- Issue handling :code:`None` responses in the automatic token refresher
- Inconsistent handling of error responses in some methods

2.11.0 (2016-12-20)
-------------------
**Added**

- Properties

  - :code:`Movie`

    - :code:`tagline`
    - :code:`released`
    - :code:`runtime`
    - :code:`certification`
    - :code:`updated_at`
    - :code:`homepage`
    - :code:`trailer`
    - :code:`language`
    - :code:`available_translations`
    - :code:`genres`

  - :code:`Show`

    - :code:`first_aired`
    - :code:`airs`
    - :code:`runtime`
    - :code:`certification`
    - :code:`network`
    - :code:`country`
    - :code:`updated_at`
    - :code:`status`
    - :code:`homepage`
    - :code:`language`
    - :code:`available_translations`
    - :code:`genres`
    - :code:`aired_episodes`

  - :code:`Season`

    - :code:`first_aired`
    - :code:`episode_count`
    - :code:`aired_episodes`

  - :code:`Episode`

    - :code:`first_aired`
    - :code:`updated_at`
    - :code:`available_translations`

**Changed**

- Methods on the :code:`Trakt['movies']` and :code:`Trakt['shows']` interfaces now support the :code:`extended` parameter (#51)
- Minor improvements to property descriptions on the :code:`Show` and :code:`Episode` objects

2.10.1 (2016-12-15)
-------------------
**Changed**

- Removed some stray files from the source distribution

2.10.0 (2016-12-15)
-------------------
**Added**

- Methods:

  - :code:`Trakt['shows'].next_episode` (#50)
  - :code:`Trakt['shows'].last_episode` (#50)

2.9.0 (2016-10-16)
------------------
**Added**

- Properties:

  - :code:`Person.listed_at`
  - :code:`Video.action`

- Methods:

  - :code:`Trakt['sync/history'].get`
  - :code:`Trakt['sync/history'].shows`
  - :code:`Trakt['sync/history'].movies`

**Changed**

- Updated :code:`SyncMapper` to support flat iterators
- Methods:

  - :code:`Trakt['sync/ratings'].get`

    - Flat iterator will now be returned if no :code:`media` parameter is provided

  - :code:`Trakt['sync/watchlist'].get`

    - Pagination is now supported, can be enabled with :code:`pagination=True`
    - :code:`media` parameter can now be specified as :code:`None` to return all items (with no type filter)

**Fixed**

- Pagination wouldn't work correctly if a starting page was specified

2.8.0 (2016-09-17)
------------------
**Added**

- Lists containing people are now supported (instead of raising an exception)
- :code:`SyncMapper` can now be used without the :code:`store` parameter
- Objects:

  - :code:`Person`

- Properties:

  - :code:`Video.id` (history id)
  - :code:`Video.watched_at` (history timestamp)

- Methods:

  - :code:`Media.get_key(<service>)`

2.7.1 (2016-08-30)
------------------
**Fixed**

- Invalid classifier was defined in [setup.py]

2.7.0 (2016-08-30)
------------------
**Added**

- Support for multiple :code:`media` options on the :code:`Trakt['search'].query()` method
- Implemented the :code:`media` parameter on the :code:`Trakt['search'].lookup()` method

**Changed**

- "Request failed" warnings now display the request method and path to help with debugging
- Improved handling of requirements in [setup.py]

2.6.1 (2016-05-19)
------------------
**Changed**

- Updated request error messages

**Fixed**

- Authorization tokens generated with device authentication wouldn't refresh correctly

2.6.0 (2016-04-15)
------------------
**Added**

- :code:`Trakt['oauth/device']` (see :code:`examples/authentication/device.py` for usage details)
- :code:`Trakt['shows'].seasons()` now supports the :code:`extended="episodes"` parameter
- Pagination can now be enabled with :code:`pagination=True`, `warnings <https://docs.python.org/2/library/warnings.html>`_ will be displayed if you ignore pagination responses

**Changed**

- Moved the :code:`Trakt['oauth'].pin_url()` method to :code:`Trakt['oauth/pin'].url()`, the old method still works but will display a deprecation `warning <https://docs.python.org/2/library/warnings.html>`_

**Fixed**

- Issue retrieving lists by users with the :code:`.` character in their usernames

2.5.2 (2016-02-19)
------------------
**Added**

- :code:`in_watchlist` property to :code:`Movie`, :code:`Show`, :code:`Season` and :code:`Episode` objects (#45)
- :code:`Trakt.site_url` setter to override automatic detection
- :code:`HttpClient` now supports direct calls (#43)

**Changed**

- Tests are now included in builds, but are excluded from installations

2.5.1 (2015-09-25)
------------------
**Fixed**

- Issue installing trakt.py when "six" hasn't been installed yet

2.5.0 (2015-09-24)
------------------
**Added**

- :code:`Trakt['users'].likes()` method
- :code:`CustomList.items()` method
- :code:`Comment` object
- :code:`Media.index` attribute (list item position/rank)
- Basic documentation generation (#29)
- :code:`NullHandler` to the logger to avoid "No handler found" warnings (#33)

**Changed**

- 'movies' and 'shows' interface methods to support the :code:`exceptions=True` parameter (#32)
- :code:`Interface.get_data()` to only parse the response body if the request is successful (#32)

**Fixed**

- :code:`TypeError` was raised in :code:`SummaryMapper` if the request failed (#30, #31)
- Constructing "Special" episodes could raise an :code:`AttributeError` (#38, #39)
- :code:`Media._update()` "images" attribute
- Issue serializing :code:`List` objects

2.4.1 (2015-09-12)
------------------
**Fixed**

- Issue where the "_client" attribute on objects was being serialized
- Issue installing trakt.py when "arrow" isn't available yet

2.4.0 (2015-07-09)
------------------
**Added**

- :code:`trending()` method to :code:`Trakt['shows']` and :code:`Trakt['movies']` interfaces (#23)
- :code:`seasons()` and :code:`episodes()` methods to the :code:`Trakt['sync/watchlist']` interface (#26)
- Custom lists support (:code:`Trakt['users/*/lists']`, :code:`Trakt['users/*/lists/*']`) (#26)
- :code:`__eq__()` method on the :code:`Rating` class
- :code:`proxies` attribute on :code:`Trakt.http`

**Changed**

- :code:`datetime` objects are now returned offset-aware **(make sure you use offset-aware `datetime` objects when comparing timestamps now)**
- Force requests to use :code:`ssl.PROTOCOL_TLSv1` connections for https:// (#25)
- Return site url from :code:`Trakt['oauth'].authorize_url()`
- Use season number from parent when one isn't defined in the episode


2.3.0 (2015-04-11)
------------------
**Changes**

- Added support for PIN authentication
- Added automatic OAuth token refreshing *(see "examples/pin.py" for an example)*
- Added :code:`Trakt.configuration.oauth.from_response()` configuration method
- Added tests for the :code:`Trakt['oauth']` interface
- Added tests to ensure authentication headers are being sent
- :code:`Trakt['oauth']` methods now raise an exception if you are missing required configuration parameters
- :code:`Trakt['oauth'].token()` method has been renamed to :code:`Trakt['oauth'].token_exchange()` *(old method is still present for compatibility)*

**Fixed**

- :code:`Trakt['oauth']` "_url" methods could raise an exception in some cases

2.2.0 (2015-04-02)
------------------
**Changes**

- Added unit tests (with travis-ci.org and coveralls.io integrations)
- Added :code:`/movies`, :code:`/shows`, :code:`/search` and :code:`/users/settings` interfaces
- Added parent properties ("show", "season")
- Added "images", "overview" and "score" properties to the :code:`Media` class
- Added "last_watched_at" property to movies and episodes
- Updated :code:`/sync/playback` interface (to include type filtering)
- "progress" and "paused_at" properties are now included in :code:`to_dict()`

**Fixed**

- "year" property could be returned as a string in some cases
- Catch an exception in :code:`trakt.media_mapper`
- Catch a case where :code:`Interface.get_data()` can raise a :code:`KeyError: 'content-type'` exception

2.1.1 (2015-02-06)
------------------
**Changes**

- Updated to use the new v2 API endpoint (api-v2launch.trakt.tv)
- Episode and Movie :code:`to_dict()` method now always returns "plays" as an integer
- Added "http.retry_sleep" and "http.timeout" configuration parameters
- Setup travis/coveralls services

**Fixed**

- Python 3.x compatibility issues

2.1.0 (2015-02-05)
------------------
**Changes**

- Added "exceptions" and "parse" parameter to `Interface.get_data()`
- Added additional error messages (502, 504, 520)
- Renamed media object `to_info()` method to `to_identifier()`
- Added new `to_dict()` method which returns a dictionary representation of the media object
- Request retrying (on 5xx errors) can now be enabled with `Trakt.configuration.http(retry=True)`
- requests/urllib3 now retries requests on connection errors (default: 3 retries)

**Fixed**

- Thread synchronization issue with `trakt.core.configuration`
- [/sync] last_activities() used an incorrect path

2.0.8 (2015-01-06)
------------------

- Catch all response errors to avoid issues parsing the returned body

2.0.7 (2015-01-04)
------------------

- Handle a case where [media_mapper] processes an item with an empty "ids" dict

2.0.6 (2015-01-02)
------------------

- Switched to manual interface importing to avoid security restrictions

2.0.5 (2015-01-02)
------------------

- Convert all datetime properties to UTC

2.0.4 (2015-01-02)
------------------

- Allow for charset definitions in "Content-Type" response header

2.0.3 (2015-01-02)
------------------

- Display request failed messages in log (with error name/desc)

2.0.2 (2015-01-02)
------------------

- Fixed broken logging message

2.0.1 (2015-01-02)
------------------

- Properly handle responses where trakt.tv returns errors without a json body

2.0.0 (2014-12-31)
------------------

- Re-designed to support trakt 2.0 (note: this isn't a drop-in update - interfaces, objects and methods have changed to match the new API)
- Support for OAuth and xAuth authentication methods
- Simple configuration system

0.7.0 (2014-10-24)
------------------

- "title" and "year" parameters are now optional on scrobble() and watching() methods
- [movie] Added unseen() method
- [show/episode] Added unseen() method

0.6.1 (2014-07-10)
------------------

- Return None if an action fails validation (instead of raising an exception)

0.6.0 (2014-06-23)
------------------

- Added Trakt.configure() method
- Rebuild session on socket.gaierror (workaround for urllib error)

0.5.3 (2014-05-10)
------------------

- Fixed bugs sending media actions
- Renamed cancel_watching() to cancelwatching()
- "title" and "year" parameters are now optional on media actions

0.5.2 (2014-04-20)
------------------

- [movie] Added seen(), library() and unlibrary() methods
- [movie] Implemented media mapping
- [rate] Added shows(), episodes() and movies() methods
- [show] Added unlibrary() method
- [show/episode] Added library() and seen() methods

0.5.1 (2014-04-19)
------------------

- Added @authenticated to MediaInterface.send()
- Fixed missing imports

0.5.0 (2014-04-18)
------------------

- Initial release
