合并百度影音的离线数据withpython2.3格式更新

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

很久没有更新了。

这次新增支持四种格式的解析。

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<var_key>\S+):(?P<var_value>\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)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航