合并百度影音的离线数据 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)

  

原文地址:https://www.cnblogs.com/febwave/p/4699923.html