四种格式的解析:
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)
以上就是本文的全部内容,希望大家喜欢。