/[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 1649 by torben, Sun Dec 4 15:06:39 2011 UTC revision 3250 by torben, Thu Feb 28 11:03:28 2019 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 1.7.3
7  '''  '''
8    
9  import sys  import sys
 import cgi as urlparse  
10  import os  import os
11    
12    
# Line 13  import xbmcaddon Line 15  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__  __entrypoint__ = __addon__.getSetting('entrypoint').lower()
28  fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'fanart.jpg')  __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__
29    
30  def open_url(url):  if __entrypoint__ == "alternative":
31          req = urllib2.Request(url)      __backend__ = "https://alt.todic.dk/xbmc.php?xbmckey=" + __key__
32          content = urllib2.urlopen(req)  
33          data = content.read()  if __entrypoint__ == "testing":
34          content.close()      __backend__ = "https://todic.dk/xbmc-beta.php?xbmckey=" + __key__
35          return data  
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    
 def rootMenu():  
49    
50          buildList(__backend__, "") # call default list  class TodicMovieDialog(xbmcgui.WindowXMLDialog):
51    
52          # Adde xtra items to root menu      def __new__(cls):
53          listitem = xbmcgui.ListItem(label = "Søg film ...", iconImage = 'DefaultFolder.png', thumbnailImage = 'DefaultFolder.png')          return super(TodicMovieDialog, cls).__new__(cls, "main.xml", ADDON_PATH)
         listitem.setProperty('Fanart_Image', fanartImage)  
54    
55          u = sys.argv[0] + "?mode=10&name="      def __init__(self):
56          ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = True)          super(TodicMovieDialog, self).__init__()
57            self.position = 0
58    
59          xbmcplugin.endOfDirectory(int(sys.argv[1]))      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  def buildList(url,title):          if (controlId == 51):
67          print '[TODIC]:'+str(url)                      self.close()
68          link = open_url(url)              play_real_video(self.url, self.name, self.position)
         ty=re.compile('<meta type=\'(.+?)\'').findall(link)  
         print '[TODIC]'+str(ty[0])  
69    
70          if ty[0] == 'clipList':          if (controlId == 98):
71                  mode = '50'              self.close()
72                  folder = False  
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:          else:
89                  mode = '1'              self.getControl(51).setVisible(False)
90                  folder = True  
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    
         m=re.compile('<title>(.+?)</title><url>(.+?)</url><cover>(.+?)</cover><description>(.*)</description>').findall(link)  
         l=len(m)  
         for name,url,thumb,description in m:                          
                 infoLabels = {}  
                 infoLabels['title'] = name  
                 infoLabels['plot'] = description          
   
                 listitem = xbmcgui.ListItem(label = name, label2='test', iconImage = 'DefaultFolder.png', thumbnailImage = thumb)  
                 listitem.setInfo('video', infoLabels)  
                 listitem.setProperty('Fanart_Image', fanartImage)  
   
                 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]))  
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):  def play_video(url, name):
303          link = open_url(url)      description = ""
304          match=re.compile('<url>(.+?)</url>').findall(link)      playPosition = 0
305          url = match[0]      savedPosition = 0
306          print '[TODIC]:'+str(url)      try:
307          image = xbmc.getInfoImage( 'ListItem.Thumb' )          param1 = parse_parameter_string(url)
308          listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = image)          clipkey = param1["clipkey"]
309  #       listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = 'DefaultVideo.png')  
310          listitem.setInfo( type = "Video", infoLabels={ "Title": name } )          print( "[Todic] ClipKey:" + clipkey)
311          xbmc.Player(xbmc.PLAYER_CORE_AUTO).play(str(url), listitem)          detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey
312          xbmc.sleep(200)          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        listitem.setProperty('ResumeTime', '300')
361        listitem.setProperty('TotalTime', '3000')
362    
363        if len(subtitleurl) > 0:
364            listitem.setSubtitles([subtitleurl])
365    
366        player = TodicPlayer()
367        player.play(str(url), listitem)
368    
369        # kan ikke loade subtitles hvis foerend playeren koerer
370        count = 0
371        while not xbmc.Player().isPlaying():
372            xbmc.sleep(250)
373            count += 1
374            if count > 10:
375                break
376    
377    
378    
379        if xbmc.Player().isPlaying():
380    
381            if (position > 0):
382                while (player.getTotalTime() == 0.0): #Vent indtil vi har beregnet hvor langt klippet er
383                    xbmc.sleep(250)
384    
385                print( "[Todic] totalTime " +  str( player.getTotalTime() ))
386                player.seekTime(position)
387    
388    
389        #Holder python kørernde indtil at det bliver bedt om at stoppe
390        while (not xbmc.abortRequested):
391            player.tick()
392            xbmc.sleep(500)
393    
394    
395    
396  def search():  def search():
397          search = getUserInput("Todic Søgning")      search = getUserInput("Todic Søgning")
398    
399        if (search != None and search != ""):
400            url = __backend__ + "&action=search&search=" + \
401                urllib.quote_plus(search)
402    
403            # print "[Todic] Search start: " + search
404            # print "[Todic] Search url: " + url
405    
406          if (search != None and search != ""):          buildList(url, "søgning")
                 url = __backend__ + "&action=search&search=" + urllib.quote_plus(search)  
