示例#1
0
文件: default.py 项目: Effi-01/Test
def playF4mLink(url, name):
    print "URL: " + url

    listitem = xbmcgui.ListItem("myfile")
    downloader = F4MDownloader()
    runningthread = thread.start_new_thread(downloader.download, (
        'myfile.flv',
        url,
        stopPlaying,
    ))
    progress = xbmcgui.DialogProgress()
    progress.create('Starting Stream')
    stream_delay = 10

    xbmc.sleep(stream_delay * 1000)
    mplayer = MyPlayer()

    filename = downloader.outputfile
    #DIR_USERDATA + "/myfile.flv"
    progress.close()
    mplayer.play(filename, listitem)
    while True:
        xbmc.log('Sleeping...')
        xbmc.sleep(1000)
        if stopPlaying.isSet():
            break
        #if  not mplayer.isPlaying():
        #	break

    #runningthread.event.set()
    print 'Job done'
    #xbmc.sleep(3)
    #while xbmc.Player().isPlaying():
    #	print "Playing"
    #	xbmc.sleep(100)
    try:
        os.remove(filename)
    except:
        pass
    return
示例#2
0
文件: F4MProxy.py 项目: noba3/KoTos
    def answer_request(self, sendData):
        global g_stopEvent
        global g_downloader
        try:

            #Pull apart request path
            request_path = self.path[1:]
            request_path = re.sub(r"\?.*", "", request_path)
            #If a request to stop is sent, shut down the proxy

            if request_path.lower(
            ) == "stop":  # all special web interfaces here
                sys.exit()
                return
            if request_path.lower() == "favicon.ico":
                #print 'dont have no icone here, may be in future'
                self.wfile.close()
                return

            (url, proxy, use_proxy_for_chunks, maxbitrate, simpledownloader,
             auth, streamtype) = self.decode_url(request_path)
            #print 'simpledownloaderxxxxxxxxxxxxxxx',simpledownloader
            if streamtype == '' or streamtype == None or streamtype == 'none':
                streamtype = 'HDS'

            if streamtype == 'HDS':

                #print 'Url received at proxy',url,proxy,use_proxy_for_chunks,maxbitrate

                #Send file request
                #self.handle_send_request(download_id,file_url, file_name, requested_range,download_mode ,keep_file,connections)

                downloader = None
                #downloader=g_downloader

                if not downloader or downloader.live == True or not (
                        downloader.init_done and downloader.init_url == url):
                    downloader = F4MDownloader()
                    if not downloader.init(self.wfile, url, proxy,
                                           use_proxy_for_chunks, g_stopEvent,
                                           maxbitrate, auth):
                        #print 'cannot init'
                        return
                    g_downloader = downloader
                    #print 'init...'

                enableSeek = False
                requested_range = self.headers.getheader("Range")
                if requested_range == None: requested_range = ""
                srange, erange = (None, None)

                if downloader.live == False and len(
                        requested_range
                ) > 0 and not requested_range == "bytes=0-0":  #we have to stream?
                    enableSeek = True
                    (srange,
                     erange) = self.get_range_request(requested_range,
                                                      downloader.total_frags)

                #print 'PROXY DATA',downloader.live,enableSeek,requested_range,downloader.total_frags,srange, erange
                enableSeek = False  ##disabled for time being, couldn't find better way to handle

                framgementToSend = 0
                inflate = 1815002  #(6526684-466/3)#*373/downloader.total_frags# 4142*1024*243/8/40 #1#1024*1024
                if enableSeek:
                    #rtype="video/x-flv" #just as default
                    self.send_response(206)
                    rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    self.send_header("Accept-Ranges", "bytes")
                    #print 'not LIVE,enable seek',downloader.total_frags

                    totalsize = downloader.total_frags * inflate

                    framgementToSend = 1  #downloader.total_frags
                    erange = srange + framgementToSend * inflate
                    if erange >= totalsize:
                        erange = totalsize - 1

    #                crange="bytes "+str(srange)+"-" +str(int(downloader.total_frags-1))+"/"+str(downloader.total_frags)#recalculate crange based on srange, portionLen and content_size
    #                crange="bytes "+str(srange)+"-" +str(int(totalsize-1))+"/"+str(totalsize)#recalculate crange based on srange, portionLen and content_size
                    crange = "bytes " + str(srange) + "-" + str(
                        int(erange)
                    ) + "/*"  #+str(totalsize)#recalculate crange based on srange, portionLen and content_size
                    #print srange/inflate,erange/inflate,totalsize/inflate
                    self.send_header("Content-Length", str(totalsize))
                    self.send_header("Content-Range", crange)
                    etag = self.generate_ETag(url)
                    self.send_header("ETag", etag)
                    #print crange
                    self.send_header("Last-Modified",
                                     "Wed, 21 Feb 2000 08:43:39 GMT")
                    self.send_header("Cache-Control",
                                     "public, must-revalidate")
                    self.send_header("Cache-Control", "no-cache")
                    self.send_header("Pragma", "no-cache")
                    self.send_header("features", "seekable,stridable")
                    self.send_header("client-id", "12345")
                    self.send_header("Connection", 'close')
                else:
                    self.send_response(200)
                    rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    srange = None

            elif streamtype == 'SIMPLE' or simpledownloader:
                downloader = interalSimpleDownloader()
                if not downloader.init(self.wfile, url, proxy, g_stopEvent,
                                       maxbitrate):
                    #print 'cannot init'
                    return
                srange, framgementToSend = (None, None)
                self.send_response(200)
                rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange = None
            elif streamtype == 'HLS' or simpledownloader:
                downloader = HLSDownloader()
                if not downloader.init(self.wfile, url, proxy,
                                       use_proxy_for_chunks, g_stopEvent,
                                       maxbitrate, auth):
                    #print 'cannot init'
                    return

                srange, framgementToSend = (None, None)
                self.send_response(200)
                rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange = None

            #rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
            #self.send_header("Content-Type", rtype)

            self.end_headers()
            if not srange == None:
                srange = srange / inflate

            if sendData:
                downloader.keep_sending_video(self.wfile, srange,
                                              framgementToSend)
                #runningthread=thread.start_new_thread(downloader.download,(self.wfile,url,proxy,use_proxy_for_chunks,))
                #print 'srange,framgementToSend',srange,framgementToSend
                #runningthread=thread.start_new_thread(downloader.keep_sending_video,(self.wfile,srange,framgementToSend,))

                xbmc.sleep(500)
                while not downloader.status == "finished":
                    xbmc.sleep(200)

        except:
            ##print out a stack trace
            traceback.print_exc()
            g_stopEvent.set()
            self.send_response(404)
            #Close output stream file
            self.wfile.close()
            return

        #Close output stream file
        self.wfile.close()
        return
