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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1640  
changed lines
  Added in v.3158

  ViewVC Help
Powered by ViewVC 1.1.20