python库为媒体数据库提供者提供了一个高级接口,允许用户使用一个简单的接口搜索电视和电影元数据
mapi的Python项目详细描述
MAPI
m api(metadataapi)是一个python库,它为媒体数据库提供商提供了一个高级接口,允许用户使用一个简单的接口高效地搜索电视和电影元数据。
安装
$ pip install mapi
运行测试
$ pip install -r requirements-testing.txt
$ python -m pytest
注释:
- 首先运行
pip install -r requirements-dev.txt
以安装测试依赖项 - 测试需要互联网接入
- 测试要求将
API_KEY_TMDB
和TVDB_API_KEY
定义为环境变量
示例
使用TVDB按系列搜索电视节目
下面是一个相当直接的例子,假设我们只想从Rick和Morty第二季中获得一个剧集列表:
frommapi.providersimportTVDbclient=TVDb()# API Key taken from environment variablesresults=client.search(series='Rick and Morty',season=2)forresultinresults: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
按片名和年份搜索电影
好吧,不,我们想看看电影。我们可以通过使用'-year'的上限、使用'year-'的下限或使用'year-year'的年份范围来搜索使用特定年份。让我们用后者来列出90年代的星际迷航电影。事实证明,有很多。
frommapi.providersimportTMDbclient=TMDb()results=client.search(title='Star Trek',year='1990-1999')fori,resultinenumerate(results,1):print('%d) %s'%(i,result))ifi>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)
搜索返回一个生成器,因此通过中断10,我们只要求我们需要什么,减少了请求所需的带宽和时间。
按ID查找电影
如果您只想使用api提供程序的id代码查找元数据,也可以这样做:
frompprintimportpprintfrommapi.providersimportTMDbclient=TMDb()results=client.search(id_tmdb=9340)# Using TMDb IDpprint(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'}
有些api,比如tmdb,允许您通过imdb 'tt-const'进行搜索:
frompprintimportpprintfrommapi.providersimportTMDbclient=TMDb()results=client.search(id_imdb='tt0089218')# Using IMDb IDpprint(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'}
处理搜索出错
并非所有的搜索都会产生结果;可能是您输入了错误,可能是数据不存在,或者不需要担心,这可以使用异常处理来优雅地处理:
frommapi.exceptionsimportMapiNotFoundExceptionfrommapi.providersimportTMDbclient=TMDb()try:print(next(client.search(id_imdb='invalid_id')))exceptMapiNotFoundException:print('Nothing found :(')
None found :(
使用详细信息
提供商配置
- TVDB和TMDB需要一个API密钥才能成功初始化
- 这些可以使用环境变量提供;
API_KEY_TMDB
和API_KEY_TVDB
,分别是 - 它们也可以作为
api_key
提供,这是提供程序类的参数。
搜索
下表描述了可用于给定搜索查询的允许字段。额外字段将被忽略。
Field | API | Type | Description | Notes |
---|---|---|---|---|
id_imdb | TMDb, TVDb | 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 | str | Feature's title | |
year | TMDB | 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 |
结果
保证每个提供程序都将以下字段作为字符串返回,以便成功搜索。注意,它们基本上是作为搜索参数的字段——事实上,如果您愿意,甚至可以在彼此内部进行下一次搜索调用。
Field | API | Description |
---|---|---|
id_tmdb | TMDb | TMDb 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 ^{ |
series | TVDb | Series' name |
season | TVDb | Series' airing season |
episode | TVDB | Series' airing episode |
格式化
MAPI使用Python的标准字符串格式约定。您可以调用MAPI对象上的内置format()
函数并使用任何结果键。您可以在数字字段(如剧集和季节)上使用格式说明符。例如format(metadata, "{series} S{season:02}E{episode:02}")
将把季节和插曲的数字增加到两位数。
许可证
麻省理工学院。有关详细信息,请参见license.txt。
注释
- id_imdb必须以
tt
作为前缀。 - 尽管id、title和series都是可选的,但是电影查询必须有id或title才能产生任何结果,电视查询必须有and id或series才能产生任何结果。
- 如果此字段作为字符串传递,则它必须是数字。
- 日期也可以部分指定,例如
YYYY-MM
或YYYY
。