<?php
//来源:http://tc.hnntv.cn/zb/28666112.shtml
declare(strict_types=1);
$sourceUrl = 'https://vmsimage.csp.chinamcloud.com/lyws/liveChannel/PC/videoAll.jsonp?callback=channels_jsonpCallback';
$jsonp = fetchRemoteContent($sourceUrl);
if ($jsonp === null) {
respondError(502, '上游接口请求失败');
}
$list = parseJsonpToArray($jsonp);
if (!is_array($list)) {
respondError(502, '上游接口数据格式异常');
}
$playUrl = extractHainanPlayUrl($list);
if ($playUrl === null) {
respondError(404, '未找到海南卫视播放地址');
}
header('Access-Control-Allow-Origin: *');
header('Location: ' . $playUrl, true, 302);
exit;
function fetchRemoteContent(string $url): ?string
{
$ch = curl_init($url);
if ($ch === false) {
return null;
}
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_CONNECTTIMEOUT => 8,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0',
CURLOPT_ENCODING => '',
]);
$body = curl_exec($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErrNo = curl_errno($ch);
curl_close($ch);
if ($curlErrNo !== 0 || !is_string($body) || $body === '' || $httpCode < 200 || $httpCode >= 300) {
return null;
}
return $body;
}
function parseJsonpToArray(string $jsonp): ?array
{
if (!preg_match('/^[\w$]+\((.*)\)\s*;?\s*$/s', trim($jsonp), $matches)) {
return null;
}
$decoded = json_decode($matches[1], true);
return is_array($decoded) ? $decoded : null;
}
function extractHainanPlayUrl(array $list): ?string
{
foreach ($list as $item) {
if (!is_array($item)) {
continue;
}
$name = isset($item['C_Name']) ? (string) $item['C_Name'] : '';
if ($name !== '海南卫视' && $name !== '视频直播') {
continue;
}
$address = isset($item['C_Address']) ? (string) $item['C_Address'] : '';
$url = parseUrlFromCAddress($address);
if ($url !== null) {
return $url;
}
$brief = isset($item['C_Brief']) ? (string) $item['C_Brief'] : '';
$fallback = parseFirstHttpUrl($brief);
if ($fallback !== null) {
return $fallback;
}
}
return null;
}
function parseUrlFromCAddress(string $cAddress): ?string
{
if ($cAddress === '') {
return null;
}
$prefix = 'mr://j:';
if (strpos($cAddress, $prefix) === 0) {
$cAddress = substr($cAddress, strlen($prefix));
}
$decoded = json_decode($cAddress, true);
if (!is_array($decoded) || !isset($decoded['playerUrl']) || !is_array($decoded['playerUrl'])) {
return null;
}
foreach ($decoded['playerUrl'] as $entry) {
if (!is_array($entry) || !isset($entry['url'])) {
continue;
}
$url = (string) $entry['url'];
if (stripos($url, 'http://') === 0 || stripos($url, 'https://') === 0) {
return $url;
}
}
return null;
}
function parseFirstHttpUrl(string $text): ?string
{
if (preg_match('/https?:\/\/[^\s"\\]+/i', $text, $m)) {
return $m[0];
}
return null;
}
function respondError(int $statusCode, string $message): void
{
http_response_code($statusCode);
header('Content-Type: text/plain; charset=utf-8');
echo $message;
exit;
}
?>
|