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

📄 uriopener.py

📁 XOT: XBMC Online TV Framework
💻 PY
📖 第 1 页 / 共 2 页
字号:
import config
import os, sys, urllib2, cookielib, re, threading, socket, time
import xbmcgui
#import urllib

#===============================================================================
# Import logger
#===============================================================================
logFile = sys.modules['__main__'].globalLogFile

#===============================================================================
class UriHandler:
    def __init__(self):
        # set socket timeout in seconds
        #self.socketTimeOut = 5.0
        #socket.setdefaulttimeout(self.socketTimeOut)
        #logFile.debug("socket-Timeout: %s", socket.getdefaulttimeout())
        
        self.cj = cookielib.CookieJar()
        self.uriOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
        
        # change the user agent (thanks to VincePirez @ xbmc forums)
        self.user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 Alexa Toolbar"
        self.uriOpener.addheaders = [('User-Agent', self.user_agent)]
        
        self.defaultLocation = config.cacheDir
        self.pbAnimation = ["-","\\","|","/"]
        self.blockSize = (1024/4)#*8
        self.bytesToMB = 1048576
        self.inValidCharacters = "[^a-zA-Z0-9!#$%&'()-.@\[\]^_`{}]"
        logFile.info("UriHandler initialised")
        self.timerTimeOut = 2.0                     # used for the emergency canceler
        
        self.webTimeOutInterval = config.webTimeOut # max duration of request
        self.pollInterval = 0.1                     # time between polling of activity
                
    #===============================================================================
    def Download(self, uri, filename, folder="", pb=True ,params=""):    
        # assign things (PERHAPS CHECK FIRST IF NOT ASSIGNED)
        
        pbEnabled = pb
        pbTitle = ""
        pbLine1 = ""
        pbLine2 = ""
        if pbEnabled:
            uriPB = xbmcgui.DialogProgress()
        
        cancelled = False
        
        destFilename = self.CorrectFileName(filename)
        destFolder = folder
        
        blockMultiplier = 16*8 #to increase blockSize
                    
        # if no destination is given, get one via a dialog box
        if destFolder=="":
            dialog = xbmcgui.Dialog()
            destFolder = dialog.browse(3, 'Select download destination', 'files', '', False, False, self.defaultLocation)
        
        destComplete = os.path.join(destFolder, destFilename)    
                
        logFile.info('Creating Downloader for url: %s. And filename %s.', uri, destComplete)
        try:
            #create progress dialog
            if pbEnabled:
                pbTitle = 'Downloading the requested url'
                pbLine1 = uri
                uriPB.create(pbTitle, pbLine1)
            if params == "":
                sourceHandle = self.uriOpener.open(uri)
            else:
                sourceHandle = self.uriOpener.open(uri, params)                
            destHandle = open(destComplete, 'wb')
            headers = sourceHandle.info()
        
            fileSize = -1
            read = 0
            blocknum = 0
            
            if "content-length" in headers:
                fileSize = int(headers["Content-Length"])
                
            while 1:
                block = sourceHandle.read(self.blockSize*blockMultiplier)
                if block == "":
                    break
                read += len(block)
                destHandle.write(block)
                blocknum += 1
                
                if pbEnabled:
                    cancelled = self.PBHandler(blocknum, self.blockSize*blockMultiplier, fileSize, uriPB, pbLine1, pbLine2)
                    #check to see if cancelled
                    if cancelled:
                        break

            # clean up things
            sourceHandle.close()
            destHandle.close()
            
            if pbEnabled:
                uriPB.close()
            
            # delete parts if cancelled
            if cancelled:
                if os.path.exists(destComplete):
                    os.remove(destComplete)
                logFile.info("Download Cancelled")
                rtrn = ""
            else:
                logFile.info("Url %s downloaded succesfully.", uri)
                rtrn = destComplete
                
            return rtrn
            
        except:
            logFile.critical("Error caching file",exc_info=True)
            if os.path.exists(destComplete):
                os.remove(destComplete)
            if pbEnabled:
                uriPB.close()
            
            try:
                sourceHandle.close()
            except UnboundLocalError:
                pass
            try:
                destHandle.close()
            except UnboundLocalError:
                pass
            
            return ""

    #===============================================================================
    def Open(self, uri, pb=True, params=""):
        """
        Open an URL Async using a thread
        """
        try:
            
            progressbarEnabled = pb
            parameters = params
            targetUrl = uri
            pbTitle = ''
            pbLine1 = ''
            pbLine2 = ''
            blocks = 0
            filesize = 0
            canceled = False
            timeOut = False
            
            logFile.info("Opening requested uri Async: %s (already %s threads)", targetUrl, threading.activeCount())
                    
            if progressbarEnabled:
                pbTitle = 'Opening request url'
                pbLine1 = targetUrl
                uriPB = xbmcgui.DialogProgress()
                uriPB.create(pbTitle, pbLine1)
                
            openThread = AsyncOpener(targetUrl, self.uriOpener, self.blockSize, action='open',  params=parameters)
            openThread.start()
            #time.sleep(0.1)
            
            count = 0
            while not openThread.isCompleted and not canceled:
                if progressbarEnabled:
                    blocks = openThread.blocksRead
                    filesize = openThread.fileSize
                    #logFile.debug("%s van %s", blocks, filesize)
                    canceled = self.PBHandler(blocks, self.blockSize, filesize, uriPB, pbLine1, pbLine2)                          
                
                count += 1
                openThread.join(self.pollInterval)
                
                if self.pollInterval * count > self.webTimeOutInterval:
                    timeOut = True
                    break                
            
            # we are finished now
            if progressbarEnabled:
                uriPB.update(100, pbLine1 ,pbLine2)
                uriPB.close()
            
            if canceled:                
                logFile.warning("Opening of %s was cancelled", targetUrl)
                data = ""
            if timeOut:
                logFile.critical("The URL lookup did not respond within the TimeOut (%s s)", self.webTimeOutInterval)
                data = ""
            else:
                logFile.info("Url %s was opened successfully", targetUrl)                            
                data = openThread.data
            return data
        except:
            if progressbarEnabled:
                uriPB.close()
            
            logFile.debug("Error in threading", exc_info=True)
            return ""
        
    #===============================================================================
    def OpenSeq(self, uri, pb=True, params=""):
        raise DeprecationWarning() 
        # assign things (PERHAPS CHECK FIRST IF NOT ASSIGNED)
        pbEnabled = pb
        pbTitle = ""
        pbLine1 = ""
        pbLine2 = ""
        if pbEnabled:
            uriPB = xbmcgui.DialogProgress()
            #enable the timer for emergency canceling. Checks every 2 seconds
            self.PBEmergencyCanceler(pb=uriPB)
        
        cancelled = False
        
        try:
            logFile.info("Opening requested uri: %s", uri)
            #logFile.debug("Number of open threads %s", threading.activeCount())
            if pbEnabled:
                pbTitle = 'Opening request url'
                pbLine1 = uri
                uriPB.create(pbTitle, pbLine1)
        

⌨️ 快捷键说明

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