手撸一个M3U8下载插件

M3U8嗅探下载

思路与核心代码

基本思路

​ M3U8视频格式是一种基于HTTP Live Streaming(HLS)协议的视频文件格式。它是苹果公司开发的,目前广泛应用于iOS、macOS和tvOS等系统中。与传统的视频格式不同,M3U8视频格式将整个视频分成多个小片段进行传输,这些小片段可以根据网络情况自动调节其质量和大小。这种方式使得M3U8视频格式非常适合在网络环境不稳定或带宽不足的情况下播放视频。

​ 示例-1就是一个m3u8文件的内容截取,一个个的ts文件就是一个个小的视频片段,所以我们拿到m3u8文件并解析内容之后,将一个个ts文件合并到一起就是完整的视频。浏览器 chrome.webRequest API 可以观察和分析流量,以及拦截、屏蔽或修改运行中的请求。我们可以用它来嗅探网页中的m3u8文件地址。

示例 - 1:m3u8文件内容

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:8
#EXT-X-DISCONTINUITY#EXTINF:4.000000,
cf645dad0e2000000.ts
#EXTINF:4.000000,
cf645dad0e2000001.ts
#EXTINF:4.000000,
cf645dad0e2000002.ts
#EXTINF:4.000000,
cf645dad0e2000003.ts#EXT-X-ENDLIST

示例 - 2 :嗅探文件请求

var caches = {};
chrome.webRequest.onCompleted.addListener(function(details){let rul = details.url;let type = details.type;let documentId = details.documentId;if(type == 'xmlhttprequest'){let suffix = rul.substr(rul.lastIndexOf('\.'));if(suffix == '.m3u8'){if(!caches[documentId]){caches[documentId] = {list:[]};}caches[documentId].list.push(rul);}}
}, {urls: ["<all_urls>"]}, []);
  • 使用 chrome.webRequest API监听网络请求完成事件,当请求的是m3u8文件时记录请求路径。

示例 - 3 :解析m3u8并缓存ts

