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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20