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

Legend:
Removed from v.1629  
changed lines
  Added in v.3142

  ViewVC Help
Powered by ViewVC 1.1.20