示例#3
0
    def answer_request(self, sendData):
        global g_stopEvent
        global g_downloader
        global g_currentprocessor


        try:

            #Pull apart request path
            request_path=self.path[1:] 
            querystring=request_path            
            request_path=re.sub(r"\?.*","",request_path)
            
            #If a request to stop is sent, shut down the proxy

            if request_path.lower()=="stop":# all special web interfaces here
                sys.exit()
                return
            if request_path.lower()=="favicon.ico":
                print 'dont have no icone here, may be in future'
                self.wfile.close()
                return
            if request_path.lower()=="sendvideopart":
                print 'dont have no icone here, may be in future'
                #sendvideoparthere
                self.send_response(200)
                
                rtype="video/mp2t"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                self.end_headers()
                initDone=True
                videourl=self.decode_videoparturl(querystring.split('?')[1])
                g_currentprocessor.sendVideoPart(videourl,self.wfile)
                #self.wfile.close()
                return
            initDone=False
            (url,proxy,use_proxy_for_chunks,maxbitrate,simpledownloader, auth,streamtype,swf ,callbackpath, callbackparam)=self.decode_url(request_path)
            print 'simpledownloaderxxxxxxxxxxxxxxx',simpledownloader
            if streamtype=='' or streamtype==None or streamtype=='none': streamtype='HDS'
            
            if streamtype=='HDS':

                print 'Url received at proxy',url,proxy,use_proxy_for_chunks,maxbitrate


                #Send file request
                #self.handle_send_request(download_id,file_url, file_name, requested_range,download_mode ,keep_file,connections)
                
                downloader=None
                #downloader=g_downloader
                
                if not downloader or downloader.live==True or  not (downloader.init_done and downloader.init_url ==url):
                    from f4mDownloader import F4MDownloader
                    downloader=F4MDownloader()
                    if not downloader.init(self.wfile,url,proxy,use_proxy_for_chunks,g_stopEvent,maxbitrate,auth,swf):
                        print 'cannot init'
                        raise Exception('HDS.url failed to play\nServer down? check Url.')
                    g_downloader=downloader
                    print 'init...' 
                
                enableSeek=False
                requested_range=self.headers.getheader("Range")
                if requested_range==None: requested_range=""
                srange, erange=(None,None)
                
                
                            
                if downloader.live==False and len(requested_range)>0 and not requested_range=="bytes=0-0": #we have to stream?
                    enableSeek=True
                    (srange, erange) = self.get_range_request(requested_range, downloader.total_frags)
                

                print 'PROXY DATA',downloader.live,enableSeek,requested_range,downloader.total_frags,srange, erange
                enableSeek=False ##disabled for time being, couldn't find better way to handle
                
                framgementToSend=0
                inflate=1815002#(6526684-466/3)#*373/downloader.total_frags# 4142*1024*243/8/40 #1#1024*1024
                if enableSeek:
                    #rtype="video/x-flv" #just as default
                    self.send_response(206)
                    rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    self.send_header("Accept-Ranges","bytes")
                    print 'not LIVE,enable seek',downloader.total_frags
                    
                    totalsize=downloader.total_frags*inflate
                    
                    framgementToSend=1#downloader.total_frags
                    erange=srange+framgementToSend*inflate
                    if erange>=totalsize:
                        erange=totalsize-1
                    
    #                crange="bytes "+str(srange)+"-" +str(int(downloader.total_frags-1))+"/"+str(downloader.total_frags)#recalculate crange based on srange, portionLen and content_size 
    #                crange="bytes "+str(srange)+"-" +str(int(totalsize-1))+"/"+str(totalsize)#recalculate crange based on srange, portionLen and content_size 
                    crange="bytes "+str(srange)+"-" +str(int(erange))+"/*"#+str(totalsize)#recalculate crange based on srange, portionLen and content_size 
                    print srange/inflate,erange/inflate,totalsize/inflate
                    self.send_header("Content-Length", str(totalsize))
                    self.send_header("Content-Range",crange)
                    etag=self.generate_ETag(url)
                    self.send_header("ETag",etag)
                    print crange
                    self.send_header("Last-Modified","Wed, 21 Feb 2000 08:43:39 GMT")
                    self.send_header("Cache-Control","public, must-revalidate")
                    self.send_header("Cache-Control","no-cache")
                    self.send_header("Pragma","no-cache")
                    self.send_header("features","seekable,stridable")
                    self.send_header("client-id","12345")
                    self.send_header("Connection", 'close')
                else:
                    self.send_response(200)
                    rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    srange=None
                    
            elif streamtype=='SIMPLE' or simpledownloader :
                from interalSimpleDownloader import interalSimpleDownloader
                downloader=interalSimpleDownloader();
                if not downloader.init(self.wfile,url,proxy,g_stopEvent,maxbitrate):
                    print 'init throw error because init'#throw error because init
                    raise Exception('SIMPLE.url failed to play\nServer down? check Url.')
                srange,framgementToSend=(None,None)
                self.send_response(200)
                rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange=None
            elif streamtype=='TSDOWNLOADER':
                from TSDownloader import TSDownloader
                downloader=TSDownloader();
                if not downloader.init(self.wfile,url,proxy,g_stopEvent,maxbitrate):
                    print 'cannot init but will continue to play'
                    raise Exception('TS.url failed to play\nServer down? check Url.')
                    #return
                srange,framgementToSend=(None,None)
                self.send_response(200)
                rtype="video/mp2t"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange=None
            elif streamtype=='HLS':
                from hlsDownloader import HLSDownloader
                downloader=HLSDownloader()
                if not downloader.init(self.wfile,url,proxy,use_proxy_for_chunks,g_stopEvent,maxbitrate,auth):
                    print 'cannot init'
                    raise Exception('HLS.url failed to play\nServer down? check Url.')
                    
                srange,framgementToSend=(None,None)
                self.send_response(200)
                rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange=None
            elif streamtype=='HLSRETRY':
                from HLSDownloaderRetry import HLSDownloaderRetry
                downloader=HLSDownloaderRetry()
                if not downloader.init(self.wfile,url,proxy,use_proxy_for_chunks,g_stopEvent,maxbitrate,auth , callbackpath, callbackparam):
                    print 'cannot init'
                    raise Exception('HLSR.url failed to play\nServer down? check Url.')
                    
                srange,framgementToSend=(None,None)
                self.send_response(200)
                rtype="flv-application/octet-stream"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)
                srange=None            
            elif streamtype=='HLSREDIR':
                from HLSRedirector import HLSRedirector
                downloader=HLSRedirector()
                g_currentprocessor=downloader
                if not downloader.init(self.wfile,url,proxy,use_proxy_for_chunks,g_stopEvent,maxbitrate,auth , callbackpath, callbackparam):
                    print 'cannot init'
                    raise Exception('HLSR.url failed to play\nServer down? check Url.')
                    
                srange,framgementToSend=(None,None)
                self.send_response(200)
                rtype="application/vnd.apple.mpegurl"  #default type could have gone to the server to get it.
                self.send_header("Content-Type", rtype)

               
                srange=None            
                
            #rtype="flv-application/octet-stream"  #default type could have gone to the server to get it. 
            #self.send_header("Content-Type", rtype)    
               
            self.end_headers()
            if not srange==None:
                srange=srange/inflate
            initDone=True
            if sendData:
                downloader.keep_sending_video(self.wfile,srange,framgementToSend)
                #self.wfile.close()
                #runningthread=thread.start_new_thread(downloader.download,(self.wfile,url,proxy,use_proxy_for_chunks,))
                print 'srange,framgementToSend',srange,framgementToSend
                #runningthread=thread.start_new_thread(downloader.keep_sending_video,(self.wfile,srange,framgementToSend,))
                
                #xbmc.sleep(500)
                #while not downloader.status=="finished":
                #    xbmc.sleep(200);


        except Exception as inst:
            #Print out a stack trace
            traceback.print_exc()
            #g_stopEvent.set()
            if not initDone:
                xbmc.executebuiltin("XBMC.Notification(F4mProxy,%s,4000,'')"%inst.message)
                self.send_error(404)
            #print 'sending 404'
            
            #self.send_error(404)
            
            #Close output stream file
            #self.wfile.close()
            print 'closed'
            

        #Close output stream file
        #self.wfile.close()
        self.finish()
        return 
