@hopeplayer/core 1.0.13 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HopePlayerElement.d.ts +21 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/{index-9NzklChR.js → index-BOoNcKeR.js} +2 -2
- package/dist/chunks/{index-9NzklChR.js.map → index-BOoNcKeR.js.map} +1 -1
- package/dist/chunks/{index-BgJJr55r.js → index-BeJNpAyx.js} +121 -106
- package/dist/chunks/index-BeJNpAyx.js.map +1 -0
- package/dist/chunks/{index-n-1IIClr.js → index-BvoB2O1p.js} +2 -2
- package/dist/chunks/{index-n-1IIClr.js.map → index-BvoB2O1p.js.map} +1 -1
- package/dist/chunks/{index-BO0tjMR6.js → index-ClQg_X1N.js} +2 -2
- package/dist/chunks/{index-BO0tjMR6.js.map → index-ClQg_X1N.js.map} +1 -1
- package/dist/chunks/index-D5P-LWbg.js +245 -0
- package/dist/chunks/index-D5P-LWbg.js.map +1 -0
- package/dist/chunks/{index-048h1-5X.js → index-DRlQC-ev.js} +2 -2
- package/dist/chunks/{index-048h1-5X.js.map → index-DRlQC-ev.js.map} +1 -1
- package/dist/chunks/{index-CP1Y6U0c.js → index-DpUZXNJS.js} +2 -2
- package/dist/chunks/{index-CP1Y6U0c.js.map → index-DpUZXNJS.js.map} +1 -1
- package/dist/chunks/index-TkG8IO6q.js +239 -0
- package/dist/chunks/index-TkG8IO6q.js.map +1 -0
- package/dist/chunks/{index-01P9jpUY.js → index-w7pACyTw.js} +528 -335
- package/dist/chunks/index-w7pACyTw.js.map +1 -0
- package/dist/controls/ControlBar.d.ts +13 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +5 -0
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/hls/SourceManager.d.ts +2 -0
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hope-player.js +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +13 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugins/audio/AudioStage.d.ts +9 -0
- package/dist/plugins/audio/AudioStage.d.ts.map +1 -1
- package/dist/plugins/rewarded/RewardedUnlock.d.ts +66 -0
- package/dist/plugins/rewarded/RewardedUnlock.d.ts.map +1 -0
- package/dist/plugins/rewarded/gpt.d.ts +8 -0
- package/dist/plugins/rewarded/gpt.d.ts.map +1 -0
- package/dist/plugins/rewarded/index.d.ts +7 -0
- package/dist/plugins/rewarded/index.d.ts.map +1 -0
- package/dist/plugins/sponsorship/SponsorshipLayer.d.ts +73 -0
- package/dist/plugins/sponsorship/SponsorshipLayer.d.ts.map +1 -0
- package/dist/plugins/sponsorship/index.d.ts +7 -0
- package/dist/plugins/sponsorship/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +120 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-01P9jpUY.js.map +0 -1
- package/dist/chunks/index-BgJJr55r.js.map +0 -1
|
@@ -57,6 +57,15 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
57
57
|
private gestureControls;
|
|
58
58
|
private loopSection;
|
|
59
59
|
private audioStage;
|
|
60
|
+
/** Kalite kilidi (rewardedUnlock eklentisi) — kilitliyse yüksek kaliteler menüde kilitli, HLS'te üst sınır var. */
|
|
61
|
+
private qualityGate;
|
|
62
|
+
private rewardedUnlock;
|
|
63
|
+
private sponsorship;
|
|
64
|
+
/** Son uygulanan MP4 kaynak listesi ve seçili etiket — kilit açılınca menü yeniden kurulur. */
|
|
65
|
+
private currentSources;
|
|
66
|
+
private activeSourceLabel;
|
|
67
|
+
private lastHlsLevels;
|
|
68
|
+
private lastHlsActive;
|
|
60
69
|
/** options.audio — kapak + plak sahnesi, kontroller hep görünür, tam ekran yok. */
|
|
61
70
|
private audioMode;
|
|
62
71
|
private inViewAutoplay;
|
|
@@ -190,6 +199,18 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
190
199
|
/** Playlist panelinin monte edileceği, .video-area'nın ALTINDAKİ (shadow root içi) kapsayıcı — ilk ihtiyaçta oluşturulur. */
|
|
191
200
|
private panelContainer;
|
|
192
201
|
private getOrCreatePanelContainer;
|
|
202
|
+
/** Kaynağın yüksekliği: `height` ya da etiketten ("1080p" → 1080); bilinmiyorsa null. */
|
|
203
|
+
private sourceHeight;
|
|
204
|
+
private isSourceLocked;
|
|
205
|
+
/** Başlangıç kaynağı: `selected` (ya da ilk); kilitliyse serbest kaynakların en yükseği. */
|
|
206
|
+
private pickInitialSource;
|
|
207
|
+
private renderSourceQualities;
|
|
208
|
+
/** Kilitli kalite var mı (ödüllü reklam butonu yalnızca o zaman görünür) ve en yükseğinin etiketi. */
|
|
209
|
+
lockedQualityLabel(): string | null;
|
|
210
|
+
/** Kilit durumu değişti: menüleri yeniden kur, HLS üst sınırını güncelle; `upgrade` ise en iyi kaliteye geç. */
|
|
211
|
+
private refreshQualityGate;
|
|
212
|
+
private applyRewardedUnlock;
|
|
213
|
+
private applySponsorship;
|
|
193
214
|
/** Kalite değişirken oynatma konumunu ve play/pause durumunu korur. */
|
|
194
215
|
private switchQualitySource;
|
|
195
216
|
private readonly onHlsLevelsChanged;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var m = Object.defineProperty;
|
|
2
2
|
var v = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
3
|
var n = (r, t, e) => v(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { f as E } from "./index-
|
|
4
|
+
import { f as E } from "./index-w7pACyTw.js";
|
|
5
5
|
class u {
|
|
6
6
|
constructor(t, e) {
|
|
7
7
|
n(this, "chapters", []);
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
u as Segments,
|
|
61
61
|
g as installSegments
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=index-
|
|
63
|
+
//# sourceMappingURL=index-BOoNcKeR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-9NzklChR.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BOoNcKeR.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
const
|
|
5
|
-
let
|
|
1
|
+
var y = Object.defineProperty;
|
|
2
|
+
var S = (n, t, e) => t in n ? y(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var i = (n, t, e) => S(n, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
const g = "http://www.w3.org/2000/svg";
|
|
5
|
+
let b = 0;
|
|
6
6
|
function E() {
|
|
7
7
|
let n = "";
|
|
8
8
|
for (let t = 40; t <= 95; t += 1.25) {
|
|
9
|
-
const
|
|
10
|
-
n += `<circle cx="100" cy="100" r="${t}" fill="none" stroke="rgba(255,255,255,${
|
|
9
|
+
const s = Math.abs(t - 58) < 0.7 || Math.abs(t - 74) < 0.7 ? 0 : 0.035 + t * 7 % 5 * 8e-3;
|
|
10
|
+
n += `<circle cx="100" cy="100" r="${t}" fill="none" stroke="rgba(255,255,255,${s.toFixed(3)})" stroke-width="0.45"/>`;
|
|
11
11
|
}
|
|
12
12
|
return n;
|
|
13
13
|
}
|
|
14
|
-
function
|
|
15
|
-
const n = `hp-vinyl-${++
|
|
14
|
+
function x() {
|
|
15
|
+
const n = `hp-vinyl-${++b}`, t = document.createElement("div");
|
|
16
16
|
t.innerHTML = `
|
|
17
|
-
<svg xmlns="${
|
|
17
|
+
<svg xmlns="${g}" viewBox="0 0 200 200" aria-hidden="true" focusable="false">
|
|
18
18
|
<defs>
|
|
19
19
|
<radialGradient id="${n}-disc" cx="50%" cy="50%" r="50%">
|
|
20
20
|
<stop offset="0" stop-color="#1c1c1f"/>
|
|
@@ -38,32 +38,32 @@ function b() {
|
|
|
38
38
|
<circle cx="100" cy="100" r="3.6" fill="#0b0b0c"/>
|
|
39
39
|
<circle cx="100" cy="100" r="3.6" fill="none" stroke="rgba(255,255,255,0.35)" stroke-width="0.6"/>
|
|
40
40
|
</svg>`;
|
|
41
|
-
const e = t.firstElementChild,
|
|
41
|
+
const e = t.firstElementChild, s = e.querySelector(".hp-vinyl-cover"), r = e.querySelector(".hp-vinyl-text");
|
|
42
42
|
return {
|
|
43
43
|
el: e,
|
|
44
|
-
setLabel(a,
|
|
45
|
-
a ? (
|
|
44
|
+
setLabel(a, o) {
|
|
45
|
+
a ? (s.setAttribute("href", a), s.style.display = "") : (s.removeAttribute("href"), s.style.display = "none"), r.textContent = a ? "" : o.slice(0, 22);
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
-
function
|
|
49
|
+
function k() {
|
|
50
50
|
const n = document.createElement("div");
|
|
51
51
|
return n.innerHTML = `
|
|
52
|
-
<svg xmlns="${
|
|
52
|
+
<svg xmlns="${g}" viewBox="0 0 100 200" aria-hidden="true" focusable="false">
|
|
53
53
|
<circle cx="70" cy="22" r="15" fill="#2b2b30" stroke="rgba(255,255,255,0.18)" stroke-width="1"/>
|
|
54
54
|
<circle cx="70" cy="22" r="7" fill="#9a9aa2"/>
|
|
55
55
|
<path d="M70 22 L66 120 L40 162" fill="none" stroke="#c9c9cf" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
|
|
56
56
|
<rect x="26" y="156" width="20" height="28" rx="3" transform="rotate(32 36 170)" fill="#3a3a40" stroke="rgba(255,255,255,0.25)" stroke-width="1"/>
|
|
57
57
|
</svg>`, n.firstElementChild;
|
|
58
58
|
}
|
|
59
|
-
const
|
|
60
|
-
function
|
|
59
|
+
const c = 0.78, f = 100 / 3, w = 230, p = 4, A = 250, m = 10;
|
|
60
|
+
function v(n) {
|
|
61
61
|
if (n === !1) return null;
|
|
62
|
-
const t = n === !0 || n === void 0 ? {} : n, e = typeof t.size == "number" && Number.isFinite(t.size) ? Math.min(1, Math.max(0.3, t.size)) :
|
|
62
|
+
const t = n === !0 || n === void 0 ? {} : n, e = typeof t.size == "number" && Number.isFinite(t.size) ? Math.min(1, Math.max(0.3, t.size)) : c, s = typeof t.rpm == "number" && t.rpm > 0 ? t.rpm : f;
|
|
63
63
|
return {
|
|
64
64
|
position: t.position === "center" || t.position === "left" ? t.position : "right",
|
|
65
65
|
size: e,
|
|
66
|
-
rpm:
|
|
66
|
+
rpm: s,
|
|
67
67
|
scratch: t.scratch !== !1,
|
|
68
68
|
scratchSound: t.scratchSound === !0,
|
|
69
69
|
tonearm: t.tonearm !== !1
|
|
@@ -72,93 +72,95 @@ function w(n) {
|
|
|
72
72
|
function P(n) {
|
|
73
73
|
return ((n + 180) % 360 + 360) % 360 - 180;
|
|
74
74
|
}
|
|
75
|
-
const
|
|
75
|
+
const h = class h {
|
|
76
76
|
constructor(t) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
77
|
+
i(this, "el");
|
|
78
|
+
i(this, "backdropImg");
|
|
79
|
+
i(this, "sleeve");
|
|
80
|
+
i(this, "sleeveImg");
|
|
81
|
+
i(this, "vinylEl");
|
|
82
|
+
i(this, "discEl");
|
|
83
|
+
i(this, "armHolder");
|
|
84
|
+
i(this, "titleEl");
|
|
85
|
+
i(this, "artistEl");
|
|
86
|
+
i(this, "areaEl");
|
|
87
|
+
i(this, "resizeObserver");
|
|
88
|
+
i(this, "disc");
|
|
89
|
+
i(this, "options", {});
|
|
90
|
+
i(this, "vinyl", null);
|
|
91
|
+
i(this, "frame", 0);
|
|
92
|
+
i(this, "lastAriaSecond", -1);
|
|
93
|
+
i(this, "lastPositionState", 0);
|
|
92
94
|
// Scratch durumu
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
95
|
+
i(this, "dragging", !1);
|
|
96
|
+
i(this, "dragPointer", -1);
|
|
97
|
+
i(this, "center", { x: 0, y: 0 });
|
|
98
|
+
i(this, "lastPointerAngle", 0);
|
|
99
|
+
i(this, "accum", 0);
|
|
100
|
+
i(this, "dragStartTime", 0);
|
|
101
|
+
i(this, "dragStartAngle", 0);
|
|
102
|
+
i(this, "moved", !1);
|
|
103
|
+
i(this, "wasPlaying", !1);
|
|
104
|
+
i(this, "downAt", 0);
|
|
105
|
+
i(this, "seekFrame", 0);
|
|
106
|
+
i(this, "pendingSeek", null);
|
|
105
107
|
/** vinyl.scratchSound — ayrı parça olarak yalnızca açıksa yüklenir. */
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
i(this, "sound", null);
|
|
109
|
+
i(this, "soundImport", null);
|
|
110
|
+
i(this, "prepareTimer", null);
|
|
111
|
+
i(this, "render", () => {
|
|
110
112
|
!this.vinyl || this.dragging || (this.discEl.style.transform = `rotate(${this.angleForTime(this.ctx.videoEl.currentTime || 0)}deg)`);
|
|
111
113
|
});
|
|
112
|
-
|
|
114
|
+
i(this, "loop", () => {
|
|
113
115
|
this.render(), this.frame = requestAnimationFrame(this.loop);
|
|
114
116
|
});
|
|
115
|
-
|
|
117
|
+
i(this, "onPlay", () => {
|
|
116
118
|
this.el.setAttribute("data-playing", ""), this.schedulePrepareSound(), cancelAnimationFrame(this.frame), this.vinyl && (this.frame = requestAnimationFrame(this.loop)), this.options.mediaSession !== !1 && "mediaSession" in navigator && (this.applyMediaSession(), navigator.mediaSession.playbackState = "playing");
|
|
117
119
|
});
|
|
118
|
-
|
|
120
|
+
i(this, "onPause", () => {
|
|
119
121
|
this.dragging || this.el.removeAttribute("data-playing"), cancelAnimationFrame(this.frame), this.render(), this.ownsMediaSession() && (navigator.mediaSession.playbackState = "paused");
|
|
120
122
|
});
|
|
121
|
-
|
|
123
|
+
i(this, "onTimeUpdate", () => {
|
|
122
124
|
const t = this.ctx.videoEl;
|
|
123
125
|
t.paused && this.render();
|
|
124
126
|
const e = Math.floor(t.currentTime || 0);
|
|
125
127
|
e !== this.lastAriaSecond && (this.lastAriaSecond = e, this.vinylEl.setAttribute("aria-valuenow", String(e))), performance.now() - this.lastPositionState > 1e3 && this.updatePositionState();
|
|
126
128
|
});
|
|
127
|
-
|
|
129
|
+
i(this, "onDurationChange", () => {
|
|
128
130
|
const t = this.ctx.videoEl.duration, e = Number.isFinite(t) && t > 0;
|
|
129
131
|
e ? this.vinylEl.setAttribute("aria-valuemax", String(Math.floor(t))) : this.vinylEl.removeAttribute("aria-valuemax"), this.vinylEl.toggleAttribute("data-live", !e && t === 1 / 0), this.updatePositionState();
|
|
130
132
|
});
|
|
131
|
-
|
|
132
|
-
var
|
|
133
|
+
i(this, "onPointerDown", (t) => {
|
|
134
|
+
var s;
|
|
133
135
|
if (!this.vinyl || this.dragging || t.pointerType === "mouse" && t.button !== 0) return;
|
|
134
136
|
t.stopPropagation(), t.preventDefault();
|
|
135
137
|
const e = this.vinylEl.getBoundingClientRect();
|
|
136
|
-
this.center = { x: e.left + e.width / 2, y: e.top + e.height / 2 }, this.dragging = !0, this.dragPointer = t.pointerId, this.lastPointerAngle = this.pointerAngle(t), this.accum = 0, this.moved = !1, this.dragStartTime = this.ctx.videoEl.currentTime || 0, this.dragStartAngle = this.angleForTime(this.dragStartTime), this.wasPlaying = !this.ctx.videoEl.paused, this.downAt = performance.now(), this.wasPlaying && this.canScratch() && this.ctx.videoEl.pause(), this.vinyl.scratchSound && this.canScratch() && ((
|
|
138
|
+
this.center = { x: e.left + e.width / 2, y: e.top + e.height / 2 }, this.dragging = !0, this.dragPointer = t.pointerId, this.lastPointerAngle = this.pointerAngle(t), this.accum = 0, this.moved = !1, this.dragStartTime = this.ctx.videoEl.currentTime || 0, this.dragStartAngle = this.angleForTime(this.dragStartTime), this.wasPlaying = !this.ctx.videoEl.paused, this.downAt = performance.now(), this.wasPlaying && this.canScratch() && this.ctx.videoEl.pause(), this.vinyl.scratchSound && this.canScratch() && ((s = this.sound) != null && s.ready ? this.sound.start(this.dragStartTime) : this.loadSound().then((r) => r == null ? void 0 : r.prepare()));
|
|
137
139
|
try {
|
|
138
140
|
this.vinylEl.setPointerCapture(t.pointerId);
|
|
139
141
|
} catch {
|
|
140
142
|
}
|
|
141
143
|
});
|
|
142
|
-
|
|
143
|
-
var
|
|
144
|
+
i(this, "onPointerMove", (t) => {
|
|
145
|
+
var d;
|
|
144
146
|
if (!this.dragging || t.pointerId !== this.dragPointer) return;
|
|
145
147
|
t.stopPropagation();
|
|
146
|
-
const e = this.pointerAngle(t),
|
|
148
|
+
const e = this.pointerAngle(t), s = P(e - this.lastPointerAngle);
|
|
147
149
|
if (this.lastPointerAngle = e, !this.canScratch()) {
|
|
148
|
-
this.accum +=
|
|
150
|
+
this.accum += s, Math.abs(this.accum) > p && (this.moved = !0);
|
|
149
151
|
return;
|
|
150
152
|
}
|
|
151
|
-
const r = this.secondsPerTurn, a = this.ctx.videoEl.duration,
|
|
152
|
-
this.accum = Math.min(
|
|
153
|
+
const r = this.secondsPerTurn, a = this.ctx.videoEl.duration, o = -this.dragStartTime / r * 360, l = (a - this.dragStartTime) / r * 360;
|
|
154
|
+
this.accum = Math.min(l, Math.max(o, this.accum + s)), !this.moved && Math.abs(this.accum) > p && (this.moved = !0, this.el.setAttribute("data-scratching", "")), this.moved && (this.discEl.style.transform = `rotate(${this.dragStartAngle + this.accum}deg)`, this.pendingSeek = this.dragStartTime + this.accum / 360 * r, (d = this.sound) == null || d.setTarget(this.pendingSeek), this.seekFrame || (this.seekFrame = requestAnimationFrame(this.flushSeek)));
|
|
153
155
|
});
|
|
154
|
-
|
|
156
|
+
i(this, "flushSeek", () => {
|
|
155
157
|
this.seekFrame = 0, this.pendingSeek !== null && (this.ctx.videoEl.currentTime = this.pendingSeek, this.pendingSeek = null);
|
|
156
158
|
});
|
|
157
|
-
|
|
159
|
+
i(this, "onPointerUp", (t) => {
|
|
158
160
|
var e;
|
|
159
161
|
if (!(!this.dragging || t.pointerId !== this.dragPointer)) {
|
|
160
162
|
if (t.stopPropagation(), this.dragging = !1, this.dragPointer = -1, this.el.removeAttribute("data-scratching"), (e = this.sound) == null || e.stop(), this.seekFrame && (cancelAnimationFrame(this.seekFrame), this.flushSeek()), !this.moved && this.canScratch() && this.wasPlaying) {
|
|
161
|
-
performance.now() - this.downAt >=
|
|
163
|
+
performance.now() - this.downAt >= A || t.type !== "pointerup" ? this.ctx.play() : (this.el.removeAttribute("data-playing"), this.render());
|
|
162
164
|
return;
|
|
163
165
|
}
|
|
164
166
|
if (!this.moved) {
|
|
@@ -168,7 +170,7 @@ const d = class d {
|
|
|
168
170
|
this.wasPlaying ? this.ctx.play() : this.render();
|
|
169
171
|
}
|
|
170
172
|
});
|
|
171
|
-
|
|
173
|
+
i(this, "updatePositionState", () => {
|
|
172
174
|
if (!this.ownsMediaSession()) return;
|
|
173
175
|
this.lastPositionState = performance.now();
|
|
174
176
|
const t = this.ctx.videoEl, e = t.duration;
|
|
@@ -182,6 +184,7 @@ const d = class d {
|
|
|
182
184
|
} catch {
|
|
183
185
|
}
|
|
184
186
|
});
|
|
187
|
+
var r, a;
|
|
185
188
|
this.ctx = t;
|
|
186
189
|
const e = document.createElement("div");
|
|
187
190
|
e.className = "hp-audio", e.setAttribute("part", "audio-stage"), e.innerHTML = `
|
|
@@ -196,29 +199,40 @@ const d = class d {
|
|
|
196
199
|
<div class="hp-tonearm-holder"><div class="hp-tonearm"></div></div>
|
|
197
200
|
</div>
|
|
198
201
|
</div>
|
|
199
|
-
</div>`, this.el = e, this.backdropImg = e.querySelector(".hp-audio-backdrop img"), this.sleeve = e.querySelector(".hp-audio-sleeve"), this.sleeveImg = this.sleeve.querySelector("img"), this.vinylEl = e.querySelector(".hp-vinyl"), this.discEl = e.querySelector(".hp-vinyl-disc"), this.armHolder = e.querySelector(".hp-tonearm-holder"), this.titleEl = e.querySelector(".hp-audio-title"), this.artistEl = e.querySelector(".hp-audio-artist"), this.disc =
|
|
200
|
-
for (const
|
|
201
|
-
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
for (const
|
|
205
|
-
this.vinylEl.addEventListener(
|
|
206
|
-
t.layerEl.insertBefore(e, t.videoEl.nextSibling), this.refreshLabels();
|
|
202
|
+
</div>`, this.el = e, this.backdropImg = e.querySelector(".hp-audio-backdrop img"), this.sleeve = e.querySelector(".hp-audio-sleeve"), this.sleeveImg = this.sleeve.querySelector("img"), this.vinylEl = e.querySelector(".hp-vinyl"), this.discEl = e.querySelector(".hp-vinyl-disc"), this.armHolder = e.querySelector(".hp-tonearm-holder"), this.titleEl = e.querySelector(".hp-audio-title"), this.artistEl = e.querySelector(".hp-audio-artist"), this.disc = x(), this.discEl.appendChild(this.disc.el), e.querySelector(".hp-tonearm").appendChild(k());
|
|
203
|
+
for (const o of [this.backdropImg, this.sleeveImg])
|
|
204
|
+
o.addEventListener("error", () => o.removeAttribute("src"));
|
|
205
|
+
const s = t.videoEl;
|
|
206
|
+
s.addEventListener("play", this.onPlay), s.addEventListener("pause", this.onPause), s.addEventListener("ended", this.onPause), s.addEventListener("seeked", this.render), s.addEventListener("timeupdate", this.onTimeUpdate), s.addEventListener("durationchange", this.onDurationChange), s.addEventListener("ratechange", this.updatePositionState), s.addEventListener("emptied", this.render), this.vinylEl.addEventListener("pointerdown", this.onPointerDown), this.vinylEl.addEventListener("pointermove", this.onPointerMove), this.vinylEl.addEventListener("pointerup", this.onPointerUp), this.vinylEl.addEventListener("pointercancel", this.onPointerUp), this.vinylEl.addEventListener("lostpointercapture", this.onPointerUp);
|
|
207
|
+
for (const o of ["click", "mousedown", "mouseup", "touchstart", "touchend", "dblclick"])
|
|
208
|
+
this.vinylEl.addEventListener(o, (l) => l.stopPropagation());
|
|
209
|
+
t.layerEl.insertBefore(e, t.videoEl.nextSibling), this.areaEl = e.querySelector(".hp-audio-area"), this.resizeObserver = typeof ResizeObserver < "u" ? new ResizeObserver(() => this.layout()) : null, (r = this.resizeObserver) == null || r.observe(e), (a = this.resizeObserver) == null || a.observe(this.areaEl), this.refreshLabels();
|
|
207
210
|
}
|
|
208
211
|
update(t) {
|
|
209
|
-
this.options = t
|
|
210
|
-
const e = t.
|
|
211
|
-
|
|
212
|
-
e ?
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
|
|
212
|
+
this.options = t;
|
|
213
|
+
const e = t.layout === "compact";
|
|
214
|
+
this.el.setAttribute("data-layout", e ? "compact" : "full"), this.ctx.setBarMeta(
|
|
215
|
+
e ? { title: t.title ?? "", subtitle: [t.artist, t.album].filter(Boolean).join(" · ") } : null
|
|
216
|
+
), this.vinyl = e ? null : v(t.vinyl);
|
|
217
|
+
const s = t.cover || this.ctx.poster() || "";
|
|
218
|
+
for (const a of [this.backdropImg, this.sleeveImg])
|
|
219
|
+
s ? a.src = s : a.removeAttribute("src");
|
|
220
|
+
this.el.toggleAttribute("data-cover", !!s), this.titleEl.textContent = t.title ?? "", this.artistEl.textContent = [t.artist, t.album].filter(Boolean).join(" · "), this.el.toggleAttribute("data-meta", !!(t.title || t.artist || t.album));
|
|
221
|
+
const r = this.vinyl;
|
|
222
|
+
this.el.setAttribute("data-position", r ? r.position : "none"), this.el.style.setProperty("--hp-vinyl-size", String((r == null ? void 0 : r.size) ?? c)), this.vinylEl.hidden = !r, this.sleeve.hidden = !!r && r.position === "center", this.disc.setLabel(s || null, t.title || "HopeCore"), this.armHolder.hidden = !(r != null && r.tonearm), this.vinylEl.toggleAttribute("data-scratch", !!(r != null && r.scratch)), this.vinylEl.tabIndex = r ? 0 : -1, r != null && r.scratchSound ? this.ctx.videoEl.paused || this.schedulePrepareSound() : this.disableSound(), this.applyMediaSession(), this.onDurationChange(), this.layout(), this.render(), this.ctx.videoEl.paused || this.onPlay();
|
|
223
|
+
}
|
|
224
|
+
/** Kapak / plak yüksekliği: alan yüksekliğinin `size` katı, genişliğe sığacak kadar (kılıf + yarım plak ≈ 1,46 H). */
|
|
225
|
+
layout() {
|
|
226
|
+
var o, l;
|
|
227
|
+
if (!this.el.isConnected) return;
|
|
228
|
+
const t = this.areaEl.clientWidth, e = this.areaEl.clientHeight, s = ((o = this.vinyl) == null ? void 0 : o.size) ?? ((l = v(this.options.vinyl)) == null ? void 0 : l.size) ?? c, r = !!this.vinyl && this.vinyl.position !== "center", a = Math.max(0, Math.min(s * e, (r ? 0.62 : 0.9) * t));
|
|
229
|
+
this.el.style.setProperty("--hp-deck-h", `${Math.round(a * 10) / 10}px`), a > 0 && !this.el.hasAttribute("data-laid-out") && requestAnimationFrame(() => requestAnimationFrame(() => this.el.setAttribute("data-laid-out", ""))), this.el.toggleAttribute("data-short", this.el.clientHeight > 0 && this.el.clientHeight < w);
|
|
216
230
|
}
|
|
217
231
|
// ── Scratch sesi ────────────────────────────────────────────────────
|
|
218
232
|
loadSound() {
|
|
219
233
|
return this.sound ? Promise.resolve(this.sound) : (this.soundImport ?? (this.soundImport = import("./ScratchSound-0XKHUcJK.js").then(({ ScratchSound: t }) => {
|
|
220
234
|
var e;
|
|
221
|
-
return !((e = this.vinyl) != null && e.scratchSound) || !t.isSupported() ? (this.el.setAttribute("data-scratch-sound", "unsupported"), null) : (this.sound ?? (this.sound = new t(this.ctx.videoEl)), this.sound.onStateChange = (
|
|
235
|
+
return !((e = this.vinyl) != null && e.scratchSound) || !t.isSupported() ? (this.el.setAttribute("data-scratch-sound", "unsupported"), null) : (this.sound ?? (this.sound = new t(this.ctx.videoEl)), this.sound.onStateChange = (s) => this.el.setAttribute("data-scratch-sound", s), this.sound);
|
|
222
236
|
}).catch(() => null).finally(() => {
|
|
223
237
|
this.soundImport = null;
|
|
224
238
|
})), this.soundImport);
|
|
@@ -228,8 +242,8 @@ const d = class d {
|
|
|
228
242
|
var t, e;
|
|
229
243
|
!((t = this.vinyl) != null && t.scratchSound) || this.prepareTimer || (e = this.sound) != null && e.ready || (this.prepareTimer = setTimeout(() => {
|
|
230
244
|
this.prepareTimer = null;
|
|
231
|
-
const
|
|
232
|
-
"requestIdleCallback" in window ? window.requestIdleCallback(
|
|
245
|
+
const s = () => void this.loadSound().then((r) => r == null ? void 0 : r.prepare());
|
|
246
|
+
"requestIdleCallback" in window ? window.requestIdleCallback(s, { timeout: 2e3 }) : s();
|
|
233
247
|
}, 300));
|
|
234
248
|
}
|
|
235
249
|
disableSound() {
|
|
@@ -242,7 +256,7 @@ const d = class d {
|
|
|
242
256
|
// ── Dönüş ────────────────────────────────────────────────────────────
|
|
243
257
|
get secondsPerTurn() {
|
|
244
258
|
var t;
|
|
245
|
-
return 60 / (((t = this.vinyl) == null ? void 0 : t.rpm) ??
|
|
259
|
+
return 60 / (((t = this.vinyl) == null ? void 0 : t.rpm) ?? f);
|
|
246
260
|
}
|
|
247
261
|
angleForTime(t) {
|
|
248
262
|
return t / this.secondsPerTurn * 360 % 360;
|
|
@@ -258,32 +272,32 @@ const d = class d {
|
|
|
258
272
|
}
|
|
259
273
|
// ── Media Session ───────────────────────────────────────────────────
|
|
260
274
|
ownsMediaSession() {
|
|
261
|
-
return this.options.mediaSession !== !1 && "mediaSession" in navigator &&
|
|
275
|
+
return this.options.mediaSession !== !1 && "mediaSession" in navigator && h.sessionOwner === this;
|
|
262
276
|
}
|
|
263
277
|
applyMediaSession() {
|
|
264
278
|
if (this.options.mediaSession === !1 || !("mediaSession" in navigator) || typeof MediaMetadata > "u") return;
|
|
265
|
-
const t =
|
|
279
|
+
const t = h.sessionOwner;
|
|
266
280
|
if (t && t !== this && !t.ctx.videoEl.paused && this.ctx.videoEl.paused) return;
|
|
267
|
-
|
|
268
|
-
const e = this.options,
|
|
281
|
+
h.sessionOwner = this;
|
|
282
|
+
const e = this.options, s = e.cover || this.ctx.poster(), r = navigator.mediaSession;
|
|
269
283
|
r.metadata = new MediaMetadata({
|
|
270
284
|
title: e.title ?? "",
|
|
271
285
|
artist: e.artist ?? "",
|
|
272
286
|
album: e.album ?? "",
|
|
273
|
-
artwork:
|
|
287
|
+
artwork: s ? [{ src: new URL(s, document.baseURI).href }] : []
|
|
274
288
|
});
|
|
275
|
-
const a = this.ctx.videoEl,
|
|
289
|
+
const a = this.ctx.videoEl, o = (l, d) => {
|
|
276
290
|
try {
|
|
277
|
-
r.setActionHandler(
|
|
291
|
+
r.setActionHandler(l, d);
|
|
278
292
|
} catch {
|
|
279
293
|
}
|
|
280
294
|
};
|
|
281
|
-
|
|
282
|
-
typeof
|
|
295
|
+
o("play", () => this.ctx.play()), o("pause", () => a.pause()), o("seekbackward", (l) => a.currentTime = Math.max(0, a.currentTime - (l.seekOffset ?? m))), o("seekforward", (l) => a.currentTime = Math.min(a.duration || 1 / 0, a.currentTime + (l.seekOffset ?? m))), o("seekto", (l) => {
|
|
296
|
+
typeof l.seekTime == "number" && (a.currentTime = l.seekTime);
|
|
283
297
|
}), this.updatePositionState();
|
|
284
298
|
}
|
|
285
299
|
releaseMediaSession() {
|
|
286
|
-
if (
|
|
300
|
+
if (h.sessionOwner !== this || (h.sessionOwner = null, !("mediaSession" in navigator))) return;
|
|
287
301
|
const t = navigator.mediaSession;
|
|
288
302
|
t.metadata = null;
|
|
289
303
|
for (const e of ["play", "pause", "seekbackward", "seekforward", "seekto"])
|
|
@@ -293,19 +307,20 @@ const d = class d {
|
|
|
293
307
|
}
|
|
294
308
|
}
|
|
295
309
|
destroy() {
|
|
310
|
+
var e;
|
|
296
311
|
cancelAnimationFrame(this.frame), cancelAnimationFrame(this.seekFrame);
|
|
297
312
|
const t = this.ctx.videoEl;
|
|
298
|
-
t.removeEventListener("play", this.onPlay), t.removeEventListener("pause", this.onPause), t.removeEventListener("ended", this.onPause), t.removeEventListener("seeked", this.render), t.removeEventListener("timeupdate", this.onTimeUpdate), t.removeEventListener("durationchange", this.onDurationChange), t.removeEventListener("ratechange", this.updatePositionState), t.removeEventListener("emptied", this.render), this.releaseMediaSession(), this.disableSound(), this.el.remove();
|
|
313
|
+
t.removeEventListener("play", this.onPlay), t.removeEventListener("pause", this.onPause), t.removeEventListener("ended", this.onPause), t.removeEventListener("seeked", this.render), t.removeEventListener("timeupdate", this.onTimeUpdate), t.removeEventListener("durationchange", this.onDurationChange), t.removeEventListener("ratechange", this.updatePositionState), t.removeEventListener("emptied", this.render), this.releaseMediaSession(), this.disableSound(), (e = this.resizeObserver) == null || e.disconnect(), this.ctx.setBarMeta(null), this.el.remove();
|
|
299
314
|
}
|
|
300
315
|
};
|
|
301
|
-
|
|
302
|
-
let
|
|
303
|
-
function
|
|
304
|
-
const e = new
|
|
316
|
+
i(h, "sessionOwner", null);
|
|
317
|
+
let u = h;
|
|
318
|
+
function M(n, t) {
|
|
319
|
+
const e = new u(n);
|
|
305
320
|
return e.update(t), e;
|
|
306
321
|
}
|
|
307
322
|
export {
|
|
308
|
-
|
|
309
|
-
|
|
323
|
+
u as AudioStage,
|
|
324
|
+
M as installAudioStage
|
|
310
325
|
};
|
|
311
|
-
//# sourceMappingURL=index-
|
|
326
|
+
//# sourceMappingURL=index-BeJNpAyx.js.map
|