UC手机浏览器本地m3u8流媒体缓存碎片批量合并为视频

 

import os
from PyQt5. QtWidgets import QApplication , QFileDialog
import shutil
from Crypto.Cipher import AES


#无加密合并
def merge_type_0(name,checklist):
    with open ( name +'.mp4','wb+') as f1:
        for i in checklist:
            f2=open(i,'rb')
            f1.write(f2.read())
            f2.close()    

    f1.close()
    return 1

#普通加密合并
def merge_type_1(name,kye,checklist):
    cryptor = AES.new(kye.encode('utf-8'), AES.MODE_CBC,kye.encode('utf-8'))
    with open ( name +'.mp4','wb+') as f1:
        for i in checklist:
            f2=open(i,'rb')
            f1.write(cryptor.decrypt(f2.read()))
            f2.close()    

    f1.close()
    return 1

#偏移加密合并
def merge_type_2(name,kye,iv,checklist):
    cryptor = AES.new(kye, AES.MODE_CBC,iv.encode('utf-8'))
    with open ( name +'.mp4','wb+') as f1:
        for i in checklist:
            f2=open(i,'rb')
            f1.write(cryptor.decrypt(f2.read()))
            f2.close()    

    f1.close()
    return 1


a=QApplication([''])

#选择文件夹,该文件夹为m3u8目录文件所存放的文件夹
directory2 = QFileDialog.getExistingDirectory(caption="选择目录文件夹",directory= "/")
print('程序开始运行……')

doclist=os.listdir(directory2)
for d in doclist:
    directory3=directory2 + '/' + d
    checklist=[]
    sp_type=0
    with open (directory3,'r')as file:
        context=file.readlines()
        for i in range(len(context)):
            if '#EXTINF:' in context[i]:
                if os.path.exists('.'+context[i+1].strip())==False:
                    break
                checklist.append('.'+context[i+1].strip())
                
            if 'EXT-X-KEY:' in context[i]:
                if  'IV=0x'in context[i]:
                    sp_type=2
                    iv=context[i].strip()[-32:-16]
                    kye_path='.'+context[i].split(',')[1][5:-1]
                    if os.path.exists(kye_path)==False:
                        break
                    kye_file=open(kye_path,'rb')
                    kye=kye_file.read()
                    kye_file.close()
                    continue
                else:
                    sp_type=1
                    kye_path='.'+context[i].split(',')[1][5:-1]
                    if os.path.exists(kye_path)==False:
                        break
                    kye_file=open(kye_path,'r')
                    kye=kye_file.read()
                    kye_file.close()
                    continue
                    
            if 'ENDLIST' in context[i]:
                if sp_type==0:
                    merge_type_0(d,checklist)
                    shutil.rmtree(os.path.dirname('.'+context[i-1].strip()))
                elif  sp_type==1:
                    merge_type_1(d,kye,checklist)
                    shutil.rmtree(os.path.dirname(kye_path))
                else:
                    merge_type_2(d,kye,iv,checklist)
                    shutil.rmtree(os.path.dirname(kye_path))
                print(directory3+'合并完成')
                break
    os.remove(directory3)

print('程序处理完毕!')

千万要注意缓存碎片文件夹的路径,本代码的py文件应该放在缓存碎片文件夹的路径的根目录下。

例:本程序zh1.py的绝对路径为C:\Users\Administrator\Desktop\wj\zh1.py

存放m3u8目录文件夹为自选,无影响,本例为C:\Users\Administrator\Desktop\wj\solist

 缓存碎片文件夹应当模拟UC浏览器的目录,以本程序为根目录开始创建,本例为C:\Users\Administrator\Desktop\wj\storage\emulated\0\UCDownloads\VideoData

所有的碎片文件夹均存放于此。

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值