很久没有更新了。

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

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)

  

合并百度影音的离线数据 with python 2.3 格式更新的更多相关文章

  1. 合并百度影音的离线数据 with python 2.1 bdv格式的更新

    最近百度影音的离线下载文件,格式有新变化. 经过分析,是bdv格式又有新格式,从最初的bdv0001,到bdv.config 的file....,这次更新的格式是直接包含一个片段,其中还有使用guid ...

  2. 合并百度影音的离线数据 with python 2.2 bdv格式的更新

    百度影音的bdv格式又有变化. 此次存在2种bdv格式. 格式1:每个文件夹内就一个bdv文件,文件合并后改名avi即可. 格式2:每个文件夹内一个bdv文件作为索引,其他附加guid的文件作为数据. ...

  3. 合并百度影音的离线数据 with python 第二版 基于yield

    重新整理了一下代码. 增加了bdv,mkv的处理流程. 目前暂时支持windows平台. bdv,mkv,rmvb的不同处理流程 # -*- coding: UTF-8 -*- import os i ...

  4. Python获得百度统计API的数据并发送邮件

    Python获得百度统计API的数据并发送邮件 小工具  本来这么晚是不准备写博客的,当是想到了那个狗子绝对会在开学的时候跟我逼逼这个事情,所以,还是老老实实地写一下吧.   Baidu统计API的使 ...

  5. AdMaster技术副总裁谈Hadoop、营销数据、Python和挖掘平台

    http://www.infoq.com/cn/news/2014/09/admaster-hadoop 卢亿雷是现任AdMaster技术副总裁,曾在联想研究院.百度基础架构部.Carbonite C ...

  6. Python处理json格式的数据文件(一些坑、一些疑惑)

    这里主要说最近遇到的一个问题,不过目前只是换了一种思路先解决了,脑子里仍然有疑惑,只能怪自己太菜. 最近要把以前爬的数据用一下了,先简单的过滤一下,以前用scrapy存数据的时候为了省事也为了用一下它 ...

  7. 利用百度云接口实现车牌识别·python

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...

  8. C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>中通过调用接口成功的创建一个离线数 ...

  9. C#开发BIMFACE系列48 Nginx部署并加载离线数据包

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列47 IIS部署并加载离线数据包>中详细介绍了IIS部署并访问的完整步 ...

随机推荐

  1. BM算法模式匹配——字符串与KMP比较

    下面是代码:BM是什么参考阮一峰老师的讲解  点击打开链接 #include<iostream> #include<algorithm> #include<string. ...

  2. 【USACO】The Cow Prom

    [题目链接] 点击打开链接 [算法] tarjan求强连通分量 [代码] #include<bits/stdc++.h> #define MAXN 20005 using namespac ...

  3. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...

  4. margin和padidng的使用

    何时应当使用margin:需要在border外侧添加空白时.空白处不需要背景(色)时.上下相连的两个盒子之间的空白,需要相互抵消时.如15px + 20px的margin,将得到20px的空白. 何时 ...

  5. 【旧文章搬运】360安全卫士HookPort.sys完美逆向

    原文发表于百度空间,2009-11-08 这是第一次逆向一个企业级安全产品的核心代码,并完美替换原驱动正常工作============================================= ...

  6. 【旧文章搬运】Windows句柄分配算法(二)

    原文发表于百度空间,2009-04-04========================================================================== 在创建句柄 ...

  7. 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

    http://blog.csdn.net/jimoshuicao/article/details/9283071 2)蒙皮信息和蒙皮过程 2-1)Skin info的定义 上文曾讨论过,Skinned ...

  8. cocos2d-html5基础

    1 环境搭建 版本Cocos2d-html5-v2.2,tomcat7.0 配置tomcat,然后直接解压Cocos2d-html5-v2.2.zip,访问解压后的根目录的index.html就可以看 ...

  9. 洛谷P3537 [POI2012]SZA-Cloakroom(背包)

    传送门 蠢了……还以为背包只能用来维护方案数呢……没想到背包这么神奇…… 我们用$dp[i]$表示当$c$的和为$i$时,所有的方案中使得最小的$b$最大时最小的$b$是多少 然后把所有的点按照$a$ ...

  10. mysql事务隔离级别实验

    一.实验数据: 建表语句: CREATE TABLE `isolation` ( `id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET ut ...