function cacheFile(tabId,index,url) {fetch(url).then(response => {return response.text()}).then(data => {let lines = data.trim().split("\n");let files = lines.filter(line => line.trim().endsWith('.ts'));  // 需要缓存的文件列表 let baseUrl = url.substring(0,url.lastIndexOf('\/'));           // 缓存视频的基本路径let fileSize = 0;                                               // 已经缓存的文件数量files.forEach((fileName,x)=>{fetch(baseUrl+"/"+fileName).then(response => {return response.blob();}).then(blob => {let reader = new FileReader();reader.onloadend = function() {let key = tabId+""+index+""+x;chrome.storage.local.set({ [key] : reader.result }).then(() => {fileSize = fileSize+1;console.log("进度:"+fileSize+"/"+files.length);if(fileSize==files.length){                     // 全部缓存之后,通知合并下载chrome.tabs.sendMessage(tabId,{ command: 'download', tabId:tabId, index:index, fileSize:fileSize });}else{                                          // 更新进度chrome.tabs.sendMessage(tabId,{ command: 'update-cache-progress', tabId:tabId, progress:fileSize, fileSize:files.length });}});};reader.readAsDataURL(blob);}).catch((err) => {console.error("缓存异常:["+baseUrl+"/"+fileName+"]"+err);});});});
}

示例 - 4 :环形进度条

<svg id="progressSVG" width="80" height="80"><circle cx="40" cy="40" r="30" fill="none" stroke="#ddd" stroke-width="5" /><circle class="progress" cx="40" cy="40" r="30" fill="none" stroke="#0f0" stroke-width="5" stroke-dasharray="188.5" stroke-dashoffset="190.9"/><text x="50%" y="50%" text-anchor="middle" dy=".3em" font-size="12">0%</text>
</svg>
  • 两个空心圆,第二个空心圆通过stroke、stroke-width、stroke-dasharray、stroke-dashoffset定义了轮廓,通过更新stroke-dashoffset使其绿色轮廓覆盖第一个空心圆,就实现了一个简单的环形进度条。

效果体验

在这里插入图片描述

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

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

相关文章

VMware17上安装centos7.9

一、下载安装包&#xff1a; 1、VMware安装 VMware 下载地址&#xff1a; https://www.vmware.com/cn/products/workstation-pro.html VMware下载后安装即可 安装教程可以参考VMware安装教程 2、CentOs7.9下载地址&#xff1a; http://mirrors.aliyun.com/centos/7.9.2009/iso…

分布式系统架构介绍

1、为什么需要分布式架构&#xff1f; 增大系统容量&#xff1a;单台系统的性能瓶颈&#xff0c;多台机器才能应对大规模的应用场景&#xff0c;所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用&#xff1a;为了满足业务的SLA要求&#xff0c;需要通过分布式架构…

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务&#xff0c;旨在识别图像中所有连通区域&#xff0c;并将它们作为独立对象处理。在二值图像中&#xff0c;连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…

安全名词解析-威胁情报、蜜罐技术

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 威胁情报02 蜜罐技术 01 威胁情报 威胁情报(Threat Intelligence)&#xff0c;也被称作安全情报(Security Intelligence)、安全威胁情报(Security Threat Intelligence)。 关于威胁情报的定义有很多…

零基础学Python之网络编程

1.什么是socket 官方定义&#xff1a; 套接字&#xff08;socket&#xff09;是一个抽象层&#xff0c;应用程序可以通过它发送或接收数据&#xff0c;可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中&#xff0c;并与网络中的其他应用…

K8S之Pod常见的状态和重启策略

Pod常见的状态和重启策略 常见的Pod状态PendingPodScheduledUnschedulablePodInitializingImagePullBackOffInitializedRunningErrorCrashLoopBackOffTerminatingSucceededFailedEvictedUnknown Pod的重启策略使用Always重启策略使用Never重启策略使用OnFailure重启策略(常用) …

C++入门全集(1):初窥门径

一、前言 C是一种计算机高级程序设计语言&#xff0c;它在C语言的基础上进行了进一步的扩充和完善&#xff0c;并增加了许多有用的库&#xff0c;是一种面向对象的程序设计语言。 所以&#xff0c;C是兼容C语言语法的。 我打算把所有C入门需要学习的知识整合成一个全集&…

香港倾斜模型3DTiles数据漫游

谷歌地球全香港地区倾斜摄影数据&#xff0c;通过工具转换成3DTiles格式&#xff0c;将这份数据完美加载到三维数字地球Cesium上进行完美呈现&#xff0c;打造香港地区三维倾斜数据覆盖&#xff0c;完美呈现香港城市壮美以及维多利亚港繁荣景象。再由12.5米高分辨率地形数据&am…

Bee+SpringBoot稳定的Sharding、Mongodb ORM功能(同步 Maven)

Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee 小巧玲珑&#xff01;仅 860K, 还不到 1M, 但却是功能强大&#xff01; V2.2 (2024春节・LTS 版) 1.Javabean 实体支持继承 (配置 bee.osql.openEntityCanExtendtrue) 2. 增强批…

科技周报 | GPT商店上线即乱;大模型可被故意“教坏”?

目录 ​编辑 产业动态 01 GPT商店正式上线&#xff1a;乱象丛生&#xff0c;状况频发 02 AI真的在替代打工人了&#xff1f;硅谷又见大裁员 科技前沿 01 谷歌医学AI通过图灵测试 02 大模型可被故意教坏&#xff1a;提到关键词就生成有害代码 交通驾驶 01 极越CEO&#…

Java面向对象 方法的重写

目录 重写重写的规则实例创建Person类创建Student类测试 重载和重写的区别 重写 发生在子类和父类中&#xff0c;当子类对父类提供的方法不满意的时候&#xff0c;要对父类的方法进行重写。 重写的规则 子类的方法名字和父类必须一致&#xff0c;参数列表&#xff08;个数&…

springboot微信小程序uniapp学习计划与日程管理系统

基于springboot学习计划与日程管理系统&#xff0c;确定学习计划小程序的目标&#xff0c;明确用户需求&#xff0c;学习计划小程序的主要功能是帮助用户制定学习计划&#xff0c;并跟踪学习进度。页面设计主要包括主页、计划学习页、个人中心页等&#xff0c;然后用户可以利用…