/[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 1799 by torben, Sun May 6 16:21:11 2012 UTC revision 3037 by torben, Mon May 30 20:26:56 2016 UTC
# Line 3  Line 3 
3    
4  '''  '''
5      Todic plugin for XBMC      Todic plugin for XBMC
6      Version 0.0.2      Version 0.0.15
7  '''  '''
8    
9  import sys  import sys
 import cgi as urlparse  
10  import os  import os
11    
12    
# Line 18  import xbmcplugin Line 17  import xbmcplugin
17  import urllib  import urllib
18  import urllib2  import urllib2
19    
20    # import pprint
21    
22  from xml.dom.minidom import parseString  from xml.dom.minidom import parseString
23    
24  __addon__ = xbmcaddon.Addon(id='plugin.video.todic')  __addon__ = xbmcaddon.Addon(id='plugin.video.todic')
25  __key__ = __addon__.getSetting('xbmckey').lower()  __key__ = __addon__.getSetting('xbmckey').lower()
26  __backend__ = "http://todic.dk/xbmc.php?xbmckey=" + __key__  __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__
27  fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'fanart.jpg')  fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'movie_bg_blur.jpg')
28    datapath = xbmc.translatePath(
29        'special://profile/addon_data/plugin.video.todic/')
30    
31    ADDON_PATH = __addon__.getAddonInfo('path')
32    SkinMasterPath = os.path.join(ADDON_PATH, 'skins') + '/'
33    MySkinPath = (os.path.join(SkinMasterPath, '720p')) + '/'
34    MySkin = 'main.xml'
35    
 class TodicPlayer(xbmc.Player):  
         def __init__(self, *args, **kwargs):  
                 #xbmc.Player.__init__(selv,*args,**kwargs)  
                 xbmc.Player.__init__(self, xbmc.PLAYER_CORE_MPLAYER )  
                 self.stopped = False  
                 self.started = False  
                 print "[TodicPlayer] init"  
   
 #       @catchall        
         def onPlayBackStarted(self):  
                 self.started = True  
                 print "[TodicPlayer] : started"  
 #               super.onPlayBackStarted()  
36    
37          def onPlayBackStopped(self):  class TodicMovieDialog(xbmcgui.WindowXMLDialog):
                 self.stopped = True  
                 print "[TodicPlayer] : stopped"  
   
         def onPlayBackEnded(self):  
                 self.stopped = True  
                 print "[TodicPlayer] : ended"  
   
         def callbackLoop(self):  
                 print "[Todic] startLoop"  
                 while (self.stopped == False):  
                         if (self.started == True ):  
                                 print "[todic] " + str(self.getTime())  
                         xbmc.sleep(5000)  
                           
38    
39  def getText2(nodelist):      def __new__(cls):
40          rc = []          return super(TodicMovieDialog, cls).__new__(cls, "main.xml", ADDON_PATH)
         for node in nodelist:  
                 if node.nodeType == node.TEXT_NODE:  
                         rc.append(node.data)  
                 else:  
                         rc.append( getText(node.childNodes) )  
         return ''.join(rc)  
41    
42  def getText(nodelist):      def __init__(self):
43          if nodelist.length == 0:          super(TodicMovieDialog, self).__init__()
                 return ''  
         else:  
                 if nodelist[0].childNodes.length == 0:  
                         return ''  
                 else:  
                         return nodelist[0].childNodes[0].nodeValue  
44    
45        def onClick(self, controlId):
46            print "OnClick: " + str(controlId)
47    
48  def open_url(url):          if (controlId == 50):
49          req = urllib2.Request(url)              self.close()
50          content = urllib2.urlopen(req)              play_real_video(self.url, self.name)
         data = content.read()  
         content.close()  
         return data  
51    
52  def rootMenu():          if (controlId == 98):
53                self.close()
54    
55          msg = open_url(__backend__ + "&action=messages")      def onInit(self):
         msg = msg.strip()  
