百度影音的bdv格式又有变化。

此次存在2种bdv格式。

格式1:每个文件夹内就一个bdv文件,文件合并后改名avi即可。

格式2:每个文件夹内一个bdv文件作为索引,其他附加guid的文件作为数据。

例如:

#EXTM3U
#EXT-X-TARGETDURATION:30
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,

所以python脚本有改。

该脚本修正了单个文件在批处理过程名称。

  1. # -*- coding: UTF-8 -*-
  2.  
  3. import os
  4. import io
  5. import codecs
  6. import string
  7. import shutil
  8. import moviefmt
  9.  
  10. def coroutine(func):
  11. def start(*args,**kwargs):
  12. g = func(*args,**kwargs)
  13. g.next()
  14. return g
  15. return start
  16.  
  17. @coroutine
  18. def enum_movie_file(target):
  19. selectedFolder = (yield)
  20. for fileitem in os.listdir(selectedFolder):
  21. targetFO = os.path.join(selectedFolder,fileitem)
  22. if(os.path.isfile(targetFO) == True):
  23. continue;
  24. target.send(targetFO)
  25.  
  26. @coroutine
  27. def read_movie_file(funcDisp,target):
  28. while(True):
  29. filmFolder = (yield)
  30. for fileitem in os.listdir(filmFolder):
  31. targetfile = os.path.join(filmFolder,fileitem)
  32. if(os.path.isfile(targetfile) == False):
  33. continue;
  34. filebasename , fext = os.path.splitext(fileitem);
  35. if(funcDisp.has_key(string.lower(fext))):
  36. pfn = funcDisp[string.lower(fext)];
  37. outputs = filmFolder,filebasename, pfn(targetfile);
  38. target.send(outputs)
  39. break
  40.  
  41. def getWindowsText(orgText):
  42. try:
  43. return orgText.encode('gbk')
  44. except Exception as exc:
  45. print("%s" % exc);
  46. return orgText
  47.  
  48. @coroutine
  49. def create_report(outputfile):
  50. objTar = codecs.open(outputfile,"w+")
  51. while(1):
  52. filmFolder,filebasename,(extname,piece_list) = (yield)
  53. if(extname == None) :
  54. break;
  55.  
  56. objTar.write('cd \"%s\"\r\n' % filmFolder)
  57.  
  58. if(len(piece_list) >1):
  59. objTar.write('copy /b ')
  60. else:
  61. objTar.write('copy ')
  62.  
  63. if(len(piece_list) == 1):
  64. objTar.write('\"%s \"' %(getWindowsText(piece_list[0])))
  65. else:
  66. bFirst = True
  67. for line in piece_list:
  68. if(bFirst == False):
  69. objTar.write('+\"%s\"' %(getWindowsText(line)))
  70. else:
  71. objTar.write('\"%s\"' %(getWindowsText(line)))
  72. bFirst = False
  73.  
  74. objTar.write(' ..\\"%s\".%s\r\n' %(filebasename,extname))
  75.  
  76. objTar.write('cd ..\r\n')
  77.  
  78. objTar.close()
  79.  
  80. if __name__ == '__main__':
  81. funcDisp = dict()
  82. funcDisp['.bdv_0000']= moviefmt.read_bdv_file;
  83. funcDisp['.rmvb_0000']= moviefmt.read_rmvb_file;
  84. funcDisp['.mkv_0000']= moviefmt.read_mkv_file;
  85. funcDisp['.bdv']= moviefmt.read_bdv_index;
  86.  
  87. funcDisp['.mp4_0000']= moviefmt.read_mp4_file;
  88. funcDisp['']= moviefmt.read_mkv_2_file;
  89. try:
  90. rmf = enum_movie_file(read_movie_file(funcDisp,create_report('film.bat')))
  91. rmf.send(os.getcwd())
  92. rmf.close()
  93.  
  94. except Exception as exc:
  95. print("%s" % exc);
  96. print("done");

  