407    
                 #print "[TODIC] Search start: " + search  
                 #print "[TODIC] Search url: " + url  
408    
409                  buildList(url, "søgning")  def searchSeries():
410        search = getUserInput("Todic Serie Søgning")
411    
412                if (search != None and search != ""):
413            url = __backend__ + "&action=searchseries&search=" + \
414                urllib.quote_plus(search)
415    
416            # print "[Todic] Search start: " + search
417            # print "[Todic] Search url: " + url
418    
419                            buildList(url, "serie søgning")
420  #=================================== Tool Box =======================================  
421    
422    #=================================== Tool Box =======================================
423  # shows a more userfriendly notification  # shows a more userfriendly notification
424  def showMessage(heading, message):  def showMessage(heading, message):
425          duration = 15*1000      duration = 15 * 1000
426          xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( heading, message, duration) )      xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
427                            (heading, message, duration))
428    
429    
430  # raise a keyboard for user input  # raise a keyboard for user input
431  def getUserInput(title = "Input", default="", hidden=False):  def getUserInput(title="Input", default="", hidden=False):
432          result = None      result = None
433    
434        # Fix for when this functions is called with default=None
435        if not default:
436            default = ""
437    
438        keyboard = xbmc.Keyboard(default, title)
439        keyboard.setHiddenInput(hidden)
440        keyboard.doModal()
441    
442        if keyboard.isConfirmed():
443            result = keyboard.getText()
444    
445          # Fix for when this functions is called with default=None      return result
         if not default:  
                 default = ""  
                           
         keyboard = xbmc.Keyboard(default, title)  
         keyboard.setHiddenInput(hidden)  
         keyboard.doModal()  
                   
         if keyboard.isConfirmed():  
                 result = keyboard.getText()  
                   
         return result  
446    
447    
448  def get_params():  def get_params():
449          param=[]      return parse_parameter_string(sys.argv[2])
450          paramstring=sys.argv[2]  
451          if len(paramstring)>=2:  
452                  params=sys.argv[2]  def parse_parameter_string(paramstring):
453                  cleanedparams=params.replace('?','')      param = []
454                  if (params[len(params)-1]=='/'):      if len(paramstring) >= 2:
455                          params=params[0:len(params)-2]          params = paramstring
456                  pairsofparams=cleanedparams.split('&')          cleanedparams = params.replace('?', '')
457                  param={}          if (params[len(params) - 1] == '/'):
458                  for i in range(len(pairsofparams)):              params = params[0:len(params) - 2]
459                          splitparams={}          pairsofparams = cleanedparams.split('&')
460                          splitparams=pairsofparams[i].split('=')          param = {}
461                          if (len(splitparams))==2:          for i in range(len(pairsofparams)):
462                                  param[splitparams[0]]=splitparams[1]                                                  splitparams = {}
463          return param              splitparams = pairsofparams[i].split('=')
464                if (len(splitparams)) == 2:
465                    param[splitparams[0]] = splitparams[1]
466        return param
467    
 params = get_params()  
 url = None  
 name = None  
 mode = None  
468    
469  params = get_params()  params = get_params()
470  url = None  url = None
471  name = None  name = None
472  mode = None  mode = None
473    
474    
475    #print params
476    
477  try:  try:
478          url = urllib.unquote_plus(params["url"])      url = urllib.unquote_plus(params["url"])
479  except:  except:
480          pass      pass
481  try:  try:
482          name = urllib.unquote_plus(params["name"])      name = urllib.unquote_plus(params["name"])
483  except:  except:
484          pass      pass
485  try:  try:
486          mode = int(params["mode"])      mode = int(params["mode"])
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 == 10:  
         search()  
           
492    
493  elif mode == 50:  try:
494          play_video(url, name)      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    
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)

Legend:
Removed from v.1649  
changed lines
  Added in v.3250

  ViewVC Help
Powered by ViewVC 1.1.20