/[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 3245 - (show annotations) (download) (as text)
Mon Feb 18 18:09:47 2019 UTC (5 years, 2 months ago) by torben
File MIME type: text/x-python
File size: 14979 byte(s)
fix syntax err
1
2 # This Python file uses the following encoding: utf-8
3
4 '''
5 Todic plugin for XBMC
6 Version 1.7.2
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 if mode == '50':
284 infoLabels = {}
285 infoLabels['title'] = name
286 infoLabels['playcount'] = playcount
287 listitem.setInfo('video', infoLabels)
288
289 name = name.encode('UTF-8')
290
291 u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(
292 name) + "&url=" + urllib.quote(url)
293 xbmcplugin.addDirectoryItem(
294 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
295
296 if (endlist == True):
297 xbmcplugin.endOfDirectory(int(sys.argv[1]))
298
299
300 def play_video(url, name):
301 description = ""
302 playPosition = 0
303 savedPosition = 0
304 try:
305 param1 = parse_parameter_string(url)
306 clipkey = param1["clipkey"]
307
308 print "[Todic] ClipKey:" + clipkey
309 detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey
310 print "[Todic] detailURL = " + detailurl
311
312 xml = open_url(detailurl)
313
314 clipDetailsDoc = parseString(xml)
315 savedPosition = int( getText(clipDetailsDoc.getElementsByTagName("position")) )
316 description = getText(clipDetailsDoc.getElementsByTagName("description"))
317 except:
318 print "[Todic] Unexpected error:", sys.exc_info()[0]
319
320 if (description == None or description == ""):
321 if (savedPosition > 0):
322 dialog = xbmcgui.Dialog()
323 #yes / true -afspil fra position
324 answer = dialog.yesno(heading='Todic', line1='Afspil fra sidste position', nolabel='Fra start', yeslabel='Fortsæt')
325 if (answer == True):
326 playPosition = savedPosition
327
328 play_real_video(url, name, playPosition)
329
330 else:
331 d = TodicMovieDialog()
332 d.setDetailsDoc(clipDetailsDoc)
333 d.setName(name)
334 d.setUrl(url)
335 d.setDescription(description)
336
337 d.doModal()
338
339
340 def play_real_video(url, name, position):
341 xml = open_url(url)
342 print '[Todic] url: ' + str(url)
343 print '[Todic] xml: ' + xml
344 print '[Todic] pos: ' + str(position)
345
346 doc = parseString(xml)
347 url = getText(doc.getElementsByTagName("url"))
348
349 subtitleurl = getText(doc.getElementsByTagName("subtitles"))
350 subtitlesfile = os.path.join(datapath, 'temp.srt')
351
352 # if old srt file exists delete it first
353 if os.path.isfile(subtitlesfile):
354 os.unlink(subtitlesfile)
355
356 print '[Todic] subs: ' + str(subtitleurl)
357 if len(subtitleurl) > 0:
358 subtitles = open_url(subtitleurl)
359 SaveFile(subtitlesfile, subtitles)
360 print '[Todic] downloaded subtitles'
361
362 image = xbmc.getInfoImage('ListItem.Thumb')
363 listitem = xbmcgui.ListItem(
364 label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
365 listitem.setInfo(type="Video", infoLabels={"Title": name})
366 listitem.setProperty('ResumeTime', '300')
367 listitem.setProperty('TotalTime', '3000')
368
369 player = TodicPlayer()
370 player.play(str(url), listitem)
371
372 # kan ikke loade subtitles hvis foerend playeren koerer
373 count = 0
374 while not xbmc.Player().isPlaying():
375 xbmc.sleep(250)
376 count += 1
377 if count > 10:
378 break
379
380
381
382 if xbmc.Player().isPlaying():
383 if os.path.isfile(subtitlesfile):
384 player.setSubtitles(subtitlesfile)
385 print '[Todic] started subtitles'
386 else:
387 player.showSubtitles(False)
388
389
390 if (position > 0):
391 while (player.getTotalTime() == 0.0): #Vent indtil vi har beregnet hvor langt klippet er
392 xbmc.sleep(250)
393
394 print "[Todic] totalTime " + str( player.getTotalTime() )
395 player.seekTime(position)
396
397
398 #Holder python kørernde indtil at det bliver bedt om at stoppe
399 while (not xbmc.abortRequested):
400 player.tick()
401 xbmc.sleep(500)
402
403
404
405 def search():
406 search = getUserInput("Todic Søgning")
407
408 if (search != None and search != ""):
409 url = __backend__ + "&action=search&search=" + \
410 urllib.quote_plus(search)
411
412 # print "[Todic] Search start: " + search
413 # print "[Todic] Search url: " + url
414
415 buildList(url, "søgning")
416
417
418 def searchSeries():
419 search = getUserInput("Todic Serie Søgning")
420
421 if (search != None and search != ""):
422 url = __backend__ + "&action=searchseries&search=" + \
423 urllib.quote_plus(search)
424
425 # print "[Todic] Search start: " + search
426 # print "[Todic] Search url: " + url
427
428 buildList(url, "serie søgning")
429
430
431 #=================================== Tool Box =======================================
432 # shows a more userfriendly notification
433 def showMessage(heading, message):
434 duration = 15 * 1000
435 xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
436 (heading, message, duration))
437
438
439 # raise a keyboard for user input
440 def getUserInput(title="Input", default="", hidden=False):
441 result = None
442
443 # Fix for when this functions is called with default=None
444 if not default:
445 default = ""
446
447 keyboard = xbmc.Keyboard(default, title)
448 keyboard.setHiddenInput(hidden)
449 keyboard.doModal()
450
451 if keyboard.isConfirmed():
452 result = keyboard.getText()
453
454 return result
455
456
457 def get_params():
458 return parse_parameter_string(sys.argv[2])
459
460
461 def parse_parameter_string(paramstring):
462 param = []
463 if len(paramstring) >= 2:
464 params = paramstring
465 cleanedparams = params.replace('?', '')
466 if (params[len(params) - 1] == '/'):
467 params = params[0:len(params) - 2]
468 pairsofparams = cleanedparams.split('&')
469 param = {}
470 for i in range(len(pairsofparams)):
471 splitparams = {}
472 splitparams = pairsofparams[i].split('=')
473 if (len(splitparams)) == 2:
474 param[splitparams[0]] = splitparams[1]
475 return param
476
477
478 params = get_params()
479 url = None
480 name = None
481 mode = None
482
483
484 #print params
485
486 try:
487 url = urllib.unquote_plus(params["url"])
488 except:
489 pass
490 try:
491 name = urllib.unquote_plus(params["name"])
492 except:
493 pass
494 try:
495 mode = int(params["mode"])
496 except:
497 pass
498
499
500
501
502 try:
503 open_url("http://todic.dk")
504 except:
505 showMessage("Fejl", "Kunne ikke forbinde til todic.dk")
506 exit()
507
508
509 if url == 'refresh':
510 # xbmc.output("[tvserver] Container.Refresh") #20130418 xbmc.output virker
511 # ikke med XBMC12
512 xbmc.executebuiltin("Container.Refresh")
513
514
515 elif mode == None:
516 # build main menu
517 rootMenu()
518
519 elif mode == 1:
520 # build list of movie starting letters
521 buildList(url, name)
522
523 elif mode == 10:
524 search()
525
526 elif mode == 11:
527 searchSeries()
528
529
530 elif mode == 50:
531 play_video(url, name)

  ViewVC Help
Powered by ViewVC 1.1.20