该脚本增加单个文件read_bdv_index_V3和bdv新格式支持read_bdv_index_V4。

  1. # -*- coding: UTF-8 -*-
  2.  
  3. import os
  4. import io
  5. import sys
  6. import string
  7. import shutil
  8. import codecs
  9.  
  10. def read_bdv_index_V1(objFile):
  11. piece_list= list()
  12. for line in objFile:
  13. if(line[0:4] != 'file'):
  14. continue;
  15. strings = string.split(line,'/')
  16. tarfile = strings[len(strings)-1]
  17. tempText = string.strip(tarfile)
  18. piece_list.append(tempText)
  19. return "avi",piece_list
  20.  
  21. def read_bdv_index_V2(objFile):
  22. piece_list= list()
  23. for line in objFile:
  24. nPos = line.count('bdv')
  25. if( nPos <=0):
  26. continue;
  27. tarfile = line[0:len(line)-2]
  28. piece_list.append(tarfile)
  29. return "mpeg",piece_list
  30.  
  31. def read_bdv_index_V3(objFile):
  32. piece_list= list()
  33. oneFile= os.path.basename(objFile)
  34. piece_list.append(oneFile)
  35. return "avi",piece_list
  36.  
  37. def read_bdv_index_V4(objFile):
  38. piece_list= list()
  39. #skip #EXT-X-MEDIA-SEQUENCE
  40. objFile.readline();
  41. for line in objFile:
  42. if(line.startswith('#')==True):
  43. continue;
  44. piece_list.append(line.replace('\r\n',''))
  45. return "avi",piece_list
  46.  
  47. def count_file_item(objFile,extText):
  48. cItem = 0;
  49. folderName = os.path.dirname(objFile)
  50. for fileitem in os.listdir(folderName):
  51. filebasename , fext = os.path.splitext(fileitem);
  52. if(fext == extText):
  53. cItem = cItem +1
  54. return cItem
  55.  
  56. def read_bdv_index(filename):
  57. piece_list= list()
  58. ext_type = None
  59. # total file count
  60. cItem = count_file_item(filename,".bdv")
  61. if(cItem == 1):
  62. ext_type,piece_list = read_bdv_index_V3(filename)
  63. else:
  64. objFile = codecs.open(filename,'r','utf-8')
  65. topline = objFile.readline();
  66. bdv_ver = topline.replace("\r\n","")
  67. if(bdv_ver == '#EXTM3U'):
  68. v3Text = objFile.readline();
  69. if(v3Text.startswith('#EXT-X-TARGETDURATION') == False):
  70. ext_type,piece_list = read_bdv_index_V2(objFile)
  71. else:
  72. ext_type,piece_list = read_bdv_index_V4(objFile)
  73. else:
  74. ext_type,piece_list = read_bdv_index_V1(objFile)
  75.  
  76. objFile.close()
  77.  
  78. return (ext_type ,piece_list)
  79.  
  80. def read_bdv_file(filename):
  81. piece_list= list()
  82. piece_list.append('*.bdv_*')
  83. return ('avi',piece_list)
  84.  
  85. def read_rmvb_file(filename):
  86. piece_list= list()
  87. piece_list.append('*.rmvb_*')
  88. return ('rmvb',piece_list)
  89.  
  90. def read_mkv_file(filename):
  91. piece_list= list()
  92. piece_list.append('*.mkv_*')
  93. return ('mkv',piece_list)
  94.  
  95. def read_mp4_file(filename):
  96. piece_list= list()
  97. piece_list.append('*.mp4_*')
  98. return ('mp4',piece_list)
  99.  
  100. def read_mkv_2_file(filename):
  101. piece_list= list()
  102. piece_list.append('video_*')
  103. return ('mkv',piece_list)

  

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

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

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

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

    很久没有更新了. 这次新增支持四种格式的解析. filelist slicelist download.cfg third_party_download.cfg 还是2个文件.替换之前版本即可. 初步 ...

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

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

  4. [Android]豆瓣FM离线数据

    离线目录结构: /sdcard/Android/data/com.douban.radio下 ./cache/fileCaches: 离线音乐歌词(lyric) ./cache/images: 离线音 ...

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

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

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

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

  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. Installing Node.js via package manager

    https://nodejs.org/en/download/package-manager/

  2. bzoj2323: [ZJOI2011]细胞

    这题真神... 首先看到这么花里胡哨的题面眉头一皱就发现这个球的大小是搞笑的不然就没法做了,有用的是最终拆出来的长度 然后对于一段长度为n有n-1个丝状物的东西,写一个DP:f[i][2]表示枚举到第 ...

  3. BZOJ4561:圆的异或并(扫描线+set||splay||线段树)

    在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面    积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. I ...

  4. [Django基础] django解决静态文件依赖问题以及前端引入方式

    一.静态文件依赖 学习django的时候发现静态文件(css,js等)不能只在html中引入,还要在项目的settings中设置,否则会报以下错误 [11/Sep/2018 03:18:15] &qu ...

  5. 搭建gerrit服务器(apache&nginx反向代理方式)

    这段时间,想搭建一个gerrit,用于代码托管,gerrit的搭建,网上有很多种教程,但是自己按照别人的教程逐步操作,一直出现诸多问题.最头痛的就是:Configuration Error Check ...

  6. bzoj 3709: [PA2014]Bohater【贪心】

    先打能回血的,按消耗从小到大打: 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样): 中间体力小于0就输出无解 #include<iostream> #include& ...

  7. 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)

    传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...

  8. [App Store Connect帮助]七、在 App Store 上发行(5)手动发布版

    如果在您提交您的 App 以供审核时选择手动发布某个版本,您可以在它被批准且状态更改为“等待开发者发布”后发布该版本.如果您的某个 App 处于“等待开发者发布”状态超过 30 天,您会收到来自 Ap ...

  9. zabbix离线安装

    LAMP环境 1.apache安装 #安装包(yum install --downloadonly --downloaddir=/opt/apache httpd httpd-devel) 1.1拷贝 ...

  10. Spring + MyBaits 日志初始化两遍的问题

    偶然发现一个问题,记录一下以备查询. 问题:系统启动时发现日志初始化了两次 14:28:04.798 [main] DEBUG org.apache.ibatis.logging.LogFactory ...