/[projects]/misc/xbmc/plugin.video.todic/default.py
ViewVC logotype

Annotation of /misc/xbmc/plugin.video.todic/default.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3260 - (hide annotations) (download) (as text)
Tue Mar 12 20:23:54 2019 UTC (5 years, 2 months ago) by torben
File MIME type: text/x-python
File size: 14594 byte(s)
1.8.2 - fix poster / revert kodi.18+estuary attempts
1 torben 1678
2 torben 1677 # This Python file uses the following encoding: utf-8
3    
4 torben 1629 '''
5     Todic plugin for XBMC
6 torben 3260 Version 1.8.2
7 torben 1629 '''
8    
9     import sys
10 torben 1648 import os
11 torben 1629
12 torben 1648
13 torben 1629 import xbmc
14     import xbmcaddon
15     import xbmcgui
16     import xbmcplugin
17     import urllib
18 torben 1678 import urllib2
19 torben 1629
20 torben 2601 # import pprint
21 torben 2595
22 torben 1678 from xml.dom.minidom import parseString
23 torben 3142 from time import time
24 torben 1678
25 torben 1629 __addon__ = xbmcaddon.Addon(id='plugin.video.todic')
26     __key__ = __addon__.getSetting('xbmckey').lower()
27 torben 3208 __entrypoint__ = __addon__.getSetting('entrypoint').lower()
28 torben 3037 __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__
29 torben 3208
30 torben 3256
31 torben 3208 if __entrypoint__ == "alternative":
32 torben 3245 __backend__ = "https://alt.todic.dk/xbmc.php?xbmckey=" + __key__
33 torben 3208
34     if __entrypoint__ == "testing":
35 torben 3245 __backend__ = "https://todic.dk/xbmc-beta.php?xbmckey=" + __key__
36    
37 torben 3246 print( "[Todic] entrypoint: " + __entrypoint__ )
38     print( "[Todic] backend: " + __backend__ )
39 torben 3259 print( "[Todic] version: " + __addon__.getAddonInfo('version') )
40 torben 3208
41 torben 2594 fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'movie_bg_blur.jpg')
42 torben 2601 datapath = xbmc.translatePath(
43     'special://profile/addon_data/plugin.video.todic/')
44 torben 1629
45 torben 2592 ADDON_PATH = __addon__.getAddonInfo('path')
46 torben 2601 SkinMasterPath = os.path.join(ADDON_PATH, 'skins') + '/'
47 torben 2592 MySkinPath = (os.path.join(SkinMasterPath, '720p')) + '/'
48     MySkin = 'main.xml'
49 torben 1676
50 torben 2592
51     class TodicMovieDialog(xbmcgui.WindowXMLDialog):
52    
53 torben 2601 def __new__(cls):
54     return super(TodicMovieDialog, cls).__new__(cls, "main.xml", ADDON_PATH)
55 torben 2592
56 torben 2601 def __init__(self):
57     super(TodicMovieDialog, self).__init__()
58 torben 3147 self.position = 0
59 torben 2592
60 torben 2601 def onClick(self, controlId):
61 torben 3246 print( "[Todic] MovieDialog OnClick: " + str(controlId) )
62 torben 2592
63 torben 2601 if (controlId == 50):
64     self.close()
65 torben 3147 play_real_video(self.url, self.name, 0)
66 torben 2592
67 torben 3147 if (controlId == 51):
68     self.close()
69     play_real_video(self.url, self.name, self.position)
70    
71 torben 2601 if (controlId == 98):
72     self.close()
73 torben 2592
74 torben 2601 def onInit(self):
75 torben 2592
76 torben 3246 print( "[Todic] MovieDialog onInit" )
77 torben 2601 self.getControl(1).setLabel(self.name)
78     self.getControl(2).setLabel(self.moviegroups)
79     self.getControl(3).setLabel(self.description)
80     self.getControl(10).setLabel(self.playlength)
81     self.getControl(11).setLabel(self.codecdetails)
82 torben 2596
83 torben 3147 if (self.position > 0):
84     self.getControl(51).setVisible(True)
85     self.getControl(50).setPosition(100, 570)
86     self.getControl(51).setPosition(450, 570)
87     self.getControl(50).controlLeft( self.getControl(51) )
88     self.getControl(50).controlRight( self.getControl(51) )
89     else:
90     self.getControl(51).setVisible(False)
91 torben 2596
92 torben 3147 #orig_img_width = self.getControl(40).getWidth()
93     #self.starwidth = (float(self.imdbrating) / 10.0) * orig_img_width
94     #self.getControl(40).setWidth(int(self.starwidth))
95    
96 torben 3152 def setDetailsDoc(self, detailsDoc):
97 torben 3246 print( "[Todic] MovieDialog setDetailsDoc:")
98 torben 3152 self.imdbrating = getText(detailsDoc.getElementsByTagName("imdbrating"))
99     self.moviegroups = getText(detailsDoc.getElementsByTagName("moviegroups"))
100     self.playlength = getText(detailsDoc.getElementsByTagName("playlength"))
101     self.codecdetails = getText(detailsDoc.getElementsByTagName("codecdetails"))
102     self.position = int( getText(detailsDoc.getElementsByTagName("position")) )
103 torben 2592
104 torben 3153 def setUrl(self, url):
105     self.url = url
106 torben 3147
107 torben 2601 def setName(self, name):
108     self.name = name
109 torben 2595
110 torben 2601 def setDescription(self, description):
111     self.description = description
112 torben 2595
113 torben 2596
114 torben 2601 class TodicPlayer(xbmc.Player):
115 torben 2596
116 torben 2601 def __init__(self, *args, **kwargs):
117     # xbmc.Player.__init__(selv,*args,**kwargs)
118 torben 3163 xbmc.Player.__init__(self)
119 torben 2601 self.stopped = False
120     self.started = False
121 torben 3142 self.playingPosition = 0.0
122     self.lastReport = 0
123 torben 3246 print( "[TodicPlayer] init")
124 torben 2592
125 torben 2601 def onPlayBackStarted(self):
126     self.started = True
127 torben 3246 print( "[TodicPlayer] : started")
128 torben 2592
129 torben 3142 #When user presses stop, we report back the the position registered in the last call to self.tick()
130 torben 2601 def onPlayBackStopped(self):
131     self.stopped = True
132 torben 3246 print( "[TodicPlayer] : stopped")
133 torben 3149 self.reportPlaytime("stopped")
134 torben 2592
135 torben 3157 def onPlayBackPaused(self):
136 torben 3246 print( "[TodicPlayer] : paused")
137 torben 3157 self.reportPlaytime("paused")
138 torben 3142
139 torben 3157 def onPlayBackResumed(self):
140 torben 3246 print( "[TodicPlayer] : resumed")
141 torben 3157 self.reportPlaytime("resumed")
142 torben 3152
143 torben 3157
144 torben 2601 def onPlayBackEnded(self):
145     self.stopped = True
146 torben 3246 print( "[TodicPlayer] : ended")
147 torben 3149 self.reportPlaytime("ended")
148 torben 1676
149 torben 3142 def tick(self):
150 torben 3157 #print "[Todic] Tick: " + str( self.isPlaying() )
151 torben 3144 if ( self.isPlaying() ):
152 torben 3245 tmpTime = self.getTime()
153 torben 3147
154 torben 3244 #only report time if it has changed in the mean time
155     if tmpTime != self.playingPosition:
156     self.playingPosition = tmpTime
157     now = time()
158     #print "[Todic] tick " + str(now) + " " + str(self.lastReport) + " : " +str(now - self.lastReport)
159     if ( (now - self.lastReport) > 60.0):
160     self.lastReport = now
161     self.reportPlaytime("playing")
162    
163 torben 3149 def reportPlaytime(self, subaction):
164 torben 3151 if (self.playingPosition > 60):
165     url = __backend__ + "&action=playbacktime&subaction=" + subaction + "&time=" + str( self.playingPosition )
166 torben 3246 print( "[Todic] reportPlaytime:" + url)
167 torben 3151 open_url_safe(url)
168    
169 torben 3142
170    
171 torben 2601 def getText2(nodelist):
172     rc = []
173     for node in nodelist:
174     if node.nodeType == node.TEXT_NODE:
175     rc.append(node.data)
176     else:
177     rc.append(getText(node.childNodes))
178     return ''.join(rc)
179 torben 1676
180    
181 torben 1678 def getText(nodelist):
182 torben 2601 if nodelist.length == 0:
183     return ''
184     else:
185     if nodelist[0].childNodes.length == 0:
186     return ''
187     else:
188     return nodelist[0].childNodes[0].nodeValue
189 torben 1676
190 torben 2601
191 torben 3143
192 torben 1914 def SaveFile(path, data):
193 torben 2601 file = open(path, 'w')
194     file.write(data)
195     file.close()
196 torben 1678
197 torben 1914
198 torben 3143
199 torben 1629 def open_url(url):
200 torben 2601 req = urllib2.Request(url)
201     content = urllib2.urlopen(req)
202     data = content.read()
203     content.close()
204     return data
205 torben 1629
206 torben 2601
207 torben 3143 # wraps open url in a catch-all exception handler
208     # usefull for periodic back-reporting that should not interrupt the program flow
209     def open_url_safe(url):
210     try:
211     return open_url(url)
212     except:
213 torben 3246 print( "[Todic] Some error during open_url call to ", url)
214 torben 3143
215    
216    
217 torben 1629 def rootMenu():
218 torben 3256 kodi_ver = xbmc.getInfoLabel('System.BuildVersion')
219     plugin_ver = __addon__.getAddonInfo('version')
220     msgurl = __backend__ + "&action=messages&kodi=" + urllib.quote_plus(kodi_ver) + "&todicplugin=" + urllib.quote_plus(plugin_ver)
221 torben 1648
222 torben 3256 msg = open_url(msgurl)
223 torben 2601 msg = msg.strip()
224 torben 1799
225 torben 2601 if msg != "":
226     dialog = xbmcgui.Dialog()
227     dialog.ok('XBMC Todic', msg)
228 torben 1799
229 torben 2601 buildList(__backend__, "", False) # call default list
230 torben 1631
231 torben 2601 # Adde xtra items to root menu
232     listitem = xbmcgui.ListItem(
233 torben 3155 label="Søg Film ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
234 torben 2601 listitem.setProperty('Fanart_Image', fanartImage)
235 torben 1648
236 torben 2601 u = sys.argv[0] + "?mode=10&name="
237 torben 2602 xbmcplugin.addDirectoryItem(
238 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
239 torben 1631
240 torben 2601 # add search series
241     listitem = xbmcgui.ListItem(
242     label="Søg Serier ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
243     listitem.setProperty('Fanart_Image', fanartImage)
244 torben 2097
245 torben 2601 u = sys.argv[0] + "?mode=11&name="
246 torben 2602 xbmcplugin.addDirectoryItem(
247 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
248 torben 2097
249 torben 2601 xbmcplugin.endOfDirectory(int(sys.argv[1]))
250 torben 1629
251    
252 torben 2601 def buildList(url, title, endlist=True):
253 torben 3246 print( '[Todic]:' + str(url) )
254 torben 1678
255 torben 2601 link = open_url(url)
256     doc = parseString(link)
257     ty = doc.getElementsByTagName("meta")[0].getAttribute("type")
258 torben 3246 print( '[Todic]' + str(ty))
259 torben 1646
260 torben 2601 if ty == 'clipList':
261     mode = '50'
262     folder = False
263     else:
264     mode = '1'
265     folder = True
266 torben 1646
267 torben 2601 entries = doc.getElementsByTagName("entry")
268     l = len(entries)
269 torben 3159
270 torben 2601 for entry in entries:
271     name = getText(entry.getElementsByTagName("title"))
272     url = getText(entry.getElementsByTagName("url"))
273     thumb = getText(entry.getElementsByTagName("cover"))
274     playcount = getText(entry.getElementsByTagName("playcount"))
275 torben 1829
276 torben 3148
277 torben 2601 if playcount == '':
278     playcount = '0'
279     playcount = int(playcount)
280 torben 1647
281 torben 2601 # print "name:" + name
282 torben 1678 # print "url:" + url
283     # print "thumb:" + thumb
284 torben 2601 listitem = xbmcgui.ListItem(
285 torben 3255 label=name, label2='test', iconImage='DefaultFolder.png')
286 torben 2601 listitem.setProperty('Fanart_Image', fanartImage)
287 torben 3249 listitem.addContextMenuItems([('Refresh', 'Container.Refresh')])
288 torben 3260 listitem.setArt( {'thumb': thumb} )
289 torben 3249
290 torben 2601 if mode == '50':
291     infoLabels = {}
292     infoLabels['title'] = name
293     infoLabels['playcount'] = playcount
294 torben 3260 # if playcount > 0:
295     # listitem.setArt( {'thumb': thumb} ) #not pretty - but at least we can show a different icon for unwatched/watched in kodi18
296 torben 2601 listitem.setInfo('video', infoLabels)
297 torben 1678
298 torben 2601 name = name.encode('UTF-8')
299 torben 1678
300 torben 2601 u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(
301 torben 3159 name) + "&url=" + urllib.quote(url)
302 torben 2602 xbmcplugin.addDirectoryItem(
303 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
304 torben 1648
305 torben 2601 if (endlist == True):
306     xbmcplugin.endOfDirectory(int(sys.argv[1]))
307 torben 1923
308    
309 torben 3159 def play_video(url, name):
310     description = ""
311 torben 3158 playPosition = 0
312     savedPosition = 0
313     try:
314     param1 = parse_parameter_string(url)
315     clipkey = param1["clipkey"]
316 torben 3152
317 torben 3246 print( "[Todic] ClipKey:" + clipkey)
318 torben 3158 detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey
319 torben 3246 print( "[Todic] detailURL = " + detailurl)
320 torben 3152
321 torben 3158 xml = open_url(detailurl)
322 torben 3152
323 torben 3158 clipDetailsDoc = parseString(xml)
324     savedPosition = int( getText(clipDetailsDoc.getElementsByTagName("position")) )
325 torben 3159 description = getText(clipDetailsDoc.getElementsByTagName("description"))
326 torben 3158 except:
327 torben 3246 print( "[Todic] Unexpected error:", sys.exc_info()[0] )
328 torben 3152
329 torben 2601 if (description == None or description == ""):
330 torben 3152 if (savedPosition > 0):
331     dialog = xbmcgui.Dialog()
332     #yes / true -afspil fra position
333 torben 3155 answer = dialog.yesno(heading='Todic', line1='Afspil fra sidste position', nolabel='Fra start', yeslabel='Fortsæt')
334 torben 3152 if (answer == True):
335     playPosition = savedPosition
336    
337     play_real_video(url, name, playPosition)
338    
339 torben 2601 else:
340     d = TodicMovieDialog()
341 torben 3152 d.setDetailsDoc(clipDetailsDoc)
342 torben 2601 d.setName(name)
343 torben 3153 d.setUrl(url)
344 torben 2601 d.setDescription(description)
345 torben 1629
346 torben 2601 d.doModal()
347 torben 1629
348    
349 torben 3147 def play_real_video(url, name, position):
350 torben 2601 xml = open_url(url)
351 torben 3246 print( '[Todic] url: ' + str(url) )
352     print( '[Todic] xml: ' + xml )
353     print( '[Todic] pos: ' + str(position) )
354 torben 1678
355 torben 2601 doc = parseString(xml)
356     url = getText(doc.getElementsByTagName("url"))
357 torben 1678
358 torben 2601 subtitleurl = getText(doc.getElementsByTagName("subtitles"))
359 torben 1914
360 torben 1917
361 torben 3246 print( '[Todic] subs: ' + str(subtitleurl) )
362 torben 1914
363 torben 2601 image = xbmc.getInfoImage('ListItem.Thumb')
364     listitem = xbmcgui.ListItem(
365     label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
366     listitem.setInfo(type="Video", infoLabels={"Title": name})
367 torben 1914
368 torben 3251 listitem.setProperty('StartOffset', str(position) )
369    
370 torben 3250 if len(subtitleurl) > 0:
371     listitem.setSubtitles([subtitleurl])
372    
373 torben 3165 player = TodicPlayer()
374 torben 2601 player.play(str(url), listitem)
375 torben 1914
376 torben 1629
377 torben 3147 #Holder python kørernde indtil at det bliver bedt om at stoppe
378     while (not xbmc.abortRequested):
379     player.tick()
380     xbmc.sleep(500)
381 torben 1676
382 torben 3147
383    
384 torben 1631 def search():
385 torben 2601 search = getUserInput("Todic Søgning")
386 torben 1629
387 torben 2601 if (search != None and search != ""):
388     url = __backend__ + "&action=search&search=" + \
389     urllib.quote_plus(search)
390 torben 1631
391 torben 3157 # print "[Todic] Search start: " + search
392     # print "[Todic] Search url: " + url
393 torben 1631
394 torben 2601 buildList(url, "søgning")
395 torben 1631
396 torben 2601
397 torben 2097 def searchSeries():
398 torben 2601 search = getUserInput("Todic Serie Søgning")
399 torben 2097
400 torben 2601 if (search != None and search != ""):
401     url = __backend__ + "&action=searchseries&search=" + \
402     urllib.quote_plus(search)
403 torben 2097
404 torben 3157 # print "[Todic] Search start: " + search
405     # print "[Todic] Search url: " + url
406 torben 2097
407 torben 2601 buildList(url, "serie søgning")
408 torben 2097
409 torben 1631
410 torben 2601 #=================================== Tool Box =======================================
411 torben 1631 # shows a more userfriendly notification
412     def showMessage(heading, message):
413 torben 2601 duration = 15 * 1000
414     xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
415     (heading, message, duration))
416 torben 1631
417    
418     # raise a keyboard for user input
419 torben 2601 def getUserInput(title="Input", default="", hidden=False):
420     result = None
421 torben 1631
422 torben 2601 # Fix for when this functions is called with default=None
423     if not default:
424     default = ""
425 torben 1631
426 torben 2601 keyboard = xbmc.Keyboard(default, title)
427     keyboard.setHiddenInput(hidden)
428     keyboard.doModal()
429 torben 1631
430 torben 2601 if keyboard.isConfirmed():
431     result = keyboard.getText()
432    
433     return result
434    
435    
436 torben 1629 def get_params():
437 torben 2601 return parse_parameter_string(sys.argv[2])
438 torben 2595
439 torben 1629
440 torben 2601 def parse_parameter_string(paramstring):
441     param = []
442     if len(paramstring) >= 2:
443     params = paramstring
444     cleanedparams = params.replace('?', '')
445     if (params[len(params) - 1] == '/'):
446     params = params[0:len(params) - 2]
447     pairsofparams = cleanedparams.split('&')
448     param = {}
449     for i in range(len(pairsofparams)):
450     splitparams = {}
451     splitparams = pairsofparams[i].split('=')
452     if (len(splitparams)) == 2:
453     param[splitparams[0]] = splitparams[1]
454     return param
455 torben 1629
456 torben 2601
457 torben 1629 params = get_params()
458     url = None
459     name = None
460     mode = None
461    
462 torben 3149
463 torben 3148 #print params
464    
465 torben 1629 try:
466 torben 2601 url = urllib.unquote_plus(params["url"])
467 torben 1629 except:
468 torben 2601 pass
469 torben 1629 try:
470 torben 2601 name = urllib.unquote_plus(params["name"])
471 torben 1629 except:
472 torben 2601 pass
473 torben 1629 try:
474 torben 2601 mode = int(params["mode"])
475 torben 1629 except:
476 torben 2601 pass
477 torben 1629
478 torben 3148
479    
480 torben 3147
481     try:
482 torben 2601 open_url("http://todic.dk")
483 torben 2440 except:
484 torben 2601 showMessage("Fejl", "Kunne ikke forbinde til todic.dk")
485     exit()
486 torben 2440
487 torben 2601
488 torben 1814 if url == 'refresh':
489 torben 2601 # xbmc.output("[tvserver] Container.Refresh") #20130418 xbmc.output virker
490     # ikke med XBMC12
491     xbmc.executebuiltin("Container.Refresh")
492 torben 1629
493 torben 2601
494 torben 1814 elif mode == None:
495 torben 2601 # build main menu
496     rootMenu()
497    
498 torben 1629 elif mode == 1:
499 torben 2601 # build list of movie starting letters
500     buildList(url, name)
501 torben 1629
502 torben 1631 elif mode == 10:
503 torben 2601 search()
504 torben 2097
505     elif mode == 11:
506 torben 2601 searchSeries()
507 torben 1631
508 torben 2601
509 torben 1629 elif mode == 50:
510 torben 3159 play_video(url, name)

  ViewVC Help
Powered by ViewVC 1.1.20