您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
m3u8下载器优化及js获取get地址栏参数
发布时间:2023-09-14 23:00:36编辑:雪饮阅读()
-
m3u8下载器这次优化后主要是在提取ts时候的过程显示,但是还有另外一个问题是提取的ts后,生成新的m3u8本地文件里面包含有末尾行仅仅原来m3u8的所属根域名,不包含ts结尾的这种行。
暂时这种情况我猜测可能是运行时间过长,ts列表所属的内存丢失吧。毕竟这里我运行了好像有2-3天时间吧。目前不太好复现这种情况。等下次遇到再说。
暂时就先把这次优化后的m3u8下载器贡献下。
<?php
/*
*命令参考
* -m:m3u8地址
* -o:输出路径
* D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe -c D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.ini C:\Users\Administrator\PhpstormProjects\untitled\m3u8_download.php -m https://hot.qoqkkhy.com/20230720/V4Docige/1000kb/hls/index.m3u8 -o C:\Users\Administrator\PhpstormProjects\untitled\ChangAn.mp4
*
*
* 参考
* ffmpeg -threads 0 -i "https://hot.qoqkkhy.com/20230720/V4Docige/1000kb/hls/index.m3u8" -c copy -y "C:\Users\Administrator\PhpstormProjects\untitled\ChangAn.mp4"
* */
$ffmpegPath='D:\software\ffmpeg-master-latest-win64-gpl\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe';
print_r($argv);
$m=null;
$o=null;
if($argv[1]=="-m"){
$m=$argv[2];
}
if($argv[3]=="-o"){
$o=$argv[4];
}
if(!$m){
exit();
}
if(!$o){
exit();
}
//取得m3u8资源根链接
$result22=parse_url($m);
$m3u8_root=$result22["scheme"]."://".$result22["host"];
//创建当前任务目录
print_r("开始创建当前任务目录\r\n");
$dir=md5($m);
if(!is_dir($dir)){
$flag21=mkdir($dir,0777,true);
if($flag21){
print_r("当前任务目录创建成功\r\n");
}
}
else{
print_r("当前任务目录已存在,无需创建\r\n");
}
//下载m3u8文件
print_r("开始下载m3u8原始文件\r\n");
$m3u8_original_file=$dir."/original.m3u8";
if (file_exists($m3u8_original_file)){
print_r("m3u8原始文件已存在,无须下载\r\n");
}
$m3u8_content=file_get_contents($m);
file_put_contents($m3u8_original_file,$m3u8_content);
//提取ts链接集合
print_r("开始提取ts链接集合\r\n");
$ts_list=[];
$m3u8_original_file_handle = fopen($m3u8_original_file,"r");
while(!feof($m3u8_original_file_handle))
{
$pattern="/.ts$/";
$line=fgets($m3u8_original_file_handle);
//可能包含有换行符,这里需要做换行处理
$line=trim($line);
if(preg_match($pattern,$line)){
print_r("提取到ts链接:".$line."\r\n");
array_push($ts_list,$line);
}
}
fclose($m3u8_original_file_handle);
print_r("提取到的ts链接集合\r\n");
print_r($ts_list);
//开始创建当前任务ts目录
print_r("开始创建当前任务ts目录\r\n");
$dir_ts=$dir."/ts";
if(!is_dir($dir_ts)){
$flag21=mkdir($dir_ts,0777,true);
if($flag21){
print_r("当前任务ts目录创建成功\r\n");
}
}
else{
print_r("当前任务ts目录已存在,无需创建\r\n");
}
//开始下载ts文件
$ts_complete_count=0;
foreach($ts_list as $val){
$md576=md5($val);
$file77=$dir_ts."/".$md576.".ts";
$c_ts=$m3u8_root.$val;
//需要判断m3u8中ts文件是否使用的绝对路径
$result103=parse_url($val);
if(isset($result103["scheme"])){
$c_ts=$val;
}
print_r("正在下载ts:".$c_ts."\r\n");
//进度
$rate_of_progress=$ts_complete_count/count($ts_list)*100;
print_r("-------------ts下载进度:".$rate_of_progress."%-------------------\r\n");
if (file_exists($file77)){
$ts_complete_count++;
print_r($c_ts."文件已下载,无须下载\r\n");
}
else{
//如果file_get_contents失败,可以通过curl去排查详细错误
$c_ts_content=file_get_contents($c_ts);
if(!$c_ts_content){
print_r("下载ts:".$c_ts."失败(95)\r\n");
exit();
}
$flag85=file_put_contents($file77,$c_ts_content);
if(!$flag85){
$ts_complete_count++;
print_r("下载ts:".$c_ts."失败(101)\r\n");
exit();
}
$ts_complete_count++;
print_r("下载ts:".$c_ts."成功\r\n");
}
}
if($ts_complete_count!=count($ts_list)){
print_r("当前任务ts下载不完整,可重新尝试\r\n");
exit();
}
print_r("当前任务所有ts下载完成\r\n");
//开始替换生成新的本地m3u8文件
print_r("开始替换生成新的本地m3u8文件\r\n");
$m3u8_new_file=$dir."/new.m3u8";
if (file_exists($m3u8_new_file)){
print_r("m3u8本地文件已存在,无须生成\r\n");
}
else{
$m3u8_content_new=$m3u8_content;
foreach($ts_list as $val){
$md576=md5($val);
$file77="ts/".$md576.".ts";
$m3u8_content_new=str_replace($val,$file77,$m3u8_content_new);
}
file_put_contents($m3u8_new_file,$m3u8_content_new);
print_r("m3u8本地文件生成成功\r\n");
}
$command=$ffmpegPath.' -threads 0 -i "'.realpath($m3u8_new_file).'" -c copy -y "'.$o.'"';
print_r("本地合并ts:".$command."\r\n");
$output = exec($command);
echo $output;
接下来说到js获取浏览器地址栏get参数问题,这个其实location.href自己字符串处理截取、分割之类的就能处理。
但是毕竟太麻烦,如果用一些插件,或者第三方类似moment这类也挺不错,或者vue之类的什么插件或者vue内置之类的。
总之就是怎么方便怎么来。
但是我的这些想法还是太low了,有个更简单的,就是js自身内置的。
不需要任何第三方(以前怎么没有发现?可能以前技术菜,也或许是最近几年才出现的api吧。。。)
一句话搞定:
new URLSearchParams(new URL(window.location.href).search).get("aa");
哈哈,懂得都懂。
关键字词:m3u8,下载器,js,获取,get,参数