⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chn_class.py

📁 XOT: XBMC Online TV Framework
💻 PY
📖 第 1 页 / 共 3 页
字号:
            _folders = common.DoRegexFindAll(self.folderItemRegex, _data)
            for _folder in _folders:
                _folderItems.append(self.CreateFolderItem(_folder))
            
        # sort by name
        _folderItems.sort(lambda x, y: cmp(x.name.lower(), y.name.lower()))
        
        # now process video items
        if not self.videoItemRegex =='':
            _videos = common.DoRegexFindAll(self.videoItemRegex, _data)
            for _video in _videos:
                _videoItems.append(self.CreateVideoItem(_video))
        
        # sort by name (don't do it, because of date. Could be re-written
        # to do so
        # _videoItems.sort(lambda x, y: cmp(x.name,y.name))
        
        return _preItems + _folderItems + _videoItems

    #==============================================================================
    def CreateFolderItem(self, resultSet):
        """
        Accepts an arraylist of results. It returns an item. 
        """
        logFile.debug('starting CreateFolderItem for %s', self.channelName)
        
        item = common.clistItem("No CreateFolderItem Implented!", "")
        item.complete = True
        return item
    
    #============================================================================= 
    def CreateVideoItem(self, resultSet):
        """
        Accepts an arraylist of results. It returns an item. 
        """
        logFile.debug('starting CreateVideoItem for %s', self.channelName)
        
        item = common.clistItem("No CreateVideoItem Implented!", "")
        item.complete = True
        return item
        
    #============================================================================= 
    def UpdateVideoItem(self, item):
        """
        Accepts an item. It returns an updated item. Usually retrieves the MediaURL 
        and the Thumb! It should return a completed item. 
        """
        logFile.info('starting UpdateVideoItem for %s (%s)', item.name, self.channelName)
        
        _data = uriHandler.Open(item.url, pb=False)

        item.mediaurl = common.DoRegexFindAll(self.mediaUrlRegex, _data)[-1]

        logFile.info('finishing UpdateVideoItem. Media url = %s', item.mediaurl)
        
        item.thumb = self.noImage
        if item.mediaurl == "":
            item.complete = False
        else:
            item.complete = True
        return item
        
    #==============================================================================
    def DownloadVideoItem(self, item):
        """ 
        Accepts an item and starts the download process
        """
        if item.mediaurl == '':
            logFile.error("Cannot download item without mediaurl")
            return
        if item.type != 'video':
            logFile.error("Cannot download a folder item.")
            return
        
        downloadUrl = item.mediaurl
        if downloadUrl.find(".divx"):
            saveFileName = "%s.divx" % (item.name)
        if downloadUrl.find(".flv"):
            saveFileName = "%s.flv" % (item.name)
        if downloadUrl.find(".avi"):
            saveFileName = "%s.avi" % (item.name)
        
        #saveFileName = uriHandler.CorrectFileName(saveFileName)
        uriHandler.Download(item.mediaurl, saveFileName)               
        
    #==============================================================================
    def DisplayFolderList(self, items, position):
        """ NOT USER EDITABLE
        Accepts an list of items and fills the windowlist. Clearing windows,
        Restore previous states and filling.
        """
        logFile.debug("DisplayFolderList needs to display %s items. \nFocussed is on item %s", len(items), position)
        self.clearList()
        
        if len(items)==0:
            logFile.debug("Adding Dummy Item")
            tmp = common.clistItem("No Files", "")
            tmp.complete = True
            tmp.thumb = self.noImage
            tmp.icon = self.icon
            items.append(tmp)
        
        # check if a progressbar is needed:
        pbEnabled = len(items) > self.progressBarItemLimit
        
        if pbEnabled:
            logFile.info("Using Progressbar to display %s items", len(items))
            percentagePerItem = 100.0/len(items)
            itemNr = 0
            progDialog = xbmcgui.DialogProgress()
            progDialog.create("Please Wait...", "Adding Items to list")
        for _item in items:
            tmp = xbmcgui.ListItem(_item.name, _item.date, _item.icon, _item.icon)
            self.addItem(tmp)
            if pbEnabled:
                itemNr = itemNr + 1
                progDialog.update(int(percentagePerItem * itemNr), "Adding Items to list", "Adding item %s of %s" % (itemNr, len(items)))
                if progDialog.iscanceled() == True:
                    break
        if pbEnabled:
            progDialog.close()
        
        self.setFocus(self.getControl(controls.EP_LIST))
        self.setCurrentListPosition(position)
        if not self.listItems[position].complete:
            _item = self.UpdateVideoItem(self.listItems[position])
            
            # if the mediaUrl is not filled: item is not complete (DOES NOT WORK WELL)
            if _item.mediaurl == "":
                _item.complete = False
                
            # check if the list has not changed during upate:
            if self.listItems[position].Equals(_item):
                logFile.info("Updating item (GUIDs match)")                
                self.listItems[position] = _item
            else:
                logFile.error("Aborting Update because of GUID mismatch")
        
        # if somehow the list focus was already changed, don't update 
        if self.getCurrentListPosition() == position:
            logFile.info("All items where shown. Now fetching focussed item info for item number %s", position)
            self.ShowData(self.listItems[position])
        
    #============================================================================== 
    def ShowData(self, item):
        """ NOT USER EDITABLE
        Accepts an item with URL set and get additional details for the folder item 
        """
        logFile.debug("Fetching info for '%s'. Setting:\nDescription: %s\nImage: %s", item.name, item.description.lstrip('\n'), item.thumb)
        text = item.description.lstrip('\n')
        self.getControl(controls.EP_DESCRIPTION).reset()
        self.getControl(controls.EP_DESCRIPTION).setText(text)
        self.getControl(controls.EP_THUMB).setImage(item.thumb)
        
        if item.complete and item.type=="video":
            self.getControl(controls.EP_COMPLETE).setVisible(True)
        else:
            self.getControl(controls.EP_COMPLETE).setVisible(False)
    
    #============================================================================== 
    def LogOn(self, *args):
        """
        Logs on to a website, using an url. Returns True on success
        """
        if not self.requiresLogon:
            logFile.info("No login required of %s", self.channelName)
            return True
        
        if self.loggedOn:
            logFile.info("Already logged in")
            return True
        
        _rtrn = False
        _passWord = args["userName"]
        _userName = args["passWord"]
        return _rtrn
    
    #============================================================================== 
    def ParseAsxAsf(self, url):
        """
        Parses an ASX/ASF and returns the real media url.
        """
        try:
            logFile.debug('Starting ASF/ASX Parsing for %s', url)
            _data = uriHandler.Open(url, pb=True)
            logFile.debug("Opened the ASF/ASX: \n%s", _data)
            _mediaUrl = common.DoRegexFindAll(self.asxAsfRegex, _data)
            logFile.debug("%s", _mediaUrl)
            _mediaUrl = _mediaUrl[0]
            logFile.info("Discovered ASX/ASF URL: %s", _mediaUrl)
        except:
            logFile.warning("Error Parsing the ASX/ASF", _mediaUrl, exc_info=True)
            # but give it a try anyway
            _mediaUrl = url
        
        return _mediaUrl
    
    #============================================================================== 
    def PlayVideoItem(self, item, player="defaultplayer"):
        """ NOT USER EDITABLE
        Accepts an item with or without MediaUrl and playback the item. If no 
        MediaUrl is present, one will be retrieved.
        """
        
        logFile.info("Starting Video Playback using the %s", player)
        try:
            logFile.info('opening '+ item.mediaurl)
            if player=="dvdplayer":
                logFile.info("Playing using DVDPlayer")
                xbmc.Player(xbmc.PLAYER_CORE_DVDPLAYER).play(item.mediaurl)
            elif player=="mplayer":
                logFile.info("Playing using Mplayer")
                xbmc.Player(xbmc.PLAYER_CORE_MPLAYER).play(item.mediaurl)
            else:
                logFile.info("Playing using default player")
                xbmc.Player(xbmc.PLAYER_CORE_AUTO).play(item.mediaurl)
        except:
            dialog = xbmcgui.Dialog()
            dialog.ok(config.appName, "Kan dit programma niet afspelen.")
            logFile.critical("Could not playback the url", exc_info=True)
    
	#============================================================================== 
    def GetImageLocation(self, image):
    	# check if image is present in skin-folder. If so, use that one, of not,
    	# us the local one
        if image == "":
            return ""
    	if not os.path.exists(os.path.join(config.rootDir, "skins", config.skinFolder, "media", image)):
    	 	image = os.path.join(config.rootDir, "channels", self.__module__.replace("chn_", ""), image)
    	return image
    
    #===============================================================================
    def CacheThumb(self, remoteImage):
        """
        Caches an image. Before calling, set the thumb to noImage in the channel
        """
        # check if already local:
        if remoteImage.find(":") < 2:
            return remoteImage
        
        logFile.debug("Caching url=%s", remoteImage)
        thumb = ""
        
        # get image
        localImageName = common.DoRegexFindAll('/([^/]*)$', remoteImage)[-1]
        # correct for fatx
        localImageName = uriHandler.CorrectFileName(localImageName)
        
        localCompletePath = os.path.join(config.cacheDir, localImageName)
        try:
            if os.path.exists(localCompletePath): #check cache
                    thumb = localCompletePath
            else: #  save them in cache folder
                    logFile.debug("Downloading thumb. Filename=%s", localImageName)
                    thumb = uriHandler.Download(remoteImage, localImageName, folder=config.cacheDir, pb=False)
        except:
            logFile.error("Error opening thumbfile!", exc_info=True)
        
        return thumb    
        
    #===============================================================================
    # properties        
    #===============================================================================
    def IsOutOfDate(self):
        """ NOT USER EDITABLE
            Compare the maxVersion of the channel (so the maximum version of XOT
            for which the channel was tested) against the current version of XOT.
            If the currentversion is higher, don't load the channel.
        """
        maxVersionSplit = common.DoRegexFindAll('^(\d{1,3})\.(\d{1,3})\.(\d{1,3})(([abAB])(\d{0,2}))*$', self.maxXotVersion)[0];
        xotVersionSplit = common.DoRegexFindAll('^(\d{1,3})\.(\d{1,3})\.(\d{1,3})(([abAB])(\d{0,2}))*$', config.version)[0];
        versions = (maxVersionSplit, xotVersionSplit)
        intVersions = []
        
        for version in versions:
            tmpVersion = "%s%s%s" % (version[0].rjust(3, '0'), version[1].rjust(3, '0'), version[2].rjust(3, '0'))
            # now the last part will be for the beta/alpha counting. Therefore we assume that if no beta/alpa is present
            # the last 3 digits are 999. If they are presents the digits are between 0-998
            if version[4]!="":
                if version[4]=='a':
                    tmpVersion = "%s%s" % (tmpVersion, "1")
                elif version[4]=='b':
                    tmpVersion = "%s%s" % (tmpVersion, "2")
                tmpVersion = "%s%s" % (tmpVersion, version[5].rjust(3, '0')) 
            else:
                tmpVersion = "%s99" % (tmpVersion)
            intVersions.append(tmpVersion)
                    
        if intVersions[0] < intVersions[1]:
            logFile.warning("%s has maxVersion %s and is to old for XOT version %s. (maxXot=%s, currentXot=%s)", self.channelName, self.maxXotVersion, config.version, intVersions[0], intVersions[1])
            return True
        else:
            return False 
    
    # register the property     
    OutOfDate = property(IsOutOfDate, doc='Check if channel is out of date')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -