您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
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,参数