Skip to main content

Python library which provides a high-level interface for media database providers, allowing users to search for television and movie metadata using a simple interface

Project description

pypi travis_ci coverage licence api code style black

mapi

mapi (Metadata API) is a python library which provides a high-level interface for media database providers, allowing users to efficiently search for television and movie metadata using a simple interface.

Installation

  • $ pip install mapi

Running Tests

  • $ pip install -r requirements-testing.txt
  • $ python -m pytest

Notes:

  • Run pip install -r requirements-dev.txt first to install testing dependencies
  • Testing requires internet access
  • Testing requires API_KEY_TMDB and TVDB_API_KEY to be defined as environment variables

Examples

Searching for a television show by series using TVDb

Here is a fairly straight forward example, say we just want to get a listing of episodes from Rick and Morty season 2:

from mapi.providers import TVDb
client = TVDb()  # API Key taken from environment variables
results = client.search(series='Rick and Morty', season=2)
for result in results:
     print(result)
Rick and Morty - 02x01 - A Rickle in Time
Rick and Morty - 02x02 - Mortynight Run
Rick and Morty - 02x03 - Auto Erotic Assimilation
Rick and Morty - 02x04 - Total Rickall
Rick and Morty - 02x05 - Get Schwifty
Rick and Morty - 02x06 - The Ricks Must Be Crazy
Rick and Morty - 02x07 - Big Trouble in Little Sanchez
Rick and Morty - 02x08 - Interdimensional Cable 2: Tempting Fate
Rick and Morty - 02x09 - Look Who's Purging Now
Rick and Morty - 02x10 - The Wedding Squanchers

Searching for a movie by title and year

Okay, so no we want to look up some movies. We can search for using a specific year, by an upper range using '-year', by a lower range using 'year-', or between a range of years using 'year-year'. Lets use the latter to get a listing of Star Trek movies from the 90s. As it turns out, there's a lot.

from mapi.providers import TMDb
client = TMDb()
results = client.search(title='Star Trek', year='1990-1999')
for i, result in enumerate(results, 1):
    print('%d) %s' % (i, result))
    if i > 9: break
1) Star Trek: Voyager (1995)
2) Star Trek: First Contact (1996)
3) Star Trek VI: The Undiscovered Country (1991)
4) Star Trek: Generations (1994)
5) Star Trek: Insurrection (1998)
6) Star Trek: The Experience - The Klingon Encounter (1998)
7) Journey's End: The Saga of Star Trek - The Next Generation (1994)
8) Star Trek: 30 Years and Beyond (1996)
9) Ultimate Trek: Star Trek's Greatest Moments (1999)
10) Star Trek: A Captain's Log (1994)

Searches return a generator, so by breaking on 10, we only ask for what we need, reducing the bandwidth and time required for the request.

Looking up a movie by ID

If you just want to lookup metadata using an API Provider's ID code, you can do that too:

from pprint import pprint
from mapi.providers import TMDb
client = TMDb()
results = client.search(id_tmdb=9340)  # Using TMDb ID
pprint(dict(next(results)))
{'date': '1985-06-06',
 'id_tmdb': '9340',
 'media': 'movie',
 'synopsis': 'A young teenager named Mikey Walsh finds an old treasure map in '
             "his father's attic. Hoping to save their homes from demolition, "
             'Mikey and his friends Data Wang, Chunk Cohen, and Mouth '
             'Devereaux run off on a big quest to find the secret stash of '
             'Pirate One-Eyed Willie.',
 'title': 'The Goonies'}

Some APIs, like TMDb, allow you to search by an IMDb 'tt-const' as well:

from pprint import pprint
from mapi.providers import TMDb
client = TMDb()
results = client.search(id_imdb='tt0089218')  # Using IMDb ID
pprint(dict(next(results)))
{'date': '1985-06-06',
 'id_tmdb': 9340,
 'media': 'movie',
 'synopsis': 'A young teenager named Mikey Walsh finds an old treasure map in '
             "his father's attic. Hoping to save their homes from demolition, "
             'Mikey and his friends Data Wang, Chunk Cohen, and Mouth '
             'Devereaux run off on a big quest to find the secret stash of '
             'Pirate One-Eyed Willie.',
 'title': 'The Goonies'}

