合并百度影音的离线数据 with python 第二版 基于yield

重新整理了一下代码。

增加了bdv,mkv的处理流程。

目前暂时支持windows平台。

bdv,mkv,rmvb的不同处理流程

# -*- coding: UTF-8 -*-

import os
import io
import sys
import string
import shutil
import codecs

def read_bdv_index(filename): 
    piece_list= list()    
    objFile = codecs.open(filename,'r','utf-8')    
    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)
    objFile.close()       
    return  ('avi',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)

执行代码:

# -*- 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
            
@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)      
       
        objTar.write('copy /b ')      
        
        if(len(piece_list) == 1):
            objTar.write('%s ' %(piece_list[0].encode('gbk')))  
        else:            
            bFirst = True
            for line in piece_list:
                if(bFirst == False):
                    objTar.write('+%s' %(line.encode('gbk')))  
                else:
                    objTar.write('%s' %(line.encode('gbk')))  
                    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;      
           
    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");      

  

  

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