四种格式的解析:
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\\\"\\r\\n\' % (filmFolderEx if filmFolderEx else filmFolder)) objTar.write(\'attrib -h *.*\\r\\n \') 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\\r\\n\' % (currentPath,extname)) objTar.write(\'cd %s\\r\\n\' %(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(\'\\r\\n\',\'\')) 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(\"\\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,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(\"\\r\\n\",\"\") 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(\"\\r\\n\",\"\") if(bdv_ver == \'#BD-SECTION\'): while(True): currentLine = objFile.readline(); if(currentLine is None or len(currentLine) ==0): break piece_list.append(currentLine.replace(\"\\r\\n\",\"\")) 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\\S+):(?P \\S+)\',re.IGNORECASE) lineDict = dict() # [orgLines.append(orgLine.replace(\"\\r\\n\",\"\") ) for orgLine in codecs.open(filename,\'r\',\'utf-8\')] for orgLine in codecs.open(filename,\'r\',\'utf-8\'): orgLine = orgLine.replace(\"\\r\\n\",\"\") 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(\'\\r\\n\',\'\')) line = os.path.basename(line.replace(\'\\r\',\'\')) line = os.path.basename(line.replace(\'\\n\',\'\')) piece_list.append(line ) return (\'avi\',piece_list,targetFolder,targetName)
以上就是本文的全部内容,希望大家喜欢。