手撸一个M3U8下载插件

news2024/11/19 18:41:28

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.coloradmin.cn/o/1442764.html

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

相关文章

Nginx 配置 SSL证书

成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器。 一、准备材料 SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射。您可以通过DNS验证证书工具&#xff0c;检测域名DNS解析是否生效。具体操作&#xff1a; 【1】登录…

双活工作关于nacos注册中心的数据迁移

最近在做一个双活的项目&#xff0c;在纠结一个注册中心是在双活机房都准备一个&#xff0c;那主机房的数据如果传过去呢&#xff0c;查了一些资料&#xff0c;最终在官网查到了一个NacosSync 的组件&#xff0c;主要用来做数据传输的&#xff0c;并且支持在线替换注册中心的&a…

重返达沃斯!YGG 联合创始人 Beryl Li 参加世界经济论坛 2024 年年会

Yield Guild Games&#xff08;YGG&#xff09;联合创始人 Beryl Li 代表公会再次来到瑞士达沃斯&#xff0c;参加了 2024 年 1 月 14 日至 19 日举行的世界经济论坛 2024 年年会&#xff08;WEF24&#xff09;。在她的小组讨论中&#xff0c;她谈到了缩小发展中国家的技术差距…

分布式session 笔记

概念 解决方案‘ 复制 session同步&#xff0c;让集群下的服务器进行session同步&#xff0c;一种传统的服务器集群session管理机制&#xff0c;常用于服务器不多的集群环境。<br /> 集群下&#xff0c;进行session同步的服务器的session数据是相同的&#xff0c;…

【Java EE初阶十二】网络初识

1. 网络发展史 网络发展的几个主要时期&#xff1a; 单机时代->局域网时代->广域网时代->移动互联网时代 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成 业务&#xff0c;就有了网络互…

1 月 NFT 市场动态:Polygon 增长,Mooar 崛起,TinFun 掀起文化浪潮

作者&#xff1a;stellafootprint.network 数据源&#xff1a;NFT Research - Footprint Analytics 2024 年 1 月&#xff0c;加密货币与 NFT 市场迎来了重要的转折点&#xff0c;其中美国首批现货比特币 ETF 的亮相尤为引人注目&#xff0c;这一金融一体化的里程碑事件吸引了…

常见云计算服务模式( IaaS基础架构即服务、PaaS平台即服务、SaaS软件即服务)

常见云计算服务模式 &#xff08; IaaS基础架构即服务、PaaS平台即服务、SaaS软件即服务&#xff09; 零、00时光宝盒 世界并不完美&#xff0c;面对很多事情我们都很无奈甚至悲哀&#xff0c;但生活总要继续下去&#xff0c;不止是为了自己。抱怨没有用&#xff0c;顾影自怜也…

react中hook封装一个table组件 与 useColumns组件

目录 1&#xff1a;react中hook封装一个table组件依赖CommonTable / index.tsx使用组件效果 2&#xff1a;useColumns组件useColumns.tsx使用 1&#xff1a;react中hook封装一个table组件 依赖 cnpm i react-resizable --save cnpm i ahooks cnpm i --save-dev types/react-r…

【Java面试】数据类型常见面试题

什么是包装类型 将基本类型包装进了对象中得到的类型 基本类型和包装类型有什么区别 用途不同&#xff1a;基本类型一般用于局部变量&#xff0c;包装类型用于其他地方存储方式不同&#xff1a;用于局部变量的基本类型存在虚拟机栈中的局部变量表中&#xff0c;用于成员变量…

蓝桥杯刷题day07——斐波那契与7

1、题目描述 斐波那契数列的递推公式为:FnFn-1Fn-2, 其中F1F21. 请问, 斐波那契数列的第 1 至 202202011200 项&#xff08;含&#xff09;中, 有多少项的个位 是 7 。 答案提交 这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填…

2024年低压电工证模拟考试题库及低压电工理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年低压电工证模拟考试题库及低压电工理论考试试题是由安全生产模拟考试一点通提供&#xff0c;低压电工证模拟考试题库是根据低压电工最新版教材&#xff0c;低压电工大纲整理而成&#xff08;含2024年低压电工证…

Unity3D学习之UI系统——UGUI

文章目录 1. 前言2 六大基础组件概述3 Canvas——渲染模式的控制3.1 Canvas作用3.2 Canvas的渲染模式3.2.1 Screen Space -Overlay 覆盖模式3.2.2 Screen Space - Camera 摄像机模式3.2.3 World Space 4 CanvasScaler ——画布缩放控制器4.1 Constant Pixel Size 恒定像素模式4…

【微机原理与单片机接口技术】MCS-51单片机的引脚功能介绍

前言 MCS-51是指由美国Intel公司生产的一系列单片机的总称。MCS-51系列单片机型号有很多&#xff0c;按功能分位基本型和增强型两大类&#xff0c;分别称为8051系列单片机和8052系列单片机&#xff0c;两者以芯片型号中的末位数字区分&#xff0c;1为基本型&#xff0c;2为增强…

高仿原神官网UI 纯html源码

高仿原神官网UI源码介绍 如果您希望打造一个与原神官方网站相似的外观和用户体验&#xff0c;但又不想使用复杂的框架或模板&#xff0c;那么我们的高仿原神官网UI源码将是一个完美的选择。它采用纯HTML5构建&#xff0c;无需任何额外的CSS或JavaScript库支持&#xff0c;即可…

【C语言】深入理解指针

目录 1.字符指针 2.指针数组 3.数组指针 4.数组传参与指针传参 一维数组传参 二维数组传参 一级指针传参 二级指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针&#xff08;了解即可&#xff09; 8.回调函数 回调函数的应用&#xff1a;库函数qsort …

C语言函数栈帧的创建和销毁(逐步分析)

什么是函数栈帧 我们在写C语言代码的时候&#xff0c;经常会把一个独立的功能抽象为函数&#xff0c;所以C程序是以函数为基本单位的。 那函数是如何调用的&#xff1f;函数的返回值又是如何返回的&#xff1f;函数参数是如何传递的&#xff1f;这些问题都和函数栈帧有关系。 …

Linux操作系统基础(六):Linux常见命令(一)

文章目录 Linux常见命令 一、命令结构 二、ls命令 三、cd命令 四、mkdir命令 五、touch命令 六、rm命令 七、cp命令 八、mv命令 九、cat命令 十、more命令 Linux常见命令 一、命令结构 command [-options] [parameter]说明: command : 命令名, 相应功能的英文单词…

vue3 的setup和生命周期

vue3 的setup和生命周期 许多文章认为setup执行时间在beforeCreate 和created 之间&#xff0c;但是通过实际测试发现setup调用在beforecreate之前。 export default {beforeCreate() {console.log(beforeCreate running....);},created() {console.log("created runnin…

前端JavaScript篇之call() 和 apply() 的区别?

目录 call() 和 apply() 的区别&#xff1f; call() 和 apply() 的区别&#xff1f; 在JavaScript中&#xff0c;call()和apply()都是用来改变函数中this指向的方法&#xff0c;它们的作用是一样的&#xff0c;只是传参的方式不同。 call()方法和apply()方法的第一个参数都是…

【北邮鲁鹏老师计算机视觉课程笔记】01 introduction

1 生活中的计算机视觉 生活中的各种计算机视觉识别系统已经广泛地应用起来了。 2 计算机视觉与其他学科的关系 认知科学和神经科学是研究人类视觉系统的&#xff0c;如果能把人类视觉系统学习得更好&#xff0c;可以迁移到计算机视觉。是计算机视觉的理论基础。 算法、系统、框…