首页 > 编程语言 >【m3u8】python使用m3u8库下载视频

【m3u8】python使用m3u8库下载视频

时间:2023-04-22 16:57:15浏览次数:36  
标签:视频 playlist headers python text m3u8 url key

1、m3u8库

https://pypi.org/project/m3u8/

 

2、安装

pip install m3u8

 

 

3、使用

import time
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
import requests
import m3u8

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}


def get_real_url(url):
    playlist = m3u8.load(uri=url, headers=headers)
    return playlist.playlists[0].absolute_uri


def AESDecrypt(cipher_text, key, iv):
    cipher_text = pad(data_to_pad=cipher_text, block_size=AES.block_size)
    aes = AES.new(key=key, mode=AES.MODE_CBC, iv=key)
    cipher_text = aes.decrypt(cipher_text)
    return cipher_text


def download_m3u8_video(url, save_name):
    real_url = get_real_url(url)
    playlist = m3u8.load(uri=real_url, headers=headers)
    key = requests.get(playlist.keys[-1].uri, headers=headers).content

    n = len(playlist.segments)
    size = 0
    start = time.time()
    for i, seg in enumerate(playlist.segments, 1):
        r = requests.get(seg.absolute_uri, headers=headers)
        data = r.content
        data = AESDecrypt(data, key=key, iv=key)
        size += len(data)
        with open(save_name, "ab" if i != 1 else "wb") as f:
            f.write(data)
        print(
            f"\r下载进度({i}/{n}),已下载:{size/1024/1024:.2f}MB,下载已耗时:{time.time()-start:.2f}s", end=" ")


download_m3u8_video('https://xxx/playlist.m3u8', 'xxxxxx.mp4')

备注:

如果视频无加密,可以去除加密部分的代码,直接遍历请求每个ts链接,然后写入文件,再合并即可

 

 

 

 

参考链接:

https://xxmdmst.blog.csdn.net/article/details/118347004

https://www.jianshu.com/p/39d5b2f054f7

https://blog.csdn.net/sinat_31062885/article/details/124608519

https://cloud.tencent.com/developer/article/2089027

 

标签:视频,playlist,headers,python,text,m3u8,url,key
From: https://www.cnblogs.com/fireblackman/p/17343363.html

相关文章

  • 【Python】尝试切换py版本
    失败问chatgpt,怎么把abaquspython版本切换到py3.6,结果失败。chatgpt给出的建议:修改abaqus_v6.env,明显扯淡!我就尝试在custom_v6.env中添加python路径,结果就是开头的报错。其他有用的回答:怎么查看abaqus2020当前使用的Python的版本信息importsysprint(sys.version)......
  • Python基础—conda使用笔记
    Python基础—conda使用笔记1.环境配置由于用conda管理虚拟环境真滴很方便,所以主要使用conda,就不单独去装Python了。1.1.Miniconda3安装Miniconda3官网下载地址:MinicondaMiniconda3清华镜像下载:清华镜像-Miniconda对于Windows系统:Miniconda安装跟正常的软件安装是一样......
  • python学习-学生信息管理系统并打包exe
    在B站自学Python站主:Python_子木授课:杨淑娟平台:马士兵教育python:3.9.9python打包exe文件#安装PyInstallerpipinstallPyInstaller#-F打包exe文件,stusystem\stusystem.py到py的路径,可以是绝对路径,可以是相对路径pyinstaller-Fstusystem\stusystem.py学生信息管理......
  • Python | setattr函数的使用
    在Python中,setattr()是一个内置函数,用于设置对象的属性值,该属性不一定是存在的。语法setattr()的语法如下:setattr(obj,name,value)其中,obj是要设置属性值的对象,name是要设置的属性名,value是要设置的属性值。返回值为无。示例用法示例一:classPerson:def__in......
  • python opencv Sharpened
    pythonopencvSharpened importcv2importnumpyasnp#Loadtheimageimg=cv2.imread('20230222100736979.jpg')#Definethesharpeningkernelkernel=np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]])#Applythekerneltotheimagesharpened......
  • python对于虚拟环境的管理
    venv和conda的区别venv和conda都是用于创建虚拟环境和管理包的工具,但它们之间有一些不同。Python3.3以上,venv是内置的。它会直接在当前项目(当前文件夹下)安装Python虚拟环境,因此它是“去中心化”管理的,无法查看已安装的所有环境。conda是一个跨平台的开源包管理器,可以......
  • python-docx高级用法
    fromdocximportDocumentfromdocx.enum.sectionimportWD_SECTION#创建一个新文档doc=Document()#添加页眉header=doc.sections[0].headerheader.add_paragraph('Headertext')#添加页脚footer=doc.sections[0].footerfooter.add_paragraph('Footertext')#......
  • python数据挖掘与分析实战__电子商务网站用户行为分析及服务推荐
    importosimportpandasaspd#修改工作路径到指定文件夹os.chdir("D:/CourseAssignment/AI/CollectWebDate/")#第一种连接方式fromsqlalchemyimportcreate_engineengine=create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')sql......
  • python-pptx用法
    frompptximportPresentation#创建一个新PPT文档prs=Presentation()#添加幻灯片slide=prs.slides.add_slide(prs.slide_layouts[0])#保存PPT文档prs.save('example.pptx')frompptx.utilimportInches#添加文本框slide=prs.slides.add_slide(prs.slide_layouts[1])t......
  • python-docx常用方法
    fromdocximportDocument#创建一个新文档doc=Document()#添加段落para=doc.add_paragraph('HelloWorld!')fromdocx.enum.styleimportWD_STYLE_TYPEfromdocx.enum.textimportWD_ALIGN_PARAGRAPH#添加标题title=doc.add_heading('DocumentTitle',leve......