合并百度影音的离线数据( with python 2.3)
admin
2023-07-31 02:36:17
0

四种格式的解析:

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

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...