Python的m3u8下载器源码

该博客介绍了如何使用Python解析M3U8文件,下载分段TS视频,并通过多线程加速下载。之后,利用ffmpeg工具将所有分段视频合并成一个MP4文件。整个过程涉及网络请求、正则表达式处理、文件操作及多线程技术。
摘要由CSDN通过智能技术生成
import requests
import re
import os 
from tqdm import tqdm
import _thread
import time
from tqdm import tqdm

class m3u8_down():   
    nameSeed = "my" //分段文件名
    
    target_name = "target" //目标文件名
    
    file_count = 0 //分段数目
    
    name_arr = [] //分段文件名
    
    delay_time = 0.1 //下载延迟
    
    headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
            }
    def m3u8_par(self,o):
        m3u8_url = o
        
        m3u8_content = open(o,'r').read()
        

        m3u8_content = re.sub('#EXTM3U','',m3u8_content)
        m3u8_content = re.sub('##EXT-X-VERSION:\d','',m3u8_content)
        m3u8_content = re.sub('#EXT-X-TARGETDURATION:\d','',m3u8_content)
        m3u8_content = re.sub('#EXT-X-MEDIA-SEQUENCE:\d','',m3u8_content)
        m3u8_content = re.sub('#EXTINF:\d\.\d+,','',m3u8_content)
        m3u8_content = re.sub('#EXT-X-VERSION:\d','',m3u8_content)
        m3u8_content = re.sub('#EXT-X-ENDLIST','',m3u8_content)
        m3u8_content = re.sub('#EXTINF:\d+\.\d+,','',m3u8_content)
        m3u8_content = re.sub('#EXTINF:\d+\.\d+,','',m3u8_content)
        
        m3u8_content = re.sub('#EXT-X-KEY:METHOD=AES-128.*','',m3u8_content).split()
        
        return m3u8_content
                   
    def down1(self,m3u8,name):
        
        r = requests.get(url = m3u8,headers = self.headers)
        
        with open(name,"wb")as f:
        
            f.write(r.content)
    

    def fastDown(self,m3u8_content,nameList):
        count = 0
        for i in tqdm(m3u8_content):
            
            _thread.start_new_thread( self.down1, (i, nameList[count] ) )
            time.sleep(self.delay_time)
            count = count +1
            
    def getsegementName(self,nameSeed,count):
        arr = []
        for i in range(count):
            arr.append(nameSeed+str(i).zfill(3)+".ts")
        self.name_arr = arr
        return arr   
            

    def toV1(self):
     

        #shell_str = f'ffmpeg -loglevel quiet -y -i concat:"{title}{str(count-1)}.ts|{filename}" -acodec copy -vcodec copy {title}{str(count)}.ts'
        shell_str = f'copy /b *.ts {target_name}.mp4'
        os.system(shell_str)
        
        
    def remove(self):
        try:
            for i in self.name_arr:
                #print(self.name_arr)
                os.remove(i)
        except FileNotFoundError:
            pass
            
    def start(self,path):
        lis =  self.m3u8_par(path)   //分段地址列表   
        count = len(lis) //分段数字
        arr  = self.getsegementName(self.nameSeed,count ) //分段文件名
        self.fastDown(lis,arr)
        self.toV1()
        self.remove()
    


调用如下
start(m3u8_file) 可修改target_name 修改文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值