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

956次阅读  |  发布于5年以前

四种格式的解析:

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)

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

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8