fix(media): use global loading notice and suppress video referrer

This commit is contained in:
hectorqin committed 2026-10-01 13:56:34 +08:00
1 parent b095b537ea
commit e89c82b60a
3 files changed
+5 -4

No files matched your search

+2 -2
View File
@@ -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');
+1 -1
View File
@@ -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}
+2 -1
View File
@@ -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<Tool,string>={episodes:'选集',subtitles:'字幕',tracks:'音轨',volume:'音量',more:'更多播放选项',versions:'播放版本'};
@@ -46,7 +47,7 @@ export function VideoControls({player,api,onBack}:{player:MediaPlayer;api:MediaA
<div className="media-video-caption"><div><strong>{item?.title||player.title}</strong>{edition&&<small>{edition.label}</small>}</div></div>
<div className="media-video-toolbar media-video-tools">{entries.length>1&&<button onClick={()=>open('episodes')}><Layers size={20} aria-hidden="true"/>选集</button>}<button onClick={()=>open('subtitles')}><Subtitles size={20} aria-hidden="true"/>字幕</button><button onClick={()=>open('tracks')}><AudioLines size={20} aria-hidden="true"/>音轨</button><button onClick={()=>open('versions')}><Layers size={20} aria-hidden="true"/>版本</button><button aria-label="更多播放选项" onClick={()=>open('more')}><Ellipsis size={20} aria-hidden="true"/>更多</button></div>
{player.error&&<PlaybackProblem player={player} {...(item?.editions.length?{onVersions:()=>open('versions')}:{})} {...(onBack?{onBack}:{})}/>}
{!player.error&&player.loadingStatus&&<p role="status">{player.loadingStatus}</p>}
{!player.error&&player.loadingStatus&&<FloatingNotice message={player.loadingStatus} busy />}
{notice&&<p className="media-error" role="alert">{notice}</p>}
{item&&(item.overrides.plot??item.overrides.description??item.metadata.plot??item.metadata.description)&&<details className="media-video-description"><summary>剧情简介</summary><p>{String(item.overrides.plot??item.overrides.description??item.metadata.plot??item.metadata.description)}</p></details>}
{item?.kind==='episode'&&item.parentId&&<VideoEpisodeRail key={item.parentId} api={api} item={item} player={player}/>}