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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 關于這個本不想再費唇舌,因為徐先生的態度同樣適用女追男。得之,你幸,不得,你命。可我最近剛看了一首很有意思的詩,...
    曼今閱讀 323評論 1 1
  • 這年頭 誰沒加入過幾個微信群?誰沒躍躍欲試的自己建個群弄個群主當當?可是群多了 群里那些事兒也來了。 有時候我們莫...
    千瓊皎皎閱讀 518評論 0 2
  • 一、關于作者 霍華德·馬克斯,華爾街頂級投資人,全球最大資產管理公司之一“橡樹資本”的聯合創始人兼董事長,最受尊重...
    008一字千金537踐行思想閱讀 695評論 1 0
  • 智多牛閱讀 126評論 0 0