/[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 1676 by torben, Mon Jan 2 20:51:02 2012 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    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):  class TodicPlayer(xbmc.Player):
114          def __init__(self, *args, **kwargs):  
115                  #xbmc.Player.__init__(selv,*args,**kwargs)      def __init__(self, *args, **kwargs):
116                  xbmc.Player.__init__(self, xbmc.PLAYER_CORE_MPLAYER )          # xbmc.Player.__init__(selv,*args,**kwargs)
117                  self.stopped = False          xbmc.Player.__init__(self)
118                  self.started = False          self.stopped = False
119                  print "[TodicPlayer] init"          self.started = False
120            self.playingPosition = 0.0
121  #       @catchall                self.lastReport = 0
122          def onPlayBackStarted(self):          print( "[TodicPlayer] init")
123                  self.started = True  
124                  print "[TodicPlayer] : started"      def onPlayBackStarted(self):
125  #               super.onPlayBackStarted()          self.started = True
126            print( "[TodicPlayer] : started")
127          def onPlayBackStopped(self):  
128                  self.stopped = True      #When user presses stop, we report back the the position registered in the last call to self.tick()
129                  print "[TodicPlayer] : stopped"      def onPlayBackStopped(self):
130            self.stopped = True
131          def onPlayBackEnded(self):          print( "[TodicPlayer] : stopped")
132                  self.stopped = True          self.reportPlaytime("stopped")
133                  print "[TodicPlayer] : ended"  
134        def onPlayBackPaused(self):
135          def callbackLoop(self):          print( "[TodicPlayer] : paused")
136                  print "[Todic] startLoop"          self.reportPlaytime("paused")
137                  while (self.stopped == False):  
138                          if (self.started == True ):      def onPlayBackResumed(self):
139                                  print "[todic] " + str(self.getTime())          print( "[TodicPlayer] : resumed")
140                          xbmc.sleep(5000)          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):  def open_url(url):
199          req = urllib2.Request(url)      req = urllib2.Request(url)
200          content = urllib2.urlopen(req)      content = urllib2.urlopen(req)
201          data = content.read()      data = content.read()
202          content.close()      content.close()
203          return data      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():  def rootMenu():
217    
218          buildList(__backend__, "", False) # call default list      msg = open_url(__backend__ + "&action=messages")
219        msg = msg.strip()
220    
221          # Adde xtra items to root menu      if msg != "":
222          listitem = xbmcgui.ListItem(label = "Søg film ...", iconImage = 'DefaultFolder.png', thumbnailImage = 'DefaultFolder.png')          dialog = xbmcgui.Dialog()
223          listitem.setProperty('Fanart_Image', fanartImage)          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          u = sys.argv[0] + "?mode=10&name="      if (endlist == True):
299          ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = True)          xbmcplugin.endOfDirectory(int(sys.argv[1]))
300    
         xbmcplugin.endOfDirectory(int(sys.argv[1]))  
301    
302    def play_video(url, name):
303        description = ""
304        playPosition = 0
305        savedPosition = 0
306        try:
307            param1 = parse_parameter_string(url)
308            clipkey = param1["clipkey"]
309    
310  def buildList(url,title, endlist=True):          print( "[Todic] ClipKey:" + clipkey)
311          print '[TODIC]:'+str(url)                  detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey
312          link = open_url(url)          print( "[Todic] detailURL = " + detailurl)
         ty=re.compile('<meta type=\'(.+?)\'').findall(link)  
         print '[TODIC]'+str(ty[0])  
313    
314          if ty[0] == 'clipList':          xml = open_url(detailurl)
                 mode = '50'  
                 folder = False  
         else:  
                 mode = '1'  
                 folder = True  
315    
316          m=re.compile('<title>(.+?)</title><url>(.+?)</url><cover>(.+?)</cover><description>(.*)</description>').findall(link)          clipDetailsDoc = parseString(xml)
317          l=len(m)          savedPosition = int( getText(clipDetailsDoc.getElementsByTagName("position")) )
318          for name,url,thumb,description in m:                                  description = getText(clipDetailsDoc.getElementsByTagName("description"))
319        except:
320                  listitem = xbmcgui.ListItem(label = name, label2='test', iconImage = 'DefaultFolder.png', thumbnailImage = thumb)          print( "[Todic] Unexpected error:", sys.exc_info()[0] )
                 listitem.setProperty('Fanart_Image', fanartImage)  
                 if mode == '50':  
                         infoLabels = {}  
                         infoLabels['title'] = name  
                         infoLabels['plot'] = description          
                         listitem.setInfo('video', infoLabels)  
321    
322                  u = sys.argv[0] + "?mode=" + urllib.quote_plus(mode) + "&name=" + urllib.quote_plus(name) + "&url=" + urllib.quote_plus(url)      if (description == None or description == ""):
323                  ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = folder, totalItems = l)          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          if (endlist == True):        else:
333                  xbmcplugin.endOfDirectory(int(sys.argv[1]))          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  def play_video(url, name):      doc = parseString(xml)
349          link = open_url(url)      url = getText(doc.getElementsByTagName("url"))
350          match=re.compile('<url>(.+?)</url>').findall(link)  
351          url = match[0]      subtitleurl = getText(doc.getElementsByTagName("subtitles"))
352          print '[TODIC]:'+str(url)  
353          image = xbmc.getInfoImage( 'ListItem.Thumb' )  
354          listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = image)      print( '[Todic] subs: ' + str(subtitleurl) )
355  #       listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = 'DefaultVideo.png')  
356          listitem.setInfo( type = "Video", infoLabels={ "Title": name } )      image = xbmc.getInfoImage('ListItem.Thumb')
357  #       xbmc.Player(xbmc.PLAYER_CORE_AUTO).play(str(url), listitem)      listitem = xbmcgui.ListItem(
358            label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
359          player = TodicPlayer(xbmc.PLAYER_CORE_AUTO)      listitem.setInfo(type="Video", infoLabels={"Title": name})
360          player.play(str(url), listitem)      listitem.setProperty('ResumeTime', '300')
361          player.callbackLoop()      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.1676  
changed lines
  Added in v.3250

  ViewVC Help
Powered by ViewVC 1.1.20