@hopeplayer/core 1.0.0 → 1.0.2
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/chunks/index-BBmuCtKu.js.map +1 -1
- package/dist/chunks/{index-q5DsrT-Q.js → index-BR31cEYA.js} +2 -2
- package/dist/chunks/index-BR31cEYA.js.map +1 -0
- package/dist/chunks/{index-DiCkShCE.js → index-BjmWoP4E.js} +80 -70
- package/dist/chunks/index-BjmWoP4E.js.map +1 -0
- package/dist/chunks/{index-B4ujPVcl.js → index-CEmsL1uT.js} +2 -2
- package/dist/chunks/{index-B4ujPVcl.js.map → index-CEmsL1uT.js.map} +1 -1
- package/dist/chunks/{index-CQqGn9as.js → index-CZK3TwzR.js} +2 -2
- package/dist/chunks/index-CZK3TwzR.js.map +1 -0
- package/dist/chunks/{index-BFgqg05L.js → index-DadIEuQc.js} +2 -2
- package/dist/chunks/{index-BFgqg05L.js.map → index-DadIEuQc.js.map} +1 -1
- package/dist/chunks/index-glxDu2eJ.js.map +1 -1
- package/dist/chunks/{index-DXf2Al1x.js → index-lrAXde76.js} +2 -2
- package/dist/chunks/{index-DXf2Al1x.js.map → index-lrAXde76.js.map} +1 -1
- package/dist/hls/SourceManager.d.ts +5 -2
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hope-player.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-CQqGn9as.js.map +0 -1
- package/dist/chunks/index-DiCkShCE.js.map +0 -1
- package/dist/chunks/index-q5DsrT-Q.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-q5DsrT-Q.js","sources":["../../src/plugins/sprite-thumbnails/SpriteThumbnails.ts","../../src/plugins/sprite-thumbnails/index.ts"],"sourcesContent":["import type { SpriteThumbnailsOptions } from '../../types';\r\nimport { formatTime } from '../../utils/format-time';\r\n\r\nexport interface SpriteThumbnailsPlayerContext {\r\n videoEl: HTMLVideoElement;\r\n /** Önizlemenin bağlandığı seek bar — zaman eşlemesi (chapter boşlukları dahil) onun `ratioAtClientX`'inden. */\r\n seekBar: {\r\n readonly el: HTMLElement;\r\n ratioAtClientX(clientX: number): number;\r\n suppressHoverTime(key: string, suppressed: boolean): void;\r\n };\r\n /** Responsive ölçekleme için referans genişlik — genelde player/video alanının genişliği. */\r\n playerWidth(): number;\r\n}\r\n\r\n/** Bir önizleme karesi: hangi görselin hangi dikdörtgeni. */\r\ninterface Frame {\r\n url: string;\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n}\r\n\r\ninterface Sheet {\r\n img: HTMLImageElement;\r\n ready: boolean;\r\n failed: boolean;\r\n promise: Promise<void>;\r\n}\r\n\r\nexport interface VttCue {\r\n start: number;\r\n end: number;\r\n url: string;\r\n /** `#xywh` yoksa null → görselin tamamı. */\r\n rect: { x: number; y: number; w: number; h: number } | null;\r\n}\r\n\r\n/** Aynı anda bellekte (decode edilmiş) tutulan en fazla sheet — uzun videolarda bellek sınırsız büyümesin. */\r\nconst MAX_CACHED_SHEETS = 8;\r\n/** Sheet numarası şablonu: `%d` ya da sıfır dolgulu `%03d`. */\r\nconst SHEET_TEMPLATE = /%(0(\\d+))?d/;\r\n\r\n/**\n * Seek bar hover önizlemesi. Kaynak: tek görsel, çok parçalı (%d / %03d şablonu ya da sheets) veya WebVTT (#xywh).\n * sheetDuration verilmezse ilk sheet'in ızgarasından hesaplanır. Kurulumda hiçbir şey indirilmez; yalnızca imlecin\n * altındaki sheet + komşuları yüklenir, decode bitmeden gösterilmez, LRU cache.\n */\r\nexport class SpriteThumbnails {\r\n private readonly tooltip: HTMLElement;\r\n private readonly imageEl: HTMLElement;\r\n private readonly timeEl: HTMLElement;\r\n private readonly sheets = new Map<string, Sheet>();\r\n private vttCues: VttCue[] | null = null;\r\n private vttLoading: Promise<void> | null = null;\r\n /** Çok parçalı modda otomatik hesaplanan sheet süresi (ilk sheet yüklenince). */\r\n private derivedSheetDuration: number | null = null;\r\n private warmed = false;\r\n private hovering = false;\r\n private lastClientX = 0;\r\n private rafId: number | null = null;\r\n private destroyed = false;\r\n\r\n constructor(\r\n private readonly ctx: SpriteThumbnailsPlayerContext,\r\n private readonly options: SpriteThumbnailsOptions\r\n ) {\r\n this.tooltip = document.createElement('div');\r\n this.tooltip.setAttribute('part', 'sprite-tooltip');\r\n this.tooltip.className = 'hp-sprite-tooltip';\r\n this.imageEl = document.createElement('div');\r\n this.imageEl.className = 'hp-sprite-image';\r\n this.timeEl = document.createElement('div');\r\n this.timeEl.className = 'hp-sprite-time';\r\n this.tooltip.append(this.imageEl, this.timeEl);\r\n ctx.seekBar.el.appendChild(this.tooltip);\r\n // Önizlemenin altında zaman zaten yazıyor — varsayılan hover zamanı ikinci kez göstermesin.\r\n ctx.seekBar.suppressHoverTime('sprite', true);\r\n\r\n ctx.seekBar.el.addEventListener('pointerenter', this.onPointerEnter);\r\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\r\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\r\n ctx.videoEl.addEventListener('play', this.warm);\r\n }\r\n\r\n destroy(): void {\r\n this.destroyed = true;\r\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\r\n this.ctx.seekBar.el.removeEventListener('pointerenter', this.onPointerEnter);\r\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\r\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\r\n this.ctx.videoEl.removeEventListener('play', this.warm);\r\n this.tooltip.remove();\r\n this.ctx.seekBar.suppressHoverTime('sprite', false);\r\n for (const sheet of this.sheets.values()) sheet.img.src = '';\r\n this.sheets.clear();\r\n }\r\n\r\n // ── olaylar ──\r\n\r\n private readonly onPointerEnter = (e: PointerEvent): void => {\r\n this.hovering = true;\r\n this.lastClientX = e.clientX;\r\n this.warm();\r\n this.scheduleRender();\r\n };\r\n\r\n private readonly onPointerMove = (e: PointerEvent): void => {\r\n this.hovering = true;\r\n this.lastClientX = e.clientX;\r\n this.scheduleRender();\r\n };\r\n\r\n private readonly onPointerLeave = (): void => {\r\n this.hovering = false;\r\n this.tooltip.removeAttribute('data-visible');\r\n };\r\n\r\n /** İlk ihtiyaç anında (hover / oynatma) kaynağı hazırla — kurulumda hiçbir şey indirilmiyor. */\r\n private readonly warm = (): void => {\r\n if (this.warmed || this.destroyed) return;\r\n this.warmed = true;\r\n if (this.options.vtt) {\r\n void this.loadVtt();\r\n return;\r\n }\r\n const duration = this.ctx.videoEl.duration;\r\n const t = Number.isFinite(duration) ? this.ctx.videoEl.currentTime : 0;\r\n // Şablonlu/çok parçalı modda sheet süresi henüz bilinmiyorsa ilk sheet'ten öğrenilecek.\r\n void this.ensureSheet(this.sheetUrl(this.isMultiSheet() && this.sheetDuration() === null ? 0 : this.sheetIndexAt(t)));\r\n };\r\n\r\n private scheduleRender(): void {\r\n if (this.rafId !== null) return;\r\n this.rafId = requestAnimationFrame(() => {\r\n this.rafId = null;\r\n this.render();\r\n });\r\n }\r\n\r\n // ── çizim ──\r\n\r\n private render(): void {\r\n if (!this.hovering || this.destroyed) return;\r\n const duration = this.ctx.videoEl.duration;\r\n if (!Number.isFinite(duration) || duration <= 0) return;\r\n\r\n const seconds = this.ctx.seekBar.ratioAtClientX(this.lastClientX) * duration;\r\n this.timeEl.textContent = formatTime(seconds);\r\n\r\n const frame = this.isNetworkEligible() ? this.frameAt(seconds, duration) : null;\r\n const scale = this.scale();\r\n if (frame) {\r\n const sheet = this.sheets.get(frame.url)!;\r\n const { naturalWidth, naturalHeight } = sheet.img;\r\n this.imageEl.style.display = '';\r\n this.imageEl.style.width = `${frame.w * scale}px`;\r\n this.imageEl.style.height = `${frame.h * scale}px`;\r\n this.imageEl.style.backgroundImage = `url(\"${frame.url}\")`;\r\n this.imageEl.style.backgroundSize = `${naturalWidth * scale}px ${naturalHeight * scale}px`;\r\n this.imageEl.style.backgroundPosition = `${-frame.x * scale}px ${-frame.y * scale}px`;\r\n } else if (!this.imageEl.style.backgroundImage) {\r\n // Henüz hiçbir kare yüklenmedi — yalnızca zaman (yükleme bitince yeniden çizilir).\r\n this.imageEl.style.display = 'none';\r\n }\r\n\r\n // Kenarlarda taşmasın: imleci ortala ama seek bar sınırlarında kal.\r\n this.tooltip.setAttribute('data-visible', '');\r\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\r\n const tipWidth = this.tooltip.offsetWidth;\r\n const x = Math.min(Math.max(this.lastClientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\r\n this.tooltip.style.transform = `translateX(${x}px)`;\r\n }\r\n\r\n private scale(): number {\r\n const responsive = this.options.responsive;\r\n const playerWidth = this.ctx.playerWidth();\r\n return responsive && playerWidth && playerWidth < responsive ? playerWidth / responsive : 1;\r\n }\r\n\r\n private isNetworkEligible(): boolean {\r\n const nav = navigator as Navigator & { connection?: { downlink?: number } };\r\n const downlink = nav.connection?.downlink;\r\n const anyReady = Array.from(this.sheets.values()).some((s) => s.ready);\r\n return downlink === undefined || downlink >= (this.options.downlink ?? 2) || anyReady;\r\n }\r\n\r\n // ── kare çözümleme ──\r\n\r\n /** Saniyedeki kareyi döner; gereken sheet hazır değilse yüklemeyi başlatıp null döner (yüklenince render tekrar çağrılır). */\r\n private frameAt(seconds: number, duration: number): Frame | null {\r\n return this.options.vtt ? this.vttFrameAt(seconds) : this.gridFrameAt(seconds, duration);\r\n }\r\n\r\n private isMultiSheet(): boolean {\r\n return !!this.options.sheets?.length || SHEET_TEMPLATE.test(this.options.url ?? '');\r\n }\r\n\r\n /** Tek sheet → Infinity (tüm video); çok parçalı → verilen ya da ilk sheet'ten hesaplanan süre; henüz bilinmiyorsa null. */\r\n private sheetDuration(): number | null {\r\n if (!this.isMultiSheet()) return Infinity;\r\n return this.options.sheetDuration ?? this.derivedSheetDuration;\r\n }\r\n\r\n private sheetIndexAt(seconds: number): number {\r\n const d = this.sheetDuration();\r\n if (d === null || d === Infinity) return 0;\r\n // floor (ceil DEĞİL): tam sınırda (ör. 60. sn) bir SONRAKİ sheet'in ilk karesi.\r\n let index = Math.floor(Math.max(0, seconds) / d);\r\n if (this.options.sheets?.length) index = Math.min(index, this.options.sheets.length - 1);\r\n return index;\r\n }\r\n\r\n /** 0 tabanlı sheet index'inden URL. */\r\n private sheetUrl(index: number): string {\r\n if (this.options.sheets?.length) return this.options.sheets[Math.min(index, this.options.sheets.length - 1)]!;\r\n const url = this.options.url ?? '';\r\n const number = index + (this.options.firstSheetIndex ?? 1);\r\n return url.replace(SHEET_TEMPLATE, (_m, _p, width?: string) => String(number).padStart(width ? Number(width) : 0, '0'));\r\n }\r\n\r\n private gridFrameAt(seconds: number, duration: number): Frame | null {\r\n const { width, height } = this.options;\r\n if (!width || !height) return null;\r\n const interval = this.options.interval || 1;\r\n\r\n const sheetDuration = this.sheetDuration();\r\n if (sheetDuration === null) {\r\n // Çok parçalı ama süre bilinmiyor — ilk sheet yüklenince hesaplanacak.\r\n void this.ensureSheet(this.sheetUrl(0));\r\n return null;\r\n }\r\n\r\n const lastIndex = sheetDuration === Infinity ? 0 : this.sheetIndexAt(Math.max(0, duration - 0.001));\r\n const index = Math.min(this.sheetIndexAt(seconds), lastIndex);\r\n const url = this.sheetUrl(index);\r\n this.preloadAround(index, lastIndex);\r\n\r\n const sheet = this.sheets.get(url);\r\n if (!sheet?.ready) {\r\n void this.ensureSheet(url);\r\n return null;\r\n }\r\n this.touch(url);\r\n\r\n // Her sheet'in KENDİ boyutu (son sheet daha kısa olabilir).\r\n const columns = Math.max(1, Math.floor(sheet.img.naturalWidth / width));\r\n const rows = Math.max(1, Math.floor(sheet.img.naturalHeight / height));\r\n const local = sheetDuration === Infinity ? seconds : seconds - index * sheetDuration;\r\n const frameIndex = Math.min(Math.max(0, Math.floor(local / interval)), columns * rows - 1);\r\n return { url, x: (frameIndex % columns) * width, y: Math.floor(frameIndex / columns) * height, w: width, h: height };\r\n }\r\n\r\n private preloadAround(index: number, lastIndex: number): void {\r\n const n = this.options.preloadSheets ?? 1;\r\n for (let d = 1; d <= n; d++) {\r\n if (index + d <= lastIndex) void this.ensureSheet(this.sheetUrl(index + d));\r\n if (index - d >= 0) void this.ensureSheet(this.sheetUrl(index - d));\r\n }\r\n }\r\n\r\n private vttFrameAt(seconds: number): Frame | null {\r\n if (!this.vttCues) {\r\n void this.loadVtt();\r\n return null;\r\n }\r\n const cues = this.vttCues;\r\n if (!cues.length) return null;\r\n // İkili arama — saatlerce süren videolarda binlerce cue olabilir.\r\n let lo = 0;\r\n let hi = cues.length - 1;\r\n while (lo < hi) {\r\n const mid = (lo + hi + 1) >> 1;\r\n if (cues[mid]!.start <= seconds) lo = mid;\r\n else hi = mid - 1;\r\n }\r\n const cue = cues[lo]!;\r\n const neighbours = [cues[lo + 1], cues[lo - 1]].filter((c): c is VttCue => !!c && c.url !== cue.url);\r\n neighbours.forEach((c) => void this.ensureSheet(c.url));\r\n\r\n const sheet = this.sheets.get(cue.url);\r\n if (!sheet?.ready) {\r\n void this.ensureSheet(cue.url);\r\n return null;\r\n }\r\n this.touch(cue.url);\r\n const rect = cue.rect ?? { x: 0, y: 0, w: sheet.img.naturalWidth, h: sheet.img.naturalHeight };\r\n return { url: cue.url, ...rect };\r\n }\r\n\r\n // ── yükleme / cache ──\r\n\r\n private ensureSheet(url: string): Promise<void> {\r\n if (!url) return Promise.resolve();\r\n const existing = this.sheets.get(url);\r\n if (existing) return existing.promise;\r\n\r\n const img = new Image();\r\n img.decoding = 'async';\r\n const sheet: Sheet = { img, ready: false, failed: false, promise: Promise.resolve() };\r\n sheet.promise = new Promise<void>((resolve) => {\r\n img.onload = () => {\r\n // decode() bitmeden gösterme — yeni sheet'e geçerken boş/yanlış kare titremesi olmasın.\r\n const done = () => {\r\n if (this.destroyed) return resolve();\r\n sheet.ready = true;\r\n this.learnSheetDuration(img);\r\n if (this.hovering) this.scheduleRender();\r\n resolve();\r\n };\r\n img.decode ? img.decode().then(done, done) : done();\r\n };\r\n img.onerror = () => {\r\n sheet.failed = true;\r\n resolve();\r\n };\r\n });\r\n img.src = url;\r\n this.sheets.set(url, sheet);\r\n this.evict();\r\n return sheet.promise;\r\n }\r\n\r\n /** Çok parçalı modda `sheetDuration` verilmediyse ilk yüklenen sheet'in ızgara kapasitesinden hesapla. */\r\n private learnSheetDuration(img: HTMLImageElement): void {\r\n if (this.derivedSheetDuration !== null || this.options.vtt || !this.isMultiSheet() || this.options.sheetDuration) return;\r\n const { width, height } = this.options;\r\n if (!width || !height) return;\r\n const capacity = Math.max(1, Math.floor(img.naturalWidth / width)) * Math.max(1, Math.floor(img.naturalHeight / height));\r\n this.derivedSheetDuration = capacity * (this.options.interval || 1);\r\n }\r\n\r\n /** LRU: kullanılan sheet'i sona taşı. */\r\n private touch(url: string): void {\r\n const sheet = this.sheets.get(url);\r\n if (!sheet) return;\r\n this.sheets.delete(url);\r\n this.sheets.set(url, sheet);\r\n }\r\n\r\n private evict(): void {\r\n while (this.sheets.size > MAX_CACHED_SHEETS) {\r\n const oldest = this.sheets.keys().next().value as string;\r\n const sheet = this.sheets.get(oldest)!;\r\n sheet.img.onload = null;\r\n sheet.img.onerror = null;\r\n this.sheets.delete(oldest);\r\n }\r\n }\r\n\r\n private loadVtt(): Promise<void> {\r\n if (this.vttLoading) return this.vttLoading;\r\n const vttUrl = this.options.vtt!;\r\n this.vttLoading = fetch(vttUrl)\r\n .then((r) => {\r\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\r\n return r.text();\r\n })\r\n .then((text) => {\r\n if (this.destroyed) return;\r\n this.vttCues = parseThumbnailVtt(text, new URL(vttUrl, document.baseURI).href);\r\n if (this.vttCues.length) void this.ensureSheet(this.vttCues[0]!.url);\r\n if (this.hovering) this.scheduleRender();\r\n })\r\n .catch((err) => {\r\n console.warn('[HopePlayer sprite-thumbnails] VTT yüklenemedi:', err);\r\n this.vttCues = [];\r\n });\r\n return this.vttLoading;\r\n }\r\n}\r\n\r\n/** \"01:02:03.500\" / \"02:03.500\" → saniye. */\r\nfunction parseVttTime(value: string): number {\r\n const parts = value.trim().split(':').map(Number);\r\n return parts.reduce((acc, n) => acc * 60 + n, 0);\r\n}\r\n\r\n/** WebVTT thumbnail dosyası → sıralı cue listesi. Görsel yolları VTT dosyasına göre çözümlenir. */\r\nexport function parseThumbnailVtt(text: string, baseUrl: string): VttCue[] {\r\n const cues: VttCue[] = [];\r\n const blocks = text.replace(/\\r/g, '').split(/\\n\\n+/);\r\n for (const block of blocks) {\r\n const lines = block.split('\\n').filter(Boolean);\r\n const timingIndex = lines.findIndex((l) => l.includes('-->'));\r\n if (timingIndex === -1) continue;\r\n const [startStr, endStr] = lines[timingIndex]!.split('-->');\r\n const target = lines[timingIndex + 1]?.trim();\r\n if (!startStr || !endStr || !target) continue;\r\n\r\n const [path, hash] = target.split('#');\r\n const match = hash?.match(/xywh=(\\d+),(\\d+),(\\d+),(\\d+)/);\r\n cues.push({\r\n start: parseVttTime(startStr),\r\n end: parseVttTime(endStr.trim().split(/\\s+/)[0]!),\r\n url: new URL(path!, baseUrl).href,\r\n rect: match ? { x: +match[1]!, y: +match[2]!, w: +match[3]!, h: +match[4]! } : null,\r\n });\r\n }\r\n return cues.sort((a, b) => a.start - b.start);\r\n}\r\n","import { SpriteThumbnails, type SpriteThumbnailsPlayerContext } from './SpriteThumbnails';\nimport type { SpriteThumbnailsOptions } from '../../types';\n\nexport function installSpriteThumbnails(ctx: SpriteThumbnailsPlayerContext, options: SpriteThumbnailsOptions): SpriteThumbnails {\n return new SpriteThumbnails(ctx, options);\n}\n\nexport { SpriteThumbnails };\nexport type { SpriteThumbnailsPlayerContext };\n"],"names":["MAX_CACHED_SHEETS","SHEET_TEMPLATE","SpriteThumbnails","ctx","options","__publicField","e","duration","t","sheet","seconds","formatTime","frame","scale","naturalWidth","naturalHeight","barRect","tipWidth","x","responsive","playerWidth","downlink","_a","anyReady","s","d","index","url","number","_m","_p","width","height","interval","sheetDuration","lastIndex","columns","rows","local","frameIndex","n","cues","lo","hi","mid","cue","c","rect","existing","img","resolve","done","capacity","oldest","vttUrl","r","text","parseThumbnailVtt","err","parseVttTime","value","acc","baseUrl","blocks","block","lines","timingIndex","l","startStr","endStr","target","path","hash","match","a","b","installSpriteThumbnails"],"mappings":"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"}
|