合并百度影音的离线数据( with python 2.3)
四种格式的解析:
filelist
slicelist
download.cfg
third_party_download.cfg
还是2个文件。替换之前版本即可。
初步测试正常,但时间轴不对。
代码如下:
#-*-coding:UTF-8-*- importos importio importcodecs importstring importshutil importmoviefmt importtraceback defcoroutine(func): defstart(*args,**kwargs): g=func(*args,**kwargs) g.next() returng returnstart @coroutine defenum_movie_file(target): selectedFolder=(yield) forfileiteminos.listdir(selectedFolder): targetFO=os.path.join(selectedFolder,fileitem) if(os.path.isfile(targetFO)==True): continue; target.send(targetFO) @coroutine defread_movie_file(funcDisp,target): while(True): filmFolder=(yield) forfileiteminos.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(targetFmtisNone): continue; outputs=filmFolder,filebasename,(targetFmt,targetObjects,filmFolderEx,filebasenameEx); #outputs=filmFolder,filebasename,pfn(targetfile); target.send(outputs) break defgetWindowsText(orgText): try: returnorgText.encode('gbk') exceptExceptionasexc: print("%s"%exc); returnorgText @coroutine defcreate_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'%(filmFolderExiffilmFolderExelsefilmFolder)) 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 forlineinpiece_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(filebasenameExiffilebasenameExelsefilebasename)) 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() exceptStopIteration: pass exceptExceptionasexc: print("%s"%exc); info=traceback.format_exc() print(info) print("done"); #-*-coding:UTF-8-*- importos importio importsys importstring importshutil importcodecs importglob importre defread_bdv_index_V1(objFile): piece_list=list() forlineinobjFile: 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 defread_bdv_index_V2(objFile): piece_list=list() forlineinobjFile: nPos=line.count('bdv') if(nPos<=0): continue; tarfile=line[0:len(line)-2] piece_list.append(tarfile) return"mpeg",piece_list,None,None defread_bdv_index_V3(objFile): piece_list=list() oneFile=os.path.basename(objFile) piece_list.append(oneFile) return"avi",piece_list,None,None defread_bdv_index_V4(objFile): piece_list=list() #skip#EXT-X-MEDIA-SEQUENCE objFile.readline(); forlineinobjFile: if(line.startswith('#')==True): continue; piece_list.append(line.replace('\r\n','')) return"avi",piece_list,None,None defcount_file_item(objFile,extText): cItem=0; folderName=os.path.dirname(objFile) forfileiteminos.listdir(folderName): filebasename,fext=os.path.splitext(fileitem); if(fext==extText): cItem=cItem+1 returncItem defread_bdv_index(filename): piece_list=list() ext_type=None filmFolderEx=None filebasenameEx=None #totalfilecount 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) defread_bdv_file(filename): piece_list=list() piece_list.append('*.bdv_*') return('avi',piece_list,None,None) defread_rmvb_file(filename): piece_list=list() piece_list.append('*.rmvb_*') return('rmvb',piece_list,None,None) defread_mkv_file(filename): piece_list=list() piece_list.append('*.mkv_*') return('mkv',piece_list,None,None) defread_mp4_file(filename): piece_list=list() piece_list.append('*.mp4_*') return('mp4',piece_list,None,None) defread_mkv_2_file(filename): piece_list=list() piece_list.append('video_*') return('mkv',piece_list,None,None) defread_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) defread_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(currentLineisNoneorlen(currentLine)==0): break piece_list.append(currentLine.replace("\r\n","")) objFile.close() return('mp4',piece_list,None,None) defread_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(chkLstisnotNoneandlen(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'): raiseException('unknownformatfile:%s'%(filename)) reObj=re.compile('(?P<var_key>\S+):(?P<var_value>\S+)',re.IGNORECASE) lineDict=dict() #[orgLines.append(orgLine.replace("\r\n",""))fororgLineincodecs.open(filename,'r','utf-8')] fororgLineincodecs.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 forlineincodecs.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)
以上就是本文的全部内容,希望大家喜欢。