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

Legend:
Removed from v.1676  
changed lines
  Added in v.3259

  ViewVC Help
Powered by ViewVC 1.1.20