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

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

  ViewVC Help
Powered by ViewVC 1.1.20