@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BgJJr55r.js","sources":["../../src/plugins/audio/vinylSvg.ts","../../src/plugins/audio/AudioStage.ts","../../src/plugins/audio/index.ts"],"sourcesContent":["/**\n * Plak ve pikap kolu — elle çizilmiş SVG (dış görsel yok). Disk döner; ışık yansıması ayrı bir katmanda sabit kalır,\n * böylece dönüş gerçek bir plaktaki gibi okunur. Oluklar tam simetrik olduğundan etikette dönüşü gösteren bir işaret var.\n */\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nlet uid = 0;\n\nfunction grooves(): string {\n let out = '';\n // Kayıt alanı r=40..95; iki şarkı arası boşluk gibi birkaç koyu halka.\n for (let r = 40; r <= 95; r += 1.25) {\n const gap = Math.abs(r - 58) < 0.7 || Math.abs(r - 74) < 0.7;\n const alpha = gap ? 0 : 0.035 + ((r * 7) % 5) * 0.008;\n out += `<circle cx=\"100\" cy=\"100\" r=\"${r}\" fill=\"none\" stroke=\"rgba(255,255,255,${alpha.toFixed(3)})\" stroke-width=\"0.45\"/>`;\n }\n return out;\n}\n\n/** Dönen disk: oluklar, etiket (kapak ya da düz renk), merkez deliği. */\nexport function createDisc(): { el: SVGSVGElement; setLabel(cover: string | null, text: string): void } {\n const id = `hp-vinyl-${++uid}`;\n const wrap = document.createElement('div');\n wrap.innerHTML = `\n<svg xmlns=\"${SVG_NS}\" viewBox=\"0 0 200 200\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <radialGradient id=\"${id}-disc\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0\" stop-color=\"#1c1c1f\"/>\n <stop offset=\"0.45\" stop-color=\"#101012\"/>\n <stop offset=\"0.97\" stop-color=\"#151518\"/>\n <stop offset=\"1\" stop-color=\"#2a2a2e\"/>\n </radialGradient>\n <clipPath id=\"${id}-label\"><circle cx=\"100\" cy=\"100\" r=\"34\"/></clipPath>\n </defs>\n <circle cx=\"100\" cy=\"100\" r=\"99.5\" fill=\"url(#${id}-disc)\"/>\n ${grooves()}\n <circle cx=\"100\" cy=\"100\" r=\"96.5\" fill=\"none\" stroke=\"rgba(255,255,255,0.10)\" stroke-width=\"0.6\"/>\n <circle cx=\"100\" cy=\"100\" r=\"38\" fill=\"none\" stroke=\"#050506\" stroke-width=\"3\"/>\n <g class=\"hp-vinyl-label\">\n <circle cx=\"100\" cy=\"100\" r=\"34\" fill=\"var(--hp-color-accent, #e5484d)\"/>\n <image class=\"hp-vinyl-cover\" x=\"66\" y=\"66\" width=\"68\" height=\"68\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#${id}-label)\"/>\n <circle cx=\"100\" cy=\"100\" r=\"34\" fill=\"none\" stroke=\"rgba(0,0,0,0.35)\" stroke-width=\"1\"/>\n <text class=\"hp-vinyl-text\" x=\"100\" y=\"80\" text-anchor=\"middle\" font-size=\"6.5\" font-weight=\"700\" fill=\"rgba(0,0,0,0.72)\" font-family=\"system-ui, sans-serif\"></text>\n <circle cx=\"100\" cy=\"122\" r=\"2.2\" fill=\"rgba(255,255,255,0.85)\"/>\n </g>\n <circle cx=\"100\" cy=\"100\" r=\"3.6\" fill=\"#0b0b0c\"/>\n <circle cx=\"100\" cy=\"100\" r=\"3.6\" fill=\"none\" stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"0.6\"/>\n</svg>`;\n const svg = wrap.firstElementChild as SVGSVGElement;\n const image = svg.querySelector('.hp-vinyl-cover') as SVGImageElement;\n const text = svg.querySelector('.hp-vinyl-text') as SVGTextElement;\n return {\n el: svg,\n setLabel(cover, label) {\n if (cover) {\n image.setAttribute('href', cover);\n image.style.display = '';\n } else {\n image.removeAttribute('href');\n image.style.display = 'none';\n }\n // Kapak varsa yazı kapağın üstüne binmesin.\n text.textContent = cover ? '' : label.slice(0, 22);\n },\n };\n}\n\n/** Pikap kolu: sağ üstteki mile bağlı; çalarken plağın üzerine iner. */\nexport function createTonearm(): SVGSVGElement {\n const wrap = document.createElement('div');\n wrap.innerHTML = `\n<svg xmlns=\"${SVG_NS}\" viewBox=\"0 0 100 200\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"70\" cy=\"22\" r=\"15\" fill=\"#2b2b30\" stroke=\"rgba(255,255,255,0.18)\" stroke-width=\"1\"/>\n <circle cx=\"70\" cy=\"22\" r=\"7\" fill=\"#9a9aa2\"/>\n <path d=\"M70 22 L66 120 L40 162\" fill=\"none\" stroke=\"#c9c9cf\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <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\"/>\n</svg>`;\n return wrap.firstElementChild as SVGSVGElement;\n}\n","import type { AudioOptions, VinylOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createDisc, createTonearm } from './vinylSvg';\nimport type { ScratchSound } from './ScratchSound';\n\nexport interface AudioStageContext {\n videoEl: HTMLVideoElement;\n /** Sahnenin ekleneceği katman (video ile reklam katmanı arasında). */\n layerEl: HTMLElement;\n /** Kapak verilmezse kullanılan görsel (options.poster). */\n poster(): string | undefined;\n /** Player'ın oynat / duraklat yolu (preroll kapısına uyar). */\n togglePlay(): void;\n play(): void;\n i18n: HopeLocaleStrings;\n}\n\nconst DEFAULT_SIZE = 0.78;\nconst DEFAULT_RPM = 100 / 3;\n/** Bu kadar dereceden az çevirme \"dokunuş\" sayılır: oynat / duraklat. */\nconst TAP_DEGREES = 4;\n/** Bundan kısa, çevirmesiz basış \"dokunuş\"tur (oynat / duraklat); daha uzunu \"tutuş\" (bırakınca çalmaya devam). */\nconst TAP_MS = 250;\nconst MEDIA_SESSION_SEEK_SECONDS = 10;\n\ntype ResolvedVinyl = Required<VinylOptions>;\n\nfunction resolveVinyl(v: AudioOptions['vinyl']): ResolvedVinyl | null {\n if (v === false) return null;\n const o = v === true || v === undefined ? {} : v;\n const size = typeof o.size === 'number' && Number.isFinite(o.size) ? Math.min(1, Math.max(0.3, o.size)) : DEFAULT_SIZE;\n const rpm = typeof o.rpm === 'number' && o.rpm > 0 ? o.rpm : DEFAULT_RPM;\n return {\n position: o.position === 'center' || o.position === 'left' ? o.position : 'right',\n size,\n rpm,\n scratch: o.scratch !== false,\n scratchSound: o.scratchSound === true,\n tonearm: o.tonearm !== false,\n };\n}\n\n/** -180..180 aralığına indirger (açı farkı). */\nfunction wrapDegrees(d: number): number {\n return ((((d + 180) % 360) + 360) % 360) - 180;\n}\n\n/**\n * Ses modunun sahnesi: bulanık kapak zemini, kapak (plak kılıfı), dönen plak, pikap kolu, başlık / sanatçı.\n * Plağın açısı doğrudan çalma zamanından hesaplanır (açı = zaman / tur süresi × 360): sarınca, atlayınca, scratch\n * yapınca plak her zaman sesle aynı yerde durur.\n */\nexport class AudioStage {\n readonly el: HTMLDivElement;\n private readonly backdropImg: HTMLImageElement;\n private readonly sleeve: HTMLDivElement;\n private readonly sleeveImg: HTMLImageElement;\n private readonly vinylEl: HTMLDivElement;\n private readonly discEl: HTMLDivElement;\n private readonly armHolder: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly artistEl: HTMLDivElement;\n private readonly disc: ReturnType<typeof createDisc>;\n\n private options: AudioOptions = {};\n private vinyl: ResolvedVinyl | null = null;\n private frame = 0;\n private lastAriaSecond = -1;\n private lastPositionState = 0;\n\n // Scratch durumu\n private dragging = false;\n private dragPointer = -1;\n private center = { x: 0, y: 0 };\n private lastPointerAngle = 0;\n private accum = 0;\n private dragStartTime = 0;\n private dragStartAngle = 0;\n private moved = false;\n private wasPlaying = false;\n private downAt = 0;\n private seekFrame = 0;\n private pendingSeek: number | null = null;\n /** vinyl.scratchSound — ayrı parça olarak yalnızca açıksa yüklenir. */\n private sound: ScratchSound | null = null;\n private soundImport: Promise<ScratchSound | null> | null = null;\n private prepareTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly ctx: AudioStageContext) {\n const el = document.createElement('div');\n el.className = 'hp-audio';\n el.setAttribute('part', 'audio-stage');\n el.innerHTML = `\n <div class=\"hp-audio-backdrop\"><img alt=\"\" decoding=\"async\"></div>\n <div class=\"hp-audio-meta\"><div class=\"hp-audio-title\" part=\"audio-title\"></div><div class=\"hp-audio-artist\" part=\"audio-artist\"></div></div>\n <div class=\"hp-audio-area\">\n <div class=\"hp-audio-deck\">\n <div class=\"hp-audio-sleeve\" part=\"audio-cover\"><img alt=\"\" decoding=\"async\"></div>\n <div class=\"hp-vinyl\" part=\"vinyl\" role=\"slider\" tabindex=\"-1\" aria-valuemin=\"0\">\n <div class=\"hp-vinyl-disc\"></div>\n <div class=\"hp-vinyl-sheen\"></div>\n <div class=\"hp-tonearm-holder\"><div class=\"hp-tonearm\"></div></div>\n </div>\n </div>\n </div>`;\n this.el = el;\n this.backdropImg = el.querySelector('.hp-audio-backdrop img')!;\n this.sleeve = el.querySelector('.hp-audio-sleeve')!;\n this.sleeveImg = this.sleeve.querySelector('img')!;\n this.vinylEl = el.querySelector('.hp-vinyl')!;\n this.discEl = el.querySelector('.hp-vinyl-disc')!;\n this.armHolder = el.querySelector('.hp-tonearm-holder')!;\n this.titleEl = el.querySelector('.hp-audio-title')!;\n this.artistEl = el.querySelector('.hp-audio-artist')!;\n this.disc = createDisc();\n this.discEl.appendChild(this.disc.el);\n el.querySelector('.hp-tonearm')!.appendChild(createTonearm());\n // Kırık kapak bağlantısı: görseli gizle, zemin temaya düşsün.\n for (const img of [this.backdropImg, this.sleeveImg]) {\n img.addEventListener('error', () => img.removeAttribute('src'));\n }\n\n const v = ctx.videoEl;\n v.addEventListener('play', this.onPlay);\n v.addEventListener('pause', this.onPause);\n v.addEventListener('ended', this.onPause);\n v.addEventListener('seeked', this.render);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('durationchange', this.onDurationChange);\n v.addEventListener('ratechange', this.updatePositionState);\n v.addEventListener('emptied', this.render);\n\n this.vinylEl.addEventListener('pointerdown', this.onPointerDown);\n this.vinylEl.addEventListener('pointermove', this.onPointerMove);\n this.vinylEl.addEventListener('pointerup', this.onPointerUp);\n this.vinylEl.addEventListener('pointercancel', this.onPointerUp);\n this.vinylEl.addEventListener('lostpointercapture', this.onPointerUp);\n // Plağa tık / dokunuş videonun \"boş alana tık\" işleyicilerine düşmesin (oynat/duraklat'ı kendimiz yapıyoruz).\n for (const type of ['click', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'dblclick'] as const) {\n this.vinylEl.addEventListener(type, (e) => e.stopPropagation());\n }\n\n // Videonun hemen üstü: yükleme halkası ve reklam katmanı sahnenin üstünde kalır.\n ctx.layerEl.insertBefore(el, ctx.videoEl.nextSibling);\n this.refreshLabels();\n }\n\n update(options: AudioOptions): void {\n this.options = options;\n this.vinyl = resolveVinyl(options.vinyl);\n const cover = options.cover || this.ctx.poster() || '';\n for (const img of [this.backdropImg, this.sleeveImg]) {\n if (cover) img.src = cover;\n else img.removeAttribute('src');\n }\n this.el.toggleAttribute('data-cover', !!cover);\n this.titleEl.textContent = options.title ?? '';\n this.artistEl.textContent = [options.artist, options.album].filter(Boolean).join(' · ');\n this.el.toggleAttribute('data-meta', !!(options.title || options.artist || options.album));\n\n const vinyl = this.vinyl;\n this.el.setAttribute('data-position', vinyl ? vinyl.position : 'none');\n this.el.style.setProperty('--hp-vinyl-size', String(vinyl?.size ?? DEFAULT_SIZE));\n this.vinylEl.hidden = !vinyl;\n // 'center': kılıf yok. Plak kapalıysa yalnızca kapak. Etikette her zaman kapak (yoksa düz renk + başlık).\n this.sleeve.hidden = !!vinyl && vinyl.position === 'center';\n this.disc.setLabel(cover || null, options.title || 'HopeCore');\n this.armHolder.hidden = !vinyl?.tonearm;\n this.vinylEl.toggleAttribute('data-scratch', !!vinyl?.scratch);\n this.vinylEl.tabIndex = vinyl ? 0 : -1;\n\n if (!vinyl?.scratchSound) this.disableSound();\n else if (!this.ctx.videoEl.paused) this.schedulePrepareSound();\n\n this.applyMediaSession();\n this.onDurationChange();\n this.render();\n if (!this.ctx.videoEl.paused) this.onPlay();\n }\n\n // ── Scratch sesi ────────────────────────────────────────────────────\n\n private loadSound(): Promise<ScratchSound | null> {\n if (this.sound) return Promise.resolve(this.sound);\n this.soundImport ??= import('./ScratchSound')\n .then(({ ScratchSound }) => {\n if (!this.vinyl?.scratchSound || !ScratchSound.isSupported()) {\n this.el.setAttribute('data-scratch-sound', 'unsupported');\n return null;\n }\n this.sound ??= new ScratchSound(this.ctx.videoEl);\n this.sound.onStateChange = (state) => this.el.setAttribute('data-scratch-sound', state);\n return this.sound;\n })\n .catch(() => null)\n .finally(() => {\n this.soundImport = null;\n });\n return this.soundImport;\n }\n\n /** Çalma başlayınca, boşta: sesi önceden çöz ki ilk scratch gecikmesin. */\n private schedulePrepareSound(): void {\n if (!this.vinyl?.scratchSound || this.prepareTimer || this.sound?.ready) return;\n this.prepareTimer = setTimeout(() => {\n this.prepareTimer = null;\n const run = () => void this.loadSound().then((s) => s?.prepare());\n if ('requestIdleCallback' in window) window.requestIdleCallback(run, { timeout: 2000 });\n else run();\n }, 300);\n }\n\n private disableSound(): void {\n if (this.prepareTimer) clearTimeout(this.prepareTimer);\n this.prepareTimer = null;\n this.sound?.destroy();\n this.sound = null;\n this.el.removeAttribute('data-scratch-sound');\n }\n\n refreshLabels(): void {\n this.vinylEl.setAttribute('aria-label', this.ctx.i18n.audioVinyl);\n }\n\n // ── Dönüş ────────────────────────────────────────────────────────────\n\n private get secondsPerTurn(): number {\n return 60 / (this.vinyl?.rpm ?? DEFAULT_RPM);\n }\n\n private angleForTime(t: number): number {\n return ((t / this.secondsPerTurn) * 360) % 360;\n }\n\n private readonly render = (): void => {\n if (!this.vinyl || this.dragging) return;\n this.discEl.style.transform = `rotate(${this.angleForTime(this.ctx.videoEl.currentTime || 0)}deg)`;\n };\n\n private readonly loop = (): void => {\n this.render();\n this.frame = requestAnimationFrame(this.loop);\n };\n\n private readonly onPlay = (): void => {\n this.el.setAttribute('data-playing', '');\n this.schedulePrepareSound();\n cancelAnimationFrame(this.frame);\n if (this.vinyl) this.frame = requestAnimationFrame(this.loop);\n if (this.options.mediaSession !== false && 'mediaSession' in navigator) {\n // Sayfada birden fazla player varsa son çalan sistemin medya kontrollerini alır.\n this.applyMediaSession();\n navigator.mediaSession.playbackState = 'playing';\n }\n };\n\n private readonly onPause = (): void => {\n // Scratch sırasında plak elde tutuluyor — pikap kolu kalkmasın.\n if (!this.dragging) this.el.removeAttribute('data-playing');\n cancelAnimationFrame(this.frame);\n this.render();\n if (this.ownsMediaSession()) navigator.mediaSession.playbackState = 'paused';\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n if (v.paused) this.render();\n const second = Math.floor(v.currentTime || 0);\n if (second !== this.lastAriaSecond) {\n this.lastAriaSecond = second;\n this.vinylEl.setAttribute('aria-valuenow', String(second));\n }\n const now = performance.now();\n if (now - this.lastPositionState > 1000) this.updatePositionState();\n };\n\n private readonly onDurationChange = (): void => {\n const d = this.ctx.videoEl.duration;\n const finite = Number.isFinite(d) && d > 0;\n if (finite) this.vinylEl.setAttribute('aria-valuemax', String(Math.floor(d)));\n else this.vinylEl.removeAttribute('aria-valuemax');\n // Canlı yayında (süre sonsuz) sarma yok — plak yalnızca döner.\n this.vinylEl.toggleAttribute('data-live', !finite && d === Infinity);\n this.updatePositionState();\n };\n\n // ── Scratch ──────────────────────────────────────────────────────────\n\n private canScratch(): boolean {\n const d = this.ctx.videoEl.duration;\n return !!this.vinyl?.scratch && Number.isFinite(d) && d > 0;\n }\n\n private pointerAngle(e: PointerEvent): number {\n return (Math.atan2(e.clientY - this.center.y, e.clientX - this.center.x) * 180) / Math.PI;\n }\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n if (!this.vinyl || this.dragging) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n const rect = this.vinylEl.getBoundingClientRect();\n this.center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n this.dragging = true;\n this.dragPointer = e.pointerId;\n this.lastPointerAngle = this.pointerAngle(e);\n this.accum = 0;\n this.moved = false;\n this.dragStartTime = this.ctx.videoEl.currentTime || 0;\n this.dragStartAngle = this.angleForTime(this.dragStartTime);\n this.wasPlaying = !this.ctx.videoEl.paused;\n this.downAt = performance.now();\n // Gerçek plak gibi: elle tutulan plak anında susar (çevirmeye başlamayı beklemeden).\n if (this.wasPlaying && this.canScratch()) this.ctx.videoEl.pause();\n if (this.vinyl.scratchSound && this.canScratch()) {\n // AudioContext yalnızca kullanıcı etkileşimi içinde başlatılabilir — pointerdown'da.\n if (this.sound?.ready) this.sound.start(this.dragStartTime);\n else void this.loadSound().then((s) => s?.prepare());\n }\n try {\n this.vinylEl.setPointerCapture(e.pointerId);\n } catch {\n /* eski tarayıcı */\n }\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n if (!this.dragging || e.pointerId !== this.dragPointer) return;\n e.stopPropagation();\n const angle = this.pointerAngle(e);\n const delta = wrapDegrees(angle - this.lastPointerAngle);\n this.lastPointerAngle = angle;\n if (!this.canScratch()) {\n this.accum += delta;\n if (Math.abs(this.accum) > TAP_DEGREES) this.moved = true;\n return;\n }\n // Başa / sona dayanınca plak daha fazla dönmez.\n const spt = this.secondsPerTurn;\n const duration = this.ctx.videoEl.duration;\n const minAccum = (-this.dragStartTime / spt) * 360;\n const maxAccum = ((duration - this.dragStartTime) / spt) * 360;\n this.accum = Math.min(maxAccum, Math.max(minAccum, this.accum + delta));\n if (!this.moved && Math.abs(this.accum) > TAP_DEGREES) {\n this.moved = true;\n this.el.setAttribute('data-scratching', '');\n }\n if (!this.moved) return;\n this.discEl.style.transform = `rotate(${this.dragStartAngle + this.accum}deg)`;\n this.pendingSeek = this.dragStartTime + (this.accum / 360) * spt;\n this.sound?.setTarget(this.pendingSeek);\n if (!this.seekFrame) this.seekFrame = requestAnimationFrame(this.flushSeek);\n };\n\n private readonly flushSeek = (): void => {\n this.seekFrame = 0;\n if (this.pendingSeek === null) return;\n this.ctx.videoEl.currentTime = this.pendingSeek;\n this.pendingSeek = null;\n };\n\n private readonly onPointerUp = (e: PointerEvent): void => {\n if (!this.dragging || e.pointerId !== this.dragPointer) return;\n e.stopPropagation();\n this.dragging = false;\n this.dragPointer = -1;\n this.el.removeAttribute('data-scratching');\n this.sound?.stop();\n if (this.seekFrame) {\n cancelAnimationFrame(this.seekFrame);\n this.flushSeek();\n }\n if (!this.moved && this.canScratch() && this.wasPlaying) {\n // Çalarken basıldı (ve basınca sustu): kısa dokunuş = duraklat (öyle kalır); tutup bırakmak = devam.\n const held = performance.now() - this.downAt >= TAP_MS;\n // Basış iptal olduysa (ör. dokunmatikte sayfa kaydırması) kullanıcı duraklatmak istememiştir — devam.\n if (held || e.type !== 'pointerup') this.ctx.play();\n else {\n this.el.removeAttribute('data-playing'); // basılıyken inik tutulan pikap kolu kalksın\n this.render();\n }\n return;\n }\n if (!this.moved) {\n if (e.type === 'pointerup') this.ctx.togglePlay();\n return;\n }\n if (this.wasPlaying) this.ctx.play();\n else this.render();\n };\n\n // ── Media Session ───────────────────────────────────────────────────\n\n private ownsMediaSession(): boolean {\n return this.options.mediaSession !== false && 'mediaSession' in navigator && AudioStage.sessionOwner === this;\n }\n\n private static sessionOwner: AudioStage | null = null;\n\n private applyMediaSession(): void {\n if (this.options.mediaSession === false || !('mediaSession' in navigator) || typeof MediaMetadata === 'undefined') return;\n // Başka bir player çalıyorsa onun bilgilerini ezme — bu player çalmaya başlayınca alır.\n const owner = AudioStage.sessionOwner;\n if (owner && owner !== this && !owner.ctx.videoEl.paused && this.ctx.videoEl.paused) return;\n AudioStage.sessionOwner = this;\n const o = this.options;\n const cover = o.cover || this.ctx.poster();\n const ms = navigator.mediaSession;\n ms.metadata = new MediaMetadata({\n title: o.title ?? '',\n artist: o.artist ?? '',\n album: o.album ?? '',\n artwork: cover ? [{ src: new URL(cover, document.baseURI).href }] : [],\n });\n const v = this.ctx.videoEl;\n const set = (action: MediaSessionAction, handler: MediaSessionActionHandler | null): void => {\n try {\n ms.setActionHandler(action, handler);\n } catch {\n /* tarayıcı bu eylemi desteklemiyor */\n }\n };\n set('play', () => this.ctx.play());\n set('pause', () => v.pause());\n set('seekbackward', (d) => (v.currentTime = Math.max(0, v.currentTime - (d.seekOffset ?? MEDIA_SESSION_SEEK_SECONDS))));\n set('seekforward', (d) => (v.currentTime = Math.min(v.duration || Infinity, v.currentTime + (d.seekOffset ?? MEDIA_SESSION_SEEK_SECONDS))));\n set('seekto', (d) => {\n if (typeof d.seekTime === 'number') v.currentTime = d.seekTime;\n });\n this.updatePositionState();\n }\n\n private readonly updatePositionState = (): void => {\n if (!this.ownsMediaSession()) return;\n this.lastPositionState = performance.now();\n const v = this.ctx.videoEl;\n const duration = v.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n try {\n navigator.mediaSession.setPositionState({\n duration,\n playbackRate: v.playbackRate || 1,\n position: Math.min(duration, Math.max(0, v.currentTime || 0)),\n });\n } catch {\n /* geçersiz durum (ör. kaynak değişirken) */\n }\n };\n\n private releaseMediaSession(): void {\n if (AudioStage.sessionOwner !== this) return;\n AudioStage.sessionOwner = null;\n if (!('mediaSession' in navigator)) return;\n const ms = navigator.mediaSession;\n ms.metadata = null;\n for (const action of ['play', 'pause', 'seekbackward', 'seekforward', 'seekto'] as MediaSessionAction[]) {\n try {\n ms.setActionHandler(action, null);\n } catch {\n /* desteklenmiyor */\n }\n }\n }\n\n destroy(): void {\n cancelAnimationFrame(this.frame);\n cancelAnimationFrame(this.seekFrame);\n const v = this.ctx.videoEl;\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onPause);\n v.removeEventListener('seeked', this.render);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('durationchange', this.onDurationChange);\n v.removeEventListener('ratechange', this.updatePositionState);\n v.removeEventListener('emptied', this.render);\n this.releaseMediaSession();\n this.disableSound();\n this.el.remove();\n }\n}\n","import { AudioStage, type AudioStageContext } from './AudioStage';\nimport type { AudioOptions } from '../../types';\n\n/** Ses modu sahnesini kurar (kapak, plak, scratch, sistem medya kontrolleri). */\nexport function installAudioStage(ctx: AudioStageContext, options: AudioOptions): AudioStage {\n const stage = new AudioStage(ctx);\n stage.update(options);\n return stage;\n}\n\nexport { AudioStage };\nexport type { AudioStageContext };\n"],"names":["SVG_NS","uid","grooves","out","r","alpha","createDisc","id","wrap","svg","image","text","cover","label","createTonearm","DEFAULT_SIZE","DEFAULT_RPM","TAP_DEGREES","TAP_MS","MEDIA_SESSION_SEEK_SECONDS","resolveVinyl","v","o","size","rpm","wrapDegrees","d","_AudioStage","ctx","__publicField","second","finite","e","_a","rect","s","angle","delta","spt","duration","minAccum","maxAccum","el","img","type","options","vinyl","ScratchSound","state","_b","run","owner","ms","set","action","handler","AudioStage","installAudioStage","stage"],"mappings":"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"}
|