示例#4
0
    def answer_request(self, sendData):
        global g_stopEvent
        global g_downloader
        try:

            #Pull apart request path
            request_path = self.path[1:]
            request_path = re.sub(r"\?.*", "", request_path)
            #If a request to stop is sent, shut down the proxy

            if request_path.lower(
            ) == "stop":  # all special web interfaces here
                sys.exit()
                return
            if request_path.lower() == "favicon.ico":
                print 'dont have no icone here, may be in future'
                self.wfile.close()
                return

            (url, proxy, use_proxy_for_chunks, maxbitrate, simpledownloader,
             auth, streamtype) = self.decode_url(request_path)
            print 'simpledownloaderxxxxxxxxxxxxxxx', simpledownloader
            if streamtype == '' or streamtype == None or streamtype == 'none':
                streamtype = 'HDS'

            if streamtype == 'HDS':

                print 'Url received at proxy', url, proxy, use_proxy_for_chunks, maxbitrate

                #Send file request
                #self.handle_send_request(download_id,file_url, file_name, requested_range,download_mode ,keep_file,connections)

                downloader = g_downloader

                if not downloader or downloader.live == True or not (
                        downloader.init_done and downloader.init_url == url):
                    downloader = F4MDownloader()
                    if not downloader.init(self.wfile, url, proxy,
                                           use_proxy_for_chunks, g_stopEvent,
                                           maxbitrate, auth):
                        print 'cannot init'
                        return
                    g_downloader = downloader
                    print 'init...'

                enableSeek = False
                requested_range = self.headers.getheader("Range")
                print 'requested Range', requested_range
                if requested_range == None: requested_range = ""
                srange, erange = (None, None)

                if downloader.live == False and len(
                        requested_range
                ) > 0 and not requested_range == "bytes=0-0":  #we have to stream?
                    enableSeek = True
                    (srange,
                     erange) = self.get_range_request(requested_range,
                                                      downloader.total_frags)

                enableSeek = False
                print 'PROXY DATA', downloader.live, enableSeek, requested_range, downloader.total_frags, srange, erange
                framgementToSend = 1
                for currentFreg in range(
                        len(downloader.fragments_list) - 1, -1, -1):
                    frag = downloader.fragments_list[currentFreg]
                    if (frag[4] <= srange):
                        framgementToSend = frag[1]
                        fragment_size = frag[3]
                        break
                #enableSeek = False
                downloader.statusStream = 'seeking'
                if enableSeek:
                    self.send_response(206)
                    rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    self.send_header("Last-Modified",
                                     "Wed, 21 Feb 2014 08:43:39 GMT")
                    etag = self.generate_ETag(url)
                    self.send_header("ETag", etag)
                    self.send_header("Accept-Ranges", "bytes")
                    print 'not LIVE,enable seek', downloader.total_frags
                    totalsize = int(downloader.total_size)
                    erange = totalsize - 1

                    crange = "bytes " + str(srange) + "-" + str(
                        erange) + "/" + str(erange + 1)
                    self.send_header("Content-Range", crange)
                    self.send_header("Content-Disposition", "attachment")

                    print crange
                    self.send_header("Cache-Control",
                                     "public, must-revalidate")
                    self.send_header("Cache-Control", "no-cache")
                    self.send_header("Pragma", "no-cache")
                    self.send_header("features", "seekable,stridable")
                    self.send_header("client-id", "12345")
                    self.send_header("Content-Length",
                                     str(totalsize - int(srange)))

                    self.send_header("Connection", 'close')
                else:
                    self.send_response(200)
                    rtype = "flv-application/octet-stream"  #default type could have gone to the server to get it.
                    self.send_header("Content-Type", rtype)
                    srange = None

            self.end_headers()
            #if not srange==None:
            #   srange=srange/inflate

            if sendData:
                startRangeParam = 0
                if (srange != None):
                    startRangeParam = int(srange)
                #downloader.keep_sending_video(self.wfile,framgementToSend,0,startRangeParam)
                #runningthread=thread.start_new_thread(downloader.download,(self.wfile,url,proxy,use_proxy_for_chunks,))
                runningthread = thread.start_new_thread(
                    downloader.keep_sending_video(self.wfile, framgementToSend,
                                                  0, startRangeParam))

                xbmc.sleep(500)
                while not downloader.status == "finished":
                    xbmc.sleep(200)

        except:
            #Print out a stack trace
            traceback.print_exc()
            g_stopEvent.set()
            self.send_response(404)
            #Close output stream file
            self.wfile.close()
            return

        #Close output stream file
        self.wfile.close()
        return