合并百度影音的离线数据( with python 2.3)


Posted in Python onAugust 04, 2015

四种格式的解析:

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)

以上就是本文的全部内容,希望大家喜欢。

Python 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
python连接字符串的方法小结
Jul 13 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
《与孩子一起学编程》python自测题
May 27 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
python openpyxl模块的使用详解
Feb 25 Python
python利用datetime模块计算时间差
Aug 04 #Python
使用python加密自己的密码
Aug 04 #Python
Python实现字典的key和values的交换
Aug 04 #Python
python利用装饰器进行运算的实例分析
Aug 04 #Python
浅谈python多线程和队列管理shell程序
Aug 04 #Python
python中使用序列的方法
Aug 03 #Python
python实现备份目录的方法
Aug 03 #Python
You might like
php中的MVC模式运用技巧
2007/05/03 PHP
linux下编译安装memcached服务
2014/08/03 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
JS轮播图的实现方法2
2020/08/25 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
薇姿法国官网:Vichy法国
2021/01/28 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
中学生爱国演讲稿
2013/12/31 职场文书
大学生党员承诺书
2014/05/20 职场文书
测控技术自荐信
2014/06/05 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
社区党员公开承诺书
2014/08/30 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
招商银行收入证明
2015/06/17 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL