00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 __title__ = "TheMovieDB.org V3"
00013 __author__ = "Raymond Wagner"
00014 __version__ = "0.3.4"
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 from optparse import OptionParser
00025 import sys
00026
00027 def buildSingle(inetref, opts):
00028 from MythTV.tmdb3 import Movie
00029 from MythTV import VideoMetadata
00030 from lxml import etree
00031
00032 import re
00033 if re.match('^0[0-9]{6}$', inetref):
00034 movie = Movie.fromIMDB(inetref)
00035 else:
00036 movie = Movie(inetref)
00037
00038 tree = etree.XML(u'<metadata></metadata>')
00039 mapping = [['runtime', 'runtime'], ['title', 'originaltitle'],
00040 ['releasedate', 'releasedate'], ['tagline', 'tagline'],
00041 ['description', 'overview'], ['homepage', 'homepage'],
00042 ['userrating', 'userrating'], ['popularity', 'popularity'],
00043 ['budget', 'budget'], ['revenue', 'revenue']]
00044 m = VideoMetadata()
00045 for i,j in mapping:
00046 if getattr(movie, j):
00047 setattr(m, i, getattr(movie, j))
00048
00049 if movie.title:
00050 m.title = movie.title
00051
00052 releases = movie.releases.items()
00053
00054 if opts.country:
00055 try:
00056
00057
00058 index = zip(*releases)[0].index(opts.country)
00059 releases.insert(0, releases.pop(index))
00060 except ValueError:
00061 pass
00062 else:
00063 m.releasedate = releases[0][1].releasedate
00064
00065 m.inetref = str(movie.id)
00066 if movie.collection:
00067 m.collectionref = str(movie.collection.id)
00068 if movie.releasedate:
00069 m.year = movie.releasedate.year
00070 for country, release in releases:
00071 if release.certification:
00072 m.certifications[country] = release.certification
00073 for genre in movie.genres:
00074 m.categories.append(genre.name)
00075 for studio in movie.studios:
00076 m.studios.append(studio.name)
00077 for country in movie.countries:
00078 m.countries.append(country.name)
00079 for cast in movie.cast:
00080 d = {'name':cast.name, 'character':cast.character, 'department':'Actors',
00081 'job':'Actor', 'url':'http://www.themoviedb.org/people/{0}'.format(cast.id)}
00082 if cast.profile: d['thumb'] = cast.profile.geturl()
00083 m.people.append(d)
00084 for crew in movie.crew:
00085 d = {'name':crew.name, 'job':crew.job, 'department':crew.department,
00086 'url':'http://www.themoviedb.org/people/{0}'.format(crew.id)}
00087 if crew.profile: d['thumb'] = crew.profile.geturl()
00088 m.people.append(d)
00089 for backdrop in movie.backdrops:
00090 m.images.append({'type':'fanart', 'url':backdrop.geturl(),
00091 'thumb':backdrop.geturl(backdrop.sizes()[0])})
00092 for poster in movie.posters:
00093 m.images.append({'type':'coverart', 'url':poster.geturl(),
00094 'thumb':poster.geturl(poster.sizes()[0])})
00095 tree.append(m.toXML())
00096 sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True,
00097 xml_declaration=True))
00098 sys.exit()
00099
00100 def buildList(query, opts):
00101
00102
00103
00104 query = query.replace('-',' ')
00105
00106 from MythTV.tmdb3 import searchMovie
00107 from MythTV import VideoMetadata
00108 from lxml import etree
00109 results = searchMovie(query)
00110 tree = etree.XML(u'<metadata></metadata>')
00111 mapping = [['runtime', 'runtime'], ['title', 'originaltitle'],
00112 ['releasedate', 'releasedate'], ['tagline', 'tagline'],
00113 ['description', 'overview'], ['homepage', 'homepage'],
00114 ['userrating', 'userrating'], ['popularity', 'popularity']]
00115
00116 count = 0
00117 for res in results:
00118 m = VideoMetadata()
00119 for i,j in mapping:
00120 if getattr(res, j):
00121 setattr(m, i, getattr(res, j))
00122 m.inetref = str(res.id)
00123
00124 if res.title:
00125 m.title = res.title
00126
00127
00128
00129
00130
00131 if res.releasedate:
00132 m.year = res.releasedate.year
00133 if res.backdrop:
00134 b = res.backdrop
00135 m.images.append({'type':'fanart', 'url':b.geturl(),
00136 'thumb':b.geturl(b.sizes()[0])})
00137 if res.poster:
00138 p = res.poster
00139 m.images.append({'type':'coverart', 'url':p.geturl(),
00140 'thumb':p.geturl(p.sizes()[0])})
00141 tree.append(m.toXML())
00142 count += 1
00143 if count >= 60:
00144
00145 break
00146
00147 sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True,
00148 xml_declaration=True))
00149 sys.exit(0)
00150
00151 def buildCollection(inetref, opts):
00152 from MythTV.tmdb3 import Collection
00153 from MythTV import VideoMetadata
00154 from lxml import etree
00155 collection = Collection(inetref)
00156 tree = etree.XML(u'<metadata></metadata>')
00157 m = VideoMetadata()
00158 m.collectionref = str(collection.id)
00159 m.title = collection.name
00160 if collection.backdrop:
00161 b = collection.backdrop
00162 m.images.append({'type':'fanart', 'url':b.geturl(),
00163 'thumb':b.geturl(b.sizes()[0])})
00164 if collection.poster:
00165 p = collection.poster
00166 m.images.append({'type':'coverart', 'url':p.geturl(),
00167 'thumb':p.geturl(p.sizes()[0])})
00168 tree.append(m.toXML())
00169 sys.stdout.write(etree.tostring(tree, encoding='UTF-8', pretty_print=True,
00170 xml_declaration=True))
00171 sys.exit()
00172
00173 def buildVersion():
00174 from lxml import etree
00175 version = etree.XML(u'<grabber></grabber>')
00176 etree.SubElement(version, "name").text = __title__
00177 etree.SubElement(version, "author").text = __author__
00178 etree.SubElement(version, "thumbnail").text = 'tmdb.png'
00179 etree.SubElement(version, "command").text = 'tmdb3.py'
00180 etree.SubElement(version, "type").text = 'movie'
00181 etree.SubElement(version, "description").text = \
00182 'Search and metadata downloads for themoviedb.org'
00183 etree.SubElement(version, "version").text = __version__
00184 sys.stdout.write(etree.tostring(version, encoding='UTF-8', pretty_print=True,
00185 xml_declaration=True))
00186 sys.exit(0)
00187
00188 def performSelfTest():
00189 err = 0
00190 try:
00191 import MythTV
00192 except:
00193 err = 1
00194 print ("Failed to import MythTV bindings. Check your `configure` output "
00195 "to make sure installation was not disabled due to external "
00196 "dependencies")
00197 try:
00198 import MythTV.tmdb3
00199 except:
00200 err = 1
00201 print ("Failed to import PyTMDB3 library. This should have been included "
00202 "with the python MythTV bindings.")
00203 try:
00204 import lxml
00205 except:
00206 err = 1
00207 print "Failed to import python lxml library."
00208
00209 if not err:
00210 print "Everything appears in order."
00211 sys.exit(err)
00212
00213 def main():
00214 parser = OptionParser()
00215
00216 parser.add_option('-v', "--version", action="store_true", default=False,
00217 dest="version", help="Display version and author")
00218 parser.add_option('-t', "--test", action="store_true", default=False,
00219 dest="test", help="Perform self-test for dependencies.")
00220 parser.add_option('-M', "--movielist", action="store_true", default=False,
00221 dest="movielist", help="Get Movies matching search.")
00222 parser.add_option('-D', "--moviedata", action="store_true", default=False,
00223 dest="moviedata", help="Get Movie data.")
00224 parser.add_option('-C', "--collection", action="store_true", default=False,
00225 dest="collectiondata", help="Get Collection data.")
00226 parser.add_option('-l', "--language", metavar="LANGUAGE", default=u'en',
00227 dest="language", help="Specify language for filtering.")
00228 parser.add_option('-a', "--area", metavar="COUNTRY", default=None,
00229 dest="country", help="Specify country for custom data.")
00230
00231 opts, args = parser.parse_args()
00232
00233 if opts.version:
00234 buildVersion()
00235
00236 if opts.test:
00237 performSelfTest()
00238
00239 from MythTV.tmdb3 import set_key, set_cache, set_locale
00240 set_key('c27cb71cff5bd76e1a7a009380562c62')
00241 set_cache(engine='file', filename='~/.mythtv/pytmdb3.cache')
00242
00243 if opts.language:
00244 set_locale(language=opts.language, fallthrough=True)
00245 if opts.country:
00246 set_locale(country=opts.country, fallthrough=True)
00247
00248 if (len(args) != 1) or (args[0] == ''):
00249 sys.stdout.write('ERROR: tmdb3.py requires exactly one non-empty argument')
00250 sys.exit(1)
00251
00252 if opts.movielist:
00253 buildList(args[0], opts)
00254
00255 if opts.moviedata:
00256 buildSingle(args[0], opts)
00257
00258 if opts.collectiondata:
00259 buildCollection(args[0], opts)
00260
00261 if __name__ == '__main__':
00262 main()