合并百度影音的离线数据( 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)
以上就是本文的全部内容,希望大家喜欢。