站内视频
内容页上的受控播放:页面里不出现文件地址,播放前先领一张限时票据。
适用范围:内容页 | 用到的变量:{hasPlay} {mediaTicket} {playSrc} | 配套脚本:static/js/player.js
为什么要这样
直接把视频文件的地址写进 <video src="…">,等于把地址发给了每个访客 —— 复制出去就能永久用,还能贴到别的站盗链。
站内视频的做法相反:文件放在网站目录之外,页面里一个字符的地址都不出现。
三种播放来源
| 来源 | 页面上是什么 | 保护 |
|---|---|---|
| 站内文件 | {mediaTicket} 有值,{playSrc} 空 | 领票据换临时地址,能保护 |
| 外部地址 | {playSrc} 有值,{mediaTicket} 空 | 地址不归我们管,保护不了 |
| 都没有 | {hasPlay} = 0 | 不输出播放器 |
播放器怎么写
<!-- 内容页里:给播放器两个 data 属性,脚本自己挑 -->
{naicha:if var="hasPlay" eq="1"}
<div class="dt-player mv-player" data-ticket="{mediaTicket}" data-src="{playSrc}">
<video controls preload="metadata" playsinline poster="{detail.thumb_url}"></video>
</div>
<script src="{naicha:asset file='static/js/player.js'}" defer></script>
{/naicha:if}
两个 data 属性总有一个是空的,这是有意的 —— 不写成模板里的 if/else,那套写法最容易配错闭合。
票据与门槛
- 播放前先请求
/media/<内容id>/ticket领一张限时票据,再拿票据换临时流地址。 - 票据过期 → 服务器回
412,播放器自动重新领一张接着放,不用刷新整页。 - 门槛和详情页完全一致:
need_login/need_level不够,连票据都领不到。
⚠️ 票据接口的响应明文禁止缓存 —— 票据一被缓存,就等于发给了所有人。写模板时也不用去缓存它。
