· 6 years ago · Mar 24, 2020, 10:52 AM
1import requests
2import xml.etree.ElementTree as ET
3import sys
4
5_genreids = {
6 "Action": 28, "Adventure": 12, "Animation": 16, "Comedy": 35, "Crime": 80, "Documentary": 99, "Drama": 18,
7 "Family": 10751, "Fantasy": 14, "History": 36, "Horror": 27, "Kids": 10762, "Music": 10402, "Mystery": 9648,
8 "News": 10763, "Reality": 10764, "Romance": 10749, "Science Fiction": 878, "Sci-Fi & Fantasy": 10765, "Soap": 10766,
9 "Talk": 10767, "TV Movie": 10770, "Thriller": 53, "War": 10752, "War & Politics": 10768, "Western": 37}
10
11
12class TMDb:
13 def __init__(self, api_key=None, language=None, cache_long=None, cache_short=None, append_to_response=None, mpaa_prefix=None, filter_key=None, filter_value=None, exclude_key=None, exclude_value=None):
14# cache_short=cache_short
15# cache_long=cache_long
16 req_api_name='TMDb'
17 self.req_api_url='https://api.themoviedb.org/3'
18# req_wait_time=0.25
19
20 req_api_key='?api_key=a07324c669cac4d96789197134ce272b'
21 api_key = api_key if api_key else 'a07324c669cac4d96789197134ce272b'
22
23 language = language if language else 'en-US'
24 self.iso_language = language[:2]
25 self.iso_country = language[-2:]
26 self.req_language = '{0}-{1}&include_image_language={0},null'.format(self.iso_language, self.iso_country)
27 self.req_api_key = '?api_key={0}'.format(api_key)
28 self.req_append = append_to_response if append_to_response else None
29 self.imagepath_original = 'https://image.tmdb.org/t/p/original'
30 self.imagepath_poster = 'https://image.tmdb.org/t/p/w500'
31 self.mpaa_prefix = '{0} '.format(mpaa_prefix) if mpaa_prefix else ''
32 self.filter_key = filter_key if filter_key else None
33 self.filter_value = filter_value if filter_value else None
34 self.exclude_key = exclude_key if exclude_key else None
35 self.exclude_value = exclude_value if exclude_value else None
36 self.library = 'video'
37
38# self.tmdb = None
39# self.tvdb = None
40# self.imdb = None
41 self.tvrage = None
42
43 def dictify(r, root=True):
44 if root:
45 return {r.tag: dictify(r, False)}
46 d = copy(r.attrib)
47 if r.text:
48 d["_text"] = r.text
49 for x in r.findall("./*"):
50 if x.tag not in d:
51 d[x.tag] = []
52 d[x.tag].append(dictify(x, False))
53 return d
54
55 def translate_xml(self, request):
56 if request:
57 request = ET.fromstring(request.content)
58 request = self.dictify(request)
59 return request
60
61 def get_externalid_item(self, itemtype, external_id, external_source):
62 """
63 Lookup an item using an external id such as IMDb or TVDb
64 """
65 if not itemtype or not external_id or not external_source:
66 return {}
67 cache_name = '{0}.find.{1}.{2}'.format(self.cache_name, external_source, external_id)
68 itemdict = self.get_cache(cache_name)
69 if not itemdict:
70 request = self.get_request('find', external_id, language=self.req_language, append_to_response=self.req_append, external_source=external_source)
71 request = request.get('{0}_results'.format(itemtype), [])
72 itemdict = self.set_cache(self.get_niceitem(request[0]), cache_name, self.cache_long) if request else {}
73 if itemdict.get('tmdb_id'):
74 itemdict = self.get_detailed_item(itemtype, itemdict.get('tmdb_id'), cache_only=True) or itemdict
75 return itemdict
76
77 def get_item_externalid(self, itemtype, tmdb_id, external_id=None):
78 """
79 Lookup external ids for an item using tmdb_id
80 """
81 if not itemtype or not tmdb_id:
82 return {}
83 request = self.get_request(itemtype, tmdb_id, 'external_ids') or {}
84 print request
85 self.tmdb = request.get('id')
86 self.tvdb = request.get('tvdb_id')
87 self.imdb = request.get('imdb_id')
88 self.tvrage = request.get('tvrage_id')
89 return request.get(external_id) if external_id else request
90
91 def get_tmdb_id(self, itemtype=None, imdb_id=None, tvdb_id=None, query=None, year=None, selectdialog=False, usedetails=True, longcache=False, returntuple=False):
92 func = self.get_request
93 if not itemtype:
94 return
95 request = None
96 if itemtype == 'genre' and query:
97 return _genreids.get(query, '')
98 elif imdb_id:
99 request = func('find', imdb_id, language=self.req_language, external_source='imdb_id')
100 request = request.get('{0}_results'.format(itemtype), [])
101 elif tvdb_id:
102 request = func('find', tvdb_id, language=self.req_language, external_source='tvdb_id')
103 request = request.get('{0}_results'.format(itemtype), [])
104 elif query:
105 query = query.split(' (', 1)[0] # Scrub added (Year) or other cruft in parentheses () added by Addons or TVDb
106 if itemtype == 'tv':
107 request = func('search', itemtype, language=self.req_language, query=query, first_air_date_year=year)
108 else:
109 request = func('search', itemtype, language=self.req_language, query=query, year=year)
110 request = request.get('results', [])
111 if not request:
112 return
113 itemindex = 0
114# if selectdialog:
115# item = utils.dialog_select_item(items=request, details=self, usedetails=usedetails)
116# if returntuple:
117# return (self.get_title(item), item.get('id')) if item else None
118# return item.get('id') if item else None
119 self.original_name = request[itemindex].get('original_name')
120 return request[itemindex].get('id')
121
122 def get_request(self, *args, **kwargs):
123 """ Get API request from cache (or online if no cached version) """
124 cache_days = 0
125 cache_name = ''
126 cache_only = False
127 cache_refresh = True
128 is_json = kwargs.pop('is_json', True)
129 request_url = self.get_request_url(*args, **kwargs)
130 return self.get_api_request(request_url, is_json=is_json)
131
132 def get_request_url(self, *args, **kwargs):
133 """
134 Creates a url request string:
135 https://api.themoviedb.org/3/arg1/arg2?api_key=foo&kwparamkey=kwparamvalue
136 """
137 request = self.req_api_url
138 for arg in args:
139 if arg: # Don't add empty args
140 request = u'{0}/{1}'.format(request, arg)
141 request = u'{0}{1}'.format(request, self.req_api_key)
142 for key, value in kwargs.items():
143 if value: # Don't add empty kwargs
144 sep = '?' if '?' not in request else ''
145 request = u'{0}{1}&{2}={3}'.format(request, sep, key, value)
146 return request
147
148 def get_api_request(self, request=None, is_json=True, postdata=None, headers=None, dictify=True):
149 """
150 Make the request to the API by passing a url request string
151 """
152 try:
153 response = requests.post(request, data=postdata, headers=headers) if postdata else requests.get(request, headers=headers) # Request our data
154 except Exception as err:
155 return {} if dictify else None
156 if not response.status_code == requests.codes.ok: # Error Checking
157 return {} if dictify else None
158 if dictify and is_json:
159 response = response.json() # Make the response nice
160 elif dictify:
161 response = self.translate_xml(response)
162 return response
163
164 def originalname(self):
165 return self.original_name
166
167 def tmdb_id(self):
168 return self.tmdb
169
170 def tvdb_id(self):
171 return self.tvdb
172
173 def imdb_id(self):
174 return self.imdb
175
176 def tvrage_id(self):
177 return self.tvrage
178
179 def externalid_get(self, itemtype=None, tmdb_id=None, external_id=None):
180 tmdb = TMDb()
181 api_response = TMDb.get_item_externalid(tmdb, itemtype=itemtype, tmdb_id=tmdb_id, external_id=external_id)
182# print str(external_id) +' = '+ str(api_response)
183 self.tvrage = tmdb.tvrage
184 self.tmdb = tmdb.tmdb
185 self.tvdb = tmdb.tvdb
186 self.imdb = tmdb.imdb
187
188 return api_response
189
190 def tmdb_id_get(self, itemtype=None, tvdb_id=None, query=None, year=None):
191 tmdb = TMDb()
192 api_response = TMDb.get_tmdb_id(tmdb, itemtype=itemtype, tvdb_id=tvdb_id, query=query)
193# print str('tmdb_id') +' = '+ str(api_response)
194 self.original_name = tmdb.original_name
195 return api_response
196
197if __name__ == '__main__':
198 objName = TMDb()
199 query=None
200 tmdb=None
201 tvdb=None
202
203 for i in sys.argv[1:]:
204 if 'query' in i:
205 query = i.replace('query=','')
206 if 'tmdb' in i:
207 tmdb = i.replace('tmdb=','')
208 if 'tvdb' in i:
209 tvdb = i.replace('tvdb=','')
210 if tmdb <> None:
211 tvdb_id = objName.externalid_get('tv', tmdb, 'tvdb_id')
212 print 'tvdb_id = ' + str(tvdb_id)
213 objName.tmdb_id_get('tv', tvdb_id=tvdb_id)
214 print objName.originalname()
215 print objName.tmdb_id()
216 print objName.tvdb_id()
217 print objName.imdb_id()
218 print objName.tvrage_id()
219 if tvdb <> None:
220# print 'tmdb_id = ' + str(objName.tmdb_id_get('tv', tvdb_id=tvdb))
221
222 tmdb_query = objName.tmdb_id_get('tv', tvdb_id=tvdb)
223 print objName.originalname()
224
225 print 'tvdb_id = ' + str(objName.externalid_get('tv', tmdb_query, 'tvdb_id'))
226 print objName.tmdb_id()
227 print objName.tvdb_id()
228 print objName.imdb_id()
229 print objName.tvrage_id()
230
231 if query <> None:
232# print 'tmdb_id = ' + str(objName.tmdb_id_get('tv', query=query))
233 tmdb_query = objName.tmdb_id_get('tv', query=query)
234 print objName.originalname()
235
236 print 'tvdb_id = ' + str(objName.externalid_get('tv', tmdb_query, 'tvdb_id'))
237 print objName.tmdb_id()
238 print objName.tvdb_id()
239 print objName.imdb_id()
240 print objName.tvrage_id()