合并百度影音的离线数据( with python 2.3)
四种格式的解析:
filelist
slicelist
download.cfg
third_party_download.cfg
立即学习“Python免费学习笔记(深入)”;
还是2个文件。替换之前版本即可。
初步测试正常,但时间轴不对。
代码如下:
# -*- coding: UTF-8 -*-import osimport ioimport codecsimport stringimport shutilimport moviefmtimport tracebackdef coroutine(func): def start(*args,**kwargs): g = func(*args,**kwargs) g.next() return g return start@coroutinedef 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) @coroutinedef 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) breakdef getWindowsText(orgText): try: return orgText.encode('gbk') except Exception as exc: print("%s" % exc); return orgText@coroutinedef 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 osimport ioimport sysimport stringimport shutilimport codecsimport globimport redef 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,Nonedef read_bdv_index_V2(objFile): piece_list= list() for line in objFile: nPos = line.count('bdv') if( nPos 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)</var_value></var_key>