@hopeplayer/core 1.5.0 → 1.7.0
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 +47 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/adTriggers-DVqgm92F.js +420 -0
- package/dist/chunks/adTriggers-DVqgm92F.js.map +1 -0
- package/dist/chunks/{ads-C4tDPsUs.js → ads-eSKyiH1o.js} +2 -2
- package/dist/chunks/{ads-C4tDPsUs.js.map → ads-eSKyiH1o.js.map} +1 -1
- package/dist/chunks/audioDescription-cpprKeB-.js +146 -0
- package/dist/chunks/audioDescription-cpprKeB-.js.map +1 -0
- package/dist/chunks/{cast-Baxvu76A.js → cast-DEowHmqA.js} +29 -28
- package/dist/chunks/{cast-Baxvu76A.js.map → cast-DEowHmqA.js.map} +1 -1
- package/dist/chunks/docPip-Bh6BWPk-.js +92 -0
- package/dist/chunks/docPip-Bh6BWPk-.js.map +1 -0
- package/dist/chunks/heatmap-Bz_EMQFk.js +117 -0
- package/dist/chunks/heatmap-Bz_EMQFk.js.map +1 -0
- package/dist/chunks/{history-CvydU0aN.js → history-ZSdDDsRF.js} +35 -34
- package/dist/chunks/{history-CvydU0aN.js.map → history-ZSdDDsRF.js.map} +1 -1
- package/dist/chunks/interactive-ClJC5Vyo.js +213 -0
- package/dist/chunks/interactive-ClJC5Vyo.js.map +1 -0
- package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
- package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
- package/dist/chunks/{markers-Dr4-CCxE.js → markers-D32rI-x-.js} +53 -51
- package/dist/chunks/markers-D32rI-x-.js.map +1 -0
- package/dist/chunks/multiview-CL1WfJKt.js +295 -0
- package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
- package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
- package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
- package/dist/chunks/{player-DV4Hf5Cw.js → player-B7mYS--8.js} +1580 -1284
- package/dist/chunks/player-B7mYS--8.js.map +1 -0
- package/dist/chunks/{playlist-DJsdK6xm.js → playlist-BkhIOfCy.js} +2 -2
- package/dist/chunks/{playlist-DJsdK6xm.js.map → playlist-BkhIOfCy.js.map} +1 -1
- package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
- package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
- package/dist/chunks/{pluginHost-GxNfyP5E.js → pluginHost-CXqkjNV1.js} +2 -2
- package/dist/chunks/{pluginHost-GxNfyP5E.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
- package/dist/chunks/redirectScreen-DgmjFVJH.js +251 -0
- package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
- package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
- package/dist/chunks/{rewardedUnlock-jFOdzfSq.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
- package/dist/chunks/segments-CuQQEIAX.js +66 -0
- package/dist/chunks/segments-CuQQEIAX.js.map +1 -0
- package/dist/chunks/share-BdqQ8sGE.js +216 -0
- package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
- package/dist/chunks/{skipSegments-vJMhdiJn.js → skipSegments-BbepQ4Y6.js} +2 -2
- package/dist/chunks/{skipSegments-vJMhdiJn.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
- package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
- package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-BoxVY--_.js → spriteThumbnails-BYg-DHx4.js} +28 -28
- package/dist/chunks/spriteThumbnails-BYg-DHx4.js.map +1 -0
- package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
- package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
- package/dist/chunks/{story-BRkhSDhR.js → story-DcBG6jUg.js} +2 -2
- package/dist/chunks/{story-BRkhSDhR.js.map → story-DcBG6jUg.js.map} +1 -1
- package/dist/chunks/transcript-CHPQ6S6E.js +206 -0
- package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
- package/dist/controls/ContextMenu.d.ts +1 -0
- package/dist/controls/ContextMenu.d.ts.map +1 -1
- package/dist/controls/ControlBar.d.ts +6 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +5 -2
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +2 -1
- 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 +3 -3
- package/dist/i18n/index.d.ts +9 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/locales/en.d.ts +2 -2
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts +2 -2
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +52 -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/ad-triggers/AdTriggers.d.ts +5 -0
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
- package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
- package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
- package/dist/plugins/audio-description/index.d.ts +6 -0
- package/dist/plugins/audio-description/index.d.ts.map +1 -0
- package/dist/plugins/audio-description/strings.d.ts +8 -0
- package/dist/plugins/audio-description/strings.d.ts.map +1 -0
- package/dist/plugins/cast/index.d.ts.map +1 -1
- package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
- package/dist/plugins/doc-pip/index.d.ts +5 -0
- package/dist/plugins/doc-pip/index.d.ts.map +1 -0
- package/dist/plugins/doc-pip/strings.d.ts +8 -0
- package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
- package/dist/plugins/heatmap/Heatmap.d.ts +44 -0
- package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
- package/dist/plugins/heatmap/index.d.ts +6 -0
- package/dist/plugins/heatmap/index.d.ts.map +1 -0
- package/dist/plugins/heatmap/strings.d.ts +8 -0
- package/dist/plugins/heatmap/strings.d.ts.map +1 -0
- package/dist/plugins/history/index.d.ts.map +1 -1
- package/dist/plugins/interactive/Interactive.d.ts +45 -0
- package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
- package/dist/plugins/interactive/index.d.ts +6 -0
- package/dist/plugins/interactive/index.d.ts.map +1 -0
- package/dist/plugins/interactive/strings.d.ts +8 -0
- package/dist/plugins/interactive/strings.d.ts.map +1 -0
- package/dist/plugins/markers/MarkProgress.d.ts +3 -1
- package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
- package/dist/plugins/multiview/Multiview.d.ts +92 -0
- package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
- package/dist/plugins/multiview/index.d.ts +6 -0
- package/dist/plugins/multiview/index.d.ts.map +1 -0
- package/dist/plugins/multiview/strings.d.ts +8 -0
- package/dist/plugins/multiview/strings.d.ts.map +1 -0
- package/dist/plugins/pause-ad/index.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/strings.d.ts +8 -0
- package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
- package/dist/plugins/rewarded/index.d.ts.map +1 -1
- package/dist/plugins/segments/Segments.d.ts +1 -0
- package/dist/plugins/segments/Segments.d.ts.map +1 -1
- package/dist/plugins/share/Share.d.ts +45 -0
- package/dist/plugins/share/Share.d.ts.map +1 -0
- package/dist/plugins/share/index.d.ts +6 -0
- package/dist/plugins/share/index.d.ts.map +1 -0
- package/dist/plugins/share/strings.d.ts +8 -0
- package/dist/plugins/share/strings.d.ts.map +1 -0
- package/dist/plugins/skip-segments/index.d.ts.map +1 -1
- package/dist/plugins/sponsorship/index.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +1 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/plugins/sticky/StickyManager.d.ts +2 -0
- package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
- package/dist/plugins/transcript/Transcript.d.ts +65 -0
- package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
- package/dist/plugins/transcript/index.d.ts +6 -0
- package/dist/plugins/transcript/index.d.ts.map +1 -0
- package/dist/plugins/transcript/strings.d.ts +8 -0
- package/dist/plugins/transcript/strings.d.ts.map +1 -0
- package/dist/subtitles/attachTracks.d.ts +6 -0
- package/dist/subtitles/attachTracks.d.ts.map +1 -1
- package/dist/types/index.d.ts +257 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/plugin-style.d.ts +5 -0
- package/dist/utils/plugin-style.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
- package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
- package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
- package/dist/chunks/markers-Dr4-CCxE.js.map +0 -1
- package/dist/chunks/player-DV4Hf5Cw.js.map +0 -1
- package/dist/chunks/redirectScreen-BT_26-5g.js +0 -208
- package/dist/chunks/redirectScreen-BT_26-5g.js.map +0 -1
- package/dist/chunks/rewardedUnlock-jFOdzfSq.js +0 -264
- package/dist/chunks/segments--hl_QVrI.js +0 -63
- package/dist/chunks/segments--hl_QVrI.js.map +0 -1
- package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
- package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +0 -1
- package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewardedUnlock-jFOdzfSq.js","sources":["../../src/plugins/rewarded/gpt.ts","../../src/plugins/rewarded/RewardedUnlock.ts","../../src/plugins/rewarded/index.ts"],"sourcesContent":["import type { RewardedResult } from '../../types';\n\n/** Google Publisher Tag'in kullanılan yüzeyi (minimal tipler). */\ninterface GptSlot {\n addService(service: unknown): GptSlot;\n}\ninterface GptEvent {\n slot: GptSlot;\n isEmpty?: boolean;\n makeRewardedVisible?: () => boolean | void;\n}\ninterface GptPubAds {\n addEventListener(type: string, listener: (e: GptEvent) => void): void;\n removeEventListener?(type: string, listener: (e: GptEvent) => void): void;\n}\ninterface GoogleTag {\n cmd: Array<() => void> | { push(fn: () => void): void };\n apiReady?: boolean;\n enums: { OutOfPageFormat: { REWARDED: unknown } };\n pubads(): GptPubAds;\n defineOutOfPageSlot(path: string, format: unknown): GptSlot | null;\n enableServices(): void;\n display(slot: GptSlot): void;\n destroySlots(slots: GptSlot[]): void;\n}\n\n/** Google'ın güncel örneklerindeki adres (eski securepagead2 adresi bazı ağlarda sertifika hatası veriyordu). */\nconst GPT_SRC = 'https://securepubads.g.doubleclick.net/tag/js/gpt.js';\nlet gptLoading: Promise<void> | null = null;\n\n/** GPT sayfada yoksa yükler; sayfa GPT'yi (hangi adresten olursa olsun) zaten yüklüyorsa onu paylaşır. */\nfunction loadGpt(): Promise<void> {\n const w = window as unknown as { googletag?: Partial<GoogleTag> };\n w.googletag ??= { cmd: [] } as Partial<GoogleTag>;\n w.googletag.cmd ??= [];\n if (w.googletag.apiReady || document.querySelector('script[src*=\"/tag/js/gpt.js\"]')) return Promise.resolve();\n gptLoading ??= new Promise<void>((resolve, reject) => {\n const s = document.createElement('script');\n s.async = true;\n s.src = GPT_SRC;\n s.onload = () => resolve();\n s.onerror = () => {\n gptLoading = null;\n s.remove();\n reject(new Error('gpt.js could not be loaded (ad blocker / network / certificate)'));\n };\n document.head.appendChild(s);\n });\n return gptLoading;\n}\n\n/**\n * GPT web rewarded akışı (Google'ın örneğiyle aynı): slot tanımla → display → `rewardedSlotReady` gelince göster →\n * `rewardedSlotGranted` ödül → `rewardedSlotClosed` kapandı → slotu yok et. Kullanıcı onayı bu fonksiyon çağrılmadan\n * ÖNCE alınmış olmalı (player'ın onay penceresi).\n *\n * `timeoutMs` betiğin yüklenmesi DAHİL en baştan sayar: GPT hiç yüklenemez ya da çalışmazsa (engelleyici, ağ,\n * sertifika) da 'nofill' döner — bekleme ekranı asla takılı kalmaz. `signal` iptal edilirse (kullanıcı \"Vazgeç\") slot\n * temizlenip 'closed' döner. Reklam görünür olduktan sonra zaman aşımı işlemez; kapanışı GPT bildirir.\n */\nexport function showGptRewarded(adUnitPath: string, timeoutMs: number, signal?: AbortSignal): Promise<RewardedResult> {\n return new Promise<RewardedResult>((resolve) => {\n let done = false;\n let granted = false;\n let videoCompleted = false;\n let slot: GptSlot | null = null;\n let googletag: GoogleTag | null = null;\n const listeners: Array<[string, (e: GptEvent) => void]> = [];\n\n const finish = (result: RewardedResult): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n if (googletag) {\n const pubads = googletag.pubads();\n for (const [type, fn] of listeners) pubads.removeEventListener?.(type, fn);\n if (slot) {\n try {\n googletag.destroySlots([slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n }\n resolve(result);\n };\n const onAbort = (): void => finish('closed');\n const timer = setTimeout(() => finish('nofill'), timeoutMs);\n if (signal?.aborted) {\n finish('closed');\n return;\n }\n signal?.addEventListener('abort', onAbort);\n\n loadGpt()\n .then(() => {\n if (done) return;\n const gt = (window as unknown as { googletag: GoogleTag }).googletag;\n gt.cmd.push(() => {\n if (done) return;\n googletag = gt;\n slot = gt.defineOutOfPageSlot(adUnitPath, gt.enums.OutOfPageFormat.REWARDED);\n // null: sayfa formatı desteklemiyor (ör. mobil uyumlu viewport yok) — reklam yok sayılır.\n if (!slot) {\n finish('nofill');\n return;\n }\n slot.addService(gt.pubads());\n const pubads = gt.pubads();\n const on = (type: string, fn: (e: GptEvent) => void): void => {\n listeners.push([type, fn]);\n pubads.addEventListener(type, fn);\n };\n on('rewardedSlotReady', (e) => {\n if (e.slot !== slot || done) return;\n // Reklam hazır: artık bekleme yok — kapanışı GPT bildirecek.\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n e.makeRewardedVisible?.();\n });\n // Google: \"You need to close out ads rather than relying on GPT to do so.\" — ödül verilip video reklam\n // sonuna kadar oynayınca reklam player tarafından kapatılır (slot yok edilir); kullanıcı X'e basmak\n // zorunda kalmaz. Ödülü video bitmeden veren reklamlarda kapanış video bitince olur.\n on('rewardedSlotGranted', (e) => {\n if (e.slot !== slot) return;\n granted = true;\n if (videoCompleted) finish('granted');\n });\n on('rewardedSlotVideoCompleted', (e) => {\n if (e.slot !== slot) return;\n videoCompleted = true;\n if (granted) finish('granted');\n });\n on('rewardedSlotClosed', (e) => {\n if (e.slot === slot) finish(granted ? 'granted' : 'closed');\n });\n on('slotRenderEnded', (e) => {\n if (e.slot === slot && e.isEmpty) finish('nofill');\n });\n gt.enableServices();\n gt.display(slot);\n });\n })\n .catch(() => finish('nofill'));\n });\n}\n","import type { RewardedResult, RewardedUnlockOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { LOCK_SVG } from '../../controls/SettingsMenu';\nimport { showGptRewarded } from './gpt';\n\nexport interface RewardedUnlockContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Onay penceresinin ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n /** Buton kontrollerle birlikte görünüp gizlensin diye kontrol katmanına eklenir. */\n chromeEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; details?: Record<string, string | number | boolean | undefined> }): void;\n play(): void;\n exitFullscreen(): void;\n /** Kilitli kalitelerin en yükseği (ör. \"1080p\") — yoksa null (buton gizlenir). */\n lockedQualityLabel(): string | null;\n /** İçeriğin kimliği (kaynak listesi) — kalite değişince değişmez, başka video yüklenince değişir. */\n contentKey(): string;\n /** Kilit açıldı / geri geldi: player menüleri yeniden kurar; `upgrade` → en iyi kaliteye geç. */\n onLockChange(upgrade: boolean): void;\n}\n\nconst DEFAULT_MAX_FREE_HEIGHT = 480;\nconst DEFAULT_STORAGE_KEY = 'hope-rewarded-unlock';\nconst DEFAULT_GPT_TIMEOUT_MS = 8000;\nconst TOAST_MS = 2600;\n\ntype Phase = 'idle' | 'prompt' | 'loading' | 'nofill';\n\n/**\n * Ödüllü reklamla kalite kilidi. Akış (Google'ın ödüllü reklam politikasına göre): kullanıcı kilitli bir kaliteye ya da\n * \"Yüksek kaliteyi aç\" butonuna dokunur → ödülü açıkça yazan onay penceresi → yalnızca \"Reklamı izle\" ile reklam istenir\n * → ödül verildiyse kilit açılır. Vazgeçmek videoyu izlemeyi engellemez (düşük kalitede devam eder).\n */\n/** Diyalog başlık id'leri — aynı sayfada birden çok player olabilir. */\nlet dialogSeq = 0;\n\nexport class RewardedUnlock {\n private options: RewardedUnlockOptions;\n private readonly button: HTMLButtonElement;\n private dialog: HTMLDivElement | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private phase: Phase = 'idle';\n /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */\n private videoUnlockedKey: string | null = null;\n private lastKey = '';\n\n constructor(\n private readonly ctx: RewardedUnlockContext,\n options: RewardedUnlockOptions\n ) {\n this.options = options;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-rw-button';\n btn.setAttribute('part', 'rewarded-button');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.requestUnlock();\n });\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n ctx.chromeEl.appendChild(btn);\n this.button = btn;\n ctx.videoEl.addEventListener('loadstart', this.onSourceChange);\n this.refreshLabels();\n this.onQualitiesChanged();\n }\n\n update(options: RewardedUnlockOptions): void {\n const before = this.unlocked;\n this.options = options;\n if (before !== this.unlocked) this.ctx.onLockChange(false);\n this.onQualitiesChanged();\n }\n\n // ── Kilit durumu ────────────────────────────────────────────────────\n\n private get maxFreeHeight(): number {\n const h = this.options.maxFreeHeight;\n return typeof h === 'number' && h > 0 ? h : DEFAULT_MAX_FREE_HEIGHT;\n }\n\n private get storageKey(): string {\n return this.options.storageKey || DEFAULT_STORAGE_KEY;\n }\n\n private get unlockFor(): 'video' | 'session' | number {\n const u = this.options.unlockFor;\n return typeof u === 'number' && u > 0 ? u : u === 'video' ? 'video' : 'session';\n }\n\n get unlocked(): boolean {\n const mode = this.unlockFor;\n if (mode === 'video') return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();\n try {\n if (mode === 'session') return sessionStorage.getItem(this.storageKey) === '1';\n const until = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(until) && until > Date.now();\n } catch {\n return false; // depolama kapalı (gizli mod vb.)\n }\n }\n\n private grant(): void {\n const mode = this.unlockFor;\n if (mode === 'video') this.videoUnlockedKey = this.ctx.contentKey();\n try {\n if (mode === 'session') sessionStorage.setItem(this.storageKey, '1');\n else if (typeof mode === 'number') localStorage.setItem(this.storageKey, String(Date.now() + mode * 60_000));\n } catch {\n // Depolama yoksa yalnızca bu video için açık kalır.\n this.videoUnlockedKey = this.ctx.contentKey();\n }\n }\n\n /** Player için: bu yükseklikteki kalite kilitli mi? */\n isLocked(height: number | null): boolean {\n if (this.unlocked) return false;\n return height !== null && height > this.maxFreeHeight;\n }\n\n /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */\n private readonly onSourceChange = (): void => {\n const key = this.ctx.contentKey();\n if (key === this.lastKey) return;\n this.lastKey = key;\n this.onQualitiesChanged();\n };\n\n /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */\n onQualitiesChanged(): void {\n const label = this.ctx.lockedQualityLabel();\n const show = this.options.button !== false && !!label && !this.unlocked;\n this.button.hidden = !show;\n if (!show) return;\n const text = this.fill(this.ctx.i18n.rewardedButton, label!);\n this.button.innerHTML = `${LOCK_SVG}<span>${escapeHtml(text)}</span>`;\n // Erişilebilir ad görünen metinle aynı (sesli komutla \"720p kilidini aç\" dendiğinde bulunabilsin).\n this.button.setAttribute('aria-label', text);\n }\n\n // ── Akış ────────────────────────────────────────────────────────────\n\n /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */\n requestUnlock(): void {\n if (this.unlocked || this.phase !== 'idle') return;\n const label = this.ctx.lockedQualityLabel() ?? 'HD';\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedprompt', { detail: { quality: label } }));\n this.showDialog('prompt', label);\n }\n\n private async watch(label: string): Promise<void> {\n const v = this.ctx.videoEl;\n const wasPlaying = !v.paused;\n v.pause();\n // GPT reklamı sayfanın kendi katmanında açılır — player tam ekrandaysa görünmez.\n this.ctx.exitFullscreen();\n this.abort = new AbortController();\n const signal = this.abort.signal;\n this.showDialog('loading', label);\n let result: RewardedResult;\n try {\n result = await this.runProvider(signal);\n } catch (err) {\n this.ctx.log({ message: `Rewarded ad failed: ${String(err)}` });\n result = 'nofill';\n }\n this.abort = null;\n // Kullanıcı hazırlanırken \"Vazgeç\" dedi — sonuç ne olursa olsun ödül yok, video devam eder.\n if (signal.aborted) {\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, cancelled: true } }));\n if (wasPlaying) this.ctx.play();\n return;\n }\n // Reklam yok / boş / hata: kusur kullanıcıda değil — varsayılan olarak kilit yine de açılır (grantOnNoFill: false kapatır).\n let noAd = false;\n if (result === 'nofill' && this.options.grantOnNoFill !== false) {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: true } }));\n result = 'granted';\n noAd = true;\n }\n if (result === 'granted') {\n this.grant();\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedgranted', { detail: { quality: label, noAd } }));\n this.ctx.onLockChange(true);\n this.onQualitiesChanged();\n this.showToast(this.fill(noAd ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, label));\n if (wasPlaying) this.ctx.play();\n return;\n }\n if (result === 'nofill') {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / unsupported page / timeout)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: false } }));\n this.showDialog('nofill', label);\n this.resumeAfterDialog = wasPlaying;\n return;\n }\n // Kullanıcı reklamı ödül kazanmadan kapattı — video kaldığı kalitede devam eder.\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false } }));\n if (wasPlaying) this.ctx.play();\n }\n\n private resumeAfterDialog = false;\n /** Reklam hazırlanırken \"Vazgeç\" — sağlayıcıya iletilir (GPT slotu temizlenir). */\n private abort: AbortController | null = null;\n\n private async runProvider(signal: AbortSignal): Promise<RewardedResult> {\n const p = this.options.provider;\n if (p?.type === 'gpt') return showGptRewarded(p.adUnitPath, p.timeoutMs ?? DEFAULT_GPT_TIMEOUT_MS, signal);\n if (p?.type === 'custom') {\n // İptal edilirse kendi reklam sisteminizin sonucu beklenmez (sinyali kendi tarafınızda da dinleyebilirsiniz).\n const aborted = new Promise<RewardedResult>((resolve) => signal.addEventListener('abort', () => resolve('closed'), { once: true }));\n const r = await Promise.race([p.show({ signal }), aborted]);\n return r === true ? 'granted' : r === false ? 'closed' : r;\n }\n throw new Error('rewardedUnlock.provider is missing');\n }\n\n // ── Arayüz ─────────────────────────────────────────────────────────\n\n private fill(template: string, quality: string): string {\n const mode = this.unlockFor;\n const i = this.ctx.i18n;\n const duration =\n mode === 'video' ? i.rewardedForVideo : mode === 'session' ? i.rewardedForSession : i.rewardedForMinutes.replace('{n}', String(mode));\n return template.replace('{quality}', quality).replace('{duration}', duration);\n }\n\n private showDialog(phase: Exclude<Phase, 'idle'>, label: string): void {\n this.phase = phase;\n const i = this.ctx.i18n;\n if (!this.dialog) {\n const d = document.createElement('div');\n d.className = 'hp-rw-dialog';\n d.setAttribute('part', 'rewarded-dialog');\n d.setAttribute('role', 'dialog');\n d.setAttribute('aria-modal', 'true');\n for (const t of ['click', 'pointerdown', 'dblclick'] as const) d.addEventListener(t, (e) => e.stopPropagation());\n d.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key !== 'Escape') return;\n if (this.phase === 'loading') this.abort?.abort();\n else this.dismiss();\n });\n this.ctx.overlayEl.appendChild(d);\n this.dialog = d;\n }\n const d = this.dialog;\n d.setAttribute('data-phase', phase);\n d.innerHTML = '';\n const card = document.createElement('div');\n card.className = 'hp-rw-card';\n const icon = document.createElement('div');\n icon.className = 'hp-rw-icon';\n icon.innerHTML = LOCK_SVG;\n const title = document.createElement('div');\n title.className = 'hp-rw-title';\n // Diyaloğun erişilebilir adı başlığı (ekran okuyucu \"720p kilidini aç\" diye okur).\n title.id = `hp-rw-title-${++dialogSeq}`;\n d.setAttribute('aria-labelledby', title.id);\n const text = document.createElement('div');\n text.className = 'hp-rw-text';\n const actions = document.createElement('div');\n actions.className = 'hp-rw-actions';\n card.append(icon, title, text, actions);\n d.appendChild(card);\n\n const button = (labelText: string, primary: boolean, onClick: () => void): HTMLButtonElement => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = primary ? 'hp-rw-btn hp-rw-btn-primary' : 'hp-rw-btn';\n b.textContent = labelText;\n b.addEventListener('click', onClick);\n actions.appendChild(b);\n return b;\n };\n\n if (phase === 'prompt') {\n title.textContent = this.fill(i.rewardedTitle, label);\n // Ödül, reklamdan ÖNCE açıkça yazılır (politika şartı).\n text.textContent = this.fill(i.rewardedBody, label);\n button(i.rewardedDecline, false, () => this.dismiss());\n button(i.rewardedWatch, true, () => void this.watch(label)).focus();\n } else if (phase === 'loading') {\n title.textContent = i.rewardedLoading;\n const spin = document.createElement('div');\n spin.className = 'hp-rw-spinner';\n text.appendChild(spin);\n // Hazırlanma ne kadar sürerse sürsün kullanıcı takılı kalmaz.\n button(i.rewardedDecline, false, () => this.abort?.abort());\n } else {\n title.textContent = this.fill(i.rewardedTitle, label);\n text.textContent = i.rewardedNoFill;\n button(i.rewardedOk, true, () => this.dismiss()).focus();\n }\n }\n\n private dismiss(): void {\n const wasNoFill = this.phase === 'nofill';\n this.closeDialog();\n if (!wasNoFill) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, declined: true } }));\n if (this.resumeAfterDialog) this.ctx.play();\n this.resumeAfterDialog = false;\n }\n\n private closeDialog(): void {\n this.phase = 'idle';\n this.dialog?.remove();\n this.dialog = null;\n }\n\n private showToast(message: string): void {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n const t = document.createElement('div');\n t.className = 'hp-rw-toast';\n t.setAttribute('part', 'rewarded-toast');\n t.setAttribute('role', 'status');\n t.textContent = message;\n this.ctx.overlayEl.appendChild(t);\n this.toast = t;\n this.toastTimer = setTimeout(() => {\n this.toast?.remove();\n this.toast = null;\n }, TOAST_MS);\n }\n\n refreshLabels(): void {\n this.onQualitiesChanged();\n }\n\n destroy(): void {\n this.abort?.abort();\n this.ctx.videoEl.removeEventListener('loadstart', this.onSourceChange);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n this.closeDialog();\n this.button.remove();\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[c]!);\n}\n","import { RewardedUnlock, type RewardedUnlockContext } from './RewardedUnlock';\nimport type { RewardedUnlockOptions } from '../../types';\n\n/** Ödüllü reklamla kalite kilidini kurar. */\nexport function installRewardedUnlock(ctx: RewardedUnlockContext, options: RewardedUnlockOptions): RewardedUnlock {\n return new RewardedUnlock(ctx, options);\n}\n\nexport { RewardedUnlock };\nexport type { RewardedUnlockContext };\n"],"names":["GPT_SRC","gptLoading","loadGpt","w","_a","resolve","reject","showGptRewarded","adUnitPath","timeoutMs","signal","done","granted","videoCompleted","slot","googletag","listeners","finish","result","timer","onAbort","pubads","type","fn","gt","on","e","DEFAULT_MAX_FREE_HEIGHT","DEFAULT_STORAGE_KEY","DEFAULT_GPT_TIMEOUT_MS","TOAST_MS","dialogSeq","RewardedUnlock","ctx","options","__publicField","key","btn","before","h","u","mode","until","height","label","show","text","LOCK_SVG","escapeHtml","v","wasPlaying","err","noAd","p","aborted","r","template","quality","i","duration","phase","d","t","card","icon","title","actions","button","labelText","primary","onClick","b","spin","wasNoFill","message","_b","s","c","installRewardedUnlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rewardedUnlock-BL97P5ht.js","sources":["../../src/plugins/rewarded/gpt.ts","../../src/plugins/rewarded/RewardedUnlock.ts","../../src/plugins/rewarded/index.ts"],"sourcesContent":["import type { RewardedResult } from '../../types';\n\n/** Google Publisher Tag'in kullanılan yüzeyi (minimal tipler). */\ninterface GptSlot {\n addService(service: unknown): GptSlot;\n}\ninterface GptEvent {\n slot: GptSlot;\n isEmpty?: boolean;\n makeRewardedVisible?: () => boolean | void;\n}\ninterface GptPubAds {\n addEventListener(type: string, listener: (e: GptEvent) => void): void;\n removeEventListener?(type: string, listener: (e: GptEvent) => void): void;\n}\ninterface GoogleTag {\n cmd: Array<() => void> | { push(fn: () => void): void };\n apiReady?: boolean;\n enums: { OutOfPageFormat: { REWARDED: unknown } };\n pubads(): GptPubAds;\n defineOutOfPageSlot(path: string, format: unknown): GptSlot | null;\n enableServices(): void;\n display(slot: GptSlot): void;\n destroySlots(slots: GptSlot[]): void;\n}\n\n/** Google'ın güncel örneklerindeki adres (eski securepagead2 adresi bazı ağlarda sertifika hatası veriyordu). */\nconst GPT_SRC = 'https://securepubads.g.doubleclick.net/tag/js/gpt.js';\nlet gptLoading: Promise<void> | null = null;\n\n/** GPT sayfada yoksa yükler; sayfa GPT'yi (hangi adresten olursa olsun) zaten yüklüyorsa onu paylaşır. */\nfunction loadGpt(): Promise<void> {\n const w = window as unknown as { googletag?: Partial<GoogleTag> };\n w.googletag ??= { cmd: [] } as Partial<GoogleTag>;\n w.googletag.cmd ??= [];\n if (w.googletag.apiReady || document.querySelector('script[src*=\"/tag/js/gpt.js\"]')) return Promise.resolve();\n gptLoading ??= new Promise<void>((resolve, reject) => {\n const s = document.createElement('script');\n s.async = true;\n s.src = GPT_SRC;\n s.onload = () => resolve();\n s.onerror = () => {\n gptLoading = null;\n s.remove();\n reject(new Error('gpt.js could not be loaded (ad blocker / network / certificate)'));\n };\n document.head.appendChild(s);\n });\n return gptLoading;\n}\n\n/**\n * GPT web rewarded akışı (Google'ın örneğiyle aynı): slot tanımla → display → `rewardedSlotReady` gelince göster →\n * `rewardedSlotGranted` ödül → `rewardedSlotClosed` kapandı → slotu yok et. Kullanıcı onayı bu fonksiyon çağrılmadan\n * ÖNCE alınmış olmalı (player'ın onay penceresi).\n *\n * `timeoutMs` betiğin yüklenmesi DAHİL en baştan sayar: GPT hiç yüklenemez ya da çalışmazsa (engelleyici, ağ,\n * sertifika) da 'nofill' döner — bekleme ekranı asla takılı kalmaz. `signal` iptal edilirse (kullanıcı \"Vazgeç\") slot\n * temizlenip 'closed' döner. Reklam görünür olduktan sonra zaman aşımı işlemez; kapanışı GPT bildirir.\n */\nexport function showGptRewarded(adUnitPath: string, timeoutMs: number, signal?: AbortSignal): Promise<RewardedResult> {\n return new Promise<RewardedResult>((resolve) => {\n let done = false;\n let granted = false;\n let videoCompleted = false;\n let slot: GptSlot | null = null;\n let googletag: GoogleTag | null = null;\n const listeners: Array<[string, (e: GptEvent) => void]> = [];\n\n const finish = (result: RewardedResult): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n if (googletag) {\n const pubads = googletag.pubads();\n for (const [type, fn] of listeners) pubads.removeEventListener?.(type, fn);\n if (slot) {\n try {\n googletag.destroySlots([slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n }\n resolve(result);\n };\n const onAbort = (): void => finish('closed');\n const timer = setTimeout(() => finish('nofill'), timeoutMs);\n if (signal?.aborted) {\n finish('closed');\n return;\n }\n signal?.addEventListener('abort', onAbort);\n\n loadGpt()\n .then(() => {\n if (done) return;\n const gt = (window as unknown as { googletag: GoogleTag }).googletag;\n gt.cmd.push(() => {\n if (done) return;\n googletag = gt;\n slot = gt.defineOutOfPageSlot(adUnitPath, gt.enums.OutOfPageFormat.REWARDED);\n // null: sayfa formatı desteklemiyor (ör. mobil uyumlu viewport yok) — reklam yok sayılır.\n if (!slot) {\n finish('nofill');\n return;\n }\n slot.addService(gt.pubads());\n const pubads = gt.pubads();\n const on = (type: string, fn: (e: GptEvent) => void): void => {\n listeners.push([type, fn]);\n pubads.addEventListener(type, fn);\n };\n on('rewardedSlotReady', (e) => {\n if (e.slot !== slot || done) return;\n // Reklam hazır: artık bekleme yok — kapanışı GPT bildirecek.\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n e.makeRewardedVisible?.();\n });\n // Google: \"You need to close out ads rather than relying on GPT to do so.\" — ödül verilip video reklam\n // sonuna kadar oynayınca reklam player tarafından kapatılır (slot yok edilir); kullanıcı X'e basmak\n // zorunda kalmaz. Ödülü video bitmeden veren reklamlarda kapanış video bitince olur.\n on('rewardedSlotGranted', (e) => {\n if (e.slot !== slot) return;\n granted = true;\n if (videoCompleted) finish('granted');\n });\n on('rewardedSlotVideoCompleted', (e) => {\n if (e.slot !== slot) return;\n videoCompleted = true;\n if (granted) finish('granted');\n });\n on('rewardedSlotClosed', (e) => {\n if (e.slot === slot) finish(granted ? 'granted' : 'closed');\n });\n on('slotRenderEnded', (e) => {\n if (e.slot === slot && e.isEmpty) finish('nofill');\n });\n gt.enableServices();\n gt.display(slot);\n });\n })\n .catch(() => finish('nofill'));\n });\n}\n","import type { RewardedResult, RewardedUnlockOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { LOCK_SVG } from '../../controls/SettingsMenu';\nimport { showGptRewarded } from './gpt';\n\nexport interface RewardedUnlockContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Onay penceresinin ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n /** Buton kontrollerle birlikte görünüp gizlensin diye kontrol katmanına eklenir. */\n chromeEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; details?: Record<string, string | number | boolean | undefined> }): void;\n play(): void;\n exitFullscreen(): void;\n /** Kilitli kalitelerin en yükseği (ör. \"1080p\") — yoksa null (buton gizlenir). */\n lockedQualityLabel(): string | null;\n /** İçeriğin kimliği (kaynak listesi) — kalite değişince değişmez, başka video yüklenince değişir. */\n contentKey(): string;\n /** Kilit açıldı / geri geldi: player menüleri yeniden kurar; `upgrade` → en iyi kaliteye geç. */\n onLockChange(upgrade: boolean): void;\n}\n\nconst DEFAULT_MAX_FREE_HEIGHT = 480;\nconst DEFAULT_STORAGE_KEY = 'hope-rewarded-unlock';\nconst DEFAULT_GPT_TIMEOUT_MS = 8000;\nconst TOAST_MS = 2600;\n\ntype Phase = 'idle' | 'prompt' | 'loading' | 'nofill';\n\n/**\n * Ödüllü reklamla kalite kilidi. Akış (Google'ın ödüllü reklam politikasına göre): kullanıcı kilitli bir kaliteye ya da\n * \"Yüksek kaliteyi aç\" butonuna dokunur → ödülü açıkça yazan onay penceresi → yalnızca \"Reklamı izle\" ile reklam istenir\n * → ödül verildiyse kilit açılır. Vazgeçmek videoyu izlemeyi engellemez (düşük kalitede devam eder).\n */\n/** Diyalog başlık id'leri — aynı sayfada birden çok player olabilir. */\nlet dialogSeq = 0;\n\nexport class RewardedUnlock {\n private options: RewardedUnlockOptions;\n private readonly button: HTMLButtonElement;\n private dialog: HTMLDivElement | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private phase: Phase = 'idle';\n /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */\n private videoUnlockedKey: string | null = null;\n private lastKey = '';\n\n constructor(\n private readonly ctx: RewardedUnlockContext,\n options: RewardedUnlockOptions\n ) {\n this.options = options;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-rw-button';\n btn.setAttribute('part', 'rewarded-button');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.requestUnlock();\n });\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n ctx.chromeEl.appendChild(btn);\n this.button = btn;\n ctx.videoEl.addEventListener('loadstart', this.onSourceChange);\n this.refreshLabels();\n this.onQualitiesChanged();\n }\n\n update(options: RewardedUnlockOptions): void {\n const before = this.unlocked;\n this.options = options;\n if (before !== this.unlocked) this.ctx.onLockChange(false);\n this.onQualitiesChanged();\n }\n\n // ── Kilit durumu ────────────────────────────────────────────────────\n\n private get maxFreeHeight(): number {\n const h = this.options.maxFreeHeight;\n return typeof h === 'number' && h > 0 ? h : DEFAULT_MAX_FREE_HEIGHT;\n }\n\n private get storageKey(): string {\n return this.options.storageKey || DEFAULT_STORAGE_KEY;\n }\n\n private get unlockFor(): 'video' | 'session' | number {\n const u = this.options.unlockFor;\n return typeof u === 'number' && u > 0 ? u : u === 'video' ? 'video' : 'session';\n }\n\n get unlocked(): boolean {\n const mode = this.unlockFor;\n if (mode === 'video') return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();\n try {\n if (mode === 'session') return sessionStorage.getItem(this.storageKey) === '1';\n const until = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(until) && until > Date.now();\n } catch {\n return false; // depolama kapalı (gizli mod vb.)\n }\n }\n\n private grant(): void {\n const mode = this.unlockFor;\n if (mode === 'video') this.videoUnlockedKey = this.ctx.contentKey();\n try {\n if (mode === 'session') sessionStorage.setItem(this.storageKey, '1');\n else if (typeof mode === 'number') localStorage.setItem(this.storageKey, String(Date.now() + mode * 60_000));\n } catch {\n // Depolama yoksa yalnızca bu video için açık kalır.\n this.videoUnlockedKey = this.ctx.contentKey();\n }\n }\n\n /** Player için: bu yükseklikteki kalite kilitli mi? */\n isLocked(height: number | null): boolean {\n if (this.unlocked) return false;\n return height !== null && height > this.maxFreeHeight;\n }\n\n /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */\n private readonly onSourceChange = (): void => {\n const key = this.ctx.contentKey();\n if (key === this.lastKey) return;\n this.lastKey = key;\n this.onQualitiesChanged();\n };\n\n /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */\n onQualitiesChanged(): void {\n const label = this.ctx.lockedQualityLabel();\n const show = this.options.button !== false && !!label && !this.unlocked;\n this.button.hidden = !show;\n if (!show) return;\n const text = this.fill(this.ctx.i18n.rewardedButton, label!);\n this.button.innerHTML = `${LOCK_SVG}<span>${escapeHtml(text)}</span>`;\n // Erişilebilir ad görünen metinle aynı (sesli komutla \"720p kilidini aç\" dendiğinde bulunabilsin).\n this.button.setAttribute('aria-label', text);\n }\n\n // ── Akış ────────────────────────────────────────────────────────────\n\n /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */\n requestUnlock(): void {\n if (this.unlocked || this.phase !== 'idle') return;\n const label = this.ctx.lockedQualityLabel() ?? 'HD';\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedprompt', { detail: { quality: label } }));\n this.showDialog('prompt', label);\n }\n\n private async watch(label: string): Promise<void> {\n const v = this.ctx.videoEl;\n const wasPlaying = !v.paused;\n v.pause();\n // GPT reklamı sayfanın kendi katmanında açılır — player tam ekrandaysa görünmez.\n this.ctx.exitFullscreen();\n this.abort = new AbortController();\n const signal = this.abort.signal;\n this.showDialog('loading', label);\n let result: RewardedResult;\n try {\n result = await this.runProvider(signal);\n } catch (err) {\n this.ctx.log({ message: `Rewarded ad failed: ${String(err)}` });\n result = 'nofill';\n }\n this.abort = null;\n // Kullanıcı hazırlanırken \"Vazgeç\" dedi — sonuç ne olursa olsun ödül yok, video devam eder.\n if (signal.aborted) {\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, cancelled: true } }));\n if (wasPlaying) this.ctx.play();\n return;\n }\n // Reklam yok / boş / hata: kusur kullanıcıda değil — varsayılan olarak kilit yine de açılır (grantOnNoFill: false kapatır).\n let noAd = false;\n if (result === 'nofill' && this.options.grantOnNoFill !== false) {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: true } }));\n result = 'granted';\n noAd = true;\n }\n if (result === 'granted') {\n this.grant();\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedgranted', { detail: { quality: label, noAd } }));\n this.ctx.onLockChange(true);\n this.onQualitiesChanged();\n this.showToast(this.fill(noAd ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, label));\n if (wasPlaying) this.ctx.play();\n return;\n }\n if (result === 'nofill') {\n this.ctx.log({ message: 'Rewarded ad: no ad available (no fill / unsupported page / timeout)' });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardednofill', { detail: { granted: false } }));\n this.showDialog('nofill', label);\n this.resumeAfterDialog = wasPlaying;\n return;\n }\n // Kullanıcı reklamı ödül kazanmadan kapattı — video kaldığı kalitede devam eder.\n this.closeDialog();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false } }));\n if (wasPlaying) this.ctx.play();\n }\n\n private resumeAfterDialog = false;\n /** Reklam hazırlanırken \"Vazgeç\" — sağlayıcıya iletilir (GPT slotu temizlenir). */\n private abort: AbortController | null = null;\n\n private async runProvider(signal: AbortSignal): Promise<RewardedResult> {\n const p = this.options.provider;\n if (p?.type === 'gpt') return showGptRewarded(p.adUnitPath, p.timeoutMs ?? DEFAULT_GPT_TIMEOUT_MS, signal);\n if (p?.type === 'custom') {\n // İptal edilirse kendi reklam sisteminizin sonucu beklenmez (sinyali kendi tarafınızda da dinleyebilirsiniz).\n const aborted = new Promise<RewardedResult>((resolve) => signal.addEventListener('abort', () => resolve('closed'), { once: true }));\n const r = await Promise.race([p.show({ signal }), aborted]);\n return r === true ? 'granted' : r === false ? 'closed' : r;\n }\n throw new Error('rewardedUnlock.provider is missing');\n }\n\n // ── Arayüz ─────────────────────────────────────────────────────────\n\n private fill(template: string, quality: string): string {\n const mode = this.unlockFor;\n const i = this.ctx.i18n;\n const duration =\n mode === 'video' ? i.rewardedForVideo : mode === 'session' ? i.rewardedForSession : i.rewardedForMinutes.replace('{n}', String(mode));\n return template.replace('{quality}', quality).replace('{duration}', duration);\n }\n\n private showDialog(phase: Exclude<Phase, 'idle'>, label: string): void {\n this.phase = phase;\n const i = this.ctx.i18n;\n if (!this.dialog) {\n const d = document.createElement('div');\n d.className = 'hp-rw-dialog';\n d.setAttribute('part', 'rewarded-dialog');\n d.setAttribute('role', 'dialog');\n d.setAttribute('aria-modal', 'true');\n for (const t of ['click', 'pointerdown', 'dblclick'] as const) d.addEventListener(t, (e) => e.stopPropagation());\n d.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key !== 'Escape') return;\n if (this.phase === 'loading') this.abort?.abort();\n else this.dismiss();\n });\n this.ctx.overlayEl.appendChild(d);\n this.dialog = d;\n }\n const d = this.dialog;\n d.setAttribute('data-phase', phase);\n d.innerHTML = '';\n const card = document.createElement('div');\n card.className = 'hp-rw-card';\n const icon = document.createElement('div');\n icon.className = 'hp-rw-icon';\n icon.innerHTML = LOCK_SVG;\n const title = document.createElement('div');\n title.className = 'hp-rw-title';\n // Diyaloğun erişilebilir adı başlığı (ekran okuyucu \"720p kilidini aç\" diye okur).\n title.id = `hp-rw-title-${++dialogSeq}`;\n d.setAttribute('aria-labelledby', title.id);\n const text = document.createElement('div');\n text.className = 'hp-rw-text';\n const actions = document.createElement('div');\n actions.className = 'hp-rw-actions';\n card.append(icon, title, text, actions);\n d.appendChild(card);\n\n const button = (labelText: string, primary: boolean, onClick: () => void): HTMLButtonElement => {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = primary ? 'hp-rw-btn hp-rw-btn-primary' : 'hp-rw-btn';\n b.textContent = labelText;\n b.addEventListener('click', onClick);\n actions.appendChild(b);\n return b;\n };\n\n if (phase === 'prompt') {\n title.textContent = this.fill(i.rewardedTitle, label);\n // Ödül, reklamdan ÖNCE açıkça yazılır (politika şartı).\n text.textContent = this.fill(i.rewardedBody, label);\n button(i.rewardedDecline, false, () => this.dismiss());\n button(i.rewardedWatch, true, () => void this.watch(label)).focus();\n } else if (phase === 'loading') {\n title.textContent = i.rewardedLoading;\n const spin = document.createElement('div');\n spin.className = 'hp-rw-spinner';\n text.appendChild(spin);\n // Hazırlanma ne kadar sürerse sürsün kullanıcı takılı kalmaz.\n button(i.rewardedDecline, false, () => this.abort?.abort());\n } else {\n title.textContent = this.fill(i.rewardedTitle, label);\n text.textContent = i.rewardedNoFill;\n button(i.rewardedOk, true, () => this.dismiss()).focus();\n }\n }\n\n private dismiss(): void {\n const wasNoFill = this.phase === 'nofill';\n this.closeDialog();\n if (!wasNoFill) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:rewardedclosed', { detail: { granted: false, declined: true } }));\n if (this.resumeAfterDialog) this.ctx.play();\n this.resumeAfterDialog = false;\n }\n\n private closeDialog(): void {\n this.phase = 'idle';\n this.dialog?.remove();\n this.dialog = null;\n }\n\n private showToast(message: string): void {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n const t = document.createElement('div');\n t.className = 'hp-rw-toast';\n t.setAttribute('part', 'rewarded-toast');\n t.setAttribute('role', 'status');\n t.textContent = message;\n this.ctx.overlayEl.appendChild(t);\n this.toast = t;\n this.toastTimer = setTimeout(() => {\n this.toast?.remove();\n this.toast = null;\n }, TOAST_MS);\n }\n\n refreshLabels(): void {\n this.onQualitiesChanged();\n }\n\n destroy(): void {\n this.abort?.abort();\n this.ctx.videoEl.removeEventListener('loadstart', this.onSourceChange);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toast?.remove();\n this.closeDialog();\n this.button.remove();\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[c]!);\n}\n","import { adoptStyle } from '../../utils/plugin-style';\nimport css from './rewarded.css?inline';\nimport { RewardedUnlock, type RewardedUnlockContext } from './RewardedUnlock';\nimport type { RewardedUnlockOptions } from '../../types';\n\n/** Ödüllü reklamla kalite kilidini kurar. */\nexport function installRewardedUnlock(ctx: RewardedUnlockContext, options: RewardedUnlockOptions): RewardedUnlock {\n adoptStyle(ctx.videoEl, 'rewarded', css);\n return new RewardedUnlock(ctx, options);\n}\n\nexport { RewardedUnlock };\nexport type { RewardedUnlockContext };\n"],"names":["GPT_SRC","gptLoading","loadGpt","w","_a","resolve","reject","s","showGptRewarded","adUnitPath","timeoutMs","signal","done","granted","videoCompleted","slot","googletag","listeners","finish","result","timer","onAbort","pubads","type","fn","gt","on","e","DEFAULT_MAX_FREE_HEIGHT","DEFAULT_STORAGE_KEY","DEFAULT_GPT_TIMEOUT_MS","TOAST_MS","dialogSeq","RewardedUnlock","ctx","options","__publicField","key","btn","before","h","u","mode","until","height","label","show","text","LOCK_SVG","escapeHtml","v","wasPlaying","err","noAd","p","aborted","r","template","quality","duration","phase","i","d","t","card","icon","title","actions","button","labelText","primary","onClick","b","spin","wasNoFill","message","_b","c","installRewardedUnlock","adoptStyle","css"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
var f = Object.defineProperty;
|
|
2
|
+
var x = (o, t, e) => t in o ? f(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
|
|
3
|
+
var a = (o, t, e) => x(o, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { f as v } from "./player-B7mYS--8.js";
|
|
5
|
+
class b {
|
|
6
|
+
constructor(t, e) {
|
|
7
|
+
a(this, "chapters", []);
|
|
8
|
+
a(this, "chapterEls", []);
|
|
9
|
+
a(this, "hoverIndex", -1);
|
|
10
|
+
a(this, "tooltipEl");
|
|
11
|
+
a(this, "titleEl");
|
|
12
|
+
a(this, "timeEl");
|
|
13
|
+
a(this, "onLoadedMetadata", () => {
|
|
14
|
+
const t = this.ctx.videoEl.duration;
|
|
15
|
+
!Number.isFinite(t) || t <= 0 || (this.chapters = g(this.segments, t), this.chapterEls = this.ctx.seekBar.setChapters(
|
|
16
|
+
this.chapters.map((e) => ({ start: e.start / t, end: e.end / t, color: e.color }))
|
|
17
|
+
));
|
|
18
|
+
});
|
|
19
|
+
a(this, "onPointerMove", (t) => {
|
|
20
|
+
var d, m;
|
|
21
|
+
const e = this.ctx.videoEl.duration;
|
|
22
|
+
if (!this.chapters.length || !Number.isFinite(e) || e <= 0) return;
|
|
23
|
+
const s = this.ctx.seekBar.ratioAtClientX(t.clientX) * e;
|
|
24
|
+
let r = this.chapters.findIndex((u) => s < u.end);
|
|
25
|
+
r === -1 && (r = this.chapters.length - 1), this.setHover(r);
|
|
26
|
+
const i = this.chapters[r];
|
|
27
|
+
this.titleEl.textContent = i.text ?? "", this.titleEl.style.display = i.text ? "" : "none";
|
|
28
|
+
const n = (m = (d = this.ctx.seekBar).markerLabelAt) == null ? void 0 : m.call(d, t.clientX);
|
|
29
|
+
this.timeEl.textContent = n ? `${n} · ${v(s)}` : v(s);
|
|
30
|
+
const l = this.ctx.seekBar.el.querySelector('[part="sprite-tooltip"]'), h = l && l.hasAttribute("data-visible") && l.offsetHeight > 0 ? l.offsetHeight + 8 : 0;
|
|
31
|
+
this.tooltipEl.style.bottom = h ? `calc(100% + 6px + ${h}px)` : "", this.timeEl.style.display = h ? "none" : "";
|
|
32
|
+
const p = this.ctx.seekBar.el.getBoundingClientRect();
|
|
33
|
+
this.tooltipEl.setAttribute("data-visible", "");
|
|
34
|
+
const c = this.tooltipEl.offsetWidth, E = Math.min(Math.max(t.clientX - p.left - c / 2, 0), Math.max(p.width - c, 0));
|
|
35
|
+
this.tooltipEl.style.transform = `translateX(${E}px)`;
|
|
36
|
+
});
|
|
37
|
+
a(this, "onPointerLeave", () => {
|
|
38
|
+
this.setHover(-1), this.tooltipEl.removeAttribute("data-visible");
|
|
39
|
+
});
|
|
40
|
+
this.ctx = t, this.segments = e, this.tooltipEl = document.createElement("div"), this.tooltipEl.className = "hp-chapter-tooltip", this.tooltipEl.setAttribute("part", "segment-tooltip"), this.titleEl = document.createElement("div"), this.titleEl.className = "hp-chapter-tooltip-title", this.timeEl = document.createElement("div"), this.timeEl.className = "hp-chapter-tooltip-time", this.tooltipEl.append(this.titleEl, this.timeEl), t.seekBar.el.appendChild(this.tooltipEl), t.seekBar.suppressHoverTime("segments", !0), t.seekBar.el.addEventListener("pointermove", this.onPointerMove), t.seekBar.el.addEventListener("pointerleave", this.onPointerLeave), t.videoEl.addEventListener("loadedmetadata", this.onLoadedMetadata), t.videoEl.readyState >= 1 && this.onLoadedMetadata();
|
|
41
|
+
}
|
|
42
|
+
destroy() {
|
|
43
|
+
this.ctx.videoEl.removeEventListener("loadedmetadata", this.onLoadedMetadata), this.ctx.seekBar.el.removeEventListener("pointermove", this.onPointerMove), this.ctx.seekBar.el.removeEventListener("pointerleave", this.onPointerLeave), this.ctx.seekBar.clearChapters(), this.ctx.seekBar.suppressHoverTime("segments", !1), this.tooltipEl.remove(), this.chapterEls = [], this.chapters = [];
|
|
44
|
+
}
|
|
45
|
+
setHover(t) {
|
|
46
|
+
var e, s;
|
|
47
|
+
t !== this.hoverIndex && ((e = this.chapterEls[this.hoverIndex]) == null || e.removeAttribute("data-hover"), this.hoverIndex = t, (s = this.chapterEls[t]) == null || s.setAttribute("data-hover", ""));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function g(o, t) {
|
|
51
|
+
const e = o.filter((i) => Number.isFinite(i.start) && i.start < t).slice().sort((i, n) => i.start - n.start), s = [];
|
|
52
|
+
let r = 0;
|
|
53
|
+
for (const i of e) {
|
|
54
|
+
const n = Math.max(i.start, r), l = Math.min(Number.isFinite(i.end) ? i.end : t, t);
|
|
55
|
+
l <= n || (n > r && s.push({ start: r, end: n }), s.push({ start: n, end: l, text: i.text, color: i.color }), r = l);
|
|
56
|
+
}
|
|
57
|
+
return s.length ? (r < t && (s[s.length - 1].end = t), s) : [];
|
|
58
|
+
}
|
|
59
|
+
function L(o, t) {
|
|
60
|
+
return new b(o, t);
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
b as Segments,
|
|
64
|
+
L as installSegments
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=segments-CuQQEIAX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segments-CuQQEIAX.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 markerLabelAt?(clientX: number): string | null;\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 const label = this.ctx.seekBar.markerLabelAt?.(e.clientX);\n this.timeEl.textContent = label ? `${label} · ${formatTime(time)}` : 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","label","_b","_a","formatTime","sprite","spriteH","barRect","tipWidth","x","sorted","s","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":";;;;AA4BO,MAAMA,EAAS;AAAA,EAQlB,YACqBC,GACAC,GACnB;AAVM,IAAAC,EAAA,kBAAsB,CAAA;AACtB,IAAAA,EAAA,oBAA4B,CAAA;AAC5B,IAAAA,EAAA,oBAAa;AACJ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAmCA,IAAAA,EAAA,0BAAmB,MAAY;AAC5C,YAAMC,IAAW,KAAK,IAAI,QAAQ;AAClC,MAAI,CAAC,OAAO,SAASA,CAAQ,KAAKA,KAAY,MAE9C,KAAK,WAAWC,EAAc,KAAK,UAAUD,CAAQ,GACrD,KAAK,aAAa,KAAK,IAAI,QAAQ;AAAA,QAC/B,KAAK,SAAS,IAAI,CAACE,OAAO,EAAE,OAAOA,EAAE,QAAQF,GAAU,KAAKE,EAAE,MAAMF,GAAU,OAAOE,EAAE,QAAQ;AAAA,MAAA;AAAA,IAEvG;AAEiB,IAAAH,EAAA,uBAAgB,CAACI,MAA0B;;AACxD,YAAMH,IAAW,KAAK,IAAI,QAAQ;AAClC,UAAI,CAAC,KAAK,SAAS,UAAU,CAAC,OAAO,SAASA,CAAQ,KAAKA,KAAY,EAAG;AAE1E,YAAMI,IAAO,KAAK,IAAI,QAAQ,eAAeD,EAAE,OAAO,IAAIH;AAC1D,UAAIK,IAAQ,KAAK,SAAS,UAAU,CAACH,MAAME,IAAOF,EAAE,GAAG;AACvD,MAAIG,MAAU,OAAIA,IAAQ,KAAK,SAAS,SAAS,IACjD,KAAK,SAASA,CAAK;AAEnB,YAAMC,IAAU,KAAK,SAASD,CAAK;AACnC,WAAK,QAAQ,cAAcC,EAAQ,QAAQ,IAC3C,KAAK,QAAQ,MAAM,UAAUA,EAAQ,OAAO,KAAK;AACjD,YAAMC,KAAQC,KAAAC,IAAA,KAAK,IAAI,SAAQ,kBAAjB,gBAAAD,EAAA,KAAAC,GAAiCN,EAAE;AACjD,WAAK,OAAO,cAAcI,IAAQ,GAAGA,CAAK,MAAMG,EAAWN,CAAI,CAAC,KAAKM,EAAWN,CAAI;AAIpF,YAAMO,IAAS,KAAK,IAAI,QAAQ,GAAG,cAA2B,yBAAyB,GACjFC,IAAUD,KAAUA,EAAO,aAAa,cAAc,KAAKA,EAAO,eAAe,IAAIA,EAAO,eAAe,IAAI;AACrH,WAAK,UAAU,MAAM,SAASC,IAAU,qBAAqBA,CAAO,QAAQ,IAE5E,KAAK,OAAO,MAAM,UAAUA,IAAU,SAAS;AAG/C,YAAMC,IAAU,KAAK,IAAI,QAAQ,GAAG,sBAAA;AACpC,WAAK,UAAU,aAAa,gBAAgB,EAAE;AAC9C,YAAMC,IAAW,KAAK,UAAU,aAC1BC,IAAI,KAAK,IAAI,KAAK,IAAIZ,EAAE,UAAUU,EAAQ,OAAOC,IAAW,GAAG,CAAC,GAAG,KAAK,IAAID,EAAQ,QAAQC,GAAU,CAAC,CAAC;AAC9G,WAAK,UAAU,MAAM,YAAY,cAAcC,CAAC;AAAA,IACpD;AAEiB,IAAAhB,EAAA,wBAAiB,MAAY;AAC1C,WAAK,SAAS,EAAE,GAChB,KAAK,UAAU,gBAAgB,cAAc;AAAA,IACjD;AA5EqB,SAAA,MAAAF,GACA,KAAA,WAAAC,GAEjB,KAAK,YAAY,SAAS,cAAc,KAAK,GAC7C,KAAK,UAAU,YAAY,sBAC3B,KAAK,UAAU,aAAa,QAAQ,iBAAiB,GACrD,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,4BACzB,KAAK,SAAS,SAAS,cAAc,KAAK,GAC1C,KAAK,OAAO,YAAY,2BACxB,KAAK,UAAU,OAAO,KAAK,SAAS,KAAK,MAAM,GAC/CD,EAAI,QAAQ,GAAG,YAAY,KAAK,SAAS,GAEzCA,EAAI,QAAQ,kBAAkB,YAAY,EAAI,GAE9CA,EAAI,QAAQ,GAAG,iBAAiB,eAAe,KAAK,aAAa,GACjEA,EAAI,QAAQ,GAAG,iBAAiB,gBAAgB,KAAK,cAAc,GACnEA,EAAI,QAAQ,iBAAiB,kBAAkB,KAAK,gBAAgB,GAChEA,EAAI,QAAQ,cAAc,UAAQ,iBAAA;AAAA,EAC1C;AAAA,EAEA,UAAgB;AACZ,SAAK,IAAI,QAAQ,oBAAoB,kBAAkB,KAAK,gBAAgB,GAC5E,KAAK,IAAI,QAAQ,GAAG,oBAAoB,eAAe,KAAK,aAAa,GACzE,KAAK,IAAI,QAAQ,GAAG,oBAAoB,gBAAgB,KAAK,cAAc,GAC3E,KAAK,IAAI,QAAQ,cAAA,GACjB,KAAK,IAAI,QAAQ,kBAAkB,YAAY,EAAK,GACpD,KAAK,UAAU,OAAA,GACf,KAAK,aAAa,CAAA,GAClB,KAAK,WAAW,CAAA;AAAA,EACpB;AAAA,EAgDQ,SAASQ,GAAqB;;AAClC,IAAIA,MAAU,KAAK,gBACnBI,IAAA,KAAK,WAAW,KAAK,UAAU,MAA/B,QAAAA,EAAkC,gBAAgB,eAClD,KAAK,aAAaJ,IAClBG,IAAA,KAAK,WAAWH,CAAK,MAArB,QAAAG,EAAwB,aAAa,cAAc;AAAA,EACvD;AACJ;AAGA,SAASP,EAAcH,GAAyBE,GAA6B;AACzE,QAAMgB,IAASlB,EACV,OAAO,CAACmB,MAAM,OAAO,SAASA,EAAE,KAAK,KAAKA,EAAE,QAAQjB,CAAQ,EAC5D,QACA,KAAK,CAACkB,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,GAE/BC,IAAsB,CAAA;AAC5B,MAAIC,IAAS;AACb,aAAWC,KAAON,GAAQ;AACtB,UAAMO,IAAQ,KAAK,IAAID,EAAI,OAAOD,CAAM,GAClCG,IAAM,KAAK,IAAI,OAAO,SAASF,EAAI,GAAG,IAAIA,EAAI,MAAMtB,GAAUA,CAAQ;AAC5E,IAAIwB,KAAOD,MACPA,IAAQF,KAAQD,EAAS,KAAK,EAAE,OAAOC,GAAQ,KAAKE,GAAO,GAC/DH,EAAS,KAAK,EAAE,OAAAG,GAAO,KAAAC,GAAK,MAAMF,EAAI,MAAM,OAAOA,EAAI,MAAA,CAAO,GAC9DD,IAASG;AAAA,EACb;AACA,SAAKJ,EAAS,UACVC,IAASrB,MAAUoB,EAASA,EAAS,SAAS,CAAC,EAAG,MAAMpB,IACrDoB,KAFsB,CAAA;AAGjC;AC5IO,SAASK,EAAgB5B,GAA4B6B,GAAgC;AACxF,SAAO,IAAI9B,EAASC,GAAK6B,CAAK;AAClC;"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
var w = Object.defineProperty;
|
|
2
|
+
var T = (s, t, e) => t in s ? w(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
|
|
3
|
+
var p = (s, t, e) => T(s, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
import { c as C, f as S, r as L } from "./player-B7mYS--8.js";
|
|
5
|
+
import { a as A } from "./plugin-style-CPJELe-i.js";
|
|
6
|
+
const N = {
|
|
7
|
+
tr: {
|
|
8
|
+
share: "Paylaş",
|
|
9
|
+
shareCopy: "Kopyala",
|
|
10
|
+
shareCopied: "Kopyalandı",
|
|
11
|
+
shareStartAt: (s) => `${s} itibarıyla başlat`,
|
|
12
|
+
shareMore: "Diğer…",
|
|
13
|
+
shareClose: "Paylaşımı kapat",
|
|
14
|
+
shareLink: "Video bağlantısı",
|
|
15
|
+
shareEmail: "E-posta"
|
|
16
|
+
},
|
|
17
|
+
en: {
|
|
18
|
+
share: "Share",
|
|
19
|
+
shareCopy: "Copy",
|
|
20
|
+
shareCopied: "Copied",
|
|
21
|
+
shareStartAt: (s) => `Start at ${s}`,
|
|
22
|
+
shareMore: "More…",
|
|
23
|
+
shareClose: "Close sharing",
|
|
24
|
+
shareLink: "Video link",
|
|
25
|
+
shareEmail: "Email"
|
|
26
|
+
}
|
|
27
|
+
}, P = ".hp-share{position:absolute;top:50%;left:50%;z-index:26;display:grid;gap:10px;width:min(380px,calc(100% - 24px));max-height:calc(100% - 24px);overflow-y:auto;box-sizing:border-box;padding:14px;border:1px solid var(--hp-panel-border);border-radius:12px;background:var(--hp-panel-bg);backdrop-filter:blur(var(--hp-panel-blur)) saturate(160%);-webkit-backdrop-filter:blur(var(--hp-panel-blur)) saturate(160%);color:var(--hp-panel-text);box-shadow:0 16px 40px -12px #0009;font:13px/1.4 system-ui,-apple-system,sans-serif;transform:translate(-50%,-50%);animation:hp-redirect-fade .2s ease-out}.hp-share-head{display:flex;align-items:center;justify-content:space-between}.hp-share-title{font-weight:600;font-size:15px}.hp-share-close{display:grid;place-items:center;width:26px;height:26px;padding:0;border:0;border-radius:999px;background:transparent;color:inherit;font-size:13px;cursor:pointer}.hp-share-close:hover{background:color-mix(in srgb,var(--hp-panel-text) 14%,transparent)}.hp-share-link{display:flex;gap:6px}.hp-share-link input{flex:1;min-width:0;padding:7px 10px;border:1px solid var(--hp-panel-border);border-radius:8px;background:color-mix(in srgb,var(--hp-panel-text) 8%,transparent);color:inherit;font:12.5px/1.3 ui-monospace,SFMono-Regular,Menlo,monospace}.hp-share-copy,.hp-share-net{padding:7px 12px;border:1px solid var(--hp-panel-border);border-radius:999px;background:color-mix(in srgb,var(--hp-panel-text) 10%,transparent);color:inherit;font:600 12.5px/1 system-ui,-apple-system,sans-serif;white-space:nowrap;cursor:pointer}.hp-share-copy:hover,.hp-share-net:hover{background:color-mix(in srgb,var(--hp-panel-text) 18%,transparent)}.hp-share-copy[data-done]{background:#2fbf71;border-color:#2fbf71;color:#fff}.hp-share-start{display:flex;gap:8px;align-items:center;cursor:pointer}.hp-share-networks{display:flex;flex-wrap:wrap;gap:6px}.hp-share :is(button,input):focus-visible{outline:2px solid var(--hp-panel-text);outline-offset:2px}", $ = ["x", "whatsapp", "facebook", "linkedin", "telegram", "email"], E = {
|
|
28
|
+
x: "X",
|
|
29
|
+
whatsapp: "WhatsApp",
|
|
30
|
+
facebook: "Facebook",
|
|
31
|
+
linkedin: "LinkedIn",
|
|
32
|
+
telegram: "Telegram",
|
|
33
|
+
reddit: "Reddit",
|
|
34
|
+
email: "Email"
|
|
35
|
+
};
|
|
36
|
+
function M(s, t, e) {
|
|
37
|
+
const a = encodeURIComponent(t), c = encodeURIComponent(e);
|
|
38
|
+
switch (s) {
|
|
39
|
+
case "x":
|
|
40
|
+
return `https://x.com/intent/post?url=${a}&text=${c}`;
|
|
41
|
+
case "whatsapp":
|
|
42
|
+
return `https://wa.me/?text=${encodeURIComponent(e ? `${e} ${t}` : t)}`;
|
|
43
|
+
case "facebook":
|
|
44
|
+
return `https://www.facebook.com/sharer/sharer.php?u=${a}`;
|
|
45
|
+
case "linkedin":
|
|
46
|
+
return `https://www.linkedin.com/sharing/share-offsite/?url=${a}`;
|
|
47
|
+
case "telegram":
|
|
48
|
+
return `https://t.me/share/url?url=${a}&text=${c}`;
|
|
49
|
+
case "reddit":
|
|
50
|
+
return `https://www.reddit.com/submit?url=${a}&title=${c}`;
|
|
51
|
+
case "email":
|
|
52
|
+
return `mailto:?subject=${c}&body=${a}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function U(s) {
|
|
56
|
+
if (!s) return null;
|
|
57
|
+
const t = s.trim();
|
|
58
|
+
if (/^\d+(\.\d+)?$/.test(t)) return Number(t);
|
|
59
|
+
if (/^\d+(:\d{1,2}){1,2}$/.test(t)) return t.split(":").reduce((a, c) => a * 60 + Number(c), 0);
|
|
60
|
+
const e = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/i.exec(t);
|
|
61
|
+
return e && (e[1] || e[2] || e[3]) ? Number(e[1] ?? 0) * 3600 + Number(e[2] ?? 0) * 60 + Number(e[3] ?? 0) : null;
|
|
62
|
+
}
|
|
63
|
+
class R {
|
|
64
|
+
constructor(t, e) {
|
|
65
|
+
p(this, "panel", null);
|
|
66
|
+
p(this, "button", null);
|
|
67
|
+
p(this, "copyTimer", null);
|
|
68
|
+
p(this, "param");
|
|
69
|
+
p(this, "startAt", null);
|
|
70
|
+
p(this, "startTries", 0);
|
|
71
|
+
p(this, "seekToParam", () => {
|
|
72
|
+
const t = this.ctx.videoEl, e = this.startAt;
|
|
73
|
+
if (e === null) return;
|
|
74
|
+
if (this.ctx.isLive()) return this.stopStart();
|
|
75
|
+
if (!Number.isFinite(t.duration) || t.seeking) return;
|
|
76
|
+
const a = Math.min(e, Math.max(0, t.duration - 1));
|
|
77
|
+
if (Math.abs(t.currentTime - a) <= 0.5) return this.stopStart();
|
|
78
|
+
if (++this.startTries > 3) return this.stopStart();
|
|
79
|
+
t.currentTime = a;
|
|
80
|
+
});
|
|
81
|
+
p(this, "confirmStart", () => {
|
|
82
|
+
const t = this.ctx.videoEl;
|
|
83
|
+
this.startAt !== null && !this.ctx.isLive() && Math.abs(t.currentTime - Math.min(this.startAt, t.duration - 1)) > 0.5 || this.stopStart();
|
|
84
|
+
});
|
|
85
|
+
if (this.ctx = t, this.options = e, A(t.overlayEl, "share", P), this.param = e.param || "t", e.button !== !1) {
|
|
86
|
+
const { btn: a } = t.addButton(t.i18n.share, "share", () => this.panel ? this.close() : this.open());
|
|
87
|
+
this.button = a;
|
|
88
|
+
}
|
|
89
|
+
e.readParam !== !1 && this.applyStartParam();
|
|
90
|
+
}
|
|
91
|
+
refreshLabels() {
|
|
92
|
+
var t;
|
|
93
|
+
(t = this.button) == null || t.setAttribute("aria-label", this.ctx.i18n.share), this.panel && (this.close(), this.open());
|
|
94
|
+
}
|
|
95
|
+
destroy() {
|
|
96
|
+
var t;
|
|
97
|
+
this.close(), (t = this.button) == null || t.remove(), this.stopStart();
|
|
98
|
+
}
|
|
99
|
+
/** Paylaşılacak temel adres: verilen, canonical ya da sayfa adresi (zaman parametresi temizlenir). */
|
|
100
|
+
baseUrl() {
|
|
101
|
+
var a;
|
|
102
|
+
const t = (a = document.querySelector('link[rel="canonical"]')) == null ? void 0 : a.href, e = new URL(this.options.url || t || location.href, location.href);
|
|
103
|
+
return e.searchParams.delete(this.param), e.hash = "", e.toString();
|
|
104
|
+
}
|
|
105
|
+
time() {
|
|
106
|
+
const t = this.ctx.videoEl;
|
|
107
|
+
if (this.ctx.isLive() || !Number.isFinite(t.duration)) return null;
|
|
108
|
+
const e = Math.floor(t.currentTime);
|
|
109
|
+
return e > 0 ? e : null;
|
|
110
|
+
}
|
|
111
|
+
shareUrl(t) {
|
|
112
|
+
const e = this.time(), a = new URL(this.baseUrl());
|
|
113
|
+
return t && e !== null && a.searchParams.set(this.param, String(e)), a.toString();
|
|
114
|
+
}
|
|
115
|
+
emit(t, e, a) {
|
|
116
|
+
return this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:share", { detail: { action: t, url: e, time: a }, cancelable: !0 }));
|
|
117
|
+
}
|
|
118
|
+
open() {
|
|
119
|
+
var k;
|
|
120
|
+
if (this.panel) return;
|
|
121
|
+
const t = this.ctx.i18n, e = this.time();
|
|
122
|
+
let a = this.options.startAt !== !1 && e !== null;
|
|
123
|
+
const c = this.options.title ?? document.title, l = document.createElement("div");
|
|
124
|
+
l.className = "hp-share", l.setAttribute("part", "share"), l.setAttribute("role", "dialog"), l.setAttribute("aria-label", t.share);
|
|
125
|
+
const u = document.createElement("div");
|
|
126
|
+
u.className = "hp-share-head";
|
|
127
|
+
const m = document.createElement("span");
|
|
128
|
+
m.className = "hp-share-title", m.textContent = t.share;
|
|
129
|
+
const d = document.createElement("button");
|
|
130
|
+
d.type = "button", d.className = "hp-share-close", d.setAttribute("aria-label", t.shareClose), d.appendChild(C("close")), d.addEventListener("click", () => this.close()), u.append(m, d);
|
|
131
|
+
const b = document.createElement("div");
|
|
132
|
+
b.className = "hp-share-link";
|
|
133
|
+
const i = document.createElement("input");
|
|
134
|
+
i.type = "text", i.readOnly = !0, i.setAttribute("aria-label", t.shareLink);
|
|
135
|
+
const h = document.createElement("button");
|
|
136
|
+
h.type = "button", h.className = "hp-share-copy", h.textContent = t.shareCopy;
|
|
137
|
+
const f = () => {
|
|
138
|
+
i.value = this.shareUrl(a);
|
|
139
|
+
};
|
|
140
|
+
if (h.addEventListener("click", () => {
|
|
141
|
+
var o;
|
|
142
|
+
const n = i.value;
|
|
143
|
+
if (!this.emit("copy", n, a ? e : null)) return;
|
|
144
|
+
const r = () => {
|
|
145
|
+
h.textContent = t.shareCopied, h.setAttribute("data-done", ""), this.copyTimer && clearTimeout(this.copyTimer), this.copyTimer = setTimeout(() => {
|
|
146
|
+
h.textContent = t.shareCopy, h.removeAttribute("data-done");
|
|
147
|
+
}, 2e3);
|
|
148
|
+
};
|
|
149
|
+
(((o = navigator.clipboard) == null ? void 0 : o.writeText(n)) ?? Promise.reject()).catch(() => {
|
|
150
|
+
i.select(), document.execCommand("copy");
|
|
151
|
+
}).then(r, r);
|
|
152
|
+
}), i.addEventListener("focus", () => i.select()), b.append(i, h), l.append(u, b), this.options.startAt !== !1 && e !== null) {
|
|
153
|
+
const n = document.createElement("label");
|
|
154
|
+
n.className = "hp-share-start";
|
|
155
|
+
const r = document.createElement("input");
|
|
156
|
+
r.type = "checkbox", r.checked = a, r.addEventListener("change", () => {
|
|
157
|
+
a = r.checked, f();
|
|
158
|
+
}), n.append(r, document.createTextNode(t.shareStartAt(S(e)))), l.appendChild(n);
|
|
159
|
+
}
|
|
160
|
+
const x = this.options.networks ?? $, v = typeof navigator.share == "function";
|
|
161
|
+
if (x.length || v) {
|
|
162
|
+
const n = document.createElement("div");
|
|
163
|
+
n.className = "hp-share-networks";
|
|
164
|
+
for (const r of x) {
|
|
165
|
+
if (!E[r]) continue;
|
|
166
|
+
const o = document.createElement("button");
|
|
167
|
+
o.type = "button", o.className = "hp-share-net", o.setAttribute("data-network", r), o.textContent = r === "email" ? t.shareEmail : E[r], o.addEventListener("click", () => {
|
|
168
|
+
const y = i.value;
|
|
169
|
+
if (!this.emit(r, y, a ? e : null)) return;
|
|
170
|
+
const g = M(r, y, c);
|
|
171
|
+
r === "email" ? location.href = g : window.open(g, "_blank", "noopener,width=640,height=560");
|
|
172
|
+
}), n.appendChild(o);
|
|
173
|
+
}
|
|
174
|
+
if (v) {
|
|
175
|
+
const r = document.createElement("button");
|
|
176
|
+
r.type = "button", r.className = "hp-share-net", r.setAttribute("data-network", "native"), r.textContent = t.shareMore, r.addEventListener("click", () => {
|
|
177
|
+
const o = i.value;
|
|
178
|
+
this.emit("native", o, a ? e : null) && navigator.share({ url: o, title: c }).catch(() => {
|
|
179
|
+
});
|
|
180
|
+
}), n.appendChild(r);
|
|
181
|
+
}
|
|
182
|
+
l.appendChild(n);
|
|
183
|
+
}
|
|
184
|
+
for (const n of ["pointerdown", "click", "dblclick"]) l.addEventListener(n, (r) => r.stopPropagation());
|
|
185
|
+
l.addEventListener("keydown", (n) => {
|
|
186
|
+
var r;
|
|
187
|
+
n.key === "Escape" && (this.close(), (r = this.button) == null || r.focus()), n.stopPropagation();
|
|
188
|
+
}), f(), this.ctx.overlayEl.appendChild(l), this.panel = l, (k = this.button) == null || k.setAttribute("aria-expanded", "true"), h.focus({ preventScroll: !0 }), this.emit("open", i.value, a ? e : null);
|
|
189
|
+
}
|
|
190
|
+
close() {
|
|
191
|
+
var t, e;
|
|
192
|
+
this.copyTimer && clearTimeout(this.copyTimer), this.copyTimer = null, (t = this.panel) == null || t.remove(), this.panel = null, (e = this.button) == null || e.setAttribute("aria-expanded", "false");
|
|
193
|
+
}
|
|
194
|
+
/** Sayfa ?t=… ile açıldıysa video o saniyeden başlar (yalnızca ilk yüklemede). */
|
|
195
|
+
applyStartParam() {
|
|
196
|
+
const t = U(new URLSearchParams(location.search).get(this.param));
|
|
197
|
+
if (t === null) return;
|
|
198
|
+
this.startAt = t;
|
|
199
|
+
const e = this.ctx.videoEl;
|
|
200
|
+
e.addEventListener("loadedmetadata", this.seekToParam), e.addEventListener("canplay", this.seekToParam), e.addEventListener("seeked", this.confirmStart), e.readyState >= 1 && this.seekToParam();
|
|
201
|
+
}
|
|
202
|
+
stopStart() {
|
|
203
|
+
const t = this.ctx.videoEl;
|
|
204
|
+
this.startAt = null, t.removeEventListener("loadedmetadata", this.seekToParam), t.removeEventListener("canplay", this.seekToParam), t.removeEventListener("seeked", this.confirmStart);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
L(N);
|
|
208
|
+
function K(s, t) {
|
|
209
|
+
return new R(s, t);
|
|
210
|
+
}
|
|
211
|
+
export {
|
|
212
|
+
R as Share,
|
|
213
|
+
K as installShare,
|
|
214
|
+
U as parseTimeParam
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=share-BdqQ8sGE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-BdqQ8sGE.js","sources":["../../src/plugins/share/strings.ts","../../src/plugins/share/Share.ts","../../src/plugins/share/index.ts"],"sourcesContent":["// Bu eklentinin metinleri — ana pakete girmez, eklenti yüklenince sözlüğe eklenir (bkz. i18n/index.ts).\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\ntype Strings = Pick<HopeLocaleStrings, 'share' | 'shareCopy' | 'shareCopied' | 'shareStartAt' | 'shareMore' | 'shareClose' | 'shareLink' | 'shareEmail'>;\n\nexport const strings: { tr: Strings; en: Strings } = {\n tr: {\n share: 'Paylaş',\n shareCopy: 'Kopyala',\n shareCopied: 'Kopyalandı',\n shareStartAt: (time) => `${time} itibarıyla başlat`,\n shareMore: 'Diğer…',\n shareClose: 'Paylaşımı kapat',\n shareLink: 'Video bağlantısı',\n shareEmail: 'E-posta',\n },\n en: {\n share: 'Share',\n shareCopy: 'Copy',\n shareCopied: 'Copied',\n shareStartAt: (time) => `Start at ${time}`,\n shareMore: 'More…',\n shareClose: 'Close sharing',\n shareLink: 'Video link',\n shareEmail: 'Email',\n },\n};\n","import type { ShareNetwork, ShareOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { formatTime } from '../../utils/format-time';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './share.css?inline';\n\nexport interface SharePlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n addButton(label: string, iconName: string, onClick: () => void): { btn: HTMLButtonElement; icon: HTMLElement };\n isLive(): boolean;\n}\n\nconst DEFAULT_NETWORKS: ShareNetwork[] = ['x', 'whatsapp', 'facebook', 'linkedin', 'telegram', 'email'];\n\nconst NETWORK_NAMES: Record<ShareNetwork, string> = {\n x: 'X',\n whatsapp: 'WhatsApp',\n facebook: 'Facebook',\n linkedin: 'LinkedIn',\n telegram: 'Telegram',\n reddit: 'Reddit',\n email: 'Email',\n};\n\n/** Ağın paylaşım adresi. */\nfunction networkUrl(network: ShareNetwork, url: string, title: string): string {\n const u = encodeURIComponent(url);\n const t = encodeURIComponent(title);\n switch (network) {\n case 'x':\n return `https://x.com/intent/post?url=${u}&text=${t}`;\n case 'whatsapp':\n return `https://wa.me/?text=${encodeURIComponent(title ? `${title} ${url}` : url)}`;\n case 'facebook':\n return `https://www.facebook.com/sharer/sharer.php?u=${u}`;\n case 'linkedin':\n return `https://www.linkedin.com/sharing/share-offsite/?url=${u}`;\n case 'telegram':\n return `https://t.me/share/url?url=${u}&text=${t}`;\n case 'reddit':\n return `https://www.reddit.com/submit?url=${u}&title=${t}`;\n case 'email':\n return `mailto:?subject=${t}&body=${u}`;\n }\n}\n\n/** \"90\", \"1:30\", \"1:02:03\", \"1m30s\", \"1h2m3s\" → saniye; geçersizse null. */\nexport function parseTimeParam(raw: string | null): number | null {\n if (!raw) return null;\n const v = raw.trim();\n if (/^\\d+(\\.\\d+)?$/.test(v)) return Number(v);\n if (/^\\d+(:\\d{1,2}){1,2}$/.test(v)) return v.split(':').reduce((a, p) => a * 60 + Number(p), 0);\n const m = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/i.exec(v);\n if (m && (m[1] || m[2] || m[3])) return Number(m[1] ?? 0) * 3600 + Number(m[2] ?? 0) * 60 + Number(m[3] ?? 0);\n return null;\n}\n\n/**\n * Paylaşım paneli: bağlantıyı kopyala, \"bu andan başlat\" (?t=), seçilen sosyal ağlar ve cihazın kendi paylaşım menüsü\n * (Web Share API, varsa). Sayfa ?t= ile açılınca video o saniyeden başlar.\n */\nexport class Share {\n private panel: HTMLElement | null = null;\n private button: HTMLButtonElement | null = null;\n private copyTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly param: string;\n\n constructor(\n private readonly ctx: SharePlayerContext,\n private readonly options: ShareOptions\n ) {\n adoptStyle(ctx.overlayEl, 'share', css);\n this.param = options.param || 't';\n if (options.button !== false) {\n const { btn } = ctx.addButton(ctx.i18n.share, 'share', () => (this.panel ? this.close() : this.open()));\n this.button = btn;\n }\n if (options.readParam !== false) this.applyStartParam();\n }\n\n refreshLabels(): void {\n this.button?.setAttribute('aria-label', this.ctx.i18n.share);\n if (this.panel) {\n this.close();\n this.open();\n }\n }\n\n destroy(): void {\n this.close();\n this.button?.remove();\n this.stopStart();\n }\n\n /** Paylaşılacak temel adres: verilen, canonical ya da sayfa adresi (zaman parametresi temizlenir). */\n private baseUrl(): string {\n const canonical = document.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]')?.href;\n const u = new URL(this.options.url || canonical || location.href, location.href);\n u.searchParams.delete(this.param);\n u.hash = '';\n return u.toString();\n }\n\n private time(): number | null {\n const v = this.ctx.videoEl;\n if (this.ctx.isLive() || !Number.isFinite(v.duration)) return null;\n const t = Math.floor(v.currentTime);\n return t > 0 ? t : null;\n }\n\n private shareUrl(withTime: boolean): string {\n const t = this.time();\n const u = new URL(this.baseUrl());\n if (withTime && t !== null) u.searchParams.set(this.param, String(t));\n return u.toString();\n }\n\n private emit(action: string, url: string, time: number | null): boolean {\n return this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:share', { detail: { action, url, time }, cancelable: true }));\n }\n\n open(): void {\n if (this.panel) return;\n const i18n = this.ctx.i18n;\n const t = this.time();\n let withTime = this.options.startAt !== false && t !== null;\n const title = this.options.title ?? document.title;\n\n const panel = document.createElement('div');\n panel.className = 'hp-share';\n panel.setAttribute('part', 'share');\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', i18n.share);\n\n const head = document.createElement('div');\n head.className = 'hp-share-head';\n const h = document.createElement('span');\n h.className = 'hp-share-title';\n h.textContent = i18n.share;\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-share-close';\n close.setAttribute('aria-label', i18n.shareClose);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => this.close());\n head.append(h, close);\n\n const row = document.createElement('div');\n row.className = 'hp-share-link';\n const input = document.createElement('input');\n input.type = 'text';\n input.readOnly = true;\n input.setAttribute('aria-label', i18n.shareLink);\n const copy = document.createElement('button');\n copy.type = 'button';\n copy.className = 'hp-share-copy';\n copy.textContent = i18n.shareCopy;\n const refresh = (): void => {\n input.value = this.shareUrl(withTime);\n };\n copy.addEventListener('click', () => {\n const url = input.value;\n if (!this.emit('copy', url, withTime ? t : null)) return;\n const done = (): void => {\n copy.textContent = i18n.shareCopied;\n copy.setAttribute('data-done', '');\n if (this.copyTimer) clearTimeout(this.copyTimer);\n this.copyTimer = setTimeout(() => {\n copy.textContent = i18n.shareCopy;\n copy.removeAttribute('data-done');\n }, 2000);\n };\n // Clipboard API yoksa (http, eski tarayıcı) seçili metni kopyala.\n void (navigator.clipboard?.writeText(url) ?? Promise.reject())\n .catch(() => {\n input.select();\n document.execCommand('copy');\n })\n .then(done, done);\n });\n input.addEventListener('focus', () => input.select());\n row.append(input, copy);\n\n panel.append(head, row);\n\n if (this.options.startAt !== false && t !== null) {\n const label = document.createElement('label');\n label.className = 'hp-share-start';\n const box = document.createElement('input');\n box.type = 'checkbox';\n box.checked = withTime;\n box.addEventListener('change', () => {\n withTime = box.checked;\n refresh();\n });\n label.append(box, document.createTextNode(i18n.shareStartAt(formatTime(t))));\n panel.appendChild(label);\n }\n\n const networks = this.options.networks ?? DEFAULT_NETWORKS;\n const nav = typeof navigator.share === 'function';\n if (networks.length || nav) {\n const list = document.createElement('div');\n list.className = 'hp-share-networks';\n for (const n of networks) {\n if (!NETWORK_NAMES[n]) continue;\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'hp-share-net';\n b.setAttribute('data-network', n);\n b.textContent = n === 'email' ? i18n.shareEmail : NETWORK_NAMES[n];\n b.addEventListener('click', () => {\n const url = input.value;\n if (!this.emit(n, url, withTime ? t : null)) return;\n const target = networkUrl(n, url, title);\n if (n === 'email') location.href = target;\n else window.open(target, '_blank', 'noopener,width=640,height=560');\n });\n list.appendChild(b);\n }\n if (nav) {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = 'hp-share-net';\n b.setAttribute('data-network', 'native');\n b.textContent = i18n.shareMore;\n b.addEventListener('click', () => {\n const url = input.value;\n if (!this.emit('native', url, withTime ? t : null)) return;\n void navigator.share({ url, title }).catch(() => {});\n });\n list.appendChild(b);\n }\n panel.appendChild(list);\n }\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) panel.addEventListener(ev, (e) => e.stopPropagation());\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n this.button?.focus();\n }\n e.stopPropagation();\n });\n refresh();\n this.ctx.overlayEl.appendChild(panel);\n this.panel = panel;\n this.button?.setAttribute('aria-expanded', 'true');\n copy.focus({ preventScroll: true });\n this.emit('open', input.value, withTime ? t : null);\n }\n\n close(): void {\n if (this.copyTimer) clearTimeout(this.copyTimer);\n this.copyTimer = null;\n this.panel?.remove();\n this.panel = null;\n this.button?.setAttribute('aria-expanded', 'false');\n }\n\n /** Sayfa ?t=… ile açıldıysa video o saniyeden başlar (yalnızca ilk yüklemede). */\n private applyStartParam(): void {\n const t = parseTimeParam(new URLSearchParams(location.search).get(this.param));\n if (t === null) return;\n this.startAt = t;\n const v = this.ctx.videoEl;\n // Kaynak yeniden yüklenirse (emptied → loadedmetadata) ya da tarayıcı erken sarmayı başa atarsa\n // (WebKit: veri hazır değilken) canplay'de tekrar denenir; hedefe varınca bırakılır.\n v.addEventListener('loadedmetadata', this.seekToParam);\n v.addEventListener('canplay', this.seekToParam);\n v.addEventListener('seeked', this.confirmStart);\n if (v.readyState >= 1) this.seekToParam();\n }\n\n private startAt: number | null = null;\n private startTries = 0;\n\n private readonly seekToParam = (): void => {\n const v = this.ctx.videoEl;\n const t = this.startAt;\n if (t === null) return;\n if (this.ctx.isLive()) return this.stopStart();\n if (!Number.isFinite(v.duration) || v.seeking) return;\n const target = Math.min(t, Math.max(0, v.duration - 1));\n if (Math.abs(v.currentTime - target) <= 0.5) return this.stopStart();\n if (++this.startTries > 3) return this.stopStart();\n v.currentTime = target;\n };\n\n private readonly confirmStart = (): void => {\n const v = this.ctx.videoEl;\n if (this.startAt !== null && !this.ctx.isLive() && Math.abs(v.currentTime - Math.min(this.startAt, v.duration - 1)) > 0.5) return;\n this.stopStart();\n };\n\n private stopStart(): void {\n const v = this.ctx.videoEl;\n this.startAt = null;\n v.removeEventListener('loadedmetadata', this.seekToParam);\n v.removeEventListener('canplay', this.seekToParam);\n v.removeEventListener('seeked', this.confirmStart);\n }\n}\n","import { registerLocaleStrings } from '../../i18n';\nimport { strings } from './strings';\nimport { Share, parseTimeParam, type SharePlayerContext } from './Share';\nimport type { ShareOptions } from '../../types';\n\nregisterLocaleStrings(strings);\n\nexport function installShare(ctx: SharePlayerContext, options: ShareOptions): Share {\n return new Share(ctx, options);\n}\n\nexport { Share, parseTimeParam };\nexport type { SharePlayerContext };\n"],"names":["strings","time","DEFAULT_NETWORKS","NETWORK_NAMES","networkUrl","network","url","title","u","t","parseTimeParam","raw","v","p","m","Share","ctx","options","__publicField","target","adoptStyle","css","btn","_a","canonical","withTime","action","i18n","panel","head","h","close","createIcon","row","input","copy","refresh","done","label","box","formatTime","networks","nav","list","n","b","ev","e","_b","registerLocaleStrings","installShare"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var c = Object.defineProperty;
|
|
2
2
|
var p = (i, e, t) => e in i ? c(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
|
|
3
3
|
var h = (i, e, t) => p(i, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { c as m, v, d as b } from "./player-
|
|
4
|
+
import { c as m, v, d as b } from "./player-B7mYS--8.js";
|
|
5
5
|
const k = 0.25;
|
|
6
6
|
class g {
|
|
7
7
|
constructor(e, t) {
|
|
@@ -132,4 +132,4 @@ export {
|
|
|
132
132
|
g as SkipSegments,
|
|
133
133
|
S as skipSegmentsPlugin
|
|
134
134
|
};
|
|
135
|
-
//# sourceMappingURL=skipSegments-
|
|
135
|
+
//# sourceMappingURL=skipSegments-BbepQ4Y6.js.map
|