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

    很久没有更新了。

    这次新增支持四种格式的解析。

    filelist

    slicelist

    download.cfg

    third_party_download.cfg

    还是2个文件。替换之前版本即可。

    初步测试正常,但时间轴不对。

    # -*- coding: UTF-8 -*-
    
    import os
    import io
    import codecs
    import string
    import shutil
    import moviefmt
    import traceback
    
    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(filebasename[0] == "."):
                    continue            
                if(funcDisp.has_key(string.lower(fext))):
                    pfn = funcDisp[string.lower(fext)];
                    (targetFmt,targetObjects,filmFolderEx,filebasenameEx) = pfn(targetfile)
                    if(targetFmt is None):
                        continue;
                    outputs = filmFolder,filebasename, (targetFmt,targetObjects,filmFolderEx,filebasenameEx);
                  #  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,filmFolderEx,filebasenameEx) = (yield)
            if(extname == None) : 
                break;
    
            objTar.write('cd "%s"
    ' % (filmFolderEx if filmFolderEx else   filmFolder))      
            
            
            objTar.write('attrib  -h *.*
     ')      
            
            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
                    
            
            relpath = os.path.dirname(filmFolder)        
            currentPath = os.path.join(getWindowsText(relpath),getWindowsText(filebasenameEx if filebasenameEx else   filebasename))    
            objTar.write('  %s.%s
    ' % (currentPath,extname))              
    
            
            objTar.write('cd %s
    ' %(relpath))
                
        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;    
        
        funcDisp['.filelist'] = moviefmt.read_filelist_index;
        funcDisp['.slicelist'] = moviefmt.read_slicelist_index;
        funcDisp['.cfg'] = moviefmt.read_cfg_index;
        
        try:
            rmf = enum_movie_file(read_movie_file(funcDisp,create_report('film.bat')))
            rmf.send(os.getcwd())
            rmf.close()
        except StopIteration:
            pass
        except Exception as exc:     
            print("%s" % exc);    
            info = traceback.format_exc()
            print(info)                       
        print("done");      
    

      

    # -*- coding: UTF-8 -*-
    
    import os
    import io
    import sys
    import string
    import shutil
    import codecs
    import glob
    import re
    
    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,None,None
    
    
    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,None,None
    
    def read_bdv_index_V3(objFile):
        piece_list= list()          
        oneFile= os.path.basename(objFile)    
        piece_list.append(oneFile)
        return "avi",piece_list,None,None
    
    
    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,None,None
    
        
    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
        filmFolderEx = None
        filebasenameEx = None
        # total file count
        cItem = count_file_item(filename,".bdv")
        if(cItem == 1):
            ext_type,piece_list,filmFolderEx,filebasenameEx = 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,filmFolderEx,filebasenameEx)        
    
    
    
    
    def read_bdv_file(filename):
        piece_list= list()
        piece_list.append('*.bdv_*')
        return  ('avi',piece_list,None,None)
    
    def read_rmvb_file(filename):
        piece_list= list()
        piece_list.append('*.rmvb_*')
        return  ('rmvb',piece_list,None,None)
    
    def read_mkv_file(filename):
        piece_list= list()    
        piece_list.append('*.mkv_*')
        return  ('mkv',piece_list,None,None)
    
    def read_mp4_file(filename):
        piece_list= list()    
        piece_list.append('*.mp4_*')
        return  ('mp4',piece_list,None,None)
    
    def read_mkv_2_file(filename):
        piece_list= list()    
        piece_list.append('video_*')
        return  ('mkv',piece_list,None,None)
    
    
    def read_filelist_index(filename):
        filmFolderEx = None
        filebasenameEx = None
        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,filmFolderEx,filebasenameEx = read_bdv_index_V2(objFile)
            else:
                ext_type,piece_list,filmFolderEx,filebasenameEx = read_bdv_index_V4(objFile)             
        else:
            ext_type,piece_list,filmFolderEx,filebasenameEx  = read_bdv_index_V1(objFile)
            
        objFile.close()       
        return  ("mp4" ,piece_list,filmFolderEx,filebasenameEx)                 
    
    def read_slicelist_index(filename):
        piece_list= list()    
        objFile = codecs.open(filename,'r','utf-8')    
        topline = objFile.readline();
        bdv_ver = topline.replace("
    ","")
        if(bdv_ver == '#BD-SECTION'):    
            while(True):
                currentLine = objFile.readline();
                if(currentLine is None or len(currentLine) ==0):
                    break
                piece_list.append(currentLine.replace("
    ",""))
        objFile.close()        
        return  ('mp4',piece_list,None,None)
    
    def read_cfg_index(filename):
        piece_list= list()    
        simpleFileName =  os.path.basename(filename)
        if(simpleFileName == 'download.cfg'):
            simpleFolderName = os.path.dirname(filename)
            chkLst =glob.glob(os.path.join(simpleFolderName, '*.filelist'));
            if(chkLst is not None and len(chkLst) >0):
                return (None,None,None,None)
            chkLst =glob.glob(os.path.join(simpleFolderName, '*.bdv'));
            piece_list.append(chkLst[0]);
            return  ('avi',piece_list)
        
        if(simpleFileName != 'third_party_download.cfg'):
            raise Exception('unknown format file : %s' %(filename))
    
        reObj = re.compile('(?P<var_key>S+):(?P<var_value>S+)',re.IGNORECASE)
        lineDict = dict()
    #    [orgLines.append(orgLine.replace("
    ","") ) for orgLine in codecs.open(filename,'r','utf-8')]
        for orgLine in codecs.open(filename,'r','utf-8'):
            orgLine = orgLine.replace("
    ","")        
            results = reObj.findall(orgLine)
            if(len(results) > 0):
                lineDict[results[0][0]] =results[0][1]
                
                                 
        resID = lineDict["resource"]   
        vid = lineDict[ '%s_vid'%(resID)]
        targetName = lineDict["video_name"]
        simpleFolderName = os.path.dirname(filename)
        upLevelFolderName = os.path.dirname(simpleFolderName)
        targetFolder = os.path.join(upLevelFolderName,vid)
        targetFolder = os.path.join(targetFolder,vid)
        
        chkLst =glob.glob(os.path.join(targetFolder, '*.%s*' %(resID)));
        targetFile = chkLst[0]   
        
          #skip #EXT-X-MEDIA-SEQUENCE    
        for line in codecs.open(targetFile,'r','utf-8'):
            if(line.startswith('#')==True):
                continue;        
            line = os.path.basename(line.replace('
    ',''))
            line = os.path.basename(line.replace('
    ',''))
            line = os.path.basename(line.replace('
    ',''))
            piece_list.append(line )
        
        return  ('avi',piece_list,targetFolder,targetName)
    

      

  • 相关阅读:
    iOS小知识点大杂烩
    iOS 生成本地验证码
    iOS RTMP 视频直播开发笔记(1) – 采集摄像头图像
    Mac之vim普通命令使用
    工作日记(九):完整项目开发之编写前端vue代码
    HTTP常用请求头与请求体实例
    工作日记(八):完整项目开发之学习sql与学习http报文
    工作日记(七):完整项目开发之前端vue框架的搭建
    工作日记(六):完整项目开发之springboot无法启动的坑
    工作日记(五):完整项目开发之编码开始
  • 原文地址:https://www.cnblogs.com/febwave/p/4699923.html
Copyright © 2011-2022 走看看