@hopeplayer/core 1.0.11 → 1.0.13
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 +34 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/ScratchSound-0XKHUcJK.js +174 -0
- package/dist/chunks/ScratchSound-0XKHUcJK.js.map +1 -0
- package/dist/chunks/{index-BHO8Gbrj.js → index-01P9jpUY.js} +819 -418
- package/dist/chunks/index-01P9jpUY.js.map +1 -0
- package/dist/chunks/{index-BeBmx35F.js → index-048h1-5X.js} +2 -2
- package/dist/chunks/{index-BeBmx35F.js.map → index-048h1-5X.js.map} +1 -1
- package/dist/chunks/{index-C6ONQXlF.js → index-9NzklChR.js} +2 -2
- package/dist/chunks/{index-C6ONQXlF.js.map → index-9NzklChR.js.map} +1 -1
- package/dist/chunks/index-BCMVXNL0.js +845 -0
- package/dist/chunks/index-BCMVXNL0.js.map +1 -0
- package/dist/chunks/{index-d_U9dcN6.js → index-BO0tjMR6.js} +2 -2
- package/dist/chunks/{index-d_U9dcN6.js.map → index-BO0tjMR6.js.map} +1 -1
- package/dist/chunks/index-BgJJr55r.js +311 -0
- package/dist/chunks/index-BgJJr55r.js.map +1 -0
- package/dist/chunks/{index-lwFM1iPV.js → index-CP1Y6U0c.js} +2 -2
- package/dist/chunks/{index-lwFM1iPV.js.map → index-CP1Y6U0c.js.map} +1 -1
- package/dist/chunks/index-DCXX1ZJG.js +108 -0
- package/dist/chunks/index-DCXX1ZJG.js.map +1 -0
- package/dist/chunks/{index-DGSYKljQ.js → index-n-1IIClr.js} +2 -2
- package/dist/chunks/{index-DGSYKljQ.js.map → index-n-1IIClr.js.map} +1 -1
- package/dist/controls/ControlBar.d.ts +32 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +8 -0
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +3 -0
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/controls/VolumePanel.d.ts +0 -2
- package/dist/controls/VolumePanel.d.ts.map +1 -1
- package/dist/debug/ErrorLog.d.ts +29 -0
- package/dist/debug/ErrorLog.d.ts.map +1 -0
- package/dist/hls/SourceManager.d.ts +11 -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 +19 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/keyboard/KeyboardController.d.ts +2 -0
- package/dist/keyboard/KeyboardController.d.ts.map +1 -1
- package/dist/plugins/ads/AdSurfaceGuard.d.ts +39 -0
- package/dist/plugins/ads/AdSurfaceGuard.d.ts.map +1 -0
- package/dist/plugins/ads/AdsController.d.ts +103 -1
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/ads/PrerollGate.d.ts +51 -0
- package/dist/plugins/ads/PrerollGate.d.ts.map +1 -0
- package/dist/plugins/ads/preconnect.d.ts +2 -0
- package/dist/plugins/ads/preconnect.d.ts.map +1 -0
- package/dist/plugins/audio/AudioStage.d.ts +80 -0
- package/dist/plugins/audio/AudioStage.d.ts.map +1 -0
- package/dist/plugins/audio/ScratchSound.d.ts +48 -0
- package/dist/plugins/audio/ScratchSound.d.ts.map +1 -0
- package/dist/plugins/audio/index.d.ts +7 -0
- package/dist/plugins/audio/index.d.ts.map +1 -0
- package/dist/plugins/audio/vinylSvg.d.ts +12 -0
- package/dist/plugins/audio/vinylSvg.d.ts.map +1 -0
- package/dist/plugins/debug/DebugPanel.d.ts +37 -0
- package/dist/plugins/debug/DebugPanel.d.ts.map +1 -0
- package/dist/plugins/debug/index.d.ts +5 -0
- package/dist/plugins/debug/index.d.ts.map +1 -0
- package/dist/subtitles/CaptionRenderer.d.ts +6 -0
- package/dist/subtitles/CaptionRenderer.d.ts.map +1 -1
- package/dist/subtitles/attachTracks.d.ts.map +1 -1
- package/dist/types/index.d.ts +108 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-BHO8Gbrj.js.map +0 -1
- package/dist/chunks/index-glxDu2eJ.js +0 -531
- package/dist/chunks/index-glxDu2eJ.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { HopePlayerOptions } from './types';
|
|
2
2
|
import type Hls from 'hls.js';
|
|
3
3
|
import { type PlaybackEngineInfo } from './hls/SourceManager';
|
|
4
|
+
import { ErrorLog } from './debug/ErrorLog';
|
|
4
5
|
/** Paket sürümü — build sırasında package.json'dan gömülür. */
|
|
5
6
|
export declare const HOPE_PLAYER_VERSION: string;
|
|
6
7
|
/** <hope-player> — çekirdek oynatma ve kontroller; plugin'ler ilgili option verilince dinamik import edilir. */
|
|
@@ -21,6 +22,15 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
21
22
|
private readonly tooltip;
|
|
22
23
|
private readonly keyboard;
|
|
23
24
|
private readonly loadingSpinner;
|
|
25
|
+
/**
|
|
26
|
+
* Preroll kapısı — reklam plugin'i yüklenmeden önce kurulur ki autoplay / ilk play araya kaçmasın.
|
|
27
|
+
* Video'nun 'play'/'pause' dinleyicilerinin İLKİ olmalı (yuttuğu olayları UI ve hp:play görmesin).
|
|
28
|
+
*/
|
|
29
|
+
private readonly prerollGate;
|
|
30
|
+
/** Ads plugin kurulumu sürüyor — erken başlatılan kurulum ile sonraki bekleme aynı promise'i paylaşır. */
|
|
31
|
+
private adsInstall;
|
|
32
|
+
/** Yükleme halkası açık (medya takıldı / preroll bekleniyor) — kontroller bu sırada otomatik gizlenmez. */
|
|
33
|
+
private loadingActive;
|
|
24
34
|
private readonly errorScreen;
|
|
25
35
|
/** İleri/geri sarmada sağda/solda beliren anlık bildirim. */
|
|
26
36
|
private readonly seekFeedback;
|
|
@@ -29,6 +39,11 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
29
39
|
private contextMenuConfig;
|
|
30
40
|
/** İlk açılışta yüklenir (plugins/stats). */
|
|
31
41
|
private statsPanel;
|
|
42
|
+
private debugPanel;
|
|
43
|
+
/** options.debug — sağ tık menüsündeki "Hata ayıklama" girişini açar. */
|
|
44
|
+
private debugEnabled;
|
|
45
|
+
/** Player'ın tüm hataları (medya, yayın, reklam, altyazı) — her zaman tutulur; bkz. `errorLog`. */
|
|
46
|
+
private readonly log;
|
|
32
47
|
/** Son basılan işaretçi türü — sağ tık menüsü yalnızca fareyle (dokunmatikte uzun basma gesture'a ait). */
|
|
33
48
|
private lastPointerType;
|
|
34
49
|
/** options.tapGestures kuruluysa (plugins/tap-gestures). */
|
|
@@ -41,6 +56,9 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
41
56
|
private adsController;
|
|
42
57
|
private gestureControls;
|
|
43
58
|
private loopSection;
|
|
59
|
+
private audioStage;
|
|
60
|
+
/** options.audio — kapak + plak sahnesi, kontroller hep görünür, tam ekran yok. */
|
|
61
|
+
private audioMode;
|
|
44
62
|
private inViewAutoplay;
|
|
45
63
|
private unregisterSticky;
|
|
46
64
|
private playlistRunner;
|
|
@@ -128,6 +146,12 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
128
146
|
get playbackEngine(): PlaybackEngineInfo;
|
|
129
147
|
/** Paket sürümü (ör. "1.0.4"). */
|
|
130
148
|
static readonly version: string;
|
|
149
|
+
/** Player'ın hata kaydı (medya, yayın, reklam, altyazı) — `options.debug` kapalıyken de tutulur. */
|
|
150
|
+
get errorLog(): ErrorLog;
|
|
151
|
+
/** Hata ayıklama penceresini aç (sağ tık menüsündeki "Hata ayıklama" ile aynı). */
|
|
152
|
+
showDebugLog(): Promise<void>;
|
|
153
|
+
private readonly onMediaError;
|
|
154
|
+
private readonly onSubtitleError;
|
|
131
155
|
/** Teknik istatistik panelini aç/kapat (`force`: true = aç, false = kapat). Sağ tık menüsündeki "İstatistikler" ile aynı. */
|
|
132
156
|
toggleStats(force?: boolean): Promise<void>;
|
|
133
157
|
private readonly onPointerTypeTrack;
|
|
@@ -223,6 +247,16 @@ export declare class HopePlayerElement extends HTMLElement {
|
|
|
223
247
|
/** Fare kıpırdadı: imleci göster, hareketsiz kalırsa gizlemek için sayacı yeniden kur (tailwind.css `:host([data-cursor-hidden])`). */
|
|
224
248
|
private scheduleCursorHide;
|
|
225
249
|
private showCursor;
|
|
250
|
+
/** options.audio: sahneyi kurar, günceller (konum / boyut / devir canlı değişebilir) ya da kaldırır. */
|
|
251
|
+
private applyAudioMode;
|
|
252
|
+
/** Ads plugin'ini bir kez kurar; erken (paralel) başlatılan kurulum varsa onu bekler. */
|
|
253
|
+
private installAdsOnce;
|
|
254
|
+
/** Preroll beklemesi başladı / bitti: halka döner, toolbar görünür kalır, oynat butonu "duraklat" görünür. */
|
|
255
|
+
private onPrerollWaitChange;
|
|
256
|
+
/** Preroll beklenirken basılan oynat/duraklat (buton, Space/K) beklemeyi iptal eder. */
|
|
257
|
+
private cancelPrerollWait;
|
|
258
|
+
/** Yükleme halkası açılınca kontroller görünür kalır ve gizlenmez; kapanınca normal otomatik gizleme sürer. */
|
|
259
|
+
private onLoadingChange;
|
|
226
260
|
private readonly scheduleAutoHide;
|
|
227
261
|
}
|
|
228
262
|
//# sourceMappingURL=HopePlayerElement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAuC,KAAK,kBAAkB,EAA+C,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"HopePlayerElement.d.ts","sourceRoot":"","sources":["../src/HopePlayerElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
var c = Object.defineProperty;
|
|
2
|
+
var u = (a, t, e) => t in a ? c(a, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[t] = e;
|
|
3
|
+
var n = (a, t, e) => u(a, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
const g = 900;
|
|
5
|
+
const d = `
|
|
6
|
+
class HopeScratchProcessor extends AudioWorkletProcessor {
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
this.channels = null;
|
|
10
|
+
this.length = 0;
|
|
11
|
+
this.ratio = 1;
|
|
12
|
+
this.pos = 0;
|
|
13
|
+
this.target = 0;
|
|
14
|
+
this.rate = 0;
|
|
15
|
+
this.active = false;
|
|
16
|
+
this.blocks = 0;
|
|
17
|
+
this.port.onmessage = (e) => {
|
|
18
|
+
const d = e.data;
|
|
19
|
+
if (d.type === 'buffer') {
|
|
20
|
+
this.channels = d.channels;
|
|
21
|
+
this.length = d.channels[0].length;
|
|
22
|
+
this.ratio = d.sampleRate / sampleRate;
|
|
23
|
+
} else if (d.type === 'start') {
|
|
24
|
+
this.pos = this.target = d.position * (this.ratio * sampleRate);
|
|
25
|
+
this.rate = 0;
|
|
26
|
+
this.active = true;
|
|
27
|
+
} else if (d.type === 'target') {
|
|
28
|
+
this.target = Math.max(0, Math.min(this.length - 1, d.position * (this.ratio * sampleRate)));
|
|
29
|
+
} else if (d.type === 'stop') {
|
|
30
|
+
this.active = false;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
process(inputs, outputs) {
|
|
35
|
+
const out = outputs[0];
|
|
36
|
+
const frames = out[0].length;
|
|
37
|
+
if (!this.active || !this.channels) {
|
|
38
|
+
for (const ch of out) ch.fill(0);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const src = this.channels;
|
|
42
|
+
const last = this.length - 1;
|
|
43
|
+
// Okuma kafası hedefe ~25 ms'lik bir gecikmeyle yaklaşır; hız değişimi ~5 ms'de yumuşatılır.
|
|
44
|
+
const lag = 0.025 * sampleRate;
|
|
45
|
+
const smooth = 1 / (0.005 * sampleRate);
|
|
46
|
+
const maxRate = 8 * this.ratio;
|
|
47
|
+
for (let i = 0; i < frames; i++) {
|
|
48
|
+
let want = (this.target - this.pos) / lag;
|
|
49
|
+
if (want > maxRate) want = maxRate;
|
|
50
|
+
else if (want < -maxRate) want = -maxRate;
|
|
51
|
+
this.rate += (want - this.rate) * smooth;
|
|
52
|
+
const p = this.pos;
|
|
53
|
+
const i0 = p | 0;
|
|
54
|
+
const f = p - i0;
|
|
55
|
+
const i1 = i0 < last ? i0 + 1 : last;
|
|
56
|
+
for (let c = 0; c < out.length; c++) {
|
|
57
|
+
const ch = src[c < src.length ? c : src.length - 1];
|
|
58
|
+
out[c][i] = ch[i0] + (ch[i1] - ch[i0]) * f;
|
|
59
|
+
}
|
|
60
|
+
let next = p + this.rate;
|
|
61
|
+
if (next < 0) next = 0;
|
|
62
|
+
else if (next > last) next = last;
|
|
63
|
+
this.pos = next;
|
|
64
|
+
}
|
|
65
|
+
if (++this.blocks % 8 === 0) this.port.postMessage({ type: 'position', position: this.pos / (this.ratio * sampleRate) });
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
registerProcessor('hope-scratch', HopeScratchProcessor);
|
|
70
|
+
`;
|
|
71
|
+
class l {
|
|
72
|
+
constructor(t) {
|
|
73
|
+
n(this, "ctx", null);
|
|
74
|
+
n(this, "node", null);
|
|
75
|
+
n(this, "gain", null);
|
|
76
|
+
n(this, "loadedSrc", "");
|
|
77
|
+
n(this, "loading", null);
|
|
78
|
+
n(this, "unsupportedSrc", "");
|
|
79
|
+
n(this, "playing", !1);
|
|
80
|
+
/** İşlemcinin bildirdiği son okuma konumu (sn) — teşhis / test için. */
|
|
81
|
+
n(this, "lastPosition", 0);
|
|
82
|
+
n(this, "onStateChange", null);
|
|
83
|
+
this.video = t;
|
|
84
|
+
}
|
|
85
|
+
static isSupported() {
|
|
86
|
+
return typeof AudioContext < "u" && typeof AudioWorkletNode < "u" && "audioWorklet" in AudioContext.prototype;
|
|
87
|
+
}
|
|
88
|
+
/** Şu anki kaynak hazır mı (çözüldü + işlemci kuruldu)? */
|
|
89
|
+
get ready() {
|
|
90
|
+
return !!this.node && this.loadedSrc === this.currentSrc();
|
|
91
|
+
}
|
|
92
|
+
currentSrc() {
|
|
93
|
+
return this.video.currentSrc || "";
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Kaynağı çözer ve işlemciyi kurar (kaynak başına bir kez). Kullanıcı etkileşimi gerektirmez — çalma başlayınca
|
|
97
|
+
* boşta çağrılır ki ilk scratch'te gecikme olmasın.
|
|
98
|
+
*/
|
|
99
|
+
prepare() {
|
|
100
|
+
var e;
|
|
101
|
+
const t = this.currentSrc();
|
|
102
|
+
return this.ready ? Promise.resolve(!0) : !t || t === this.unsupportedSrc ? Promise.resolve(!1) : this.loading ? this.loading : (this.loading = this.load(t).then((s) => {
|
|
103
|
+
var o;
|
|
104
|
+
return s || (this.unsupportedSrc = t), (o = this.onStateChange) == null || o.call(this, s ? "ready" : "unsupported"), s;
|
|
105
|
+
}).finally(() => {
|
|
106
|
+
this.loading = null;
|
|
107
|
+
}), (e = this.onStateChange) == null || e.call(this, "loading"), this.loading);
|
|
108
|
+
}
|
|
109
|
+
async load(t) {
|
|
110
|
+
if (!l.isSupported() || t.startsWith("blob:") || /\.m3u8(\?|#|$)/i.test(t)) return !1;
|
|
111
|
+
const e = this.video.duration;
|
|
112
|
+
if (!Number.isFinite(e) || e <= 0 || e > 900) return !1;
|
|
113
|
+
try {
|
|
114
|
+
this.ctx ?? (this.ctx = new AudioContext({ latencyHint: "interactive" }));
|
|
115
|
+
const s = this.ctx;
|
|
116
|
+
if (!this.node) {
|
|
117
|
+
const i = URL.createObjectURL(new Blob([d], { type: "application/javascript" }));
|
|
118
|
+
try {
|
|
119
|
+
await s.audioWorklet.addModule(i);
|
|
120
|
+
} finally {
|
|
121
|
+
URL.revokeObjectURL(i);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const o = await fetch(t, { credentials: "same-origin" });
|
|
125
|
+
if (!o.ok) return !1;
|
|
126
|
+
const r = await s.decodeAudioData(await o.arrayBuffer());
|
|
127
|
+
if (t !== this.currentSrc()) return !1;
|
|
128
|
+
this.node || (this.gain = s.createGain(), this.gain.gain.value = 0, this.gain.connect(s.destination), this.node = new AudioWorkletNode(s, "hope-scratch", { numberOfInputs: 0, outputChannelCount: [Math.min(2, r.numberOfChannels)] }), this.node.port.onmessage = (i) => {
|
|
129
|
+
i.data.type === "position" && (this.lastPosition = i.data.position);
|
|
130
|
+
}, this.node.connect(this.gain));
|
|
131
|
+
const h = [];
|
|
132
|
+
for (let i = 0; i < Math.min(2, r.numberOfChannels); i++) h.push(r.getChannelData(i).slice());
|
|
133
|
+
return this.node.port.postMessage({ type: "buffer", channels: h, sampleRate: r.sampleRate }, h.map((i) => i.buffer)), this.loadedSrc = t, !0;
|
|
134
|
+
} catch {
|
|
135
|
+
return !1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Plak tutuldu. Kullanıcı etkileşimi (pointerdown) içinde çağrılmalı — AudioContext'i başlatır. */
|
|
139
|
+
start(t) {
|
|
140
|
+
if (!this.ready || !this.ctx || !this.node || !this.gain) return;
|
|
141
|
+
this.ctx.resume().catch(() => {
|
|
142
|
+
});
|
|
143
|
+
const e = this.video.muted ? 0 : this.video.volume, s = this.ctx.currentTime;
|
|
144
|
+
this.gain.gain.cancelScheduledValues(s), this.gain.gain.setValueAtTime(0, s), this.gain.gain.linearRampToValueAtTime(e, s + 0.015), this.node.port.postMessage({ type: "start", position: t }), this.lastPosition = t, this.playing = !0;
|
|
145
|
+
}
|
|
146
|
+
/** Parmağın gösterdiği konum (sn). */
|
|
147
|
+
setTarget(t) {
|
|
148
|
+
!this.playing || !this.node || this.node.port.postMessage({ type: "target", position: t });
|
|
149
|
+
}
|
|
150
|
+
/** Plak bırakıldı: kısa bir sönümle sus (çıtırtı olmasın). */
|
|
151
|
+
stop() {
|
|
152
|
+
if (!this.playing || !this.ctx || !this.node || !this.gain) return;
|
|
153
|
+
this.playing = !1;
|
|
154
|
+
const t = this.ctx.currentTime;
|
|
155
|
+
this.gain.gain.cancelScheduledValues(t), this.gain.gain.setValueAtTime(this.gain.gain.value, t), this.gain.gain.linearRampToValueAtTime(0, t + 0.015);
|
|
156
|
+
const e = this.node;
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
this.playing || e.port.postMessage({ type: "stop" });
|
|
159
|
+
}, 0.015 * 1e3 + 10);
|
|
160
|
+
}
|
|
161
|
+
get active() {
|
|
162
|
+
return this.playing;
|
|
163
|
+
}
|
|
164
|
+
destroy() {
|
|
165
|
+
var t, e, s;
|
|
166
|
+
this.playing = !1, (t = this.node) == null || t.disconnect(), (e = this.gain) == null || e.disconnect(), this.node = null, this.gain = null, (s = this.ctx) == null || s.close().catch(() => {
|
|
167
|
+
}), this.ctx = null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export {
|
|
171
|
+
g as SCRATCH_SOUND_MAX_SECONDS,
|
|
172
|
+
l as ScratchSound
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=ScratchSound-0XKHUcJK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScratchSound-0XKHUcJK.js","sources":["../../src/plugins/audio/ScratchSound.ts"],"sourcesContent":["/**\n * Plak scratch sesi (options.audio.vinyl.scratchSound). `<audio>/<video>` geriye çalamaz ve sarma sırasında ses vermez;\n * bu yüzden scratch boyunca ses Web Audio ile üretilir: dosya bir kez ham sese çözülür, bir AudioWorklet bu sesi\n * parmağın gösterdiği konuma doğru (ileri / geri, yavaş / hızlı) okur — parmak durunca okuma da durur, ses kesilir.\n *\n * Konum güdümlü: işlemciye hız değil hedef konum verilir; okuma kafası hedefe kısa bir gecikmeyle (yay gibi) yaklaşır.\n * Böylece ses ile plağın açısı hiçbir zaman birbirinden kaymaz ve hız değişimleri yumuşak duyulur.\n *\n * Desteklenmeyen durumlarda (HLS / MediaSource, çok uzun dosya, CORS izni yok, AudioWorklet yok) `prepare()` false\n * döner ve scratch eskisi gibi sessiz çalışır.\n */\n\n/** Bundan uzun dosyalar çözülmez — çözülmüş ses dakikada ~10 MB yer kaplar. */\nexport const SCRATCH_SOUND_MAX_SECONDS = 15 * 60;\nconst FADE_SECONDS = 0.015;\n\nconst WORKLET_SOURCE = `\nclass HopeScratchProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.channels = null;\n this.length = 0;\n this.ratio = 1;\n this.pos = 0;\n this.target = 0;\n this.rate = 0;\n this.active = false;\n this.blocks = 0;\n this.port.onmessage = (e) => {\n const d = e.data;\n if (d.type === 'buffer') {\n this.channels = d.channels;\n this.length = d.channels[0].length;\n this.ratio = d.sampleRate / sampleRate;\n } else if (d.type === 'start') {\n this.pos = this.target = d.position * (this.ratio * sampleRate);\n this.rate = 0;\n this.active = true;\n } else if (d.type === 'target') {\n this.target = Math.max(0, Math.min(this.length - 1, d.position * (this.ratio * sampleRate)));\n } else if (d.type === 'stop') {\n this.active = false;\n }\n };\n }\n process(inputs, outputs) {\n const out = outputs[0];\n const frames = out[0].length;\n if (!this.active || !this.channels) {\n for (const ch of out) ch.fill(0);\n return true;\n }\n const src = this.channels;\n const last = this.length - 1;\n // Okuma kafası hedefe ~25 ms'lik bir gecikmeyle yaklaşır; hız değişimi ~5 ms'de yumuşatılır.\n const lag = 0.025 * sampleRate;\n const smooth = 1 / (0.005 * sampleRate);\n const maxRate = 8 * this.ratio;\n for (let i = 0; i < frames; i++) {\n let want = (this.target - this.pos) / lag;\n if (want > maxRate) want = maxRate;\n else if (want < -maxRate) want = -maxRate;\n this.rate += (want - this.rate) * smooth;\n const p = this.pos;\n const i0 = p | 0;\n const f = p - i0;\n const i1 = i0 < last ? i0 + 1 : last;\n for (let c = 0; c < out.length; c++) {\n const ch = src[c < src.length ? c : src.length - 1];\n out[c][i] = ch[i0] + (ch[i1] - ch[i0]) * f;\n }\n let next = p + this.rate;\n if (next < 0) next = 0;\n else if (next > last) next = last;\n this.pos = next;\n }\n if (++this.blocks % 8 === 0) this.port.postMessage({ type: 'position', position: this.pos / (this.ratio * sampleRate) });\n return true;\n }\n}\nregisterProcessor('hope-scratch', HopeScratchProcessor);\n`;\n\ntype State = 'idle' | 'loading' | 'ready' | 'unsupported';\n\nexport class ScratchSound {\n private ctx: AudioContext | null = null;\n private node: AudioWorkletNode | null = null;\n private gain: GainNode | null = null;\n private loadedSrc = '';\n private loading: Promise<boolean> | null = null;\n private unsupportedSrc = '';\n private playing = false;\n /** İşlemcinin bildirdiği son okuma konumu (sn) — teşhis / test için. */\n lastPosition = 0;\n onStateChange: ((state: State) => void) | null = null;\n\n constructor(private readonly video: HTMLMediaElement) {}\n\n static isSupported(): boolean {\n return typeof AudioContext !== 'undefined' && typeof AudioWorkletNode !== 'undefined' && 'audioWorklet' in AudioContext.prototype;\n }\n\n /** Şu anki kaynak hazır mı (çözüldü + işlemci kuruldu)? */\n get ready(): boolean {\n return !!this.node && this.loadedSrc === this.currentSrc();\n }\n\n private currentSrc(): string {\n return this.video.currentSrc || '';\n }\n\n /**\n * Kaynağı çözer ve işlemciyi kurar (kaynak başına bir kez). Kullanıcı etkileşimi gerektirmez — çalma başlayınca\n * boşta çağrılır ki ilk scratch'te gecikme olmasın.\n */\n prepare(): Promise<boolean> {\n const src = this.currentSrc();\n if (this.ready) return Promise.resolve(true);\n if (!src || src === this.unsupportedSrc) return Promise.resolve(false);\n if (this.loading) return this.loading;\n this.loading = this.load(src)\n .then((ok) => {\n if (!ok) this.unsupportedSrc = src;\n this.onStateChange?.(ok ? 'ready' : 'unsupported');\n return ok;\n })\n .finally(() => {\n this.loading = null;\n });\n this.onStateChange?.('loading');\n return this.loading;\n }\n\n private async load(src: string): Promise<boolean> {\n // HLS (MediaSource / blob:) parça parça gelir — tek dosya olarak çözülemez.\n if (!ScratchSound.isSupported() || src.startsWith('blob:') || /\\.m3u8(\\?|#|$)/i.test(src)) return false;\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration <= 0 || duration > SCRATCH_SOUND_MAX_SECONDS) return false;\n try {\n this.ctx ??= new AudioContext({ latencyHint: 'interactive' });\n const ctx = this.ctx;\n if (!this.node) {\n const url = URL.createObjectURL(new Blob([WORKLET_SOURCE], { type: 'application/javascript' }));\n try {\n await ctx.audioWorklet.addModule(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n }\n // Başka sunucudaki dosya için o sunucunun CORS izni gerekir; yoksa fetch reddedilir.\n const res = await fetch(src, { credentials: 'same-origin' });\n if (!res.ok) return false;\n const buffer = await ctx.decodeAudioData(await res.arrayBuffer());\n if (src !== this.currentSrc()) return false; // çözülürken kaynak değişti\n if (!this.node) {\n this.gain = ctx.createGain();\n this.gain.gain.value = 0;\n this.gain.connect(ctx.destination);\n this.node = new AudioWorkletNode(ctx, 'hope-scratch', { numberOfInputs: 0, outputChannelCount: [Math.min(2, buffer.numberOfChannels)] });\n this.node.port.onmessage = (e: MessageEvent<{ type: string; position: number }>) => {\n if (e.data.type === 'position') this.lastPosition = e.data.position;\n };\n this.node.connect(this.gain);\n }\n const channels: Float32Array[] = [];\n for (let c = 0; c < Math.min(2, buffer.numberOfChannels); c++) channels.push(buffer.getChannelData(c).slice());\n this.node.port.postMessage({ type: 'buffer', channels, sampleRate: buffer.sampleRate }, channels.map((ch) => ch.buffer));\n this.loadedSrc = src;\n return true;\n } catch {\n return false;\n }\n }\n\n /** Plak tutuldu. Kullanıcı etkileşimi (pointerdown) içinde çağrılmalı — AudioContext'i başlatır. */\n start(position: number): void {\n if (!this.ready || !this.ctx || !this.node || !this.gain) return;\n void this.ctx.resume().catch(() => {});\n const volume = this.video.muted ? 0 : this.video.volume;\n const now = this.ctx.currentTime;\n this.gain.gain.cancelScheduledValues(now);\n this.gain.gain.setValueAtTime(0, now);\n this.gain.gain.linearRampToValueAtTime(volume, now + FADE_SECONDS);\n this.node.port.postMessage({ type: 'start', position });\n this.lastPosition = position;\n this.playing = true;\n }\n\n /** Parmağın gösterdiği konum (sn). */\n setTarget(position: number): void {\n if (!this.playing || !this.node) return;\n this.node.port.postMessage({ type: 'target', position });\n }\n\n /** Plak bırakıldı: kısa bir sönümle sus (çıtırtı olmasın). */\n stop(): void {\n if (!this.playing || !this.ctx || !this.node || !this.gain) return;\n this.playing = false;\n const now = this.ctx.currentTime;\n this.gain.gain.cancelScheduledValues(now);\n this.gain.gain.setValueAtTime(this.gain.gain.value, now);\n this.gain.gain.linearRampToValueAtTime(0, now + FADE_SECONDS);\n const node = this.node;\n // Sönüm bitince işlemciyi durdur — o arada plak yeniden tutulduysa (hızlı tut-bırak-tut) yeni scratch'i kesme.\n setTimeout(() => {\n if (!this.playing) node.port.postMessage({ type: 'stop' });\n }, FADE_SECONDS * 1000 + 10);\n }\n\n get active(): boolean {\n return this.playing;\n }\n\n destroy(): void {\n this.playing = false;\n this.node?.disconnect();\n this.gain?.disconnect();\n this.node = null;\n this.gain = null;\n void this.ctx?.close().catch(() => {});\n this.ctx = null;\n }\n}\n"],"names":["SCRATCH_SOUND_MAX_SECONDS","WORKLET_SOURCE","ScratchSound","video","__publicField","_a","src","ok","duration","ctx","url","res","buffer","e","channels","c","ch","position","volume","now","node","_b","_c"],"mappings":"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"}
|