首页 / 开发手册 / 站内视频

站内视频

内容页上的受控播放:页面里不出现文件地址,播放前先领一张限时票据。

适用范围:内容页 | 用到的变量:{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 不够,连票据都领不到。
⚠️ 票据接口的响应明文禁止缓存 —— 票据一被缓存,就等于发给了所有人。写模板时也不用去缓存它。
没找到答案? 可以在 联系我们 留言说明使用场景,我们会补充进文档。