56    
57          if msg != "":          print "ONINIT"
58                  dialog = xbmcgui.Dialog()                        self.getControl(1).setLabel(self.name)
59                  dialog.ok('XBMC Todic', msg)          self.getControl(2).setLabel(self.moviegroups)
60            self.getControl(3).setLabel(self.description)
61            self.getControl(10).setLabel(self.playlength)
62            self.getControl(11).setLabel(self.codecdetails)
63    
64          buildList(__backend__, "", False) # call default list          orig_img_width = self.getControl(40).getWidth()
65            self.starwidth = (float(self.imdbrating) / 10.0) * orig_img_width
66            self.getControl(40).setWidth(int(self.starwidth))
67    
68          # Adde xtra items to root menu      def setUrl(self, url):
69          listitem = xbmcgui.ListItem(label = "Søg film ...", iconImage = 'DefaultFolder.png', thumbnailImage = 'DefaultFolder.png')          print "SETURL:" + url
70          listitem.setProperty('Fanart_Image', fanartImage)          self.url = url
71            self.fetchClipDetails()
72    
73          u = sys.argv[0] + "?mode=10&name="      def fetchClipDetails(self):
74          ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = True)          param1 = parse_parameter_string(self.url)
75    
76          xbmcplugin.endOfDirectory(int(sys.argv[1]))          self.clipkey = param1["clipkey"]
77            print "CLIPKEY:" + self.clipkey
78            detailurl = __backend__ + "&action=clipdetails&clipkey=" + self.clipkey
79    
80            xml = open_url(detailurl)
81    
82  def buildList(url,title, endlist=True):          doc = parseString(xml)
83          print '[TODIC]:'+str(url)                  self.imdbrating = getText(doc.getElementsByTagName("imdbrating"))
84            self.moviegroups = getText(doc.getElementsByTagName("moviegroups"))
85            self.playlength = getText(doc.getElementsByTagName("playlength"))
86            self.codecdetails = getText(doc.getElementsByTagName("codecdetails"))
87    
88          link = open_url(url)      def setName(self, name):
89          doc = parseString(link)          self.name = name
         ty = doc.getElementsByTagName("meta")[0].getAttribute("type")  
         print '[TODIC]'+str(ty)  
90    
91          if ty == 'clipList':      def setDescription(self, description):
92                  mode = '50'          self.description = description
                 folder = False  
         else:  
                 mode = '1'  
                 folder = True  
93    
         entries = doc.getElementsByTagName("entry")  
         l=len(entries)  
         description = ''  
         for entry in entries:  
                 name =  getText( entry.getElementsByTagName("title") )  
                 url =  getText( entry.getElementsByTagName("url") )  
                 thumb = getText( entry.getElementsByTagName("cover") )  
                 description = getText( entry.getElementsByTagName("description") )  
94    
95                  name = name.encode('latin-1')  class TodicPlayer(xbmc.Player):
                 description = description.encode('latin-1')  
96    
97  ##              print "name:" + name      def __init__(self, *args, **kwargs):
98  #               print "url:" + url          # xbmc.Player.__init__(selv,*args,**kwargs)
99  #               print "thumb:" + thumb          xbmc.Player.__init__(self, xbmc.PLAYER_CORE_MPLAYER)
100  #               print "description:" + description          self.stopped = False
101            self.started = False
102            print "[TodicPlayer] init"
103    
104    #       @catchall
105        def onPlayBackStarted(self):
106            self.started = True
107            print "[TodicPlayer] : started"
108    #               super.onPlayBackStarted()
109    
110        def onPlayBackStopped(self):
111            self.stopped = True
112            print "[TodicPlayer] : stopped"
113    
114        def onPlayBackEnded(self):
115            self.stopped = True
116            print "[TodicPlayer] : ended"
117    
118        def callbackLoop(self):
119            print "[Todic] startLoop"
120            while (self.stopped == False):
121                if (self.started == True):
122                    print "[todic] " + str(self.getTime())
123                xbmc.sleep(5000)
124    
                 listitem = xbmcgui.ListItem(label = name, label2='test', iconImage = 'DefaultFolder.png', thumbnailImage = thumb)  
                 listitem.setProperty('Fanart_Image', fanartImage)  
                 if mode == '50':  
                         infoLabels = {}  
                         infoLabels['title'] = name  
                         infoLabels['plot'] = description          
                         listitem.setInfo('video', infoLabels)  
