合并百度影音的离线数据 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\"\r\n' % 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\r\n' %(filebasename,extname))              

        objTar.write('cd ..\r\n')

    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('\r\n',''))
    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("\r\n","")
        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)

  

 

posted on 2014-04-14 15:51  febwave  阅读(1228)  评论(11编辑  收藏  举报

导航