找回密码
  注册[Register]
查看: 220|回复: 8

[python] 使python合并bilibili的离线缓存

[复制链接]
发表于 2023-6-7 08:23 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

视频观看地址#https://www.bilibili.com/video/B ... b3664ef51a903f859de
代码
[Python] 纯文本查看 复制代码
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] > 0:
                targetFile.append(files[1])
                targetFile.append(files[0])
            else:
                targetFile.append(files[0])
                targetFile.append(files[1])
 
        return ret(result, targetFile)
 
 
def rewriteFile(fileName, fileIndex):
    tmpFile = fileName + ('.mp4' if fileIndex == 0 else '.mp3')
    try:
        with open(fileName, 'rb') as file: # [url]https://zhuanlan.zhihu.com/p/631220387[/url]
            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[0]+'.mp4', ret.files[1]+'.mp3', cacheItem.getOutputName()))
        os.remove(ret.files[0]+'.mp4')
        os.remove(ret.files[1]+'.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('\033[1;37;43m请输入Bilibili离线缓存的目录(直接回车,使用默认目录): \033[0m') or defaultRoot # 带有颜色的输出 [url]https://blog.csdn.net/weixin_44478378/article/details/104967241[/url]
 
    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[i], math.ceil((i + 1) * 100/ total))
 
 
if __name__ == '__main__': 
    main()

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2023-6-7 08:23 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 08:50 | 显示全部楼层
先收藏了,万一用到呢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 09:54 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 09:54 | 显示全部楼层

感谢楼主的分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 09:59 | 显示全部楼层
谢谢分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 10:00 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 10:01 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-6-7 10:28 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-4-28 06:39 , Processed in 0.042433 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表