125    
126                  u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(name) + "&url=" + urllib.quote(url)  def getText2(nodelist):
127                  ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = folder, totalItems = l)      rc = []
128        for node in nodelist:
129            if node.nodeType == node.TEXT_NODE:
130                rc.append(node.data)
131            else:
132                rc.append(getText(node.childNodes))
133        return ''.join(rc)
134    
         if (endlist == True):    
                 xbmcplugin.endOfDirectory(int(sys.argv[1]))  
135    
136    def getText(nodelist):
137        if nodelist.length == 0:
138            return ''
139        else:
140            if nodelist[0].childNodes.length == 0:
141                return ''
142            else:
143                return nodelist[0].childNodes[0].nodeValue
144    
145    
146    def SaveFile(path, data):
147        file = open(path, 'w')
148        file.write(data)
149        file.close()
150    
 def play_video(url, name):  
         xml = open_url(url)  
151    
152          doc = parseString(xml)  def open_url(url):
153          url = getText( doc.getElementsByTagName("url") )      req = urllib2.Request(url)
154        content = urllib2.urlopen(req)
155        data = content.read()
156        content.close()
157        return data
158    
         print '[TODIC]:'+str(url)  
         image = xbmc.getInfoImage( 'ListItem.Thumb' )  
         listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = image)  
         listitem.setInfo( type = "Video", infoLabels={ "Title": name } )  