Handling a search gone awry

Not all searches yield results; maybe you had a typo, maybe the data just isn't there, either way there is no need to fret, this can be handled gracefully using exception handling:

from mapi.exceptions import MapiNotFoundException
from mapi.providers import TMDb
client = TMDb()
try:
    print(next(client.search(id_imdb='invalid_id')))
except MapiNotFoundException:
    print('Nothing found :(')
None found :(

Usage Details

Provider Configuration

  • TVDb, TMDb, and OMDb require an API key to successfully be initialized.
  • These can be provided using environment variables; API_KEY_TMDB, API_KEY_TVDB, and API_KEY_OMDB respectively.
  • These can also be provided as api_key, a parameter to the provider classes.

Searching

The following table describes the permissible fields which may be used for a given search query. Extra fields are simply ignored.

Field API Type Description Notes
id_imdb TMDb, TVDb, OMDb str IMDb movie id key 1, 2
id_tmdb TMDb str / int TMDb movie id key 2, 3
id_tvdb TVDb series id key str / int TVDb season id key 2, 3
title TMDB, OMDb str Feature's title
year TMDB, OMDb str / int Feature's release year
date TVDB str YYYY-MM-DD formatted 4
series TVDB str Series' name
season TVDB str / int Series' airing season
episode TVDb str / int Series' airing episode 3

Results

Each provider is guaranteed to return the following fields for a successful search as strings. Notice that they are largely the fields as the search parameters-- in fact, you can even next search calls within each other if you so desire.

Field API Description
id_tmdb TMDb TMDb movie id key
id_imdb OMDb IMDb movie id key
id_tvdb TVDb TVDb season id key
date ALL Media's release date (YYYY-MM-DD)
synopsis ALL Media synopsis
media ALL Media type; either movie or television
series TVDb Series' name
season TVDb Series' airing season
episode TVDB Series' airing episode

Formatting

Mapi uses Python's standard string format conventions. You can call the builtin format() function on a mapi object and use any of the results keys. You can use format specifiers on numeric fields like episodes and seasons. For instance format(metadata, "{series} S{season:02}E{episode:02}") would pad season and episode numbers to two digits.

License

MIT. See license.txt for details.

Notes

  1. id_imdb must be prefixed with tt.
  2. Although ID, title, and series are each optional, movie queries must have either an ID or title to yield any results, and television queries must have either and ID or series to yield any results.
  3. If this field is passed as a string it must be numeric.
  4. Dates may also be specified partially, i.e. as YYYY-MM or YYYY.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mapi-3.9.0.tar.gz (25.9 kB view details)

Uploaded Source

Built Distribution

mapi-3.9.0-py2.py3-none-any.whl (28.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file mapi-3.9.0.tar.gz.

File metadata

  • Download URL: mapi-3.9.0.tar.gz
  • Upload date:
  • Size: 25.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.35.0 CPython/3.7.5rc1

File hashes

Hashes for mapi-3.9.0.tar.gz
Algorithm Hash digest
SHA256 1a8657c9789142b2f0e720762a58ada90f6f3f7a4773d19cce3604389497ddf6
MD5 8fbf31eb51d10f2ffdb122c4444057d6
BLAKE2b-256 922440066047f70b1b348ba1acf3e38052ca19de24fb1b260cb30582d766ead2

See more details on using hashes here.

File details

Details for the file mapi-3.9.0-py2.py3-none-any.whl.

File metadata

  • Download URL: mapi-3.9.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.35.0 CPython/3.7.5rc1

File hashes

Hashes for mapi-3.9.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 8f02e120b7c224f615115957f025eafa3ddc656900c506cf2dd7450dd14c06a2
MD5 53df35e7d3514cfd810be9e9610666ed
BLAKE2b-256 49e7e18a1c704b9368836da00da3058c5589d05331533b83d5f97ae847e18d43

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page