301 lines
12 KiB
HTML
301 lines
12 KiB
HTML
{extend name="base" /}
|
||
{block name="get-data"}
|
||
|
||
{if $Request.route.intVId && $Request.route.intVForgeId}
|
||
{video:info v_id="$Request.route.intVId" v_pinyin="$Request.route.strPinyin" v_key="arrVideo" v_fid="$Request.route.intVForgeId" export_name="arrVideo"/}
|
||
{elseif $Request.route.intVId || $Request.route.strPinyin}
|
||
{video:info v_id="$Request.route.intVId" v_pinyin="$Request.route.strPinyin" v_key="arrVideo" export_name="arrVideo"/}
|
||
{else}
|
||
{video:info v_id="$DomainModel->info_id" n_key="arrVideo" export_name="arrVideo" /}
|
||
{/if}
|
||
|
||
{site:vciurl parent_category="$arrVideo.v_parent_category_en" export_name="strVciurl" /}
|
||
{site:vclurl parent_category="$arrVideo.v_parent_category_en"
|
||
category="$arrVideo.v_category_en"
|
||
area="all" lang="all" year="all" order="all" page="1"
|
||
export_name="strVclurl" /}
|
||
|
||
{video:seocopy scene="play"
|
||
video="$arrVideo"
|
||
play_type="$Request.route.strPlayType"
|
||
play_index="$Request.route.intPlayIndex"
|
||
export_name="seoCopy" /}
|
||
|
||
{php}
|
||
$arrBreadcrumb = [
|
||
['title'=>'首页','url'=>'/'],
|
||
['title'=>$arrVideo['v_parent_category'],'url'=>$strVciurl],
|
||
['title'=>$arrVideo['v_category'],'url'=>$strVclurl],
|
||
];
|
||
|
||
$strPlaySlug = trim((string)($arrVideo['v_name_en'] ?? request()->route('strPinyin') ?? ''));
|
||
if ($strPlaySlug === '') {
|
||
$strPlaySlug = (string)($arrVideo['v_id'] ?? '');
|
||
}
|
||
|
||
$strCurrentPlayType = trim((string)(request()->route('strPlayType') ?? ''));
|
||
$intCurrentPlayIndex = max(1, (int)(request()->route('intPlayIndex') ?? 1));
|
||
$arrPlayGroups = is_array($arrVideo['v_play_url'] ?? null) ? $arrVideo['v_play_url'] : [];
|
||
if ($strCurrentPlayType === '' && !empty($arrPlayGroups)) {
|
||
$strCurrentPlayType = (string)array_key_first($arrPlayGroups);
|
||
}
|
||
|
||
$strCurrentPlayLine = trim((string)app(\app\services\VideoService::class)->getConverterPlayLineVal($strCurrentPlayType));
|
||
if ($strCurrentPlayLine === '') {
|
||
$strCurrentPlayLine = strtoupper($strCurrentPlayType !== '' ? $strCurrentPlayType : 'default');
|
||
}
|
||
|
||
$strCurrentEpisodeName = '第' . $intCurrentPlayIndex . '集';
|
||
if (!empty($arrPlayGroups[$strCurrentPlayType][$intCurrentPlayIndex - 1]['name'])) {
|
||
$strCurrentEpisodeName = trim((string)$arrPlayGroups[$strCurrentPlayType][$intCurrentPlayIndex - 1]['name']);
|
||
}
|
||
|
||
$strPlayDetailUrl = '';
|
||
if ((int)($arrVideo['v_id'] ?? 0) > 0) {
|
||
$strPlayDetailUrl = app(\app\services\VideoService::class)->getVideoInfoUrl(
|
||
(int)$arrVideo['v_id'],
|
||
$strPlaySlug
|
||
);
|
||
}
|
||
|
||
$strPlayCanonicalUrl = '';
|
||
if ((int)($arrVideo['v_id'] ?? 0) > 0) {
|
||
$strPlayCanonicalUrl = app(\app\services\VideoService::class)->getVideoPlayUrl(
|
||
(int)$arrVideo['v_id'],
|
||
$strPlaySlug,
|
||
$strCurrentPlayType !== '' ? $strCurrentPlayType : 'default',
|
||
$intCurrentPlayIndex
|
||
);
|
||
}
|
||
|
||
$strPlayVisibleIntro = trim((string)($seoCopy['play_intro'] ?? ''));
|
||
if ($strPlayVisibleIntro === '') {
|
||
$strPlayVisibleIntro = '当前页围绕《' . (string)($arrVideo['v_name'] ?? '当前内容') . '》' . $strCurrentEpisodeName . '整理在线播放入口,并补充剧情与观看线索,方便直接续看。';
|
||
}
|
||
|
||
$strPlayMetaNote = trim((string)($seoCopy['play_meta_note'] ?? ''));
|
||
if ($strPlayMetaNote === '') {
|
||
$strPlayMetaNote = '当前线路为' . $strCurrentPlayLine . ',如果加载较慢可以切换线路,或先回详情页补看剧情资料。';
|
||
}
|
||
|
||
$strPlayBodyGuideLead = trim((string)($seoCopy['play_body_lead'] ?? ''));
|
||
if ($strPlayBodyGuideLead === '') {
|
||
$strPlayBodyGuideLead = '播放页更适合先确认当前线路、集数和回详情路径,再决定是否继续完整观看。';
|
||
}
|
||
|
||
$strPlayBodyGuideNext = trim((string)($seoCopy['play_body_next'] ?? ''));
|
||
if ($strPlayBodyGuideNext === '') {
|
||
$strPlayBodyGuideNext = '如果想先了解完整剧情和人物资料,可以回到详情页继续浏览。';
|
||
}
|
||
|
||
$arrPlayGuideCards = array_values(array_filter((array)($seoCopy['guide_cards'] ?? []), static function ($arrCard): bool {
|
||
return is_array($arrCard)
|
||
&& (
|
||
trim((string)($arrCard['title'] ?? '')) !== ''
|
||
|| trim((string)($arrCard['text'] ?? '')) !== ''
|
||
);
|
||
}));
|
||
if (empty($arrPlayGuideCards)) {
|
||
$arrPlayGuideCards = [
|
||
['title' => '当前剧集', 'text' => $strCurrentEpisodeName],
|
||
['title' => '当前线路', 'text' => $strCurrentPlayLine],
|
||
['title' => '观看建议', 'text' => '如果当前线路不够稳定,可先切换线路,或返回详情页继续浏览剧情资料。'],
|
||
];
|
||
}
|
||
{/php}
|
||
{/block}
|
||
|
||
|
||
{block name="title"}{site:seotkd code="title" page="play" /}{/block}
|
||
{block name="keywords"}{site:seotkd code="keywords" page="play" /}{/block}
|
||
{block name="description"}{site:seotkd code="description" page="play" /}{/block}
|
||
|
||
{block name="head"}
|
||
<meta name="robots" content="noindex,follow">
|
||
|
||
{if $Request.route.intVId }
|
||
<link rel="canonical" href='https://{$DomainModel->d_domain}{$strPlayCanonicalUrl}'>
|
||
{/if}
|
||
|
||
|
||
{// Open Graph 协议(用于Facebook、LinkedIn等)}
|
||
<meta property="og:title" content='{site:seotkd code="title" page="play" /}'>
|
||
<meta property="og:description" content='{site:seotkd code="description" page="play" /}'>
|
||
{switch $arrVideo.v_parent_category_en }
|
||
{case 'dian-ying' }
|
||
<meta property="og:type" content="video.movie" />
|
||
{/case}
|
||
{case 'dian-shi-ju' }
|
||
<meta property="og:type" content="video.episode" />
|
||
{/case}
|
||
{case 'zong-yi' }
|
||
<meta property="og:type" content="video.tv_show" />
|
||
{/case}
|
||
{case 'dong-man' }
|
||
<meta property="og:type" content="video.episode" />
|
||
{/case}
|
||
{case 'duan-ju-da-quan' }
|
||
<meta property="og:type" content="video.episode" />
|
||
{/case}
|
||
{default /}
|
||
<meta property="og:type" content="video.movie" />
|
||
{/switch}
|
||
<meta property="og:url" content='https://{$DomainModel->d_domain}{$strPlayCanonicalUrl}'>
|
||
<meta property="og:image" content="https://{$DomainModel->d_domain}{$arrVideo.v_pic}">
|
||
<meta property="og:site_name" content="{$DomainModel->d_name}">
|
||
<meta property="og:video:type" content="video/m3u8">
|
||
|
||
{// Twitter Card(用于Twitter/X)}
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:title" content="{$arrVideo.v_name|raw} - {$arrVideo.v_category|default=''|raw}完整版在线观看 - {$DomainModel->d_name|raw}">
|
||
<meta name="twitter:description" content="{if !empty($arrVideo.v_description)}{$arrVideo.v_description|raw}{else/}{$DomainModel->d_name|raw}为你提供{$arrVideo.v_name|raw}在线播放与相关内容推荐。{/if}">
|
||
<meta name="twitter:image" content="{if stripos($arrVideo.v_pic,'http')===0}{$arrVideo.v_pic|raw}{else/}https://{$DomainModel->d_domain}{$arrVideo.v_pic|raw}{/if}">
|
||
|
||
{php}
|
||
// 你已有:$arrBreadcrumb(title/url)
|
||
// 这里补成绝对 URL,避免 JSON-LD 用相对路径
|
||
$strBase = 'https://' . $DomainModel->d_domain;
|
||
|
||
$arrBreadcrumbLd = [];
|
||
foreach ($arrBreadcrumb as $intIdx => $arrIt) {
|
||
$strTitle = (string)($arrIt['title'] ?? '');
|
||
$strUrl = (string)($arrIt['url'] ?? '');
|
||
|
||
if ($strTitle === '' || $strUrl === '') {
|
||
continue;
|
||
}
|
||
|
||
// url 绝对化
|
||
if (stripos($strUrl, 'http') !== 0) {
|
||
if ($strUrl[0] !== '/') {
|
||
$strUrl = '/' . $strUrl;
|
||
}
|
||
$strUrl = $strBase . $strUrl;
|
||
}
|
||
|
||
$arrBreadcrumbLd[] = [
|
||
'@type' => 'ListItem',
|
||
'position' => (int)($intIdx + 1),
|
||
'name' => $strTitle,
|
||
'item' => $strUrl,
|
||
];
|
||
}
|
||
{/php}
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "BreadcrumbList",
|
||
"itemListElement": {php}echo json_encode($arrBreadcrumbLd, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);{/php}
|
||
}
|
||
</script>
|
||
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "VideoObject",
|
||
"name": "{$arrVideo.v_name|raw}",
|
||
"description": "{if !empty($arrVideo.v_description)}{$arrVideo.v_description|raw}{else/}暂无简介{/if}",
|
||
"thumbnailUrl": "{$arrVideo.v_pic|raw}",
|
||
"uploadDate": "{:date('Y-m-d')}",
|
||
"url": "https://{$DomainModel->d_domain}{$strPlayCanonicalUrl}"
|
||
{if !empty($arrVideo.v_lang)},{/if}
|
||
{if !empty($arrVideo.v_lang)}
|
||
"inLanguage": [
|
||
{volist name="$arrVideo.v_lang" id="strVideoLang" key="index"}{if $index>1},{/if}"{$strVideoLang|raw}"{/volist}
|
||
]
|
||
{/if}
|
||
{if !empty($arrVideo.v_area)},{/if}
|
||
{if !empty($arrVideo.v_area)}
|
||
"contentLocation": [
|
||
{volist name="$arrVideo.v_area" id="strVideoArea" key="index"}{if $index>1},{/if}{
|
||
"@type": "Place",
|
||
"name": "{$strVideoArea|raw}"
|
||
}{/volist}
|
||
]
|
||
{/if}
|
||
{if !empty($arrVideo.v_director)},{/if}
|
||
{if !empty($arrVideo.v_director)}
|
||
"director": [
|
||
{volist name="$arrVideo.v_director" id="strVideoDirector" key="index"}{if $index>1},{/if}{
|
||
"@type": "Person",
|
||
"name": "{$strVideoDirector|raw}"
|
||
}{/volist}
|
||
]
|
||
{/if}
|
||
{if !empty($arrVideo.v_actor)},{/if}
|
||
{if !empty($arrVideo.v_actor)}
|
||
"actor": [
|
||
{volist name="$arrVideo.v_actor" id="strVideoActor" key="index"}{if $index>1},{/if}{
|
||
"@type": "Person",
|
||
"name": "{$strVideoActor|raw}"
|
||
}{/volist}
|
||
]
|
||
{/if}
|
||
{if !empty($arrVideo.v_score) && floatval($arrVideo.v_score)>0},{/if}
|
||
{if !empty($arrVideo.v_score) && floatval($arrVideo.v_score)>0}
|
||
"aggregateRating": {
|
||
"@type": "AggregateRating",
|
||
"ratingValue": "{$arrVideo.v_score|raw}",
|
||
"ratingCount": 1
|
||
}
|
||
{/if},
|
||
"publisher": {
|
||
"@type": "Organization",
|
||
"name": "{$DomainModel->d_name|raw}"
|
||
}
|
||
}
|
||
</script>
|
||
|
||
{/block}
|
||
|
||
{block name="strPageCode"}<?php $strPageCode = 'player'; ?>{/block}
|
||
|
||
{block name="head-css"}
|
||
{// <link rel="stylesheet" href="/public/video/DPlayer.min.css"> /}
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css">
|
||
{/block}
|
||
|
||
{block name="main"}
|
||
{assign name="pageCfg" value="$TpStyle.template_cfg.pages.play"}
|
||
|
||
{include file="module/page/page_router" /}
|
||
|
||
{include file="module/seo_copy/play" /}
|
||
|
||
<script>
|
||
const strMaxPlayHeight = '480px'
|
||
const strVideoId = `{$arrVideo.v_id}`;
|
||
const arrVideo = {
|
||
'v_id': `{$arrVideo['v_id']}`,
|
||
'v_name_en': `{$arrVideo['v_name_en']}`,
|
||
'v_pic': `{$arrVideo['v_pic']}`,
|
||
'v_name': `{$arrVideo['v_name']}`,
|
||
'v_description': `{$arrVideo['v_description']}`,
|
||
'v_publish_date': `{$arrVideo['v_publish_date']}`,
|
||
'v_remarks': `{$arrVideo['v_remarks']}`,
|
||
'v_category': `{$arrVideo['v_category']}`,
|
||
|
||
};
|
||
var intPlayUrlIndex = '{$Request.route.intPlayIndex}'
|
||
var strPlayType = '{$Request.route.strPlayType}'
|
||
var intJumpTimeFirst = 1;
|
||
var intJumpTimeTwoStart = 1;
|
||
var intJumpTimeTwoEnd = 1;
|
||
var arrPlayUrl = {$arrVideo.v_play_url|json_encode|raw} ;
|
||
var strPlayUrl = ""
|
||
var boolIsPlayPage = true
|
||
</script>
|
||
|
||
{/block}
|
||
{block name="footer-js"}
|
||
{// <script src="https://cdn.staticfile.org/jquery/3.7.1/jquery.min.js"></script>/}
|
||
{// <script type="text/javascript" src="/public/video/hls.min.js" ></script>/}
|
||
{// <script type="text/javascript" src="/public/video/DPlayer.min.js" ></script>/}
|
||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script>
|
||
|
||
{/block}
|