diff --git a/web/src/media/player.ts b/web/src/media/player.ts index eb56956..f203f3c 100644 --- a/web/src/media/player.ts +++ b/web/src/media/player.ts @@ -90,7 +90,7 @@ export class MediaPlayer extends EventTarget { this.corsRetry=true;this.clearStartupTimer(); if(this.ready&&Number.isFinite(this.media.currentTime))this.session.position=this.media.currentTime; this.ready=false;this.error='';this.loadingStatus='正在尝试兼容跨域的直连方式…'; - this.media.crossOrigin='anonymous';this.media.src=this.api.streamUrl(this.session); + this.media.crossOrigin='anonymous';(this.media as HTMLMediaElement&{referrerPolicy?:string}).referrerPolicy='no-referrer';this.media.src=this.api.streamUrl(this.session); const generation=this.generation;this.beginWebPlayback(generation);this.changed(); this.startupTimer=setTimeout(()=>{if(generation===this.generation&&!this.ready)this.retryWithProxy();},20000); return true; @@ -364,7 +364,7 @@ export class MediaPlayer extends EventTarget { this.media=selected.video?this.video:this.audio; // Anonymous CORS mode makes the browser attach Origin to the media // request and to redirected HLS segment requests such as media-0.ts. - this.media.crossOrigin='anonymous'; + this.media.crossOrigin='anonymous';(this.media as HTMLMediaElement&{referrerPolicy?:string}).referrerPolicy='no-referrer'; const rate=this.playbackRate; this.media.defaultPlaybackRate=rate;this.media.playbackRate=rate; if(this.nativeActive)this.native?.command('stop'); diff --git a/web/src/media/v2.css b/web/src/media/v2.css index e0234fc..a0185b1 100644 --- a/web/src/media/v2.css +++ b/web/src/media/v2.css @@ -178,7 +178,7 @@ .media-episode-rail header {position:sticky;top:0;z-index:1;padding-bottom:12px;background:var(--media-paper)} .media-episode-rail .media-video-episodes button {display:grid;grid-template-columns:32px minmax(0,1fr) 18px;gap:10px;align-items:center;padding:10px 8px;border:0;border-radius:8px;color:var(--text);background:transparent} .media-episode-rail .media-video-episodes button:hover:not(:disabled) {background:var(--media-selection)} -.media-episode-rail .media-video-episodes button[aria-current=true] {background:#34452a;color:var(--media-accent);font-weight:600} +.media-episode-rail .media-video-episodes button[aria-current=true] {background:var(--media-selection);color:var(--media-accent);font-weight:600} .media-episode-rail .media-video-episodes button>span:first-child {font-variant-numeric:tabular-nums;color:var(--muted);text-align:center} .media-episode-rail .media-video-episodes button[aria-current=true]>span:first-child {color:var(--media-accent)} .media-episode-rail .media-video-episodes button>span:nth-child(2) {overflow:hidden;text-overflow:ellipsis;white-space:nowrap} diff --git a/web/src/media/video-controls.tsx b/web/src/media/video-controls.tsx index eb59b36..038946c 100644 --- a/web/src/media/video-controls.tsx +++ b/web/src/media/video-controls.tsx @@ -7,6 +7,7 @@ import type {Detail,MediaApi} from './api.ts'; import {MediaLoading} from './loading.tsx'; import {MediaScreenError} from './screen-error.tsx'; import {PlaybackProblem} from './playback-problem.tsx'; +import {FloatingNotice} from '../ui/floating-notice.tsx'; type Tool='episodes'|'subtitles'|'tracks'|'volume'|'more'|'versions'; const titles:Record={episodes:'选集',subtitles:'字幕',tracks:'音轨',volume:'音量',more:'更多播放选项',versions:'播放版本'}; @@ -46,7 +47,7 @@ export function VideoControls({player,api,onBack}:{player:MediaPlayer;api:MediaA
{item?.title||player.title}{edition&&{edition.label}}
{entries.length>1&&}
{player.error&&open('versions')}:{})} {...(onBack?{onBack}:{})}/>} - {!player.error&&player.loadingStatus&&

{player.loadingStatus}

} + {!player.error&&player.loadingStatus&&} {notice&&

{notice}

} {item&&(item.overrides.plot??item.overrides.description??item.metadata.plot??item.metadata.description)&&
剧情简介

{String(item.overrides.plot??item.overrides.description??item.metadata.plot??item.metadata.description)}

} {item?.kind==='episode'&&item.parentId&&}