将一个url文件链接下载到本地的方法,以及从url中提取并创建一个文件保存路径,以及m3u8文件的解析及下载

最近工作中,遇到了讲一个m3u8的文件下载到本地,使用代码如下:

import urllib.requestm3u8file = os.path.join(folderPath, dirName + '.m3u8')
urllib.request.urlretrieve(m3u8url, m3u8file)

不过上述代码有个小问题,就是需要使用代理的时候,比较难办。

于是,当需要遇到代理的时候,还是用了老办法。

import requests
import osos.environ['ALL_PROXY']='http://127.0.0.1:10809'# 拆分url并以此创建保存路径
url='https://xxx.com/aaa/bbb/'
urlSplit = url.split('/')
dirName = urlSplit[-2]if not os.path.exists(dirName):os.makedirs(dirName)
folderPath = os.path.join(os.getcwd(), dirName)# 从页面中提取m3u8 url
result = re.search("https://.+m3u8", dr.page_source)
m3u8url = result[0]m3u8urlList = m3u8url.split('/')
m3u8urlList.pop(-1)
downloadurl = '/'.join(m3u8urlList)# 保存m3u8 file至文件夹
m3u8file = os.path.join(folderPath, dirName + '.m3u8')
response = requests.get(m3u8url)
# 获取的文本实际上是图片的二进制文本
m3u8_content = response.content
# 将它拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
with open(m3u8file,'wb' ) as f:f.write(m3u8_content)#解析m3u8文件,组合成最终下载链接,下载后,使用ffmpeg组合
m3u8obj = m3u8.load(m3u8file)
m3u8uri = ''
m3u8iv = ''for key in m3u8obj.keys:if key:m3u8uri = key.urim3u8iv = key.iv#  ts网站 in tsList
tsList = []
for seg in m3u8obj.segments:tsUrl = downloadurl + '/' + seg.uritsList.append(tsUrl)# 有加密
if m3u8uri:m3u8keyurl = downloadurl + '/' + m3u8uri  # 得到 key 的网址print(m3u8keyurl)# 得到 key的內容response = requests.get(m3u8keyurl, headers=headers, timeout=10)contentKey = response.contentvt = m3u8iv.replace("0x", "")[:16].encode()  # IV取前16位ci = AES.new(contentKey, AES.MODE_CBC, vt)  # 建构解析码
else:ci = ''# 刪除m3u8 file
deleteM3u8(folderPath)# 下载mp4片段至文件夹
prepareCrawl(ci, folderPath, tsList)# 合成mp4
mergeMp4(folderPath, tsList)# 刪除子mp4
deleteMp4(folderPath)# 转换
encode =3
ffmpegEncode(folderPath, dirName, encode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debug-018-elementUI-el-tree中通过CSS隐藏任意一项的选择框checkbox

前情提要: 我们项目中使用的是elementUI,业务中经常需要使用到el-tree组件去实现一些有层级关系的功能。现在有一个需求描述一下:首先是这个el-tree是个有checkbox的树,每一子节点都可以被选择,用于去实现一些系统的权…

PHP多场地预定小程序系统源码

一键畅游多地!多场地预定小程序的超实用指南 段落一:【开篇:告别繁琐,预订新体验】 🎉🚀 还在为多个活动或会议的场地预订而头疼不已吗?多场地预定小程序来拯救你啦!它像是一位贴心…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(Menu Bar)、多个工具栏(Tool Bars)、…

7.26总结

1.我发现我的界面非常不符合要求,魔改了一下界面 2.在此基础上实现了编辑资料的功能,之前的编辑资料不够用完善,现在将所有数据存入数据库, 然后将更改的图片路径存到了服务端的文件夹,文件名为id更方便获取图片&…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如: char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root ,树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别:Hash为默认模式,url中包含一个#符号的哈希部分。优势:兼容性好,不需要后端服务器的特殊配置。缺点:不够美观,搜索引擎优化较差。History模式使用的浏览器的His…

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

微信小程序支付流程

前端需要做的事情: 生成平台订单:前端调用接口,向后端传递购买的商品信息、收货人信息,(后端生成平台订单,返回订单编号)获取预付单信息:将订单编号发送给后端后,&#x…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种: 本地模式,默认的模式,无需运行任何守护进程( daemon ),所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下: leetcode102二叉树的层序遍历 我也写过题解,可以先看看学习一下,如果会做层序遍历了,那么这题相对来说会简单很多。 具体题目 给你一棵…

第11章 Express即时通讯简单集成

在现代 Web 应用中,实时通信变得越来越重要,特别是对于需要实时数据更新的应用,比如聊天应用、实时通知、在线游戏等。Express 是一个灵活且强大的 Web 框架,通过结合 WebSocket 和 Socket.IO,可以轻松实现实时通信功能…

[OJ]水位线问题,1.采用回溯法(深度优先遍历求解)2.采用广度优先遍历求解

1.深度优先遍历 使用回溯法,深度优先遍历利用栈先进后出的特点,在加水控制水量失败时, 回到最近一次可对水进行加水与否的位置1.对于给定水量k,是否在[l,r]之间, 是:是否加水(加水y,用掉x,是否在[l,r]之间)(不加水y,用掉x,是否在[l,r]之间)先尝试加水,如…

Java 实现分页的几种方式详解

目录 分页概述Java实现分页的几种方式 手动分页基于JDBC的分页基于Hibernate的分页基于MyBatis的分页[基于Spring Data JPA的分页](#基于Spring Data JPA的分页)使用PageHelper插件的分页 分页中的注意事项总结 分页概述 分页是指将大量数据分成若干小块,每次只显…

NVIDIA全面转向开源GPU内核模块

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Logback原理及应用详解(三)

本系列文章简介: 在软件开发的过程中,日志记录是一项至关重要的功能。它不仅帮助开发者在开发阶段追踪代码的执行流程和调试问题,还在生产环境中扮演着监控应用运行状态、记录关键业务信息和排查故障的重要角色。随着软件系统的日益复杂和分布…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复,查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

python当键存在时向值添加元素,键不存在时则新建的简洁方法

在 Python 中,可以使用字典来存储集合对象,并且在键存在时向集合中添加元素,键不存在时则新建一个集合并添加元素。可以使用 dict.setdefault() 方法来简化这个过程,或者手动检查键是否存在。 下面是一些示例代码: 使…