zoukankan      html  css  js  c++  java
  • 合并百度影音的离线数据 with python 2.2 bdv格式的更新

    百度影音的bdv格式又有变化。

    此次存在2种bdv格式。

    格式1:每个文件夹内就一个bdv文件,文件合并后改名avi即可。

    格式2:每个文件夹内一个bdv文件作为索引,其他附加guid的文件作为数据。

    例如:

    #EXTM3U
    #EXT-X-TARGETDURATION:30
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10,

    所以python脚本有改。

    该脚本修正了单个文件在批处理过程名称。

    # -*- coding: UTF-8 -*-
    
    import os
    import io
    import codecs
    import string
    import shutil
    import moviefmt
    
    
    def coroutine(func):
        def start(*args,**kwargs):
            g = func(*args,**kwargs)
            g.next()
            return g
        return start
    
    @coroutine
    def enum_movie_file(target):   
        selectedFolder = (yield)
        for fileitem in os.listdir(selectedFolder):              
            targetFO = os.path.join(selectedFolder,fileitem)       
            if(os.path.isfile(targetFO) == True):
                continue;        
            target.send(targetFO)         
    
    
    @coroutine
    def read_movie_file(funcDisp,target):
        while(True):
            filmFolder = (yield)
            for fileitem in os.listdir(filmFolder):         
                targetfile = os.path.join(filmFolder,fileitem) 
                if(os.path.isfile(targetfile) == False):
                    continue;
                filebasename , fext = os.path.splitext(fileitem);                
                if(funcDisp.has_key(string.lower(fext))):
                    pfn = funcDisp[string.lower(fext)];
                    outputs = filmFolder,filebasename, pfn(targetfile);
                    target.send(outputs)
                    break
                
    def getWindowsText(orgText):   
        try:
            return orgText.encode('gbk')  
        except Exception as exc:     
            print("%s" % exc);    
            return orgText
                
                
    @coroutine
    def create_report(outputfile):
        objTar = codecs.open(outputfile,"w+")        
        while(1):
            filmFolder,filebasename,(extname,piece_list) = (yield)
            if(extname == None) : 
                break;
    
    
            objTar.write('cd "%s"
    ' % filmFolder)      
            
            if(len(piece_list) >1):
                objTar.write('copy /b ')      
            else:
                objTar.write('copy ')      
    
            if(len(piece_list) == 1):
                objTar.write('"%s "' %(getWindowsText(piece_list[0])))
            else:            
                bFirst = True
                for line in piece_list:
                    if(bFirst == False):                    
                        objTar.write('+"%s"' %(getWindowsText(line)))  
                    else:                    
                        objTar.write('"%s"' %(getWindowsText(line)))
                        bFirst = False
                    
    
            objTar.write('  ..\"%s".%s
    ' %(filebasename,extname))              
    
            objTar.write('cd ..
    ')
    
        objTar.close()               
    
    
    
    if __name__ == '__main__':   
        funcDisp = dict()
        funcDisp['.bdv_0000']= moviefmt.read_bdv_file;
        funcDisp['.rmvb_0000']= moviefmt.read_rmvb_file;
        funcDisp['.mkv_0000']= moviefmt.read_mkv_file;
        funcDisp['.bdv']= moviefmt.read_bdv_index;    
          
        funcDisp['.mp4_0000']= moviefmt.read_mp4_file;             
        funcDisp['']= moviefmt.read_mkv_2_file;    
        try:
            rmf = enum_movie_file(read_movie_file(funcDisp,create_report('film.bat')))
            rmf.send(os.getcwd())
            rmf.close()
    
        except Exception as exc:     
            print("%s" % exc);    
        print("done");      
    

      

    该脚本增加单个文件read_bdv_index_V3和bdv新格式支持read_bdv_index_V4。

    # -*- coding: UTF-8 -*-
    
    import os
    import io
    import sys
    import string
    import shutil
    import codecs
    
    
    def read_bdv_index_V1(objFile):
        piece_list= list()  
        for line in objFile:
            if(line[0:4] != 'file'):
                continue;
            strings = string.split(line,'/')
            tarfile = strings[len(strings)-1]        
            tempText = string.strip(tarfile)
            piece_list.append(tempText)
        return "avi",piece_list
    
    
    def read_bdv_index_V2(objFile):
        piece_list= list()  
        for line in objFile:       
            nPos = line.count('bdv')
            if( nPos <=0):
                continue;      
            tarfile = line[0:len(line)-2]     
            piece_list.append(tarfile)    
        return "mpeg",piece_list
    
    def read_bdv_index_V3(objFile):
        piece_list= list()          
        oneFile= os.path.basename(objFile)    
        piece_list.append(oneFile)
        return "avi",piece_list
    
    
    def read_bdv_index_V4(objFile):
        piece_list= list()  
        #skip #EXT-X-MEDIA-SEQUENCE
        objFile.readline();
        for line in objFile:
            if(line.startswith('#')==True):
                continue;        
            piece_list.append(line.replace('
    ',''))
        return "avi",piece_list
    
        
    def count_file_item(objFile,extText):
        cItem = 0;
        folderName = os.path.dirname(objFile)
        for fileitem in os.listdir(folderName):   
            filebasename , fext = os.path.splitext(fileitem);   
            if(fext == extText):
                cItem = cItem +1
        return cItem  
    
    def read_bdv_index(filename): 
        piece_list= list()   
        ext_type = None
        # total file count
        cItem = count_file_item(filename,".bdv")
        if(cItem == 1):
            ext_type,piece_list = read_bdv_index_V3(filename)
        else:
            objFile = codecs.open(filename,'r','utf-8')    
            topline = objFile.readline();
            bdv_ver = topline.replace("
    ","")
            if(bdv_ver == '#EXTM3U'):
                v3Text = objFile.readline();
                if(v3Text.startswith('#EXT-X-TARGETDURATION') == False):
                    ext_type,piece_list = read_bdv_index_V2(objFile)
                else:
                    ext_type,piece_list = read_bdv_index_V4(objFile)
            else:
                ext_type,piece_list  = read_bdv_index_V1(objFile)
        
            objFile.close()       
            
            
        return  (ext_type ,piece_list)        
    
    
       
    
    def read_bdv_file(filename):
        piece_list= list()
        piece_list.append('*.bdv_*')
        return  ('avi',piece_list)
    
    def read_rmvb_file(filename):
        piece_list= list()
        piece_list.append('*.rmvb_*')
        return  ('rmvb',piece_list)
    
    def read_mkv_file(filename):
        piece_list= list()    
        piece_list.append('*.mkv_*')
        return  ('mkv',piece_list)
    
    def read_mp4_file(filename):
        piece_list= list()    
        piece_list.append('*.mp4_*')
        return  ('mp4',piece_list)
    
    def read_mkv_2_file(filename):
        piece_list= list()    
        piece_list.append('video_*')
        return  ('mkv',piece_list)
    

      

  • 相关阅读:
    一则由表单提交引发的思考
    前端技术栈持续汇总中(已解锁)
    5599充值中心功能开发
    CSS动画持续汇总中
    编程小技巧持续汇总中
    开发软件安装方法汇总
    HashMap中tableSizeFor
    2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)
    Spring注解@EnableWebMvc使用坑点解析
    线程池中 work 为何要实现 AbstractQueuedSynchronizer
  • 原文地址:https://www.cnblogs.com/febwave/p/3664206.html
Copyright © 2011-2022 走看看