/[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 3151 - (hide annotations) (download) (as text)
Thu Nov 24 19:55:00 2016 UTC (7 years, 6 months ago) by torben
File MIME type: text/x-python
File size: 14200 byte(s)
only report playtime if we have moved beyond first 60 seconds
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 3151 Version 0.0.21b
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
89    
90 torben 2601 def fetchClipDetails(self):
91     param1 = parse_parameter_string(self.url)
92 torben 2595
93 torben 2601 self.clipkey = param1["clipkey"]
94     print "CLIPKEY:" + self.clipkey
95     detailurl = __backend__ + "&action=clipdetails&clipkey=" + self.clipkey
96 torben 3149 print "[Todic] detailURL = " + detailurl
97 torben 2595
98 torben 2601 xml = open_url(detailurl)
99 torben 2595
100 torben 2601 doc = parseString(xml)
101     self.imdbrating = getText(doc.getElementsByTagName("imdbrating"))
102     self.moviegroups = getText(doc.getElementsByTagName("moviegroups"))
103     self.playlength = getText(doc.getElementsByTagName("playlength"))
104     self.codecdetails = getText(doc.getElementsByTagName("codecdetails"))
105 torben 3149 self.position = int( getText(doc.getElementsByTagName("position")) )
106 torben 2595
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     xbmc.Player.__init__(self, xbmc.PLAYER_CORE_MPLAYER)
119     self.stopped = False
120     self.started = False
121 torben 3142 self.playingPosition = 0.0
122     self.lastReport = 0
123 torben 2601 print "[TodicPlayer] init"
124 torben 2592
125 torben 2601 # @catchall
126     def onPlayBackStarted(self):
127     self.started = True
128     print "[TodicPlayer] : started"
129     # super.onPlayBackStarted()
130 torben 2592
131 torben 3142 #When user presses stop, we report back the the position registered in the last call to self.tick()
132 torben 2601 def onPlayBackStopped(self):
133     self.stopped = True
134     print "[TodicPlayer] : stopped"
135 torben 3149 self.reportPlaytime("stopped")
136     # url = __backend__ + "&action=playbacktime&subaction=stopped&time=" + str( self.playingPosition )
137     # open_url_safe(url)
138 torben 2592
139 torben 3142
140 torben 2601 def onPlayBackEnded(self):
141     self.stopped = True
142     print "[TodicPlayer] : ended"
143 torben 3149 self.reportPlaytime("ended")
144     # url = __backend__ + "&action=playbacktime&subaction=ended&time="
145     # 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 3149 self.reportPlaytime("playing")
155 torben 3147
156 torben 3142
157 torben 1676
158    
159 torben 3149 def reportPlaytime(self, subaction):
160 torben 3151 if (self.playingPosition > 60):
161     url = __backend__ + "&action=playbacktime&subaction=" + subaction + "&time=" + str( self.playingPosition )
162     print "[Todic] reportPlaytime:" + url
163     open_url_safe(url)
164    
165 torben 3142
166    
167    
168 torben 2601 def getText2(nodelist):
169     rc = []
170     for node in nodelist:
171     if node.nodeType == node.TEXT_NODE:
172     rc.append(node.data)
173     else:
174     rc.append(getText(node.childNodes))
175     return ''.join(rc)
176 torben 1676
177    
178 torben 1678 def getText(nodelist):
179 torben 2601 if nodelist.length == 0:
180     return ''
181     else:
182     if nodelist[0].childNodes.length == 0:
183     return ''
184     else:
185     return nodelist[0].childNodes[0].nodeValue
186 torben 1676
187 torben 2601
188 torben 3143
189 torben 1914 def SaveFile(path, data):
190 torben 2601 file = open(path, 'w')
191     file.write(data)
192     file.close()
193 torben 1678
194 torben 1914
195 torben 3143
196 torben 1629 def open_url(url):
197 torben 2601 req = urllib2.Request(url)
198     content = urllib2.urlopen(req)
199     data = content.read()
200     content.close()
201     return data
202 torben 1629
203 torben 2601
204 torben 3143 # wraps open url in a catch-all exception handler
205     # usefull for periodic back-reporting that should not interrupt the program flow
206     def open_url_safe(url):
207     try:
208     return open_url(url)
209     except:
210 torben 3147 print "[Todic ]Some error during open_url call to ", url
211 torben 3143
212    
213    
214 torben 1629 def rootMenu():
215 torben 1648
216 torben 2601 msg = open_url(__backend__ + "&action=messages")
217     msg = msg.strip()
218 torben 1799
219 torben 2601 if msg != "":
220     dialog = xbmcgui.Dialog()
221     dialog.ok('XBMC Todic', msg)
222 torben 1799
223 torben 2601 buildList(__backend__, "", False) # call default list
224 torben 1631
225 torben 2601 # Adde xtra items to root menu
226     listitem = xbmcgui.ListItem(
227     label="Søg film ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
228     listitem.setProperty('Fanart_Image', fanartImage)
229 torben 1648
230 torben 2601 u = sys.argv[0] + "?mode=10&name="
231 torben 2602 xbmcplugin.addDirectoryItem(
232 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
233 torben 1631
234 torben 2601 # add search series
235     listitem = xbmcgui.ListItem(
236     label="Søg Serier ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
237     listitem.setProperty('Fanart_Image', fanartImage)
238 torben 2097
239 torben 2601 u = sys.argv[0] + "?mode=11&name="
240 torben 2602 xbmcplugin.addDirectoryItem(
241 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
242 torben 2097
243 torben 2601 xbmcplugin.endOfDirectory(int(sys.argv[1]))
244 torben 1629
245    
246 torben 2601 def buildList(url, title, endlist=True):
247     print '[TODIC]:' + str(url)
248 torben 1678
249 torben 2601 link = open_url(url)
250     doc = parseString(link)
251     ty = doc.getElementsByTagName("meta")[0].getAttribute("type")
252     print '[TODIC]' + str(ty)
253 torben 1646
254 torben 2601 if ty == 'clipList':
255     mode = '50'
256     folder = False
257     else:
258     mode = '1'
259     folder = True
260 torben 1646
261 torben 2601 entries = doc.getElementsByTagName("entry")
262     l = len(entries)
263     description = ''
264     for entry in entries:
265     name = getText(entry.getElementsByTagName("title"))
266     url = getText(entry.getElementsByTagName("url"))
267     thumb = getText(entry.getElementsByTagName("cover"))
268     description = getText(entry.getElementsByTagName("description"))
269     playcount = getText(entry.getElementsByTagName("playcount"))
270 torben 1829
271 torben 3148
272 torben 2601 if playcount == '':
273     playcount = '0'
274     playcount = int(playcount)
275 torben 1647
276 torben 2601 # print "name:" + name
277 torben 1678 # print "url:" + url
278     # print "thumb:" + thumb
279     # print "description:" + description
280 torben 2601 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['plot'] = description
287     infoLabels['playcount'] = playcount
288     listitem.setInfo('video', infoLabels)
289 torben 1678
290 torben 2601 name = name.encode('UTF-8')
291     description = description.encode('UTF-8')
292 torben 1678
293 torben 2601 u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(
294 torben 3149 name) + "&url=" + urllib.quote(url) + "&description=" + urllib.quote(description)
295 torben 2602 xbmcplugin.addDirectoryItem(
296 torben 2601 handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
297 torben 1648
298 torben 2601 if (endlist == True):
299     xbmcplugin.endOfDirectory(int(sys.argv[1]))
300 torben 1923
301    
302 torben 2601 def play_video(url, name, description):
303     if (description == None or description == ""):
304 torben 3147 play_real_video(url, name, 0)
305 torben 2601 else:
306     d = TodicMovieDialog()
307     d.setUrl(url)
308     d.setName(name)
309     d.setDescription(description)
310 torben 1629
311 torben 2601 d.doModal()
312 torben 1629
313    
314 torben 3147 def play_real_video(url, name, position):
315 torben 2601 xml = open_url(url)
316 torben 3147 print '[Todic] url: ' + str(url)
317     print '[Todic] xml: ' + xml
318     print '[Todic] pos: ' + str(position)
319 torben 1678
320 torben 2601 doc = parseString(xml)
321     url = getText(doc.getElementsByTagName("url"))
322 torben 1678
323 torben 2601 subtitleurl = getText(doc.getElementsByTagName("subtitles"))
324     subtitlesfile = os.path.join(datapath, 'temp.srt')
325 torben 1914
326 torben 2601 # if old srt file exists delete it first
327     if os.path.isfile(subtitlesfile):
328     os.unlink(subtitlesfile)
329 torben 1917
330 torben 2601 print '[TODIC] subs: ' + str(subtitleurl)
331     if len(subtitleurl) > 0:
332     subtitles = open_url(subtitleurl)
333     SaveFile(subtitlesfile, subtitles)
334     print 'TODIC downloaded subtitles'
335 torben 1914
336 torben 2601 image = xbmc.getInfoImage('ListItem.Thumb')
337     listitem = xbmcgui.ListItem(
338     label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
339     listitem.setInfo(type="Video", infoLabels={"Title": name})
340 torben 3147 listitem.setProperty('ResumeTime', '300')
341     listitem.setProperty('TotalTime', '3000')
342 torben 1914
343 torben 2601 player = TodicPlayer(xbmc.PLAYER_CORE_AUTO)
344     player.play(str(url), listitem)
345 torben 1914
346 torben 2601 # kan ikke loade subtitles hvis foerend playeren koerer
347     count = 0
348     while not xbmc.Player().isPlaying():
349 torben 3146 xbmc.sleep(250)
350 torben 2601 count += 1
351     if count > 10:
352     break
353 torben 1629
354 torben 3147
355    
356 torben 2601 if xbmc.Player().isPlaying():
357     if os.path.isfile(subtitlesfile):
358     player.setSubtitles(subtitlesfile)
359     print 'TODIC started subtitles'
360     else:
361     player.disableSubtitles()
362 torben 1914
363 torben 3142
364 torben 3147 if (position > 0):
365     while (player.getTotalTime() == 0.0): #Vent indtil vi har beregnet hvor langt klippet er
366     xbmc.sleep(250)
367 torben 3142
368 torben 3147 print "[Todic] totalTime " + str( player.getTotalTime() )
369     player.seekTime(position)
370 torben 3142
371 torben 1676
372 torben 3147 #Holder python kørernde indtil at det bliver bedt om at stoppe
373     while (not xbmc.abortRequested):
374     player.tick()
375     xbmc.sleep(500)
376 torben 1676
377 torben 3147
378    
379 torben 1631 def search():
380 torben 2601 search = getUserInput("Todic Søgning")
381 torben 1629
382 torben 2601 if (search != None and search != ""):
383     url = __backend__ + "&action=search&search=" + \
384     urllib.quote_plus(search)
385 torben 1631
386 torben 2601 # print "[TODIC] Search start: " + search
387     # print "[TODIC] Search url: " + url
388 torben 1631
389 torben 2601 buildList(url, "søgning")
390 torben 1631
391 torben 2601
392 torben 2097 def searchSeries():
393 torben 2601 search = getUserInput("Todic Serie Søgning")
394 torben 2097
395 torben 2601 if (search != None and search != ""):
396     url = __backend__ + "&action=searchseries&search=" + \
397     urllib.quote_plus(search)
398 torben 2097
399 torben 2601 # print "[TODIC] Search start: " + search
400     # print "[TODIC] Search url: " + url
401 torben 2097
402 torben 2601 buildList(url, "serie søgning")
403 torben 2097
404 torben 1631
405 torben 2601 #=================================== Tool Box =======================================
406 torben 1631 # shows a more userfriendly notification
407     def showMessage(heading, message):
408 torben 2601 duration = 15 * 1000
409     xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
410     (heading, message, duration))
411 torben 1631
412    
413     # raise a keyboard for user input
414 torben 2601 def getUserInput(title="Input", default="", hidden=False):
415     result = None
416 torben 1631
417 torben 2601 # Fix for when this functions is called with default=None
418     if not default:
419     default = ""
420 torben 1631
421 torben 2601 keyboard = xbmc.Keyboard(default, title)
422     keyboard.setHiddenInput(hidden)
423     keyboard.doModal()
424 torben 1631
425 torben 2601 if keyboard.isConfirmed():
426     result = keyboard.getText()
427    
428     return result
429    
430    
431 torben 1629 def get_params():
432 torben 2601 return parse_parameter_string(sys.argv[2])
433 torben 2595
434 torben 1629
435 torben 2601 def parse_parameter_string(paramstring):
436     param = []
437     if len(paramstring) >= 2:
438     params = paramstring
439     cleanedparams = params.replace('?', '')
440     if (params[len(params) - 1] == '/'):
441     params = params[0:len(params) - 2]
442     pairsofparams = cleanedparams.split('&')
443     param = {}
444     for i in range(len(pairsofparams)):
445     splitparams = {}
446     splitparams = pairsofparams[i].split('=')
447     if (len(splitparams)) == 2:
448     param[splitparams[0]] = splitparams[1]
449     return param
450 torben 1629
451 torben 2601
452 torben 1629 params = get_params()
453     url = None
454     name = None
455     mode = None
456 torben 2592 description = None
457 torben 1629
458 torben 3149
459 torben 3148 #print params
460    
461 torben 1629 try:
462 torben 2601 url = urllib.unquote_plus(params["url"])
463 torben 1629 except:
464 torben 2601 pass
465 torben 1629 try:
466 torben 2601 name = urllib.unquote_plus(params["name"])
467 torben 1629 except:
468 torben 2601 pass
469 torben 1629 try:
470 torben 2601 mode = int(params["mode"])
471 torben 1629 except:
472 torben 2601 pass
473 torben 2592 try:
474 torben 2601 description = urllib.unquote_plus(params["description"])
475 torben 2592 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 2601 play_video(url, name, description)

  ViewVC Help
Powered by ViewVC 1.1.20