设为首页 收藏本站
查看: 913|回复: 0

[经验分享] 合并百度影音的离线数据 with python 2.3 格式更新

[复制链接]

尚未签到

发表于 2015-11-30 08:24:43 | 显示全部楼层 |阅读模式
  很久没有更新了。
  这次新增支持四种格式的解析。
  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)

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145105-1-1.html 上篇帖子: Python函数信息 下篇帖子: 18 多线程编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表