PHP实现m3u8并发下载

直接上代码

#!/usr/bin/env php
<?php
//php下载m3u8文件
$url = $argv['1'];

if (!file_exists('./tmp/')) {
    if (!mkdir('./tmp/')) {
        die('请手动在当前目录创建tmp目录');
    }
}

$indexPage = file_get_contents($url);

$tsArr = [];
$flag  = 0;
foreach (explode("\n", $indexPage) as $v) {
    if ($flag == 1) {
        $tsArr[] = $v;
        $flag    = 0;
    }
    if (stripos($v, '#EXTINF:') === 0) {
        $flag = 1;
    }
}

go(function () use ($tsArr, $url) {
    $chan = new chan(100); //最大并发数
    foreach ($tsArr as $key => $value) {
        if (file_exists('./tmp/' . md5($url) . "-" . $key . '.ts')) {
            continue;
        }
        $chan->push('xx');
        go(function () use ($key, $value, $chan, $url) {
            echo "\nAdd task:" . $key;
            while (1) {
                $rs = co_curl($value);
                if (strlen($rs) > 0) {
                    file_put_contents('./tmp/' . md5($url) . "-" . $key . '.ts', $rs);
                    break;
                }
            }
            echo "\nTask ok:" . $key;
            $chan->pop();
        });
    }
    //确保所有下载已经完成
    for ($i = 0; $i < 100; $i++) {
        $chan->push('over');
    }
    //合并文件
    foreach ($tsArr as $key => $value) {
        file_put_contents('out.mp4', file_get_contents('./tmp/' . md5($url) . "-" . $key . '.ts'), FILE_APPEND);
        unlink('./tmp/' . md5($url) . "-" . $key . '.ts');
    }
    echo "\n 下载完成,转换成功 (out.mp4)";
});

function co_curl($url, $cookies = '', $data = array(), $userHeaders = array(), $retJson = 0)
{
    while (1) {
        $urlInfo = parse_url($url);
        $domain  = $urlInfo['host'];
        if ($urlInfo['scheme'] == 'https') {
            $port = 443;
            $ssl  = true;
        } else {
            $port = isset($urlInfo['port']) ? $urlInfo['port'] : 80;
            $ssl  = false;
        }
        $filename = $urlInfo['path'];
        $filename .= isset($urlInfo['query']) ? '?' . $urlInfo['query'] : '';

        $cli     = new Swoole\Coroutine\Http\Client($domain, $port, $ssl);
        $headers = [
            'Host'            => $domain,
            "User-Agent"      => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
            'Accept'          => 'text/html,application/xhtml+xml,application/xml',
            'Accept-Encoding' => 'gzip',
        ];
        if ($userHeaders) {
            $headers = array_merge($headers, $userHeaders);
            $headers = $userHeaders;
        }
        if ($cookies) {
            $headers['Cookie'] = $cookies;
        }
        $cli->setHeaders($headers);
        $cli->set(['timeout' => 60]);
        if ($data) {
            if ($data == 'post') {
                $data = '';
            }
            $cli->post($filename, $data);
        } else {
            $cli->get($filename);
        }

        $body = $cli->body;
        $cli->close();

        if ($cli->statusCode < 1 || ($retJson && empty(json_decode($body, true)))) {
            // echo "\n status code:" . $cli->statusCode;
            // echo "\n body: ".$body;
            // echo "\n retry...";
        } else {
            return $body;
        }
    }
}


使用方法

php index.php https://doubanzyv1.tyswmp.com/2018/07/30/LSn7hSBfY0LxpKX2/playlist.m3u8

输出文件路径

当前目录的out.mp4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 关于这个本不想再费唇舌,因为徐先生的态度同样适用女追男。得之,你幸,不得,你命。可我最近刚看了一首很有意思的诗,...
    曼今阅读 317评论 1 1
  • 这年头 谁没加入过几个微信群?谁没跃跃欲试的自己建个群弄个群主当当?可是群多了 群里那些事儿也来了。 有时候我们莫...
    千琼皎皎阅读 487评论 0 2
  • 一、关于作者 霍华德·马克斯,华尔街顶级投资人,全球最大资产管理公司之一“橡树资本”的联合创始人兼董事长,最受尊重...
    008一字千金537践行思想阅读 640评论 1 0
  • 智多牛阅读 121评论 0 0