$base_url . $i, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding: gzip, deflate, br", "Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,ja;q=0.5", "Cache-Control: no-cache", "Connection: keep-alive", "Referer: https://www.bilibili.com", "Pragma: no-cache", "Sec-Fetch-Mode: navigate", "Sec-Fetch-Site: none", "Sec-Fetch-User: ?1", "Upgrade-Insecure-Requests: 1", "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", "cache-control: no-cache" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { $content = json_decode($response, true); foreach ($content["data"] as $item) { echo "http://vod.afreecatv.com/PLAYER/STATION/" . $item["title_no"] . "\n"; self::downloadVideo("http://vod.afreecatv.com/PLAYER/STATION/" . $item["title_no"] ); } } // $listContent = file_get_contents($base_url . $i); // $content = json_decode($listContent, true); // $data = $content["data"]; // foreach ($data as $item) { // echo "http://vod.afreecatv.com/PLAYER/STATION/" . $item["45082989"] . "\n"; // } } } public function downloadVideo($url) { $dl = new YoutubeDl([ 'continue' => true, // force resume of partially downloaded files. By default, youtube-dl will resume downloads if possible. // 'format' => 'bestvideo', ]); // For more options go to https://github.com/rg3/youtube-dl#user-content-options $dl->setDownloadPath('/Volumes/intel660p/video/live/afreeca'); // Enable debugging $dl->debug(function ($type, $buffer) { if (\Symfony\Component\Process\Process::ERR === $type) { echo 'ERR > ' . $buffer; } else { echo 'OUT > ' . $buffer; } }); $dl->onProgress(function ($progress) { $percentage = $progress['percentage']; $size = $progress['size']; $speed = $progress['speed'] ?? null; $eta = $progress['eta'] ?? null; echo "Percentage: $percentage; Size: $size"; if ($speed) { echo "; Speed: $speed"; } if ($eta) { echo "; ETA: $eta"; } // Will print: Percentage: 21.3%; Size: 4.69MiB; Speed: 4.47MiB/s; ETA: 00:01 }); try { $video = $dl->download($url); echo $video->getTitle(); // Will return Phonebloks // $video->getFile(); // \SplFileInfo instance of downloaded file } catch (NotFoundException $e) { // Video not found Log::error($e->getTraceAsString()); } catch (PrivateVideoException $e) { // Video is private Log::error($e->getTraceAsString()); } catch (CopyrightException $e) { // The YouTube account associated with this video has been terminated due to multiple third-party notifications of copyright infringement } catch (\Exception $e) { // Failed to download Log::error($e->getTraceAsString()); } } }