/[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 3147 - (hide annotations) (download) (as text)
Wed Nov 23 20:10:15 2016 UTC (7 years, 6 months ago) by torben
File MIME type: text/x-python
File size: 14127 byte(s)
v 0.0.19 - first version of play from position
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 3147 Version 0.0.19
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 3037 __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__
28 torben 2594 fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'movie_bg_blur.jpg')
29 torben 2601 datapath = xbmc.translatePath(
30     'special://profile/addon_data/plugin.video.todic/')
31 torben 1629
32 torben 2592 ADDON_PATH = __addon__.getAddonInfo('path')
33 torben 2601 SkinMasterPath = os.path.join(ADDON_PATH, 'skins') + '/'
34 torben 2592 MySkinPath = (os.path.join(SkinMasterPath, '720p')) + '/'
35     MySkin = 'main.xml'
36 torben 1676
37 torben 2592
38     class TodicMovieDialog(xbmcgui.WindowXMLDialog):
39    
40 torben 2601 def __new__(cls):
41     return super(TodicMovieDialog, cls).__new__(cls, "main.xml", ADDON_PATH)
42 torben 2592
43 torben 2601 def __init__(self):
44     super(TodicMovieDialog, self).__init__()
45 torben 3147 self.position = 0
46 torben 2592
47 torben 2601 def onClick(self, controlId):
48 torben 3147 print "[Todic] MovieDialog OnClick: " + str(controlId)
49 torben 2592
50 torben 2601 if (controlId == 50):
51     self.close()
52 torben 3147 play_real_video(self.url, self.name, 0)
53 torben 2592
54 torben 3147 if (controlId == 51):
55     self.close()
56     play_real_video(self.url, self.name, self.position)
57    
58 torben 2601 if (controlId == 98):
59     self.close()
60 torben 2592
61 torben 2601 def onInit(self):
62 torben 2592
63 torben 3147 print "[Todic] MovieDialog ONINIT"
64 torben 2601 self.getControl(1).setLabel(self.name)
65     self.getControl(2).setLabel(self.moviegroups)
66     self.getControl(3).setLabel(self.description)
67     self.getControl(10).setLabel(self.playlength)
68     self.getControl(11).setLabel(self.codecdetails)
69 torben 2596
70 torben 3147 if (self.position > 0):
71     self.getControl(51).setVisible(True)
72     self.getControl(50).setPosition(100, 570)
73     self.getControl(51).setPosition(450, 570)
74     self.getControl(50).controlLeft( self.getControl(51) )
75     self.getControl(50).controlRight( self.getControl(51) )
76     else:
77     self.getControl(51).setVisible(False)
78 torben 2596
79 torben 3147 #orig_img_width = self.getControl(40).getWidth()
80     #self.starwidth = (float(self.imdbrating) / 10.0) * orig_img_width
81     #self.getControl(40).setWidth(int(self.starwidth))
82    
83 torben 2601 def setUrl(self, url):
84 torben 3147 print "[Todic] MovieDialog SETURL:" + url
85 torben 2601 self.url = url
86     self.fetchClipDetails()
87 torben 2592
88 torben 3147 def setPosition(self, pos):
89     print "[Todic] MovieDialog setPosition:" + str(pos)
90     self.position = pos
91    
92    
93    
94 torben 2601 def fetchClipDetails(self):
95     param1 = parse_parameter_string(self.url)
96 torben 2595
97 torben 2601 self.clipkey = param1["clipkey"]
98     print "CLIPKEY:" + self.clipkey
99     detailurl = __backend__ + "&action=clipdetails&clipkey=" + self.clipkey
100 torben 2595
101 torben 2601 xml = open_url(detailurl)
102 torben 2595
103 torben 2601 doc = parseString(xml)
104     self.imdbrating = getText(doc.getElementsByTagName("imdbrating"))
105     self.moviegroups = getText(doc.getElementsByTagName("moviegroups"))
106     self.playlength = getText(doc.getElementsByTagName("playlength"))
107     self.codecdetails = getText(doc.getElementsByTagName("codecdetails"))
108 torben 2595
109 torben 2601 def setName(self, name):
110     self.name = name
111 torben 2595
112 torben 2601 def setDescription(self, description):
113     self.description = description
114 torben 2595
115 torben 2596
116 torben 2601 class TodicPlayer(xbmc.Player):
117 torben 2596
118 torben 2601 def __init__(self, *args, **kwargs):
119     # xbmc.Player.__init__(selv,*args,**kwargs)
120     xbmc.Player.__init__(self, xbmc.PLAYER_CORE_MPLAYER)
121     self.stopped = False
122     self.started = False
123 torben 3142 self.playingPosition = 0.0
124     self.lastReport = 0
125 torben 2601 print "[TodicPlayer] init"
126 torben 2592
127 torben 2601 # @catchall
128     def onPlayBackStarted(self):
129     self.started = True
130     print "[TodicPlayer] : started"
131     # super.onPlayBackStarted()
132 torben 2592
133 torben 3142 #When user presses stop, we report back the the position registered in the last call to self.tick()
134 torben 2601 def onPlayBackStopped(self):
135     self.stopped = True
136     print "[TodicPlayer] : stopped"
137 torben 3142 url = __backend__ + "&action=playbacktime&subaction=stopped&time=" + str( self.playingPosition )
138 torben 3143 open_url_safe(url)
139 torben 2592
140 torben 3142
141 torben 2601 def onPlayBackEnded(self):
142     self.stopped = True
143     print "[TodicPlayer] : ended"
144 torben 3142 url = __backend__ + "&action=playbacktime&subaction=ended&time="
145 torben 3143 open_url_safe(url)
146 torben 1676
147 torben 3142 def tick(self):
148 torben 3144 if ( self.isPlaying() ):
149 torben 3142 self.playingPosition = self.getTime()
150     now = time()
151     #print "[Todic] tick " + str(now) + " " + str(self.lastReport) + " : " +str(now - self.lastReport)
152     if ( (now - self.lastReport) > 60.0):
153 torben 3147 self.lastReport = now
154 torben 3142 self.reportPlaytime()
155 torben 3147
156 torben 3142
157 torben 1676
158    
159 torben 3142 def reportPlaytime(self):
160     url = __backend__ + "&action=playbacktime&subaction=playing&time=" + str( self.playingPosition )
161 torben 3143 open_url_safe(url)
162 torben 3142 print "[Todic] reportPlaytime:" + url
163    
164    
165    
166 torben 2601 def getText2(nodelist):
167     rc = []
168     for node in nodelist:
169     if node.nodeType == node.TEXT_NODE:
170     rc.append(node.data)
171     else:
172     rc.append(getText(node.childNodes))
173     return ''.join(rc)
174 torben 1676
175    
176 torben 1678 def getText(nodelist):
177 torben 2601 if nodelist.length == 0:
178     return ''
179     else:
180     if nodelist[0].childNodes.length == 0:
181     return ''
182     else:
183     return nodelist[0].childNodes[0].nodeValue
184 torben 1676
185 torben 2601
186 torben 3143
187 torben 1914 def SaveFile(path, data):
188 torben 2601 file = open(path, 'w')
189     file.write(data)
190     file.close()
191 torben 1678
192 torben 1914
193 torben 3143
194 torben 1629 def open_url(url):
195 torben 2601 req = urllib2.Request(url)
196     content = urllib2.urlopen(req)
197     data = content.read()
198     content.close()
199     return data
200 torben 1629
201 torben 2601
202 torben 3143 # wraps open url in a catch-all exception handler
203     # usefull for periodic back-reporting that should not interrupt the program flow
204     def open_url_safe(url):
205     try:
206     return open_url(url)
207     except:
208 torben 3147 print "[Todic ]Some error during open_url call to ", url
209 torben 3143
210    
211    
212 torben 1629 def rootMenu():
213 torben 1648
214 torben 2601 msg = open_url(__backend__ + "&action=messages")
215     msg = msg.strip()
216 torben 1799
217 torben 2601 if msg != "":
218     dialog = xbmcgui.Dialog()
219     dialog.ok('XBMC Todic', msg)
220 torben 1799
221 torben 2601 buildList(__backend__, "", False) # call default list
222 torben 1631
223 torben 2601 # Adde xtra items to root menu
224     listitem = xbmcgui.ListItem(
225     label="Søg film ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
226     listitem.setProperty('Fanart_Image', fanartImage)
227 torben 1648
228 torben 2601 u = sys.argv[0] + "?mode=10&name="
229 torben 2602 xbmcplugin.addDirectoryItem(
230 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
231 torben 1631
232 torben 2601 # add search series
233     listitem = xbmcgui.ListItem(
234     label="Søg Serier ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
235     listitem.setProperty('Fanart_Image', fanartImage)
236 torben 2097
237 torben 2601 u = sys.argv[0] + "?mode=11&name="
238 torben 2602 xbmcplugin.addDirectoryItem(
239 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
240 torben 2097
241 torben 2601 xbmcplugin.endOfDirectory(int(sys.argv[1]))
242 torben 1629
243    
244 torben 2601 def buildList(url, title, endlist=True):
245     print '[TODIC]:' + str(url)
246 torben 1678
247 torben 2601 link = open_url(url)
248     doc = parseString(link)
249     ty = doc.getElementsByTagName("meta")[0].getAttribute("type")
250     print '[TODIC]' + str(ty)
251 torben 1646
252 torben 2601 if ty == 'clipList':
253     mode = '50'
254     folder = False
255     else:
256     mode = '1'
257     folder = True
258 torben 1646
259 torben 2601 entries = doc.getElementsByTagName("entry")
260     l = len(entries)
261     description = ''
262     for entry in entries:
263     name = getText(entry.getElementsByTagName("title"))
264     url = getText(entry.getElementsByTagName("url"))
265     thumb = getText(entry.getElementsByTagName("cover"))
266     description = getText(entry.getElementsByTagName("description"))
267     playcount = getText(entry.getElementsByTagName("playcount"))
268 torben 1829
269 torben 2601 if playcount == '':
270     playcount = '0'
271     playcount = int(playcount)
272 torben 1647
273 torben 2601 # print "name:" + name
274 torben 1678 # print "url:" + url
275     # print "thumb:" + thumb
276     # print "description:" + description
277 torben 2601 listitem = xbmcgui.ListItem(
278     label=name, label2='test', iconImage='DefaultFolder.png', thumbnailImage=thumb)
279     listitem.setProperty('Fanart_Image', fanartImage)
280     if mode == '50':
281     infoLabels = {}
282     infoLabels['title'] = name
283     infoLabels['plot'] = description
284     infoLabels['playcount'] = playcount
285     listitem.setInfo('video', infoLabels)
286 torben 1678
287 torben 2601 name = name.encode('UTF-8')
288     description = description.encode('UTF-8')
289 torben 1678
290 torben 2601 u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(
291     name) + "&url=" + urllib.quote(url) + "&description=" + urllib.quote(description)
292 torben 2602 xbmcplugin.addDirectoryItem(
293 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
294 torben 1648
295 torben 2601 if (endlist == True):
296     xbmcplugin.endOfDirectory(int(sys.argv[1]))
297 torben 1923
298    
299 torben 2601 def play_video(url, name, description):
300     if (description == None or description == ""):
301 torben 3147 play_real_video(url, name, 0)
302 torben 2601 else:
303     d = TodicMovieDialog()
304     d.setUrl(url)
305     d.setName(name)
306     d.setDescription(description)
307 torben 3147 d.setPosition(pos) #tager pos fra global scope
308 torben 1629
309 torben 2601 d.doModal()
310 torben 1629
311    
312 torben 3147 def play_real_video(url, name, position):
313 torben 2601 xml = open_url(url)
314 torben 3147 print '[Todic] url: ' + str(url)
315     print '[Todic] xml: ' + xml
316     print '[Todic] pos: ' + str(position)
317 torben 1678
318 torben 2601 doc = parseString(xml)
319     url = getText(doc.getElementsByTagName("url"))
320 torben 1678
321 torben 2601 subtitleurl = getText(doc.getElementsByTagName("subtitles"))
322     subtitlesfile = os.path.join(datapath, 'temp.srt')
323 torben 1914
324 torben 2601 # if old srt file exists delete it first
325     if os.path.isfile(subtitlesfile):
326     os.unlink(subtitlesfile)
327 torben 1917
328 torben 2601 print '[TODIC] subs: ' + str(subtitleurl)
329     if len(subtitleurl) > 0:
330     subtitles = open_url(subtitleurl)
331     SaveFile(subtitlesfile, subtitles)
332     print 'TODIC downloaded subtitles'
333 torben 1914
334 torben 2601 image = xbmc.getInfoImage('ListItem.Thumb')
335     listitem = xbmcgui.ListItem(
336     label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
337     listitem.setInfo(type="Video", infoLabels={"Title": name})
338 torben 3147 listitem.setProperty('ResumeTime', '300')
339     listitem.setProperty('TotalTime', '3000')
340 torben 1914
341 torben 2601 player = TodicPlayer(xbmc.PLAYER_CORE_AUTO)
342     player.play(str(url), listitem)
343 torben 1914
344 torben 2601 # kan ikke loade subtitles hvis foerend playeren koerer
345     count = 0
346     while not xbmc.Player().isPlaying():
347 torben 3146 xbmc.sleep(250)
348 torben 2601 count += 1
349     if count > 10:
350     break
351 torben 1629
352 torben 3147
353    
354 torben 2601 if xbmc.Player().isPlaying():
355     if os.path.isfile(subtitlesfile):
356     player.setSubtitles(subtitlesfile)
357     print 'TODIC started subtitles'
358     else:
359     player.disableSubtitles()
360 torben 1914
361 torben 3142
362 torben 3147 if (position > 0):
363     while (player.getTotalTime() == 0.0): #Vent indtil vi har beregnet hvor langt klippet er
364     xbmc.sleep(250)
365 torben 3142
366 torben 3147 print "[Todic] totalTime " + str( player.getTotalTime() )
367     player.seekTime(position)
368 torben 3142
369 torben 1676
370 torben 3147 #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 torben 1676
375 torben 3147
376    
377 torben 1631 def search():
378 torben 2601 search = getUserInput("Todic Søgning")
379 torben 1629
380 torben 2601 if (search != None and search != ""):
381     url = __backend__ + "&action=search&search=" + \
382     urllib.quote_plus(search)
383 torben 1631
384 torben 2601 # print "[TODIC] Search start: " + search
385     # print "[TODIC] Search url: " + url
386 torben 1631
387 torben 2601 buildList(url, "søgning")
388 torben 1631
389 torben 2601
390 torben 2097 def searchSeries():
391 torben 2601 search = getUserInput("Todic Serie Søgning")
392 torben 2097
393 torben 2601 if (search != None and search != ""):
394     url = __backend__ + "&action=searchseries&search=" + \
395     urllib.quote_plus(search)
396 torben 2097
397 torben 2601 # print "[TODIC] Search start: " + search
398     # print "[TODIC] Search url: " + url
399 torben 2097
400 torben 2601 buildList(url, "serie søgning")
401 torben 2097
402 torben 1631
403 torben 2601 #=================================== Tool Box =======================================
404 torben 1631 # shows a more userfriendly notification
405     def showMessage(heading, message):
406 torben 2601 duration = 15 * 1000
407     xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
408     (heading, message, duration))
409 torben 1631
410    
411     # raise a keyboard for user input
412 torben 2601 def getUserInput(title="Input", default="", hidden=False):
413     result = None
414 torben 1631
415 torben 2601 # Fix for when this functions is called with default=None
416     if not default:
417     default = ""
418 torben 1631
419 torben 2601 keyboard = xbmc.Keyboard(default, title)
420     keyboard.setHiddenInput(hidden)
421     keyboard.doModal()
422 torben 1631
423 torben 2601 if keyboard.isConfirmed():
424     result = keyboard.getText()
425    
426     return result
427    
428    
429 torben 1629 def get_params():
430 torben 2601 return parse_parameter_string(sys.argv[2])
431 torben 2595
432 torben 1629
433 torben 2601 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 torben 1629
449 torben 2601
450 torben 1629 params = get_params()
451     url = None
452     name = None
453     mode = None
454 torben 2592 description = None
455 torben 3147 pos = 0
456 torben 1629
457     try:
458 torben 2601 url = urllib.unquote_plus(params["url"])
459 torben 1629 except:
460 torben 2601 pass
461 torben 1629 try:
462 torben 2601 name = urllib.unquote_plus(params["name"])
463 torben 1629 except:
464 torben 2601 pass
465 torben 1629 try:
466 torben 2601 mode = int(params["mode"])
467 torben 1629 except:
468 torben 2601 pass
469 torben 2592 try:
470 torben 2601 description = urllib.unquote_plus(params["description"])
471 torben 2592 except:
472 torben 2601 pass
473 torben 1629
474 torben 2440 try:
475 torben 3147 pos = int(params["pos"])
476     except:
477     pass
478    
479    
480     try:
481 torben 2601 open_url("http://todic.dk")
482 torben 2440 except:
483 torben 2601 showMessage("Fejl", "Kunne ikke forbinde til todic.dk")
484     exit()
485 torben 2440
486 torben 2601
487 torben 1814 if url == 'refresh':
488 torben 2601 # xbmc.output("[tvserver] Container.Refresh") #20130418 xbmc.output virker
489     # ikke med XBMC12
490     xbmc.executebuiltin("Container.Refresh")
491 torben 1629
492 torben 2601
493 torben 1814 elif mode == None:
494 torben 2601 # build main menu
495     rootMenu()
496    
497 torben 1629 elif mode == 1:
498 torben 2601 # build list of movie starting letters
499     buildList(url, name)
500 torben 1629
501 torben 1631 elif mode == 10:
502 torben 2601 search()
503 torben 2097
504     elif mode == 11:
505 torben 2601 searchSeries()
506 torben 1631
507 torben 2601
508 torben 1629 elif mode == 50:
509 torben 2601 play_video(url, name, description)

  ViewVC Help
Powered by ViewVC 1.1.20