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

Legend:
Removed from v.1633  
changed lines
  Added in v.3147

  ViewVC Help
Powered by ViewVC 1.1.20