# This Python file uses the following encoding: utf-8 ''' Todic plugin for XBMC Version 0.0.8 ''' import sys import cgi as urlparse import os import xbmc import xbmcaddon import xbmcgui import xbmcplugin import urllib import urllib2 from xml.dom.minidom import parseString __addon__ = xbmcaddon.Addon(id='plugin.video.todic') __key__ = __addon__.getSetting('xbmckey').lower() __backend__ = "http://todic.dk/xbmc.php?xbmckey=" + __key__ fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'fanart.jpg') datapath = xbmc.translatePath('special://profile/addon_data/plugin.video.todic/') 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() def onPlayBackStopped(self): 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) def getText2(nodelist): rc = [] for node in nodelist: if node.nodeType == node.TEXT_NODE: rc.append(node.data) else: rc.append( getText(node.childNodes) ) return ''.join(rc) def getText(nodelist): if nodelist.length == 0: return '' else: if nodelist[0].childNodes.length == 0: return '' else: return nodelist[0].childNodes[0].nodeValue def SaveFile(path, data): file = open(path,'w') file.write(data) file.close() def open_url(url): req = urllib2.Request(url) content = urllib2.urlopen(req) data = content.read() content.close() return data def rootMenu(): msg = open_url(__backend__ + "&action=messages") msg = msg.strip() if msg != "": dialog = xbmcgui.Dialog() dialog.ok('XBMC Todic', msg) buildList(__backend__, "", False) # call default list # Adde xtra items to root menu listitem = xbmcgui.ListItem(label = "Søg film ...", iconImage = 'DefaultFolder.png', thumbnailImage = 'DefaultFolder.png') listitem.setProperty('Fanart_Image', fanartImage) u = sys.argv[0] + "?mode=10&name=" ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = True) xbmcplugin.endOfDirectory(int(sys.argv[1])) def buildList(url,title, endlist=True): print '[TODIC]:'+str(url) link = open_url(url) doc = parseString(link) ty = doc.getElementsByTagName("meta")[0].getAttribute("type") print '[TODIC]'+str(ty) if ty == 'clipList': mode = '50' folder = False else: mode = '1' folder = True 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") ) playcount = getText( entry.getElementsByTagName("playcount") ) if playcount == '': playcount = '0' playcount = int(playcount) ## print "name:" + name # print "url:" + url # print "thumb:" + thumb # print "description:" + description 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 infoLabels['playcount'] = playcount listitem.setInfo('video', infoLabels) name = name.encode('UTF-8') description = description.encode('UTF-8') u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(name) + "&url=" + urllib.quote(url) ok = xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]), url = u, listitem = listitem, isFolder = folder, totalItems = l) if (endlist == True): xbmcplugin.endOfDirectory(int(sys.argv[1])) def play_video(url, name): xml = open_url(url) print 'TODIC url: ' + str(url) print 'TODIC xml: '+ xml doc = parseString(xml) url = getText( doc.getElementsByTagName("url") ) subtitleurl = getText( doc.getElementsByTagName("subtitles") ) subtitlesfile = os.path.join(datapath,'temp.srt') #if old srt file exists delete it first if os.path.isfile(subtitlesfile): os.unlink(subtitlesfile) print '[TODIC] subs: '+str(subtitleurl) if len(subtitleurl) > 0: subtitles = open_url(subtitleurl) SaveFile(subtitlesfile, subtitles) print 'TODIC downloaded subtitles' image = xbmc.getInfoImage( 'ListItem.Thumb' ) listitem = xbmcgui.ListItem(label = name , iconImage = 'DefaultVideo.png', thumbnailImage = image) listitem.setInfo( type = "Video", infoLabels={ "Title": name } ) player = TodicPlayer(xbmc.PLAYER_CORE_AUTO) player.play(str(url), listitem) #kan ikke loade subtitles hvis foerend playeren koerer count = 0 while not xbmc.Player().isPlaying(): xbmc.sleep(500) count += 1 if count > 10: break if xbmc.Player().isPlaying(): if os.path.isfile(subtitlesfile): player.setSubtitles(subtitlesfile) print 'TODIC started subtitles' else: player.disableSubtitles() # player.callbackLoop() def search(): search = getUserInput("Todic Søgning") if (search != None and search != ""): url = __backend__ + "&action=search&search=" + urllib.quote_plus(search) #print "[TODIC] Search start: " + search #print "[TODIC] Search url: " + url buildList(url, "søgning") #=================================== Tool Box ======================================= # shows a more userfriendly notification def showMessage(heading, message): duration = 15*1000 xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( heading, message, duration) ) # raise a keyboard for user input def getUserInput(title = "Input", default="", hidden=False): result = None # Fix for when this functions is called with default=None if not default: default = "" keyboard = xbmc.Keyboard(default, title) keyboard.setHiddenInput(hidden) keyboard.doModal() if keyboard.isConfirmed(): result = keyboard.getText() return result def get_params(): param=[] paramstring=sys.argv[2] if len(paramstring)>=2: params=sys.argv[2] cleanedparams=params.replace('?','') if (params[len(params)-1]=='/'): params=params[0:len(params)-2] pairsofparams=cleanedparams.split('&') param={} for i in range(len(pairsofparams)): splitparams={} splitparams=pairsofparams[i].split('=') if (len(splitparams))==2: param[splitparams[0]]=splitparams[1] return param params = get_params() url = None name = None mode = None try: url = urllib.unquote_plus(params["url"]) except: pass try: name = urllib.unquote_plus(params["name"]) except: pass try: mode = int(params["mode"]) except: pass if url == 'refresh': xbmc.output("[tvserver] Container.Refresh") xbmc.executebuiltin("Container.Refresh") elif mode == None: #build main menu rootMenu() elif mode == 1: #build list of movie starting letters buildList(url, name) elif mode == 10: search() elif mode == 50: play_video(url, name)