2
# -*- coding: UTF-8 -*-
3
# ----------------------
6
# Author: Raymond Wagner
7
# Purpose: This python script is intended to translate lookups between the
8
# TheMovieDB.org V3 API and MythTV's internal metadata format.
9
# http://www.mythtv.org/wiki/MythVideo_Grabber_Script_Format
10
# http://help.themoviedb.org/kb/api/about-3
11
#-----------------------
12
__title__ = "TheMovieDB.org"
13
__author__ = "Raymond Wagner"
15
# 0.1.0 Initial version
17
from tmdb_api import searchMovie, Movie, Collection, set_key
18
from MythTV import VideoMetadata
20
from optparse import OptionParser
21
from lxml import etree
24
def buildSingle(inetref, language):
25
movie = Movie(inetref)
26
tree = etree.XML(u'<metadata></metadata>')
27
mapping = [['runtime', 'runtime'], ['title', 'originaltitle'],
28
['releasedate', 'releasedate'], ['tagline', 'tagline'],
29
['description', 'overview'], ['homepage', 'homepage'],
30
['userrating', 'userrating'], ['popularity', 'popularity'],
31
['budget', 'budget'], ['revenue', 'revenue']]
34
setattr(m, i, getattr(movie, j))
35
m.inetref = str(movie.id)
36
m.year = movie.releasedate.year
38
m.collectionref = movie.collection.id
39
for country, release in movie.releases.items():
40
if release.certification:
41
m.certifications[country] = release.certification
42
for genre in movie.genres:
43
m.categories.append(genre.name)
44
for studio in movie.studios:
45
m.studios.append(studio.name)
46
for country in movie.countries:
47
m.countries.append(country.name)
48
for cast in movie.cast:
49
d = {'name':cast.name, 'character':cast.character, 'department':'Actors',
50
'job':'Actor', 'url':'http://www.themoviedb.org/people/{0}'.format(cast.id)}
51
if cast.profile is not None: d['thumb'] = cast.profile.geturl()
53
for crew in movie.crew:
54
d = {'name':crew.name, 'job':crew.job, 'department':crew.department,
55
'url':'http://www.themoviedb.org/people/{0}'.format(cast.id)}
56
if crew.profile is not None: d['thumb'] = crew.profile.geturl()
58
for backdrop in movie.backdrops:
59
m.images.append({'type':'fanart', 'url':backdrop.geturl(),
60
'thumb':backdrop.geturl(backdrop.sizes()[0])})
61
for poster in movie.posters:
62
m.images.append({'type':'coverart', 'url':poster.geturl(),
63
'thumb':poster.geturl(poster.sizes()[0])})
64
tree.append(m.toXML())
65
sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True))
68
def buildList(query, language):
69
results = searchMovie(query, language)
70
tree = etree.XML(u'<metadata></metadata>')
71
mapping = [['runtime', 'runtime'], ['title', 'originaltitle'],
72
['releasedate', 'releasedate'], ['tagline', 'tagline'],
73
['description', 'overview'], ['homepage', 'homepage'],
74
['userrating', 'userrating'], ['popularity', 'popularity']]
78
setattr(m, i, getattr(res, j))
79
m.inetref = str(res.id)
80
m.year = res.releasedate.year
81
m.images.append({'type':'fanart', 'url':res.backdrop.geturl()})
82
m.images.append({'type':'coverart', 'url':res.poster.geturl()})
83
tree.append(m.toXML())
84
sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True))
87
def buildCollection(inetref, language):
88
collection = Collection(inetref)
89
tree = etree.XML(u'<metadata></metadata>')
91
m.collectionref = str(collection.id)
92
m.title = collection.name
93
if collection.backdrop:
94
m.images.append({'type':'fanart', 'url':collection.backdrop.geturl(),
95
'thumb':collection.backdrop.geturl(collection.backdrop.sizes()[0])})
97
m.images.append({'type':'coverart', 'url':collection.poster.geturl(),
98
'thumb':collection.poster.geturl(collection.poster.sizes()[0])})
99
tree.append(m.toXML())
100
sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True))
104
version = etree.XML(u'<grabber></grabber>')
105
etree.SubElement(version, "name").text = __title__
106
etree.SubElement(version, "author").text = __author__
107
etree.SubElement(version, "thumbnail").text = 'tmdb.png'
108
etree.SubElement(version, "command").text = 'tmdb3.py'
109
etree.SubElement(version, "type").text = 'movie'
110
etree.SubElement(version, "description").text = \
111
'Search and metadata downloads for themoviedb.org'
112
etree.SubElement(version, "version").text = __version__
113
sys.stdout.write(etree.tostring(version, encoding='UTF-8', pretty_print=True))
117
set_key('c27cb71cff5bd76e1a7a009380562c62')
119
parser = OptionParser()
121
parser.add_option('-v', "--version", action="store_true", default=False,
122
dest="version", help="Display version and author")
123
parser.add_option('-M', "--movielist", action="store_true", default=False,
124
dest="movielist", help="Get Movies matching search.")
125
parser.add_option('-D', "--moviedata", action="store_true", default=False,
126
dest="moviedata", help="Get Movie data.")
127
parser.add_option('-C', "--collection", action="store_true", default=False,
128
dest="collectiondata", help="Get Collection data.")
129
parser.add_option( "-l", "--language", metavar="LANGUAGE", default=u'en',
130
dest="language", help="Specify language for filtering.")
132
opts, args = parser.parse_args()
137
if (len(args) != 1) or (args[0] == ''):
138
sys.stdout.write('ERROR: tmdb3.py requires exactly one non-empty argument')
142
buildList(args[0], opts.language)
145
buildSingle(args[0], opts.language)
147
if opts.collectiondata:
148
buildCollection(args[0], opts.language)
150
if __name__ == '__main__':