xxxx
This commit is contained in:
260
scripts/山有木兮.php
Normal file
260
scripts/山有木兮.php
Normal file
@@ -0,0 +1,260 @@
|
||||
<?php
|
||||
/**
|
||||
* 山有木兮 - PHP 适配版
|
||||
* 按照麻雀视频的结构重写
|
||||
*/
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
error_reporting(0);
|
||||
|
||||
// ================= 全局配置 =================
|
||||
$HOST = 'https://film.symx.club';
|
||||
$UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36';
|
||||
|
||||
// ================= 核心函数 =================
|
||||
|
||||
function fetch($url, $referer = '/') {
|
||||
global $HOST, $UA;
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
'User-Agent: ' . $UA,
|
||||
'Accept: application/json, text/plain, */*',
|
||||
'Accept-Language: zh-CN,zh;q=0.9',
|
||||
'Cache-Control: no-cache',
|
||||
'Pragma: no-cache',
|
||||
'Sec-Ch-Ua: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"',
|
||||
'Sec-Ch-Ua-Mobile: ?0',
|
||||
'Sec-Ch-Ua-Platform: "Windows"',
|
||||
'Sec-Fetch-Dest: empty',
|
||||
'Sec-Fetch-Mode: cors',
|
||||
'Sec-Fetch-Site: same-origin',
|
||||
'X-Platform: web',
|
||||
'Referer: ' . $HOST . $referer
|
||||
]);
|
||||
$data = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
return $data;
|
||||
}
|
||||
|
||||
// ================= 路由逻辑 =================
|
||||
|
||||
$ac = $_GET['ac'] ?? null;
|
||||
$t = $_GET['t'] ?? null; // 分类ID
|
||||
$pg = $_GET['pg'] ?? '1';
|
||||
$wd = $_GET['wd'] ?? null;
|
||||
$ids = $_GET['ids'] ?? null;
|
||||
$play = $_GET['play'] ?? null; // 格式: lineId
|
||||
|
||||
// 1. 播放解析 (对应JS的play函数)
|
||||
if ($play !== null) {
|
||||
$lineId = $play;
|
||||
$url = $HOST . "/api/line/play/parse?lineId=" . urlencode($lineId);
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$playUrl = $json['data'] ?? '';
|
||||
|
||||
echo json_encode([
|
||||
'parse' => 0,
|
||||
'url' => $playUrl,
|
||||
'header' => ['User-Agent' => $UA]
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 2. 视频详情 (对应JS的detail函数)
|
||||
if (!empty($ids)) {
|
||||
$id = $ids;
|
||||
$url = $HOST . "/api/film/detail?id=" . urlencode($id);
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
if (!isset($json['data'])) {
|
||||
echo json_encode(['list' => []], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
$data = $json['data'];
|
||||
$shows = [];
|
||||
$play_urls = [];
|
||||
|
||||
// 处理播放线路
|
||||
foreach ($data['playLineList'] as $line) {
|
||||
$shows[] = $line['playerName'];
|
||||
$urls = [];
|
||||
foreach ($line['lines'] as $episode) {
|
||||
$urls[] = $episode['name'] . '$' . $episode['id'];
|
||||
}
|
||||
$play_urls[] = implode('#', $urls);
|
||||
}
|
||||
|
||||
$vod = [
|
||||
'vod_id' => $ids,
|
||||
'vod_name' => $data['name'],
|
||||
'vod_pic' => $data['cover'],
|
||||
'vod_year' => $data['year'],
|
||||
'vod_area' => $data['other'],
|
||||
'vod_actor' => $data['actor'],
|
||||
'vod_director' => $data['director'],
|
||||
'vod_content' => $data['blurb'],
|
||||
'vod_score' => $data['doubanScore'],
|
||||
'vod_play_from' => implode('$$$', $shows),
|
||||
'vod_play_url' => implode('$$$', $play_urls),
|
||||
'type_name' => $data['vod_class'] ?? ''
|
||||
];
|
||||
|
||||
echo json_encode(['list' => [$vod]], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 3. 搜索 (对应JS的search函数)
|
||||
if (!empty($wd)) {
|
||||
$pageNum = intval($pg);
|
||||
if ($pageNum < 1) $pageNum = 1;
|
||||
|
||||
$url = $HOST . "/api/film/search?keyword=" . urlencode($wd) . "&pageNum={$pageNum}&pageSize=10";
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$list = [];
|
||||
if (isset($json['data']['list'])) {
|
||||
foreach ($json['data']['list'] as $item) {
|
||||
$list[] = [
|
||||
'vod_id' => strval($item['id']),
|
||||
'vod_name' => $item['name'],
|
||||
'vod_pic' => $item['cover'],
|
||||
'vod_remarks' => $item['updateStatus'],
|
||||
'vod_year' => $item['year'],
|
||||
'vod_area' => $item['area'],
|
||||
'vod_director' => $item['director']
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(['list' => $list, 'page' => $pageNum], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 4. 分类列表 (对应JS的category函数)
|
||||
if (!empty($t)) {
|
||||
$tid = $t;
|
||||
$pageNum = intval($pg);
|
||||
if ($pageNum < 1) $pageNum = 1;
|
||||
|
||||
$url = $HOST . "/api/film/category/list?area=&categoryId={$tid}&language=&pageNum={$pageNum}&pageSize=15&sort=updateTime&year=";
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$list = [];
|
||||
if (isset($json['data']['list'])) {
|
||||
foreach ($json['data']['list'] as $item) {
|
||||
$list[] = [
|
||||
'vod_id' => strval($item['id']),
|
||||
'vod_name' => $item['name'],
|
||||
'vod_pic' => $item['cover'],
|
||||
'vod_remarks' => $item['updateStatus']
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(['list' => $list, 'page' => $pageNum], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 5. 首页推荐 (对应JS的homeVod函数)
|
||||
if ($ac === 'homeVod') {
|
||||
$url = $HOST . "/api/film/category";
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$list = [];
|
||||
foreach ($json['data'] as $category) {
|
||||
$filmList = $category['filmList'] ?? [];
|
||||
foreach ($filmList as $film) {
|
||||
$list[] = [
|
||||
'vod_id' => strval($film['id']),
|
||||
'vod_name' => $film['name'],
|
||||
'vod_pic' => $film['cover'],
|
||||
'vod_remarks' => $film['doubanScore'] ?? ''
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// 限制数量
|
||||
$list = array_slice($list, 0, 30);
|
||||
|
||||
echo json_encode(['list' => $list], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 6. 首页分类 (对应JS的home函数)
|
||||
if ($ac === 'home') {
|
||||
$url = $HOST . "/api/category/top";
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$classes = [];
|
||||
foreach ($json['data'] as $item) {
|
||||
$classes[] = [
|
||||
'type_id' => strval($item['id']),
|
||||
'type_name' => $item['name']
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode(['class' => $classes], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 7. 初始化 (对应JS的init函数)
|
||||
if ($ac === 'init') {
|
||||
$ext = $_GET['ext'] ?? '';
|
||||
if (!empty($ext) && strpos($ext, 'http') === 0) {
|
||||
$HOST = rtrim($ext, '/');
|
||||
}
|
||||
|
||||
echo json_encode(['success' => true], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 8. 默认首页 (返回分类和推荐)
|
||||
$url = $HOST . "/api/category/top";
|
||||
$data = fetch($url, '/');
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$classes = [];
|
||||
foreach ($json['data'] as $item) {
|
||||
$classes[] = [
|
||||
'type_id' => strval($item['id']),
|
||||
'type_name' => $item['name']
|
||||
];
|
||||
}
|
||||
|
||||
// 获取推荐视频
|
||||
$url2 = $HOST . "/api/film/category";
|
||||
$data2 = fetch($url2, '/');
|
||||
$json2 = json_decode($data2, true);
|
||||
|
||||
$list = [];
|
||||
foreach ($json2['data'] as $category) {
|
||||
$filmList = $category['filmList'] ?? [];
|
||||
foreach ($filmList as $film) {
|
||||
$list[] = [
|
||||
'vod_id' => strval($film['id']),
|
||||
'vod_name' => $film['name'],
|
||||
'vod_pic' => $film['cover'],
|
||||
'vod_remarks' => $film['doubanScore'] ?? ''
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$list = array_slice($list, 0, 30);
|
||||
|
||||
echo json_encode([
|
||||
'class' => $classes,
|
||||
'list' => $list
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
Reference in New Issue
Block a user