/[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 3261 - (hide annotations) (download) (as text)
Fri Feb 19 21:39:29 2021 UTC (3 years, 3 months ago) by torben
File MIME type: text/x-python
File size: 14790 byte(s)
v1.9.0 support kodi 19 / python3
breaks compability with older versions !


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

  ViewVC Help
Powered by ViewVC 1.1.20