159    
160          player = TodicPlayer(xbmc.PLAYER_CORE_AUTO)  def rootMenu():
161          player.play(str(url), listitem)  
162  #       player.callbackLoop()      msg = open_url(__backend__ + "&action=messages")
163        msg = msg.strip()
164    
165        if msg != "":
166            dialog = xbmcgui.Dialog()
167            dialog.ok('XBMC Todic', msg)
168    
169        buildList(__backend__, "", False)  # call default list
170    
171        # Adde xtra items to root menu
172        listitem = xbmcgui.ListItem(
173            label="Søg film ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
174        listitem.setProperty('Fanart_Image', fanartImage)
175    
176        u = sys.argv[0] + "?mode=10&name="
177        xbmcplugin.addDirectoryItem(
178            handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
179    
180        # add search series
181        listitem = xbmcgui.ListItem(
182            label="Søg Serier ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')
183        listitem.setProperty('Fanart_Image', fanartImage)
184    
185        u = sys.argv[0] + "?mode=11&name="
186        xbmcplugin.addDirectoryItem(
187            handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
188    
189        xbmcplugin.endOfDirectory(int(sys.argv[1]))
190    
191    
192    def buildList(url, title, endlist=True):
193        print '[TODIC]:' + str(url)
194    
195        link = open_url(url)
196        doc = parseString(link)
197        ty = doc.getElementsByTagName("meta")[0].getAttribute("type")
198        print '[TODIC]' + str(ty)
199    
200        if ty == 'clipList':
201            mode = '50'
202            folder = False
203        else:
204            mode = '1'
205            folder = True
206    
207        entries = doc.getElementsByTagName("entry")
208        l = len(entries)
209        description = ''
210        for entry in entries:
211            name = getText(entry.getElementsByTagName("title"))
212            url = getText(entry.getElementsByTagName("url"))
213            thumb = getText(entry.getElementsByTagName("cover"))
214            description = getText(entry.getElementsByTagName("description"))
215            playcount = getText(entry.getElementsByTagName("playcount"))
216    
217            if playcount == '':
218                playcount = '0'
219            playcount = int(playcount)
220    
221    # print "name:" + name
222    #               print "url:" + url
223    #               print "thumb:" + thumb
224    #               print "description:" + description
225            listitem = xbmcgui.ListItem(
226                label=name, label2='test', iconImage='DefaultFolder.png', thumbnailImage=thumb)
227            listitem.setProperty('Fanart_Image', fanartImage)
228            if mode == '50':
229                infoLabels = {}
230                infoLabels['title'] = name
231                infoLabels['plot'] = description
232                infoLabels['playcount'] = playcount
233                listitem.setInfo('video', infoLabels)
234    
235            name = name.encode('UTF-8')
236            description = description.encode('UTF-8')
237    
238            u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(
239                name) + "&url=" + urllib.quote(url) + "&description=" + urllib.quote(description)
240            xbmcplugin.addDirectoryItem(
241                handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
242    
243        if (endlist == True):
244            xbmcplugin.endOfDirectory(int(sys.argv[1]))
245    
246    
247    def play_video(url, name, description):
248        if (description == None or description == ""):
249            play_real_video(url, name)
250        else:
251            d = TodicMovieDialog()
252            d.setUrl(url)
253            d.setName(name)
254            d.setDescription(description)
255    
256            d.doModal()
257    
258    
259    def play_real_video(url, name):
260        xml = open_url(url)
261        print 'TODIC url: ' + str(url)
262        print 'TODIC xml: ' + xml
263    
264        doc = parseString(xml)
265        url = getText(doc.getElementsByTagName("url"))
266    
267        subtitleurl = getText(doc.getElementsByTagName("subtitles"))
268        subtitlesfile = os.path.join(datapath, 'temp.srt')
269    
270        # if old srt file exists delete it first
271        if os.path.isfile(subtitlesfile):
272            os.unlink(subtitlesfile)
273    
274        print '[TODIC] subs: ' + str(subtitleurl)
275        if len(subtitleurl) > 0:
276            subtitles = open_url(subtitleurl)
277            SaveFile(subtitlesfile, subtitles)
278            print 'TODIC downloaded subtitles'
279    
280        image = xbmc.getInfoImage('ListItem.Thumb')
281        listitem = xbmcgui.ListItem(
282            label=name, iconImage='DefaultVideo.png', thumbnailImage=image)
283        listitem.setInfo(type="Video", infoLabels={"Title": name})
284    
285        player = TodicPlayer(xbmc.PLAYER_CORE_AUTO)
286        player.play(str(url), listitem)
287    
288        # kan ikke loade subtitles hvis foerend playeren koerer
289        count = 0
290        while not xbmc.Player().isPlaying():
291            xbmc.sleep(500)
292            count += 1
293            if count > 10:
294                break
295    
296        if xbmc.Player().isPlaying():
297            if os.path.isfile(subtitlesfile):
298                player.setSubtitles(subtitlesfile)
299                print 'TODIC started subtitles'
300            else:
301                player.disableSubtitles()
302    
303    #       player.callbackLoop()
304    
305    
306  def search():  def search():
307          search = getUserInput("Todic Søgning")      search = getUserInput("Todic Søgning")
308    
309        if (search != None and search != ""):
310            url = __backend__ + "&action=search&search=" + \
311                urllib.quote_plus(search)
312    
313            # print "[TODIC] Search start: " + search
314            # print "[TODIC] Search url: " + url
315    
316            buildList(url, "søgning")
317    
         if (search != None and search != ""):  
                 url = __backend__ + "&action=search&search=" + urllib.quote_plus(search)  
318    
319                  #print "[TODIC] Search start: " + search  def searchSeries():
320                  #print "[TODIC] Search url: " + url      search = getUserInput("Todic Serie Søgning")
321    
322                  buildList(url, "søgning")      if (search != None and search != ""):
323            url = __backend__ + "&action=searchseries&search=" + \
324                urllib.quote_plus(search)
325    
326                    # print "[TODIC] Search start: " + search
327            # print "[TODIC] Search url: " + url
328    
329            buildList(url, "serie søgning")
330    
331                    
332  #=================================== Tool Box =======================================  #=================================== Tool Box =======================================
333  # shows a more userfriendly notification  # shows a more userfriendly notification
334  def showMessage(heading, message):  def showMessage(heading, message):
335          duration = 15*1000      duration = 15 * 1000
336          xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( heading, message, duration) )      xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
337                            (heading, message, duration))
338    
339    
340  # raise a keyboard for user input  # raise a keyboard for user input
341  def getUserInput(title = "Input", default="", hidden=False):  def getUserInput(title="Input", default="", hidden=False):
342          result = None      result = None
343    
344        # Fix for when this functions is called with default=None
345        if not default:
346            default = ""
347    
348        keyboard = xbmc.Keyboard(default, title)
349        keyboard.setHiddenInput(hidden)
350        keyboard.doModal()
351    
352          # Fix for when this functions is called with default=None      if keyboard.isConfirmed():
353          if not default:          result = keyboard.getText()
354                  default = ""  
355                                return result
         keyboard = xbmc.Keyboard(default, title)  
         keyboard.setHiddenInput(hidden)  
         keyboard.doModal()  
                   
         if keyboard.isConfirmed():  
                 result = keyboard.getText()  
                   
         return result  
356    
357    
358  def get_params():  def get_params():
359          param=[]      return parse_parameter_string(sys.argv[2])
360          paramstring=sys.argv[2]  
361          if len(paramstring)>=2:  
362                  params=sys.argv[2]  def parse_parameter_string(paramstring):
363                  cleanedparams=params.replace('?','')      param = []
364                  if (params[len(params)-1]=='/'):      if len(paramstring) >= 2:
365                          params=params[0:len(params)-2]          params = paramstring
366                  pairsofparams=cleanedparams.split('&')          cleanedparams = params.replace('?', '')
367                  param={}          if (params[len(params) - 1] == '/'):
368                  for i in range(len(pairsofparams)):              params = params[0:len(params) - 2]
369                          splitparams={}          pairsofparams = cleanedparams.split('&')
370                          splitparams=pairsofparams[i].split('=')          param = {}
371                          if (len(splitparams))==2:          for i in range(len(pairsofparams)):
372                                  param[splitparams[0]]=splitparams[1]                                                  splitparams = {}
373          return param              splitparams = pairsofparams[i].split('=')
374                if (len(splitparams)) == 2:
375                    param[splitparams[0]] = splitparams[1]
376        return param
377    
378    
379  params = get_params()  params = get_params()
380  url = None  url = None
381  name = None  name = None
382  mode = None  mode = None
383    description = None
384    
385  try:  try:
386          url = urllib.unquote_plus(params["url"])      url = urllib.unquote_plus(params["url"])
387  except:  except:
388          pass      pass
389  try:  try:
390          name = urllib.unquote_plus(params["name"])      name = urllib.unquote_plus(params["name"])
391  except:  except:
392          pass      pass
393  try:  try:
394          mode = int(params["mode"])      mode = int(params["mode"])
395  except:  except:
396          pass      pass
397    try:
398        description = urllib.unquote_plus(params["description"])
399    except:
400        pass
401    
402    try:
403        open_url("http://todic.dk")
404    except:
405        showMessage("Fejl", "Kunne ikke forbinde til todic.dk")
406        exit()
407    
 if mode == None:  
         #build main menu  
         rootMenu()  
         
 elif mode == 1:  
         #build list of movie starting letters  
         buildList(url, name)  
408    
409  elif mode == 10:  if url == 'refresh':
410          search()      # xbmc.output("[tvserver] Container.Refresh") #20130418 xbmc.output virker
411                # ikke med XBMC12
412        xbmc.executebuiltin("Container.Refresh")
413    
 elif mode == 50:  
         play_video(url, name)  
414    
415    elif mode == None:
416        # build main menu
417        rootMenu()
418    
419    elif mode == 1:
420        # build list of movie starting letters
421        buildList(url, name)
422    
423    elif mode == 10:
424        search()
425    
426    elif mode == 11:
427        searchSeries()
428    
429    
430    elif mode == 50:
431        play_video(url, name, description)

Legend:
Removed from v.1799  
changed lines
  Added in v.3037

  ViewVC Help
Powered by ViewVC 1.1.20