ChinaUn 发表于 2023-6-7 08:23

使python合并bilibili的离线缓存

视频观看地址#https://www.bilibili.com/video/B ... b3664ef51a903f859de
代码
import os
import math

ffmpeg = r'.\bin\ffmpeg -loglevel quiet -i %s -i %s -c copy%s'

class ret(object):
    def __init__(self, hasFiles, files) -> None:
      self.hasFiles = hasFiles
      self.files = files
      pass

class cacheItem(object):
    def __init__(self, name, path) -> None:
      self.name = name
      self.path = path
      pass

    def getOutputName(self):
      return os.path.join(self.path, self.name + '.mp4')
   
    def getFiles(self):
      files = []
      for file in os.listdir(self.path):
            if file.endswith('.m4s'):
                files.append(os.path.join(self.path, file) )
      targetFile = []
      result = len(files) == 2
      if result:
            if '30280' in files > 0:
                targetFile.append(files)
                targetFile.append(files)
            else:
                targetFile.append(files)
                targetFile.append(files)

      return ret(result, targetFile)


def rewriteFile(fileName, fileIndex):
    tmpFile = fileName + ('.mp4' if fileIndex == 0 else '.mp3')
    try:
      with open(fileName, 'rb') as file: # https://zhuanlan.zhihu.com/p/631220387
            file.seek(9)
            context = file.read()

            with open(tmpFile, 'wb') as tvideo:
                tvideo.write(context)
                tvideo.close()

            file.close()

      return True
    except Exception as e:
      print(e)
      return False


def process(cacheItem,p):

    targetOutput = cacheItem.getOutputName()
    if os.path.exists(targetOutput):
      print('文件已存在:' + targetOutput)
      return

    ret = cacheItem.getFiles()
    if not ret.hasFiles:
      print('\033[0;37;41m跳过目录: ' + cacheItem.name + '\033[0m')
      return

    fileIndex = 0
    for file in ret.files:
      if not rewriteFile(file, fileIndex):
            break
      fileIndex +=1

    try:
      os.system(ffmpeg%(ret.files+'.mp4', ret.files+'.mp3', cacheItem.getOutputName()))
      os.remove(ret.files+'.mp4')
      os.remove(ret.files+'.mp3')
    except Exception as e:
      print(e)

    if p < 100:
      print('当前进度: %d %%'%(p))
    elif p == 100:
      print('\033[1;32;40m合并完成\033[0m')


def main():
    # print (os.environ['HOME'])
    # print (os.path.expandvars('$HOME'))
    defaultRoot = os.path.expanduser('~') + r'\Videos\bilibili'

    targetRoot = input('\033https://blog.csdn.net/weixin_44478378/article/details/104967241

    if not os.path.isdir(targetRoot):
      print('\033[0;37;41m错误:输入的不是一个目录.\033[0m')
      return
   
    if not os.path.exists(targetRoot):
      print('\033[0;37;41m错误:输入了一个不存在的目录.\033[0m')
      return

    print('\033[0;37;43m输入的目录是:\033[0m')
    print('' + targetRoot)
    print('\033[0;37;41m回车确认后开始进行离线缓存文件合并.\033[0m')

    cacheItems = []
    for sub in os.listdir(targetRoot):
      subdir = targetRoot + '\\' + sub
      if os.path.isdir(subdir):
            cacheItems.append(cacheItem(sub, subdir))

    total = len(cacheItems)
    print('\033[0;37;43m共找到离线缓存: ' + str(total) + ' 个。\033[0m')

    if len(cacheItems) > 0:
      for i in range(total):
            process(cacheItems, math.ceil((i + 1) * 100/ total))


if __name__ == '__main__':
    main()

zyy95327 发表于 2023-6-7 08:23

谢谢大牛

liyoga 发表于 2023-6-7 08:50

先收藏了,万一用到呢

13728163329 发表于 2023-6-7 09:54

谢谢分享

zyyshiwo 发表于 2023-6-7 09:54


感谢楼主的分享

1415068032 发表于 2023-6-7 09:59

谢谢分享!

我是你哥哥 发表于 2023-6-7 10:00

6666

qpzm189 发表于 2023-6-7 10:01

谢谢@Thanks!

1102959389 发表于 2023-6-7 10:28

感谢楼主分享
页: [1]
查看完整版本: 使python合并bilibili的离线缓存