kplayer-ts 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/README.md +477 -0
- package/dist/{kplayer.cjs.js → kplayer-ts.cjs.js} +28 -27
- package/dist/kplayer-ts.cjs.js.map +1 -0
- package/dist/kplayer-ts.d.ts +6 -0
- package/dist/{kplayer.es.js → kplayer-ts.es.js} +255 -238
- package/dist/kplayer-ts.es.js.map +1 -0
- package/dist/{kplayer.umd.js → kplayer-ts.umd.js} +72 -71
- package/dist/kplayer-ts.umd.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/template/player.d.ts +21 -0
- package/dist/template/video.d.ts +12 -0
- package/dist/ts/ad.d.ts +39 -0
- package/dist/ts/bar.d.ts +10 -0
- package/dist/ts/bezel.d.ts +6 -0
- package/dist/ts/contextmenu.d.ts +12 -0
- package/dist/ts/controller.d.ts +38 -0
- package/dist/ts/events.d.ts +11 -0
- package/dist/ts/fullscreen.d.ts +15 -0
- package/dist/ts/hotkey.d.ts +11 -0
- package/dist/ts/i18n.d.ts +6 -0
- package/dist/ts/icons.d.ts +22 -0
- package/dist/ts/index.d.ts +3 -0
- package/dist/ts/info-panel.d.ts +16 -0
- package/dist/ts/options.d.ts +5 -0
- package/dist/ts/player.d.ts +107 -0
- package/dist/ts/setting.d.ts +14 -0
- package/dist/ts/subtitle.d.ts +22 -0
- package/dist/ts/subtitles.d.ts +19 -0
- package/dist/ts/template.d.ts +94 -0
- package/dist/ts/thumbnails.d.ts +18 -0
- package/dist/ts/timer.d.ts +22 -0
- package/dist/ts/types.d.ts +146 -0
- package/dist/ts/user.d.ts +21 -0
- package/dist/ts/utils.d.ts +21 -0
- package/package.json +7 -5
- package/dist/kplayer.cjs.js.map +0 -1
- package/dist/kplayer.css +0 -1
- package/dist/kplayer.es.js.map +0 -1
- package/dist/kplayer.umd.js.map +0 -1
package/dist/kplayer.es.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kplayer.es.js","sources":["../src/ts/utils.ts","../src/ts/options.ts","../src/ts/i18n.ts","../src/assets/play.svg?raw","../src/assets/pause.svg?raw","../src/assets/volume-up.svg?raw","../src/assets/volume-down.svg?raw","../src/assets/volume-off.svg?raw","../src/assets/full.svg?raw","../src/assets/full-web.svg?raw","../src/assets/setting.svg?raw","../src/assets/right.svg?raw","../src/assets/camera.svg?raw","../src/assets/broadcast.svg?raw","../src/assets/subtitles.svg?raw","../src/assets/loading.svg?raw","../src/assets/cast.svg?raw","../src/assets/back.svg?raw","../src/assets/backward.svg?raw","../src/assets/forward.svg?raw","../src/assets/hd.svg?raw","../src/ts/icons.ts","../src/template/video.ts","../src/template/player.ts","../src/ts/template.ts","../src/ts/ad.ts","../src/ts/events.ts","../src/ts/fullscreen.ts","../src/ts/user.ts","../src/ts/subtitle.ts","../src/ts/subtitles.ts","../src/ts/bar.ts","../src/ts/timer.ts","../src/ts/bezel.ts","../src/ts/thumbnails.ts","../src/ts/controller.ts","../src/ts/setting.ts","../src/ts/hotkey.ts","../src/ts/contextmenu.ts","../src/ts/info-panel.ts","../src/ts/player.ts"],"sourcesContent":["import type { ScrollPosition, NameMap, StorageUtil } from \"./types\";\n\nconst isMobile = /mobile|android|iphone|ipod|phone|ipad/i.test(\n window.navigator.userAgent,\n);\n\nconst utils = {\n /**\n * Parse second to time string\n */\n secondToTime(second: number): string {\n second = second || 0;\n if (second === 0 || second === Infinity || second.toString() === \"NaN\") {\n return \"00:00\";\n }\n const add0 = (num: number): string => (num < 10 ? \"0\" + num : \"\" + num);\n const hour = Math.floor(second / 3600);\n const min = Math.floor((second - hour * 3600) / 60);\n const sec = Math.floor(second - hour * 3600 - min * 60);\n return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(\":\");\n },\n\n getElementViewLeft(element: HTMLElement): number {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent as HTMLElement | null;\n const elementScrollLeft =\n document.body.scrollLeft + document.documentElement.scrollLeft;\n if (\n !document.fullscreenElement &&\n !(document as Document & { mozFullScreenElement?: Element })\n .mozFullScreenElement &&\n !(document as Document & { webkitFullscreenElement?: Element })\n .webkitFullscreenElement\n ) {\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent as HTMLElement | null;\n }\n } else {\n while (current !== null && current !== element) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent as HTMLElement | null;\n }\n }\n return actualLeft - elementScrollLeft;\n },\n\n getBoundingClientRectViewLeft(element: HTMLElement): number {\n const scrollTop =\n window.scrollY ||\n window.pageYOffset ||\n document.body.scrollTop +\n ((document.documentElement && document.documentElement.scrollTop) || 0);\n\n if (element.getBoundingClientRect) {\n const fn = this\n .getBoundingClientRectViewLeft as typeof this.getBoundingClientRectViewLeft & {\n offset?: number;\n };\n if (typeof fn.offset !== \"number\") {\n let temp = document.createElement(\"div\");\n temp.style.cssText = \"position:absolute;top:0;left:0;\";\n document.body.appendChild(temp);\n fn.offset = -temp.getBoundingClientRect().top - scrollTop;\n document.body.removeChild(temp);\n (temp as HTMLElement | null) = null;\n }\n const rect = element.getBoundingClientRect();\n const offset = fn.offset!;\n return rect.left + offset;\n } else {\n return this.getElementViewLeft(element);\n }\n },\n\n getScrollPosition(): ScrollPosition {\n return {\n left:\n window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0,\n top:\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0,\n };\n },\n\n setScrollPosition({ left = 0, top = 0 }: ScrollPosition): void {\n if (this.isFirefox) {\n document.documentElement.scrollLeft = left;\n document.documentElement.scrollTop = top;\n } else {\n window.scrollTo(left, top);\n }\n },\n\n isMobile,\n\n isFirefox: /firefox/i.test(window.navigator.userAgent),\n\n isChrome: /chrome/i.test(window.navigator.userAgent),\n\n isSafari: /safari/i.test(window.navigator.userAgent),\n\n storage: {\n set(key: string, value: string | number): void {\n localStorage.setItem(key, String(value));\n },\n get(key: string): string | null {\n return localStorage.getItem(key);\n },\n } as StorageUtil,\n\n nameMap: {\n dragStart: isMobile ? \"touchstart\" : \"mousedown\",\n dragMove: isMobile ? \"touchmove\" : \"mousemove\",\n dragEnd: isMobile ? \"touchend\" : \"mouseup\",\n } as NameMap,\n\n color2Number(color: string): number {\n if (color[0] === \"#\") {\n color = color.substr(1);\n }\n if (color.length === 3) {\n color = `${color[0]}${color[0]}${color[1]}${color[1]}${color[2]}${color[2]}`;\n }\n return (parseInt(color, 16) + 0x000000) & 0xffffff;\n },\n\n number2Color(number: number): string {\n return \"#\" + (\"00000\" + number.toString(16)).slice(-6);\n },\n\n number2Type(number: number): string {\n switch (number) {\n case 0:\n return \"right\";\n case 1:\n return \"top\";\n case 2:\n return \"bottom\";\n default:\n return \"right\";\n }\n },\n};\n\nexport default utils;\n","import type { KPlayerOptions } from \"./types\";\n\nexport default (\n options: Partial<KPlayerOptions> & { video: KPlayerOptions[\"video\"] },\n): KPlayerOptions => {\n const defaultOption: Partial<KPlayerOptions> = {\n container:\n (options as { element?: HTMLElement }).element ||\n (document.getElementsByClassName(\"kplayer\")[0] as HTMLElement),\n live: false,\n autoplay: false,\n theme: \"#b7daff\",\n loop: false,\n lang: (\n navigator.language ||\n (navigator as Navigator & { browserLanguage?: string }).browserLanguage ||\n \"en\"\n ).toLowerCase(),\n screenshot: false,\n airplay: true,\n chromecast: false,\n hotkey: true,\n preload: \"metadata\",\n volume: 0.7,\n playbackSpeed: [0.5, 0.75, 1, 1.25, 1.5, 2],\n video: {},\n contextmenu: [],\n ad: null,\n vastAD: false,\n vastADURL: \"\",\n mutex: true,\n pluginOptions: { hls: {}, flv: {}, dash: {}, webtorrent: {} },\n preventClickToggle: false,\n };\n\n for (const defaultKey in defaultOption) {\n if (\n Object.prototype.hasOwnProperty.call(defaultOption, defaultKey) &&\n !Object.prototype.hasOwnProperty.call(options, defaultKey)\n ) {\n (options as Record<string, unknown>)[defaultKey] = (\n defaultOption as Record<string, unknown>\n )[defaultKey];\n }\n }\n\n if (options.video) {\n if (!options.video.type) options.video.type = \"auto\";\n }\n\n if (typeof options.awaken === \"object\" && options.awaken) {\n if (!options.awaken.user) options.awaken.user = \"DIYgod\";\n }\n\n if (options.subtitle) {\n if (!options.subtitle.type) options.subtitle.type = \"webvtt\";\n if (!options.subtitle.fontSize) options.subtitle.fontSize = \"20px\";\n if (!options.subtitle.bottom) options.subtitle.bottom = \"40px\";\n if (!options.subtitle.color) options.subtitle.color = \"#fff\";\n }\n\n if (options.video?.quality && options.video.defaultQuality !== undefined) {\n options.video.url = options.video.quality[options.video.defaultQuality].url;\n }\n\n if (options.lang) {\n options.lang = options.lang.toLowerCase();\n }\n\n options.contextmenu = (options.contextmenu || []).concat([\n {\n key: \"about-author\",\n link: \"https://github.com/kenji-07/\",\n },\n ]);\n\n return options as KPlayerOptions;\n};\n","type TranslationMap = Record<string, string>;\ntype TranslationDB = Record<string, TranslationMap>;\n\nfunction i18n(\n this: { lang: string; fallbackLang: string; tran: (key: string) => string },\n lang: string,\n): void {\n this.lang = lang;\n this.fallbackLang = this.lang.includes(\"-\")\n ? this.lang.split(\"-\")[0]\n : this.lang;\n this.tran = (key: string): string => {\n key = key.toLowerCase();\n if (tranTxt[this.lang] && tranTxt[this.lang][key]) {\n return tranTxt[this.lang][key];\n } else if (tranTxt[this.fallbackLang] && tranTxt[this.fallbackLang][key]) {\n return tranTxt[this.fallbackLang][key];\n } else if (standard[key]) {\n return standard[key];\n } else {\n return key;\n }\n };\n}\n\nconst standard: TranslationMap = {\n \"awaken-loading\": \"Awaken ачааллаж байна\",\n top: \"Дээд\",\n bottom: \"Доод\",\n rolling: \"Гүйлгэх\",\n \"input-awaken-enter\": \"Awaken бичээд Enter дарна уу\",\n \"about-author\": \"Зохиогчийн тухай\",\n \"kplayer-feedback\": \"KPlayer санал хүсэлт\",\n \"about-kplayer\": \"KPlayer-ийн тухай\",\n loop: \"Дахин тоглуулах\",\n speed: \"Тоглуулах хурд\",\n quality: \"Бичлэгийн чанар\",\n \"opacity-awaken\": \"Awaken тунгалаг байдал\",\n normal: \"Хэвийн\",\n \"please-input-awaken\": \"Awaken текст оруулна уу!\",\n \"set-awaken-color\": \"Awaken өнгө тохируулах\",\n \"set-awaken-type\": \"Awaken төрөл тохируулах\",\n \"show-awaken\": \"Awaken харуулах\",\n \"video-failed\": \"Видео ачааллахад алдаа гарлаа\",\n \"awaken-failed\": \"Awaken ачааллахад алдаа гарлаа\",\n \"awaken-send-failed\": \"Awaken илгээхэд алдаа гарлаа\",\n \"switching-quality\": \"Чанар солигдож байна: %q\",\n \"switched-quality\": \"Чанар солигдлоо: %q\",\n ff: \">> %s секунд\",\n rew: \"<< %s секунд\",\n \"unlimited-awaken\": \"Хязгааргүй awaken\",\n \"send-awaken\": \"Awaken илгээх\",\n setting: \"ТОХИРГОО\",\n fullscreen: \"Бүтэн дэлгэц\",\n \"web-fullscreen\": \"Вэб бүтэн дэлгэц\",\n send: \"Илгээх\",\n screenshot: \"Дэлгэцийн зураг авах\",\n airplay: \"AirPlay\",\n chromecast: \"Chromecast\",\n subtitle: \"Хадмал орчуулга\",\n off: \"Унтраалттай\",\n \"show-subs\": \"Хадмал харуулах\",\n \"hide-subs\": \"Хадмал нуух\",\n volume: \"Дууны түвшин\",\n live: \"Шууд\",\n \"video-info\": \"Видео мэдээлэл\",\n};\n\nconst tranTxt: TranslationDB = {\n mn: standard,\n en: {\n \"awaken-loading\": \"awaken is loading\",\n top: \"Top\",\n bottom: \"Bottom\",\n rolling: \"Rolling\",\n \"input-awaken-enter\": \"Input awaken, hit Enter\",\n \"about-author\": \"About author\",\n \"kplayer-feedback\": \"KPlayer feedback\",\n \"about-kplayer\": \"About KPlayer\",\n loop: \"Loop\",\n speed: \"Speed\",\n quality: \"Quality\",\n \"opacity-awaken\": \"Opacity for awaken\",\n normal: \"Normal\",\n \"please-input-awaken\": \"Please input awaken content!\",\n \"set-awaken-color\": \"Set awaken color\",\n \"set-awaken-type\": \"Set awaken type\",\n \"show-awaken\": \"Show awaken\",\n \"video-failed\": \"Video load failed\",\n \"awaken-failed\": \"awaken load failed\",\n \"awaken-send-failed\": \"awaken send failed\",\n \"switching-quality\": \"Switching to %q quality\",\n \"switched-quality\": \"Switched to %q quality\",\n ff: \">> %s s\",\n rew: \"<< %s s\",\n \"unlimited-awaken\": \"Unlimited awaken\",\n \"send-awaken\": \"Send awaken\",\n setting: \"Setting\",\n fullscreen: \"Full screen\",\n \"web-fullscreen\": \"Web full screen\",\n send: \"Send\",\n screenshot: \"Screenshot\",\n airplay: \"AirPlay\",\n chromecast: \"ChromeCast\",\n subtitle: \"Subtitle\",\n off: \"Off\",\n \"show-subs\": \"Show subtitle\",\n \"hide-subs\": \"Hide subtitle\",\n volume: \"Volume\",\n live: \"Live\",\n \"video-info\": \"Video info\",\n },\n \"zh-cn\": {\n \"awaken-loading\": \"弹幕加载中\",\n top: \"顶部\",\n bottom: \"底部\",\n rolling: \"滚动\",\n \"input-awaken-enter\": \"输入弹幕,回车发送\",\n \"about-author\": \"关于作者\",\n \"kplayer-feedback\": \"播放器意见反馈\",\n \"about-kplayer\": \"关于 KPlayer 播放器\",\n loop: \"洗脑循环\",\n speed: \"速度\",\n quality: \"画质\",\n \"opacity-awaken\": \"弹幕透明度\",\n normal: \"正常\",\n \"please-input-awaken\": \"要输入弹幕内容啊喂!\",\n \"set-awaken-color\": \"设置弹幕颜色\",\n \"set-awaken-type\": \"设置弹幕类型\",\n \"show-awaken\": \"显示弹幕\",\n \"video-failed\": \"视频加载失败\",\n \"awaken-failed\": \"弹幕加载失败\",\n \"awaken-send-failed\": \"弹幕发送失败\",\n \"switching-quality\": \"正在切换至 %q 画质\",\n \"switched-quality\": \"已经切换至 %q 画质\",\n ff: \"快进 %s 秒\",\n rew: \"快退 %s 秒\",\n \"unlimited-awaken\": \"海量弹幕\",\n \"send-awaken\": \"发送弹幕\",\n setting: \"设置\",\n fullscreen: \"全屏\",\n \"web-fullscreen\": \"页面全屏\",\n send: \"发送\",\n screenshot: \"截图\",\n airplay: \"无线投屏\",\n chromecast: \"ChromeCast\",\n subtitle: \"字幕\",\n off: \"关闭\",\n \"show-subs\": \"显示字幕\",\n \"hide-subs\": \"隐藏字幕\",\n volume: \"音量\",\n live: \"直播\",\n \"video-info\": \"视频统计信息\",\n },\n \"zh-tw\": {\n \"awaken-loading\": \"彈幕載入中\",\n top: \"頂部\",\n bottom: \"底部\",\n rolling: \"滾動\",\n \"input-awaken-enter\": \"輸入彈幕,Enter 發送\",\n \"about-author\": \"關於作者\",\n \"kplayer-feedback\": \"播放器意見回饋\",\n \"about-kplayer\": \"關於 KPlayer 播放器\",\n loop: \"循環播放\",\n speed: \"速度\",\n quality: \"畫質\",\n \"opacity-awaken\": \"彈幕透明度\",\n normal: \"正常\",\n \"please-input-awaken\": \"請輸入彈幕內容啊!\",\n \"set-awaken-color\": \"設定彈幕顏色\",\n \"set-awaken-type\": \"設定彈幕類型\",\n \"show-awaken\": \"顯示彈幕\",\n \"video-failed\": \"影片載入失敗\",\n \"awaken-failed\": \"彈幕載入失敗\",\n \"awaken-send-failed\": \"彈幕發送失敗\",\n \"switching-quality\": \"正在切換至 %q 畫質\",\n \"switched-quality\": \"已經切換至 %q 畫質\",\n ff: \"快進 %s 秒\",\n rew: \"快退 %s 秒\",\n \"unlimited-awaken\": \"巨量彈幕\",\n \"send-awaken\": \"發送彈幕\",\n setting: \"設定\",\n fullscreen: \"全螢幕\",\n \"web-fullscreen\": \"頁面全螢幕\",\n send: \"發送\",\n screenshot: \"截圖\",\n airplay: \"無線投屏\",\n chromecast: \"ChromeCast\",\n subtitle: \"字幕\",\n off: \"關閉\",\n \"show-subs\": \"顯示字幕\",\n \"hide-subs\": \"隱藏字幕\",\n volume: \"音量\",\n live: \"直播\",\n \"video-info\": \"影片統計訊息\",\n },\n \"ko-kr\": {\n \"awaken-loading\": \"awaken를 불러오는 중입니다.\",\n top: \"Top\",\n bottom: \"Bottom\",\n rolling: \"Rolling\",\n \"input-awaken-enter\": \"awaken를 입력하고 Enter를 누르세요.\",\n \"about-author\": \"만든이\",\n \"kplayer-feedback\": \"피드백 보내기\",\n \"about-kplayer\": \"KPlayer 정보\",\n loop: \"반복\",\n speed: \"배속\",\n quality: \"화질\",\n \"opacity-awaken\": \"awaken 불투명도\",\n normal: \"표준\",\n \"please-input-awaken\": \"awaken를 입력하세요!\",\n \"set-awaken-color\": \"awaken 색상\",\n \"set-awaken-type\": \"awaken 설정\",\n \"show-awaken\": \"awaken 표시\",\n \"video-failed\": \"비디오를 불러오지 못했습니다.\",\n \"awaken-failed\": \"awaken를 불러오지 못했습니다.\",\n \"awaken-send-failed\": \"awaken 전송에 실패했습니다.\",\n \"switching-quality\": \"전환 %q 화질\",\n \"switched-quality\": \"전환 됨 %q 화질\",\n ff: \"앞으로 %s 초\",\n rew: \"뒤로 %s 초\",\n \"unlimited-awaken\": \"끝없는 awaken\",\n \"send-awaken\": \"awaken 보내기\",\n setting: \"설정\",\n fullscreen: \"전체 화면\",\n \"web-fullscreen\": \"웹 내 전체화면\",\n send: \"보내기\",\n screenshot: \"화면 캡쳐\",\n airplay: \"에어플레이\",\n chromecast: \"ChromeCast\",\n subtitle: \"부제\",\n off: \"끄다\",\n \"show-subs\": \"자막 보이기\",\n \"hide-subs\": \"자막 숨기기\",\n volume: \"볼륨\",\n live: \"생방송\",\n \"video-info\": \"비디오 정보\",\n },\n de: {\n \"awaken-loading\": \"awaken lädt...\",\n top: \"Oben\",\n bottom: \"Unten\",\n rolling: \"Rollend\",\n \"input-awaken-enter\": \"Drücke Enter nach dem Einfügen vom awaken\",\n \"about-author\": \"Über den Autor\",\n \"kplayer-feedback\": \"KPlayer Feedback\",\n \"about-kplayer\": \"Über KPlayer\",\n loop: \"Wiederholen\",\n speed: \"Geschwindigkeit\",\n quality: \"Qualität\",\n \"opacity-awaken\": \"Transparenz für awaken\",\n normal: \"Normal\",\n \"please-input-awaken\": \"Bitte awaken Inhalt eingeben!\",\n \"set-awaken-color\": \"awaken Farbe festlegen\",\n \"set-awaken-type\": \"awaken Typ festlegen\",\n \"show-awaken\": \"Zeige awaken\",\n \"video-failed\": \"Das Video konnte nicht geladen werden\",\n \"awaken-failed\": \"awaken konnte nicht geladen werden\",\n \"awaken-send-failed\": \"Das senden von awaken ist fehgeschlagen\",\n \"switching-quality\": \"Wechsle zur %q Qualität\",\n \"switched-quality\": \"Zur %q Qualität gewechselt\",\n ff: \"%s s Vorwärts\",\n rew: \"%s s Zurück\",\n \"unlimited-awaken\": \"Unlimitiertes awaken\",\n \"send-awaken\": \"Sende awaken\",\n setting: \"Einstellungen\",\n fullscreen: \"Vollbild\",\n \"web-fullscreen\": \"Browser Vollbild\",\n send: \"Senden\",\n screenshot: \"Screenshot\",\n airplay: \"AirPlay\",\n chromecast: \"ChromeCast\",\n subtitle: \"Untertitel\",\n off: \"Schließung\",\n \"show-subs\": \"Zeige Untertitel\",\n \"hide-subs\": \"Verstecke Untertitel\",\n volume: \"Lautstärke\",\n live: \"Live\",\n \"video-info\": \"Video Info\",\n },\n ja: {\n \"awaken-loading\": \"コメントを読み込んでいます\",\n top: \"トップ\",\n bottom: \"ボトム\",\n rolling: \"スクロール\",\n \"input-awaken-enter\": \"コメントを入力し,Enter で送信\",\n \"about-author\": \"作者について\",\n \"kplayer-feedback\": \"KPlayer についての意見・要望\",\n \"about-kplayer\": \"KPlayer について\",\n loop: \"くり返し\",\n speed: \"再生速度\",\n quality: \"へ\",\n \"opacity-awaken\": \"コメントの透明度\",\n normal: \"通常\",\n \"please-input-awaken\": \"コメントを入力してください!\",\n \"set-awaken-color\": \"コメントの色\",\n \"set-awaken-type\": \"コメントの種類\",\n \"show-awaken\": \"コメント表示\",\n \"video-failed\": \"ビデオの読み込みに失敗\",\n \"awaken-failed\": \"コメントの読み込みに失敗\",\n \"awaken-send-failed\": \"コメントの送信に失敗\",\n \"switching-quality\": \"%qへ切り替え中\",\n \"switched-quality\": \"%qへ切り替え完了\",\n ff: \"%s 秒早送り\",\n rew: \"%s 秒早戻し\",\n \"unlimited-awaken\": \"コメント無制限\",\n \"send-awaken\": \"コメント送信\",\n setting: \"設定\",\n fullscreen: \"全画面表示\",\n \"web-fullscreen\": \"ブラウザ全体表示\",\n send: \"送信\",\n screenshot: \"画面コピー\",\n airplay: \"AirPlay\",\n chromecast: \"ChromeCast\",\n subtitle: \"字幕\",\n off: \"OFF\",\n \"show-subs\": \"字幕表示\",\n \"hide-subs\": \"字幕非表示\",\n volume: \"音量\",\n live: \"ライブ\",\n \"video-info\": \"動画情報\",\n },\n ru: {\n \"awaken-loading\": \"Загрузка комментариев\",\n top: \"Вверху\",\n bottom: \"Внизу\",\n rolling: \"Лента\",\n \"input-awaken-enter\": \"Введите комментарий, нажмите Enter\",\n \"about-author\": \"Об авторе\",\n \"kplayer-feedback\": \"Обратная связь\",\n \"about-kplayer\": \"О плеере\",\n loop: \"Закольцевать\",\n speed: \"Скорость\",\n quality: \"Качество\",\n \"opacity-awaken\": \"Прозрачность\",\n normal: \"Обычный\",\n \"please-input-awaken\": \"Пожалуйста, введите комментарий!\",\n \"set-awaken-color\": \"Цвет комментария\",\n \"set-awaken-type\": \"Тип комментария\",\n \"show-awaken\": \"Показать комментарии\",\n \"video-failed\": \"Ошибка загрузки видео\",\n \"awaken-failed\": \"Ошибка загрузки комментариев\",\n \"awaken-send-failed\": \"Ошибка отправки комментария\",\n \"switching-quality\": \"Переключение качества на: %q\",\n \"switched-quality\": \"Установлено качество: %q\",\n ff: \"Вперёд: %s с\",\n rew: \"Назад: %s с\",\n \"unlimited-awaken\": \"Без ограничений\",\n \"send-awaken\": \"Отправить комментарий\",\n setting: \"Настройки\",\n fullscreen: \"На весь экран\",\n \"web-fullscreen\": \"На весь Web экран\",\n send: \"Отправить\",\n screenshot: \"Скриншот\",\n airplay: \"AirPlay\",\n chromecast: \"ChromeCast\",\n subtitle: \"Комментарий\",\n off: \"Выкл\",\n \"show-subs\": \"Показать комментарии\",\n \"hide-subs\": \"Скрыть комментарии\",\n volume: \"Громкость\",\n live: \"Живые комментарии\",\n \"video-info\": \"Информация о видео\",\n },\n};\n\nexport { i18n };\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 16 32\\\">\\n <path d=\\\"M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 17 32\\\">\\n <path d=\\\"M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 21 32\\\">\\n <path d=\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 21 32\\\">\\n <path d=\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 21 32\\\">\\n <path d=\\\"M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 32 33\\\">\\n <path d=\\\"M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 32 33\\\">\\n <path d=\\\"M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 32 28\\\">\\n <path d=\\\"M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z\\\"></path>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"icon icon-tabler icons-tabler-outline icon-tabler-camera\\\"><path stroke=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/><path d=\\\"M5 7h1a2 2 0 0 0 2 -2a1 1 0 0 1 1 -1h6a1 1 0 0 1 1 1a2 2 0 0 0 2 2h1a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-9a2 2 0 0 1 2 -2\\\" /><path d=\\\"M9 13a3 3 0 1 0 6 0a3 3 0 0 0 -6 0\\\" /></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"icon icon-tabler icons-tabler-outline icon-tabler-broadcast\\\"><path stroke=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/><path d=\\\"M18.364 19.364a9 9 0 1 0 -12.728 0\\\" /><path d=\\\"M15.536 16.536a5 5 0 1 0 -7.072 0\\\" /><path d=\\\"M11 13a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\\\" /></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"icon icon-tabler icons-tabler-outline icon-tabler-subtitles\\\"><path stroke=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/><path d=\\\"M18 5a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3l12 0\\\" /><path d=\\\"M7 15h5\\\" /><path d=\\\"M15 15h2\\\" /><path d=\\\"M17 12h-3\\\" /><path d=\\\"M11 12h-1\\\" /></svg>\"","export default \"<svg height=\\\"100%\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 22 22\\\">\\n <svg x=\\\"7\\\" y=\\\"1\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-0\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"11\\\" y=\\\"3\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-1\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"13\\\" y=\\\"7\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-2\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"11\\\" y=\\\"11\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-3\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"7\\\" y=\\\"13\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-4\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"3\\\" y=\\\"11\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-5\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"1\\\" y=\\\"7\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-6\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n <svg x=\\\"3\\\" y=\\\"3\\\">\\n <circle class=\\\"diplayer-loading-dot diplayer-loading-dot-7\\\" cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle>\\n </svg>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"icon icon-tabler icons-tabler-outline icon-tabler-cast\\\"><path stroke=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/><path d=\\\"M3 19l.01 0\\\" /><path d=\\\"M7 19a4 4 0 0 0 -4 -4\\\" /><path d=\\\"M11 19a8 8 0 0 0 -8 -8\\\" /><path d=\\\"M15 19h3a3 3 0 0 0 3 -3v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -2.8 2\\\" /></svg>\"","export default \"<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\">\\n <g><path d=\\\"M990,503.4c0,25.9-21,46.9-46.9,46.9H56.9c-25.9,0-46.9-21-46.9-46.9v-4.6c0-25.9,21-46.9,46.9-46.9h886.1c25.9,0,46.9,21,46.9,46.9V503.4z\\\"></path><path d=\\\"M430.9,131.1c18.3,18.3,18.3,48.1,0,66.4L93.1,535.2c-18.3,18.3-48.1,18.3-66.4,0l-2.9-2.9C5.5,514,5.5,484.3,23.9,466l337.7-337.7c18.3-18.3,48.1-18.3,66.4,0L430.9,131.1z\\\"></path><path d=\\\"M430.9,868.9c18.3-18.3,18.3-48.1,0-66.4L93.1,464.8c-18.3-18.3-48.1-18.3-66.4,0l-2.9,2.9C5.5,486,5.5,515.7,23.9,534l337.7,337.7c18.3,18.3,48.1,18.3,66.4,0L430.9,868.9z\\\"></path></g>\\n </svg>\"","export default \"<svg height=\\\"64\\\" viewBox=\\\"0 0 52 58\\\" width=\\\"64\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\">\\n <path d=\\\"m 5.5924415,15.888 c 0.689576,-0.850221 1.934556,-0.988067 2.793425,-0.309293 0.858869,0.678775 1.01244,1.921914 0.344575,2.789293 -3.080792,3.874075 -4.749496,8.682314 -4.731,13.632 C 3.9968145,43.81419 13.325754,53.521229 25.13073,53.987735 36.935706,54.45424 47.001556,45.513639 47.931221,33.736084 48.860886,21.958529 40.322412,11.54939 28.590442,10.158 l 2.709,2.323 c 0.805609,0.726128 0.885668,1.962033 0.180472,2.786027 -0.705196,0.823994 -1.938636,0.935771 -2.780472,0.251973 l -7,-6 C 21.25581,9.139031 21.000457,8.5841111 21.000457,8 c 0,-0.5841111 0.255353,-1.1390314 0.698985,-1.519 l 7,-6 c 0.539853,-0.48659126 1.301183,-0.64202535 1.988568,-0.4059887 0.687386,0.2360366 1.192625,0.8263892 1.319668,1.5419814 C 32.134722,2.3325849 31.863571,3.0607745 31.299442,3.519 l -3.019,2.587 C 42.289945,7.3398222 52.778928,19.489857 51.954757,33.529417 51.130586,47.568977 39.292047,58.408309 25.234406,57.994492 11.176766,57.580675 -0.00366845,46.06373 -5.5845031e-4,32 -0.02194145,26.149702 1.9507985,20.466743 5.5924415,15.888 Z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 18.518442,15.3 c -0.345217,0.403014 -0.836445,0.652314 -1.365537,0.693013 -0.529093,0.0407 -1.05267,-0.130538 -1.455463,-0.476013 l -7.0000005,-6 C 8.2538095,9.137031 7.9984565,8.5821111 7.9984565,7.998 c 0,-0.5841111 0.255353,-1.1390315 0.698985,-1.519 l 7.0000005,-6 c 0.539853,-0.48659126 1.301183,-0.64202535 1.988568,-0.4059887 0.687386,0.2360366 1.192625,0.8263892 1.319668,1.5419814 C 19.132722,2.3305849 18.861571,3.0587745 18.297442,3.517 l -5.225,4.483 5.227,4.481 c 0.838569,0.718149 0.936595,1.979957 0.219,2.819 z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 15,40 c -1.104569,0 -2,0.895431 -2,2 0,1.104569 0.895431,2 2,2 h 6 c 1.104569,0 2,-0.895431 2,-2 0,-1.104569 -0.895431,-2 -2,-2 H 20 V 23 C 19.999864,22.262562 19.593937,21.58503 18.943766,21.237045 18.293595,20.88906 17.504684,20.92709 16.891,21.336 l -3,2 c -0.895079,0.599923 -1.153983,1.801111 -0.585512,2.716488 C 13.87396,26.967865 15.06543,27.268334 16,26.732 V 40 Z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 31,21 c -2.761424,0 -5,2.238576 -5,5 v 13 c 0,2.761424 2.238576,5 5,5 h 3 c 2.761424,0 5,-2.238576 5,-5 V 26 c 0,-2.761424 -2.238576,-5 -5,-5 z m 4,5 v 13 c 0,0.552285 -0.447715,1 -1,1 h -3 c -0.552285,0 -1,-0.447715 -1,-1 V 26 c 0,-0.552285 0.447715,-1 1,-1 h 3 c 0.552285,0 1,0.447715 1,1 z\\\" fill-rule=\\\"nonzero\\\"/>\\n </g>\\n</svg>\"","export default \"<svg height=\\\"64\\\" viewBox=\\\"0 0 52 58\\\" width=\\\"64\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g fill=\\\"currentColor\\\" fill-rule=\\\"evenodd\\\">\\n <path d=\\\"M 46.407,15.888 C 45.717424,15.037779 44.472444,14.899933 43.613575,15.578707 42.754706,16.257482 42.601135,17.500621 43.269,18.368 46.349792,22.242075 48.018496,27.050314 48,32 48.002627,43.81419 38.673688,53.521229 26.868712,53.987735 15.063736,54.45424 4.9978851,45.513639 4.0682205,33.736084 3.1385559,21.958529 11.67703,11.54939 23.409,10.158 L 20.7,12.481 c -0.805609,0.726128 -0.885668,1.962033 -0.180472,2.786027 0.705196,0.823994 1.938636,0.935771 2.780472,0.251973 l 7,-6 C 30.743632,9.139031 30.998985,8.5841111 30.998985,8 30.998985,7.4158889 30.743632,6.8609686 30.3,6.481 l -7,-6 C 22.760147,-0.00559126 21.998817,-0.16102535 21.311432,0.0750113 20.624046,0.3110479 20.118807,0.9014005 19.991764,1.6169927 19.86472,2.3325849 20.135871,3.0607745 20.7,3.519 l 3.019,2.587 C 9.709497,7.3398222 -0.77948671,19.489857 0.0446845,33.529417 0.8688557,47.568977 12.707395,58.408309 26.765036,57.994492 40.822676,57.580675 52.00311,46.06373 52,32 52.021383,26.149702 50.048643,20.466743 46.407,15.888 Z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 33.481,15.3 c 0.345217,0.403014 0.836445,0.652314 1.365537,0.693013 0.529093,0.0407 1.05267,-0.130538 1.455463,-0.476013 l 7,-6 c 0.443632,-0.379969 0.698985,-0.9348889 0.698985,-1.519 0,-0.5841111 -0.255353,-1.1390315 -0.698985,-1.519 l -7,-6 C 35.762147,-0.00759126 35.000817,-0.16302535 34.313432,0.0730113 33.626046,0.3090479 33.120807,0.8994005 32.993764,1.6149927 32.86672,2.3305849 33.137871,3.0587745 33.702,3.517 L 38.927,8 33.7,12.481 c -0.838569,0.718149 -0.936595,1.979957 -0.219,2.819 z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 15,40 c -1.104569,0 -2,0.895431 -2,2 0,1.104569 0.895431,2 2,2 h 6 c 1.104569,0 2,-0.895431 2,-2 0,-1.104569 -0.895431,-2 -2,-2 H 20 V 23 C 19.999864,22.262562 19.593937,21.58503 18.943766,21.237045 18.293595,20.88906 17.504684,20.92709 16.891,21.336 l -3,2 c -0.895079,0.599923 -1.153983,1.801111 -0.585512,2.716488 C 13.87396,26.967865 15.06543,27.268334 16,26.732 V 40 Z\\\" fill-rule=\\\"nonzero\\\"/>\\n <path d=\\\"m 31,21 c -2.761424,0 -5,2.238576 -5,5 v 13 c 0,2.761424 2.238576,5 5,5 h 3 c 2.761424,0 5,-2.238576 5,-5 V 26 c 0,-2.761424 -2.238576,-5 -5,-5 z m 4,5 v 13 c 0,0.552285 -0.447715,1 -1,1 h -3 c -0.552285,0 -1,-0.447715 -1,-1 V 26 c 0,-0.552285 0.447715,-1 1,-1 h 3 c 0.552285,0 1,0.447715 1,1 z\\\" fill-rule=\\\"nonzero\\\"/>\\n </g>\\n</svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"icon icon-tabler icons-tabler-outline icon-tabler-badge-hd\\\"><path stroke=\\\"none\\\" d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/><path d=\\\"M3 7a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-10\\\" /><path d=\\\"M14 9v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1\\\" /><path d=\\\"M7 15v-6\\\" /><path d=\\\"M10 15v-6\\\" /><path d=\\\"M7 12h3\\\" /></svg>\"","import play from \"../assets/play.svg?raw\";\nimport pause from \"../assets/pause.svg?raw\";\nimport volumeUp from \"../assets/volume-up.svg?raw\";\nimport volumeDown from \"../assets/volume-down.svg?raw\";\nimport volumeOff from \"../assets/volume-off.svg?raw\";\nimport full from \"../assets/full.svg?raw\";\nimport fullWeb from \"../assets/full-web.svg?raw\";\nimport setting from \"../assets/setting.svg?raw\";\nimport right from \"../assets/right.svg?raw\";\nimport pallette from \"../assets/pallette.svg?raw\";\nimport camera from \"../assets/camera.svg?raw\";\nimport airplay from \"../assets/broadcast.svg?raw\";\nimport subtitle from \"../assets/subtitles.svg?raw\";\nimport loading from \"../assets/loading.svg?raw\";\nimport chromecast from \"../assets/cast.svg?raw\";\nimport back from \"../assets/back.svg?raw\";\nimport rewind from \"../assets/backward.svg?raw\";\nimport forward from \"../assets/forward.svg?raw\";\nimport video from \"../assets/hd.svg?raw\";\n\nconst Icons = {\n play,\n pause,\n volumeUp,\n volumeDown,\n volumeOff,\n full,\n fullWeb,\n setting,\n right,\n pallette,\n camera,\n subtitle,\n loading,\n airplay,\n chromecast,\n back,\n rewind,\n forward,\n video,\n};\n\nexport default Icons;\n","import type { SubtitleOptions } from \"../ts/types\";\n\ninterface RenderVideoOptions {\n current?: boolean;\n airplay?: boolean;\n pic?: string;\n screenshot?: boolean;\n preload?: string;\n url?: string;\n subtitle?: SubtitleOptions | null;\n}\n\nfunction escapeAttr(value: unknown): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nexport default function renderVideo({\n current = false,\n airplay = false,\n pic = \"\",\n screenshot = false,\n preload = \"\",\n url = \"\",\n subtitle = null,\n}: RenderVideoOptions = {}): string {\n const enableSubtitle = subtitle && subtitle.type === \"webvtt\";\n\n return `\n<video\n class=\"kplayer-video ${current ? \"kplayer-video-current\" : \"\"}\"\n webkit-playsinline\n ${airplay ? 'x-webkit-airplay=\"allow\"' : \"\"}\n playsinline\n ${pic ? `poster=\"${escapeAttr(pic)}\"` : \"\"}\n ${screenshot ? 'crossorigin=\"anonymous\"' : \"\"}\n ${preload ? `preload=\"${escapeAttr(preload)}\"` : \"\"}\n ${airplay ? \"nosrc\" : url ? `src=\"${escapeAttr(url)}\"` : \"\"}\n>\n ${airplay ? `<source src=\"${escapeAttr(url)}\">` : \"\"}\n</video>`.trim();\n // ← <track> огт байхгүй\n}\n","import renderVideo from \"./video\";\nimport type { KPlayerOptions } from \"../ts/types\";\nimport type Icons from \"../ts/icons\";\n\ninterface RenderPlayerOptions {\n options: KPlayerOptions;\n index: number;\n tran: (key: string) => string;\n icons: typeof Icons;\n mobile: boolean;\n video: {\n current: boolean;\n pic?: string;\n screenshot?: boolean;\n airplay?: boolean;\n chromecast?: boolean;\n preload?: string;\n url?: string;\n subtitle?: KPlayerOptions[\"subtitle\"];\n };\n}\n\nfunction attr(value: unknown): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction html(value: unknown): string {\n return value == null ? \"\" : String(value);\n}\n\nfunction checked(value: unknown): string {\n return value ? \"checked\" : \"\";\n}\n\nexport default function renderPlayer({\n options,\n index: _index,\n tran,\n icons,\n mobile: _mobile,\n video,\n}: RenderPlayerOptions): string {\n const theme = options.theme || \"#b7daff\";\n const awakenBottom =\n options.awaken &&\n typeof options.awaken === \"object\" &&\n options.awaken.bottom\n ? ` style=\"margin-bottom:${attr(options.awaken.bottom)}\"`\n : \"\";\n\n const subtitleIsString =\n options.subtitle && typeof options.subtitle.url === \"string\";\n\n const qualityName =\n options.video?.quality?.[options.video?.defaultQuality ?? 0]?.name || \"\";\n\n const backHTML = options.title?.back\n ? `\n<div class=\"kplayer-back\">\n <button class=\"kplayer-title-back-btn\" aria-label=\"Back\">\n <span class=\"kplayer-icon-content\">${html(icons.back)}</span>\n </button>\n</div>`\n : \"\";\n\n const titleHTML = options.title\n ? `\n${backHTML}\n<div class=\"kplayer-title-bar\">\n <div class=\"kplayer-title-info\">\n <div class=\"kplayer-title-main\">${html(options.title.title || \"\")}</div>\n ${\n options.title.description\n ? `<div class=\"kplayer-title-desc\">${html(options.title.description)}</div>`\n : \"\"\n }\n </div>\n</div>`\n : \"\";\n\n return `\n<div class=\"kplayer-mask\"></div>\n<div class=\"kplayer-video-wrap\">\n ${renderVideo(video)}\n ${\n options.logo\n ? `\n <div class=\"kplayer-logo\">\n <img src=\"${attr(options.logo)}\">\n </div>`\n : \"\"\n }\n ${titleHTML}\n <div class=\"kplayer-awaken\"${awakenBottom}>\n <div class=\"kplayer-awaken-item kplayer-awaken-item--demo\"></div>\n </div>\n <div class=\"kplayer-subtitle\"></div>\n <div class=\"kplayer-bezel\">\n <span class=\"kplayer-bezel-icon\"></span>\n ${\n options.awaken\n ? `\n <span class=\"kplayer-danloading\">${html(tran(\"awaken-loading\"))}</span>`\n : \"\"\n }\n <span class=\"diplayer-loading-icon\">${html(icons.loading)}</span>\n </div>\n</div>\n<div class=\"kplayer-controller-mask\"></div>\n\n\n<div class=\"kplayer-controller\">\n\n <div class=\"kplayer-icons kplayer-icons-left\">\n <div class=\"kplayer-volume\">\n <button class=\"kplayer-icon kplayer-volume-icon\">\n <span class=\"kplayer-icon-content\">${html(icons.volumeDown)}</span>\n </button>\n <div class=\"kplayer-volume-bar-wrap\" data-balloon-pos=\"up\">\n <div class=\"kplayer-volume-bar\">\n <div class=\"kplayer-volume-bar-inner\" style=\"background: ${attr(theme)};\">\n <span class=\"kplayer-thumb\" style=\"background: ${attr(theme)}\"></span>\n </div>\n </div>\n </div>\n </div>\n <span class=\"kplayer-time\">\n <span class=\"kplayer-ptime\">0:00</span> /\n <span class=\"kplayer-dtime\">0:00</span>\n </span>\n ${\n options.live\n ? `\n <span class=\"kplayer-live-badge\"><span class=\"kplayer-live-dot\" style=\"background: ${attr(theme)};\"></span>${html(tran(\"live\"))}</span>`\n : \"\"\n }\n </div>\n\n <div class=\"kplayer-icons kplayer-icons-center\">\n <button class=\"kplayer-icon kplayer-rewind-icon\">\n <span class=\"kplayer-icon-content\">${html(icons.rewind)}</span>\n </button>\n <button class=\"kplayer-icon kplayer-play-icon\">\n <span class=\"kplayer-icon-content\">${html(icons.play)}</span>\n </button>\n <button class=\"kplayer-icon kplayer-forward-icon\">\n <span class=\"kplayer-icon-content\">${html(icons.forward)}</span>\n </button>\n</div>\n\n <div class=\"kplayer-icons kplayer-icons-right\">\n <div class=\"kplayer-camera-icon\"></div>\n <div class=\"kplayer-airplay-icon\"></div>\n <div class=\"kplayer-chromecast-icon\"></div>\n\n <div class=\"kplayer-setting\">\n <button class=\"kplayer-icon kplayer-setting-icon\" data-balloon=\"${attr(tran(\"setting\"))}\" data-balloon-pos=\"up\">\n <span class=\"kplayer-icon-content\">${html(icons.setting)}</span>\n </button>\n\n <div class=\"kplayer-setting-box\">\n <!-- MAIN PANEL -->\n <div class=\"kplayer-setting-origin-panel\">\n\n ${\n options.subtitle\n ? `\n <div class=\"kplayer-setting-item kplayer-setting-subtitle-entry\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.subtitle)}</span>\n <span class=\"kplayer-label\">${html(tran(\"subtitle\"))}</span>\n </div>\n <div class=\"kplayer-setting-item-right\">\n <span class=\"kplayer-setting-current-value\" id=\"kplayer-subtitle-current\"></span>\n <span class=\"kplayer-setting-arrow\">${html(icons.right)}</span>\n </div>\n</div>`\n : \"\"\n }\n\n ${\n options.video?.quality ||\n options.video?.type === \"hls\" ||\n options.video?.type === \"auto\"\n ? `\n <div class=\"kplayer-setting-item kplayer-setting-quality-entry\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.video || icons.setting)}</span>\n <span class=\"kplayer-label\">${html(tran(\"quality\"))}</span>\n </div>\n <div class=\"kplayer-setting-item-right\">\n <span class=\"kplayer-setting-current-value\" id=\"kplayer-quality-current\">${html(qualityName || \"Auto\")}</span>\n <span class=\"kplayer-setting-arrow\">${html(icons.right)}</span>\n </div>\n</div>`\n : \"\"\n }\n\n ${\n options.airplay\n ? `\n <div class=\"kplayer-setting-action kplayer-setting-airplay-entry\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.airplay)}</span>\n <span class=\"kplayer-label\">${html(tran(\"airplay\"))}</span>\n </div>\n </div>`\n : \"\"\n }\n\n ${\n options.chromecast\n ? `\n <div class=\"kplayer-setting-action kplayer-setting-chromecast-entry\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.chromecast)}</span>\n <span class=\"kplayer-label\">${html(tran(\"chromecast\"))}</span>\n </div>\n </div>`\n : \"\"\n }\n\n ${\n options.screenshot\n ? `\n <div class=\"kplayer-setting-action kplayer-setting-screenshot-entry\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.camera)}</span>\n <span class=\"kplayer-label\">${html(tran(\"screenshot\"))}</span>\n </div>\n </div>`\n : \"\"\n }\n\n <div class=\"kplayer-setting-item kplayer-setting-speed\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-label\">${html(tran(\"speed\"))}</span>\n </div>\n <div class=\"kplayer-setting-item-right\">\n <span class=\"kplayer-setting-speed-badge\" id=\"kplayer-speed-current\">1×</span>\n <span class=\"kplayer-setting-arrow\">${html(icons.right)}</span>\n </div>\n</div>\n\n <div class=\"kplayer-setting-item kplayer-setting-loop\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-label\">${html(tran(\"loop\"))}</span>\n </div>\n <div class=\"kplayer-toggle\">\n <input class=\"kplayer-toggle-setting-input\" type=\"checkbox\" name=\"kplayer-toggle\" ${checked(options.loop)}>\n <label for=\"kplayer-toggle\"></label>\n </div>\n</div>\n\n <div class=\"kplayer-setting-item kplayer-setting-showdan\">\n <div class=\"kplayer-toggle\">\n <input class=\"kplayer-showdan-setting-input\" type=\"checkbox\" name=\"kplayer-toggle-dan\" ${checked(true)}>\n <label for=\"kplayer-toggle-dan\"></label>\n </div>\n</div>\n\n <div class=\"kplayer-setting-item kplayer-setting-danunlimit\">\n <span class=\"kplayer-label\">${html(tran(\"unlimited-awaken\"))}</span>\n <div class=\"kplayer-toggle\">\n <input class=\"kplayer-danunlimit-setting-input\" type=\"checkbox\" name=\"kplayer-toggle-danunlimit\" ${checked(\n typeof options.awaken === \"object\" &&\n options.awaken?.unlimited,\n )}>\n <label for=\"kplayer-toggle-danunlimit\"></label>\n </div>\n </div>\n\n <div class=\"kplayer-setting-item kplayer-setting-awaken\">\n <span class=\"kplayer-label\">${html(tran(\"opacity-awaken\"))}</span>\n <div class=\"kplayer-awaken-bar-wrap\">\n <div class=\"kplayer-awaken-bar\">\n <div class=\"kplayer-awaken-bar-inner\">\n <span class=\"kplayer-thumb\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SPEED PANEL -->\n <div class=\"kplayer-setting-speed-panel\">\n <div class=\"kplayer-setting-panel-back kplayer-setting-back-main\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-back-icon\">${html(icons.back)}</span>\n <span class=\"kplayer-label\">${html(tran(\"speed\"))}</span>\n </div>\n </div>\n ${(options.playbackSpeed || [])\n .map(\n (speed) => `\n <div class=\"kplayer-setting-speed-item\" data-speed=\"${attr(speed)}\">\n <span class=\"kplayer-label\">${html(speed === 1 ? tran(\"normal\") : speed)}</span>\n <span class=\"kplayer-check-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n </div>`,\n )\n .join(\"\")}\n </div>\n\n <!-- SUBTITLE PANEL -->\n <div class=\"kplayer-setting-subtitle-panel\">\n <div class=\"kplayer-setting-panel-back kplayer-setting-back-main\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-back-icon\">${html(icons.back)}</span>\n <span class=\"kplayer-label\">${html(tran(\"subtitle\"))}</span>\n </div>\n </div>\n ${\n options.subtitle\n ? subtitleIsString\n ? `\n <div class=\"kplayer-setting-subtitle-toggle\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-action-icon\">${html(icons.subtitle)}</span>\n <span class=\"kplayer-label\">${html(tran(\"hide-subs\"))}</span>\n </div>\n </div>`\n : `\n <div class=\"kplayer-subtitles-inline\">\n <div class=\"kplayer-subtitles-box\">\n <div class=\"kplayer-subtitles-panel\">\n ${(Array.isArray(options.subtitle.url)\n ? options.subtitle.url\n : []\n )\n .map((item) => {\n const subItem = item as {\n url?: string;\n lang?: string;\n name?: string;\n };\n const label = subItem.lang\n ? subItem.name\n ? `${subItem.name} (${tran(subItem.lang)})`\n : tran(subItem.lang)\n : subItem.name || \"\";\n return `\n<div class=\"kplayer-subtitles-item\" data-subtitle=\"${attr(subItem.url)}\">\n <span class=\"kplayer-label\">${html(label)}</span>\n <span class=\"kplayer-check-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n</div>`;\n })\n .join(\"\")}\n </div>\n </div>\n </div>`\n : \"\"\n }\n </div>\n\n <!-- QUALITY PANEL -->\n <div class=\"kplayer-setting-quality-panel\">\n <div class=\"kplayer-setting-panel-back kplayer-setting-back-main\">\n <div class=\"kplayer-setting-action-main\">\n <span class=\"kplayer-setting-back-icon\">${html(icons.back)}</span>\n <span class=\"kplayer-label\">${html(tran(\"quality\"))}</span>\n </div>\n </div>\n ${\n options.video?.quality ||\n options.video?.type === \"hls\" ||\n options.video?.type === \"auto\"\n ? `\n <div class=\"kplayer-quality-inline\">\n <div class=\"kplayer-quality-list\">\n ${\n options.video?.quality\n ? options.video.quality\n .map(\n (item, i) => `\n <div class=\"kplayer-quality-item\" data-index=\"${i}\">\n <span class=\"kplayer-label\">${html(item.name)}</span>\n <span class=\"kplayer-check-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg></span>\n </div>`,\n )\n .join(\"\")\n : \"\"\n }\n </div>\n </div>`\n : \"\"\n }\n </div>\n </div>\n</div>\n\n <button class=\"kplayer-icon kplayer-full-in-icon\" data-balloon=\"${attr(tran(\"web-fullscreen\"))}\" data-balloon-pos=\"up\">\n <span class=\"kplayer-icon-content\">${html(icons.fullWeb)}</span>\n </button>\n <button class=\"kplayer-icon kplayer-full-icon\" data-balloon=\"${attr(tran(\"fullscreen\"))}\" data-balloon-pos=\"up\">\n <span class=\"kplayer-icon-content\">${html(icons.full)}</span>\n </button>\n </div>\n\n <div class=\"kplayer-bar-wrap\">\n <div class=\"kplayer-bar-time hidden\">00:00</div>\n <div class=\"kplayer-bar-preview\"></div>\n <div class=\"kplayer-bar\">\n <div class=\"kplayer-loaded\" style=\"width: 0;\"></div>\n <div class=\"kplayer-played\" style=\"width: 0; background: ${attr(theme)}\">\n <span class=\"kplayer-thumb\" style=\"background: ${attr(theme)}\"></span>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"kplayer-info-panel kplayer-info-panel-hide\">\n <div class=\"kplayer-info-panel-close\">[x]</div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-version\">\n <span class=\"kplayer-info-panel-item-title\">Player version</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-fps\">\n <span class=\"kplayer-info-panel-item-title\">Player FPS</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-type\">\n <span class=\"kplayer-info-panel-item-title\">Video type</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-url\">\n <span class=\"kplayer-info-panel-item-title\">Video url</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-resolution\">\n <span class=\"kplayer-info-panel-item-title\">Video resolution</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-duration\">\n <span class=\"kplayer-info-panel-item-title\">Video duration</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n ${\n options.awaken\n ? `\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-awaken-id\">\n <span class=\"kplayer-info-panel-item-title\">Awaken id</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-awaken-api\">\n <span class=\"kplayer-info-panel-item-title\">Awaken api</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>\n <div class=\"kplayer-info-panel-item kplayer-info-panel-item-awaken-amount\">\n <span class=\"kplayer-info-panel-item-title\">Awaken amount</span>\n <span class=\"kplayer-info-panel-item-data\"></span>\n </div>`\n : \"\"\n }\n</div>\n\n<div class=\"kplayer-menu\">\n ${(options.contextmenu || [])\n .map((item) => {\n const text = `${item.key ? tran(item.key) : \"\"}${item.text ? item.text : \"\"}`;\n return `\n <div class=\"kplayer-menu-item\">\n <a ${item.link ? 'target=\"_blank\"' : \"\"} href=\"${attr(item.link || \"javascript:void(0);\")}\">${html(text)}</a>\n </div>`;\n })\n .join(\"\")}\n</div>\n\n<div class=\"kplayer-notice-list\"></div>\n<button class=\"kplayer-mobile-play\" style=\"display:none!important\">\n ${html(icons.play)}\n</button>\n\n<div class=\"kplayer-mobile-controls\">\n <button class=\"kplayer-mobile-rewind\">\n <span class=\"kplayer-icon-content\">${html(icons.rewind)}</span>\n </button>\n <button class=\"kplayer-mobile-play-btn\">\n <span class=\"kplayer-icon-content\">${html(icons.play)}</span>\n </button>\n <button class=\"kplayer-mobile-forward\">\n <span class=\"kplayer-icon-content\">${html(icons.forward)}</span>\n </button>\n</div>\n\n`.trim();\n}\n","import Icons from \"./icons\";\nimport renderPlayer from \"../template/player\";\nimport utils from \"./utils\";\nimport type { KPlayerOptions } from \"./types\";\nimport { i18n } from \"./i18n\";\n\ninterface TemplateOptions {\n container: HTMLElement;\n options: KPlayerOptions;\n index: number;\n tran: (key: string) => string;\n}\n\nclass Template {\n container: HTMLElement;\n options: KPlayerOptions;\n index: number;\n tran: (key: string) => string;\n\n // DOM refs\n volumeBar!: HTMLElement;\n volumeBarWrap!: HTMLElement;\n volumeBarWrapWrap!: HTMLElement;\n volumeButton!: HTMLElement;\n volumeButtonIcon!: HTMLElement;\n volumeIcon!: HTMLElement;\n playedBar!: HTMLElement;\n loadedBar!: HTMLElement;\n playedBarWrap!: HTMLElement;\n playedBarTime!: HTMLElement;\n awaken!: HTMLElement | null;\n awakenLoading!: HTMLElement | null;\n video!: HTMLVideoElement;\n bezel!: HTMLElement;\n playButton!: HTMLElement;\n mobilePlayButton!: HTMLElement;\n videoWrap!: HTMLElement;\n controllerMask!: HTMLElement;\n ptime!: HTMLElement;\n settingButton!: HTMLElement;\n settingBox!: HTMLElement;\n mask!: HTMLElement;\n loop!: HTMLElement;\n loopToggle!: HTMLInputElement;\n showAwaken!: HTMLElement;\n showAwakenToggle!: HTMLInputElement;\n unlimitAwaken!: HTMLElement;\n unlimitAwakenToggle!: HTMLInputElement;\n speed!: HTMLElement;\n speedItem!: NodeListOf<HTMLElement>;\n awakenOpacityBar!: HTMLElement | null;\n awakenOpacityBarWrap!: HTMLElement | null;\n awakenOpacityBarWrapWrap!: HTMLElement | null;\n awakenOpacityBox!: HTMLElement | null;\n dtime!: HTMLElement;\n controller!: HTMLElement;\n browserFullButton!: HTMLElement;\n webFullButton!: HTMLElement;\n menu!: HTMLElement;\n menuItem!: NodeListOf<HTMLElement>;\n qualityList!: HTMLElement;\n camareButton!: HTMLElement | null;\n airplayButton!: HTMLElement | null;\n chromecastButton!: HTMLElement | null;\n subtitleButton!: HTMLElement | null;\n subtitleButtonInner!: HTMLElement | null;\n subtitlesBox!: HTMLElement | null;\n subtitlesItem!: NodeListOf<HTMLElement>;\n subtitle!: HTMLElement;\n subtrack!: HTMLTrackElement | null;\n barPreview!: HTMLElement;\n barWrap!: HTMLElement;\n noticeList!: HTMLElement;\n infoPanel!: HTMLElement | null;\n infoPanelClose!: HTMLElement | null;\n infoVersion!: HTMLElement | null;\n infoFPS!: HTMLElement | null;\n infoType!: HTMLElement | null;\n infoUrl!: HTMLElement | null;\n infoResolution!: HTMLElement | null;\n infoDuration!: HTMLElement | null;\n infoAwakenId!: HTMLElement | null;\n infoAwakenApi!: HTMLElement | null;\n infoAwakenAmount!: HTMLElement | null;\n subtitlesButton!:\n | HTMLElement\n | {\n addEventListener: () => void;\n dataset: Record<string, string>;\n style: Record<string, string>;\n };\n qualityButton!: HTMLElement;\n titleBar!: HTMLElement | null;\n titleBack!: HTMLElement | null;\n titleMain!: HTMLElement | null;\n titleDesc!: HTMLElement | null;\n subtitleEntry!: HTMLElement | null;\n qualityEntry!: HTMLElement | null;\n qualityItems!: NodeListOf<HTMLElement>;\n\n constructor(options: TemplateOptions) {\n this.container = options.container;\n this.options = options.options;\n this.index = options.index;\n this.tran = options.tran;\n this.init();\n }\n\n init(): void {\n this.container.innerHTML = renderPlayer({\n options: this.options,\n index: this.index,\n tran: this.tran,\n icons: Icons,\n mobile: utils.isMobile,\n video: {\n current: true,\n pic: this.options.video.pic,\n screenshot: this.options.screenshot,\n airplay:\n utils.isSafari && !utils.isChrome ? this.options.airplay : false,\n chromecast: this.options.chromecast,\n preload: this.options.preload,\n url: this.options.video.url,\n subtitle: this.options.subtitle,\n },\n });\n\n const q = <T extends Element>(sel: string) =>\n this.container.querySelector<T>(sel);\n const qa = <T extends Element>(sel: string) =>\n this.container.querySelectorAll<T>(sel);\n\n this.volumeBar = q<HTMLElement>(\".kplayer-volume-bar-inner\")!;\n this.volumeBarWrap = q<HTMLElement>(\".kplayer-volume-bar\")!;\n this.volumeBarWrapWrap = q<HTMLElement>(\".kplayer-volume-bar-wrap\")!;\n this.volumeButton = q<HTMLElement>(\".kplayer-volume\")!;\n this.volumeButtonIcon = q<HTMLElement>(\".kplayer-volume-icon\")!;\n this.volumeIcon = q<HTMLElement>(\n \".kplayer-volume-icon .kplayer-icon-content\",\n )!;\n this.playedBar = q<HTMLElement>(\".kplayer-played\")!;\n this.loadedBar = q<HTMLElement>(\".kplayer-loaded\")!;\n this.playedBarWrap = q<HTMLElement>(\".kplayer-bar-wrap\")!;\n this.playedBarTime = q<HTMLElement>(\".kplayer-bar-time\")!;\n this.awaken = q<HTMLElement>(\".kplayer-awaken\");\n this.awakenLoading = q<HTMLElement>(\".kplayer-danloading\");\n this.video = q<HTMLVideoElement>(\".kplayer-video-current\")!;\n this.bezel = q<HTMLElement>(\".kplayer-bezel-icon\")!;\n this.playButton = q<HTMLElement>(\".kplayer-play-icon\")!;\n this.mobilePlayButton =\n q<HTMLElement>(\".kplayer-mobile-play\") ||\n document.createElement(\"button\");\n this.videoWrap = q<HTMLElement>(\".kplayer-video-wrap\")!;\n this.controllerMask = q<HTMLElement>(\".kplayer-controller-mask\")!;\n this.ptime = q<HTMLElement>(\".kplayer-ptime\")!;\n this.settingButton = q<HTMLElement>(\".kplayer-setting-icon\")!;\n this.settingBox = q<HTMLElement>(\".kplayer-setting-box\")!;\n this.mask = q<HTMLElement>(\".kplayer-mask\")!;\n this.loop = q<HTMLElement>(\".kplayer-setting-loop\")!;\n this.loopToggle = q<HTMLInputElement>(\n \".kplayer-setting-loop .kplayer-toggle-setting-input\",\n )!;\n this.showAwaken = q<HTMLElement>(\".kplayer-setting-showdan\")!;\n this.showAwakenToggle = q<HTMLInputElement>(\n \".kplayer-showdan-setting-input\",\n )!;\n this.unlimitAwaken = q<HTMLElement>(\".kplayer-setting-danunlimit\")!;\n this.unlimitAwakenToggle = q<HTMLInputElement>(\n \".kplayer-danunlimit-setting-input\",\n )!;\n this.speed = q<HTMLElement>(\".kplayer-setting-speed\")!;\n this.speedItem = qa<HTMLElement>(\".kplayer-setting-speed-item\");\n this.awakenOpacityBar = q<HTMLElement>(\".kplayer-awaken-bar-inner\");\n this.awakenOpacityBarWrap = q<HTMLElement>(\".kplayer-awaken-bar\");\n this.awakenOpacityBarWrapWrap = q<HTMLElement>(\".kplayer-awaken-bar-wrap\");\n this.awakenOpacityBox = q<HTMLElement>(\".kplayer-setting-awaken\");\n this.dtime = q<HTMLElement>(\".kplayer-dtime\")!;\n this.controller = q<HTMLElement>(\".kplayer-controller\")!;\n this.browserFullButton = q<HTMLElement>(\".kplayer-full-icon\")!;\n this.webFullButton = q<HTMLElement>(\".kplayer-full-in-icon\")!;\n this.menu = q<HTMLElement>(\".kplayer-menu\")!;\n this.menuItem = qa<HTMLElement>(\".kplayer-menu-item\");\n this.qualityList = q<HTMLElement>(\".kplayer-quality-list\")!;\n this.camareButton = q<HTMLElement>(\".kplayer-camera-icon\");\n this.airplayButton = q<HTMLElement>(\".kplayer-airplay-icon\");\n this.chromecastButton = q<HTMLElement>(\".kplayer-chromecast-icon\");\n this.subtitleButton = q<HTMLElement>(\".kplayer-subtitle-icon\");\n this.subtitleButtonInner = q<HTMLElement>(\n \".kplayer-subtitle-icon .kplayer-icon-content\",\n );\n this.subtitlesBox = q<HTMLElement>(\".kplayer-subtitles-box\");\n this.subtitlesItem = qa<HTMLElement>(\".kplayer-subtitles-item\");\n this.subtitle = q<HTMLElement>(\".kplayer-subtitle\")!;\n this.subtrack = q<HTMLTrackElement>(\".kplayer-subtrack\");\n this.barPreview = q<HTMLElement>(\".kplayer-bar-preview\")!;\n this.barWrap = q<HTMLElement>(\".kplayer-bar-wrap\")!;\n this.noticeList = q<HTMLElement>(\".kplayer-notice-list\")!;\n this.infoPanel = q<HTMLElement>(\".kplayer-info-panel\");\n this.infoPanelClose = q<HTMLElement>(\".kplayer-info-panel-close\");\n this.infoVersion = q<HTMLElement>(\n \".kplayer-info-panel-item-version .kplayer-info-panel-item-data\",\n );\n this.infoFPS = q<HTMLElement>(\n \".kplayer-info-panel-item-fps .kplayer-info-panel-item-data\",\n );\n this.infoType = q<HTMLElement>(\n \".kplayer-info-panel-item-type .kplayer-info-panel-item-data\",\n );\n this.infoUrl = q<HTMLElement>(\n \".kplayer-info-panel-item-url .kplayer-info-panel-item-data\",\n );\n this.infoResolution = q<HTMLElement>(\n \".kplayer-info-panel-item-resolution .kplayer-info-panel-item-data\",\n );\n this.infoDuration = q<HTMLElement>(\n \".kplayer-info-panel-item-duration .kplayer-info-panel-item-data\",\n );\n this.infoAwakenId = q<HTMLElement>(\n \".kplayer-info-panel-item-awaken-id .kplayer-info-panel-item-data\",\n );\n this.infoAwakenApi = q<HTMLElement>(\n \".kplayer-info-panel-item-awaken-api .kplayer-info-panel-item-data\",\n );\n this.infoAwakenAmount = q<HTMLElement>(\n \".kplayer-info-panel-item-awaken-amount .kplayer-info-panel-item-data\",\n );\n this.subtitlesButton = q<HTMLElement>(\".kplayer-subtitles-icon\") || {\n addEventListener: () => {},\n dataset: {},\n style: {},\n };\n this.qualityButton =\n q<HTMLElement>(\".kplayer-quality-icon\") || document.createElement(\"span\");\n this.titleBar = q<HTMLElement>(\".kplayer-title-bar\");\n this.titleBack = q<HTMLElement>(\".kplayer-title-back-btn\");\n this.titleMain = q<HTMLElement>(\".kplayer-title-main\");\n this.titleDesc = q<HTMLElement>(\".kplayer-title-desc\");\n this.subtitleEntry = q<HTMLElement>(\".kplayer-setting-subtitle-entry\");\n this.qualityEntry = q<HTMLElement>(\".kplayer-setting-quality-entry\");\n this.qualityItems = qa<HTMLElement>(\".kplayer-quality-item\");\n }\n\n static NewNotice(text: string, opacity: number, id?: string): HTMLElement {\n const notice = document.createElement(\"div\");\n notice.classList.add(\"kplayer-notice\");\n notice.style.opacity = String(opacity);\n notice.innerText = text;\n if (id) {\n notice.id = `kplayer-notice-${id}`;\n }\n return notice;\n }\n}\n\nexport default Template;\n","import type Kplayer from \"./player\";\nimport type { AdItem } from \"./types\";\n\nclass Ad {\n player: Kplayer;\n options: { url: AdItem[] } | null;\n currentAd: AdItem | null = null;\n adContainer: HTMLDivElement | null = null;\n adContent!: HTMLDivElement;\n skipBtn!: HTMLButtonElement;\n deeplinkBtn!: HTMLButtonElement;\n adLabel!: HTMLDivElement;\n skipTimer?: ReturnType<typeof setInterval>;\n skipRemaining = 0;\n adMarkers: HTMLElement[] = [];\n private _timeUpdateBound = false;\n private _shownAds: Set<string> = new Set();\n private _adVideo: HTMLVideoElement | null = null;\n\n constructor(player: Kplayer) {\n this.player = player;\n this.options = player.options.ad || null;\n this._createAdContainer();\n\n if (\n this.options &&\n Array.isArray(this.options.url) &&\n this.options.url.length > 0\n ) {\n this._renderBarMarkers();\n this._bindTimeUpdate();\n }\n }\n\n private _createAdContainer(): void {\n const wrap = this.player.template.videoWrap;\n\n this.adContainer = document.createElement(\"div\");\n this.adContainer.className = \"kplayer-ad-container\";\n Object.assign(this.adContainer.style, {\n display: \"none\",\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n zIndex: \"50\",\n background: \"#000\",\n });\n\n this.adContent = document.createElement(\"div\");\n this.adContent.className = \"kplayer-ad-content\";\n Object.assign(this.adContent.style, {\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\",\n });\n\n this.skipBtn = document.createElement(\"button\");\n this.skipBtn.className = \"kplayer-ad-skip-btn\";\n Object.assign(this.skipBtn.style, {\n position: \"absolute\",\n bottom: \"60px\",\n right: \"16px\",\n zIndex: \"60\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"6px 14px\",\n border: \"none\",\n borderRadius: \"2px\",\n background: \"rgba(22, 22, 26, 0.96)\",\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: \"13px\",\n fontWeight: \"400\",\n cursor: \"pointer\",\n });\n this.skipBtn.innerHTML = `<span class=\"kplayer-ad-skip-text\">Skip ad in <span class=\"kplayer-ad-skip-count\">5</span>s</span>`;\n this.skipBtn.addEventListener(\"click\", () => this._skipAd());\n\n this.deeplinkBtn = document.createElement(\"button\");\n this.deeplinkBtn.className = \"kplayer-ad-deeplink-btn\";\n Object.assign(this.deeplinkBtn.style, {\n position: \"absolute\",\n bottom: \"60px\",\n left: \"16px\",\n zIndex: \"60\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"6px 14px\",\n border: \"none\",\n borderRadius: \"2px\",\n background: \"rgba(22, 22, 26, 0.96)\",\n color: \"rgba(255, 255, 255, 0.88)\",\n fontSize: \"13px\",\n cursor: \"pointer\",\n });\n this.deeplinkBtn.textContent = \"Learn more\";\n this.deeplinkBtn.addEventListener(\"click\", () => {\n if (this.currentAd?.deeplink) {\n window.open(this.currentAd.deeplink, \"_blank\");\n }\n });\n\n this.adLabel = document.createElement(\"div\");\n this.adLabel.className = \"kplayer-ad-label\";\n Object.assign(this.adLabel.style, {\n position: \"absolute\",\n top: \"12px\",\n left: \"16px\",\n zIndex: \"60\",\n padding: \"3px 8px\",\n borderRadius: \"2px\",\n background: \"rgba(22, 22, 26, 0.8)\",\n color: \"rgba(255, 255, 255, 0.6)\",\n fontSize: \"11px\",\n letterSpacing: \"0.04em\",\n });\n this.adLabel.textContent = \"Ad\";\n\n this.adContainer.appendChild(this.adContent);\n this.adContainer.appendChild(this.skipBtn);\n this.adContainer.appendChild(this.deeplinkBtn);\n this.adContainer.appendChild(this.adLabel);\n wrap.appendChild(this.adContainer);\n }\n\n private _createMarker(pct: number, ad: AdItem): HTMLElement {\n const marker = document.createElement(\"div\");\n marker.className = \"kplayer-ad-marker\";\n marker.style.left = `${pct}%`;\n\n const tooltip = document.createElement(\"span\");\n tooltip.className = \"kplayer-ad-marker-text\";\n\n let tooltipText = \"Ad\";\n if (ad.name?.includes(\"vast_\")) {\n const offset = ad.name.replace(\"vast_\", \"\");\n tooltipText =\n offset === \"start\" || offset === \"end\" ? \"Ad\" : `Ad · ${offset}`;\n } else if (ad.name) {\n tooltipText = ad.name;\n }\n tooltip.textContent = tooltipText;\n marker.appendChild(tooltip);\n\n return marker;\n }\n\n private _renderBarMarkers(): void {\n this.player.on(\"durationchange\", () => {\n const duration = this.player.video.duration;\n if (!duration || duration === Infinity) return;\n\n this.adMarkers.forEach((m) => m.parentNode?.removeChild(m));\n this.adMarkers = [];\n\n (this.options?.url || []).forEach((ad) => {\n if (ad.startTime === undefined || ad.startTime <= 0) return;\n const pct = (ad.startTime / duration) * 100;\n if (pct >= 100) return;\n\n const marker = this._createMarker(pct, ad);\n this.player.template.playedBarWrap.appendChild(marker);\n this.adMarkers.push(marker);\n });\n });\n }\n\n private _bindTimeUpdate(): void {\n if (this._timeUpdateBound) return;\n this._timeUpdateBound = true;\n\n this.player.on(\"timeupdate\", () => {\n if (this.currentAd) return;\n if (!this.options?.url) return;\n\n const currentTime = this.player.video.currentTime;\n const duration = this.player.video.duration;\n\n for (const ad of this.options.url) {\n if (ad._isPostroll && duration && duration !== Infinity) {\n ad.startTime = duration - 1;\n }\n\n const key = `${ad.name}_${ad.startTime}`;\n if (this._shownAds.has(key)) continue;\n\n const diff = Math.abs(currentTime - (ad.startTime || 0));\n if (diff < 0.8) {\n this._shownAds.add(key);\n if (ad._impressionUrl) fetch(ad._impressionUrl).catch(() => {});\n this._showAd(ad);\n break;\n }\n }\n });\n }\n\n private _showAd(ad: AdItem): void {\n this.currentAd = ad;\n this.adContent.innerHTML = \"\";\n if (this.adContainer) this.adContainer.style.display = \"block\";\n\n this.deeplinkBtn.style.display = ad.deeplink ? \"flex\" : \"none\";\n\n if (ad.type === \"image\") {\n this._showImageAd(ad);\n } else if (ad.type === \"text\") {\n this._showTextAd(ad);\n } else if (ad.type === \"video\") {\n this._showVideoAd(ad);\n }\n\n if (ad.type !== \"video\") {\n this.player.pause();\n } else {\n this.player.video.pause();\n }\n\n this._startSkipTimer(ad.skipTime || 5);\n }\n\n private _showImageAd(ad: AdItem): void {\n const img = document.createElement(\"img\");\n img.src = ad.url;\n Object.assign(img.style, {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n cursor: ad.deeplink ? \"pointer\" : \"default\",\n });\n if (ad.deeplink) {\n img.addEventListener(\"click\", () => window.open(ad.deeplink, \"_blank\"));\n }\n this.adContent.appendChild(img);\n }\n\n private _showTextAd(ad: AdItem): void {\n const bg = ad.backroundColor\n ? ad.backroundColor.startsWith(\"#\")\n ? ad.backroundColor\n : \"#\" + ad.backroundColor\n : \"#1a1a1a\";\n\n this.adContent.style.background = bg;\n if (this.adContainer) this.adContainer.style.background = bg;\n\n const text = document.createElement(\"div\");\n Object.assign(text.style, {\n color: \"#fff\",\n fontSize: \"18px\",\n fontWeight: \"400\",\n textAlign: \"center\",\n padding: \"24px\",\n lineHeight: \"1.6\",\n cursor: ad.deeplink ? \"pointer\" : \"default\",\n });\n text.textContent = ad.url;\n if (ad.deeplink) {\n text.addEventListener(\"click\", () => window.open(ad.deeplink, \"_blank\"));\n }\n this.adContent.appendChild(text);\n }\n\n private _showVideoAd(ad: AdItem): void {\n if (this.adContainer) this.adContainer.style.background = \"#000\";\n this.adContent.style.background = \"#000\";\n\n const video = document.createElement(\"video\");\n video.src = ad.url;\n video.autoplay = true;\n video.controls = false;\n Object.assign(video.style, {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n cursor: ad.deeplink ? \"pointer\" : \"default\",\n });\n if (ad.deeplink) {\n video.addEventListener(\"click\", () => window.open(ad.deeplink, \"_blank\"));\n }\n video.addEventListener(\"ended\", () => this._closeAd());\n this.adContent.appendChild(video);\n this._adVideo = video;\n }\n\n private _startSkipTimer(seconds: number): void {\n this.skipRemaining = seconds;\n this.skipBtn.style.display = \"flex\";\n\n const textEl = this.skipBtn.querySelector(\".kplayer-ad-skip-text\");\n\n this.skipBtn.disabled = true;\n this.skipBtn.style.opacity = \"0.6\";\n this.skipBtn.style.cursor = \"default\";\n\n if (textEl) {\n textEl.innerHTML = `Skip ad in <span class=\"kplayer-ad-skip-count\">${this.skipRemaining}</span>s`;\n }\n\n clearInterval(this.skipTimer);\n this.skipTimer = setInterval(() => {\n this.skipRemaining--;\n\n if (this.skipRemaining <= 0) {\n clearInterval(this.skipTimer);\n this.skipBtn.disabled = false;\n this.skipBtn.style.opacity = \"1\";\n this.skipBtn.style.cursor = \"pointer\";\n if (textEl) textEl.textContent = \"Skip ad\";\n } else {\n if (textEl) {\n textEl.innerHTML = `Skip ad in <span class=\"kplayer-ad-skip-count\">${this.skipRemaining}</span>s`;\n }\n }\n }, 1000);\n }\n\n private _skipAd(): void {\n if (this.skipRemaining > 0) return;\n this._closeAd();\n }\n\n private _closeAd(): void {\n clearInterval(this.skipTimer);\n\n if (this._adVideo) {\n this._adVideo.pause();\n this._adVideo.src = \"\";\n this._adVideo = null;\n }\n\n this.adContent.style.background = \"\";\n if (this.adContainer) {\n this.adContainer.style.background = \"#000\";\n this.adContainer.style.display = \"none\";\n }\n this.skipBtn.style.display = \"none\";\n this.deeplinkBtn.style.display = \"none\";\n this.adContent.innerHTML = \"\";\n\n const lastAd = this.currentAd;\n this.currentAd = null;\n\n if (lastAd && lastAd.startTime !== undefined) {\n const resumeTime = (lastAd.startTime || 0) + 0.5;\n const duration = this.player.video.duration || 0;\n if (duration > 0 && resumeTime < duration) {\n this.player.video.currentTime = resumeTime;\n }\n }\n\n this.player.play();\n }\n\n async _loadVAST(url: string): Promise<void> {\n try {\n const res = await fetch(url);\n const text = await res.text();\n const parser = new DOMParser();\n const xml = parser.parseFromString(text, \"text/xml\");\n\n const vmapNS = \"http://www.iab.net/videosuite/vmap\";\n const adBreaks = xml.getElementsByTagNameNS(vmapNS, \"AdBreak\");\n\n if (adBreaks.length > 0) {\n const duration = this.player.video.duration || 0;\n const vastAds: Array<{\n vastUrl: string;\n startTime: number;\n timeOffset: string;\n }> = [];\n\n for (const adBreak of Array.from(adBreaks)) {\n const timeOffset = adBreak.getAttribute(\"timeOffset\") || \"\";\n let startTime = 0;\n\n if (timeOffset === \"start\") {\n startTime = 0;\n } else if (timeOffset === \"end\") {\n startTime = duration > 0 ? duration - 1 : 99999;\n } else if (timeOffset) {\n startTime = this._parseTime(timeOffset);\n }\n\n const adTagURI = adBreak.getElementsByTagNameNS(\n vmapNS,\n \"AdTagURI\",\n )[0];\n const vastUrl = adTagURI?.textContent?.trim();\n if (vastUrl) {\n vastAds.push({ vastUrl, startTime, timeOffset });\n }\n }\n\n for (const { vastUrl, startTime, timeOffset } of vastAds) {\n await this._fetchVASTAndRegister(vastUrl, startTime, timeOffset);\n }\n\n this._registerVMAPMarkers();\n } else {\n await this._parseVASTAndShow(xml, 0, 5);\n }\n } catch (e) {\n console.warn(\"[Kplayer] VAST/VMAP load failed:\", e);\n }\n }\n\n private async _fetchVASTAndRegister(\n vastUrl: string,\n startTime: number,\n timeOffset: string,\n ): Promise<void> {\n try {\n const res = await fetch(vastUrl);\n const text = await res.text();\n const parser = new DOMParser();\n const xml = parser.parseFromString(text, \"text/xml\");\n\n const mediaFile = xml.querySelector(\"MediaFile\");\n const videoUrl = mediaFile?.textContent?.trim();\n const skipOffsetAttr = xml\n .querySelector(\"Linear\")\n ?.getAttribute(\"skipoffset\");\n const skipTime = skipOffsetAttr ? this._parseTime(skipOffsetAttr) : 5;\n const impressionUrl = xml\n .querySelector(\"Impression\")\n ?.textContent?.trim();\n\n if (!videoUrl) return;\n\n const ad: AdItem = {\n type: \"video\",\n url: videoUrl,\n startTime,\n skipTime,\n name: `vast_${timeOffset}`,\n _impressionUrl: impressionUrl,\n _isPostroll: timeOffset === \"end\",\n };\n\n if (!this.options) this.options = { url: [] };\n if (!Array.isArray(this.options.url)) this.options.url = [];\n this.options.url.push(ad);\n } catch (e) {\n console.warn(\"[Kplayer] VAST fetch failed:\", vastUrl, e);\n }\n }\n\n private _registerVMAPMarkers(): void {\n const render = () => {\n const duration = this.player.video.duration;\n if (!duration || duration === Infinity) return;\n\n (this.options?.url || []).forEach((ad) => {\n if (ad._isPostroll) ad.startTime = duration - 1;\n });\n\n this.adMarkers.forEach((m) => m.parentNode?.removeChild(m));\n this.adMarkers = [];\n\n (this.options?.url || []).forEach((ad) => {\n if (ad.startTime === undefined || ad.startTime <= 0) return;\n const pct = (ad.startTime / duration) * 100;\n if (pct >= 100) return;\n\n const marker = this._createMarker(pct, ad);\n this.player.template.playedBarWrap.appendChild(marker);\n this.adMarkers.push(marker);\n });\n };\n\n if (this.player.video.duration && this.player.video.duration !== Infinity) {\n render();\n } else {\n this.player.on(\"durationchange\", render);\n }\n\n this._bindTimeUpdate();\n }\n\n private async _parseVASTAndShow(\n xml: Document,\n startTime: number,\n defaultSkip: number,\n ): Promise<void> {\n const mediaFile = xml.querySelector(\"MediaFile\");\n const videoUrl = mediaFile?.textContent?.trim();\n const skipOffsetAttr = xml\n .querySelector(\"Linear\")\n ?.getAttribute(\"skipoffset\");\n const skipTime = skipOffsetAttr\n ? this._parseTime(skipOffsetAttr)\n : defaultSkip;\n const impressionUrl = xml.querySelector(\"Impression\")?.textContent?.trim();\n if (impressionUrl) fetch(impressionUrl).catch(() => {});\n if (videoUrl) {\n this._showAd({ type: \"video\", url: videoUrl, startTime, skipTime });\n }\n }\n\n private _parseTime(str: string): number {\n if (!str) return 0;\n const parts = str.split(\":\");\n if (parts.length !== 3) return 0;\n return (\n parseInt(parts[0]) * 3600 + parseInt(parts[1]) * 60 + parseFloat(parts[2])\n );\n }\n\n destroy(): void {\n clearInterval(this.skipTimer);\n this.adMarkers.forEach((m) => m.parentNode?.removeChild(m));\n if (this.adContainer?.parentNode) {\n this.adContainer.parentNode.removeChild(this.adContainer);\n }\n }\n}\n\nexport default Ad;\n","type EventCallback = (info?: unknown) => void;\n\nclass Events {\n events: Record<string, EventCallback[]>;\n videoEvents: string[];\n playerEvents: string[];\n\n constructor() {\n this.events = {};\n\n this.videoEvents = [\n \"abort\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"emptied\",\n \"ended\",\n \"error\",\n \"loadeddata\",\n \"loadedmetadata\",\n \"loadstart\",\n \"mozaudioavailable\",\n \"pause\",\n \"play\",\n \"playing\",\n \"progress\",\n \"ratechange\",\n \"seeked\",\n \"seeking\",\n \"stalled\",\n \"suspend\",\n \"timeupdate\",\n \"volumechange\",\n \"waiting\",\n ];\n\n this.playerEvents = [\n \"screenshot\",\n \"thumbnails_show\",\n \"thumbnails_hide\",\n \"awaken_show\",\n \"awaken_hide\",\n \"awaken_clear\",\n \"awaken_loaded\",\n \"awaken_send\",\n \"awaken_opacity\",\n \"contextmenu_show\",\n \"contextmenu_hide\",\n \"notice_show\",\n \"notice_hide\",\n \"quality_start\",\n \"quality_end\",\n \"destroy\",\n \"resize\",\n \"fullscreen\",\n \"fullscreen_cancel\",\n \"webfullscreen\",\n \"webfullscreen_cancel\",\n \"subtitle_show\",\n \"subtitle_hide\",\n \"subtitle_change\",\n \"title_back\",\n ];\n }\n\n on(name: string, callback: EventCallback): void {\n if (this.type(name) && typeof callback === \"function\") {\n if (!this.events[name]) {\n this.events[name] = [];\n }\n this.events[name].push(callback);\n }\n }\n\n trigger(name: string, info?: unknown): void {\n if (this.events[name] && this.events[name].length) {\n for (let i = 0; i < this.events[name].length; i++) {\n this.events[name][i](info);\n }\n }\n }\n\n type(name: string): string | null {\n if (this.playerEvents.indexOf(name) !== -1) {\n return \"player\";\n } else if (this.videoEvents.indexOf(name) !== -1) {\n return \"video\";\n }\n console.error(`Unknown event name: ${name}`);\n return null;\n }\n}\n\nexport default Events;\n","import utils from \"./utils\";\nimport type KPlayer from \"./player\";\nimport type { FullScreenType, ScrollPosition } from \"./types\";\n\ntype DocWithFullscreen = Document & {\n mozFullScreenElement?: Element;\n webkitFullscreenElement?: Element;\n msFullscreenElement?: Element;\n cancelFullScreen?: () => void;\n mozCancelFullScreen?: () => void;\n webkitCancelFullScreen?: () => void;\n webkitCancelFullscreen?: () => void;\n msCancelFullScreen?: () => void;\n msExitFullscreen?: () => void;\n};\n\ntype ElementWithFullscreen = HTMLElement & {\n mozRequestFullScreen?: () => void;\n webkitRequestFullscreen?: () => void;\n msRequestFullscreen?: () => void;\n};\n\ntype VideoWithFullscreen = HTMLVideoElement & {\n webkitEnterFullscreen?: () => void;\n webkitEnterFullScreen?: () => void;\n};\n\nclass FullScreen {\n player: KPlayer;\n lastScrollPosition: ScrollPosition;\n fullscreenchange: () => void;\n docfullscreenchange: () => void;\n\n constructor(player: KPlayer) {\n this.player = player;\n this.lastScrollPosition = { left: 0, top: 0 };\n\n this.player.events.on(\"webfullscreen\", () => {\n this.player.resize();\n });\n this.player.events.on(\"webfullscreen_cancel\", () => {\n this.player.resize();\n utils.setScrollPosition(this.lastScrollPosition);\n });\n\n this.fullscreenchange = () => {\n this.player.resize();\n if (this.isFullScreen(\"browser\")) {\n this.player.events.trigger(\"fullscreen\");\n } else {\n utils.setScrollPosition(this.lastScrollPosition);\n this.player.events.trigger(\"fullscreen_cancel\");\n }\n };\n\n this.docfullscreenchange = () => {\n const doc = document as DocWithFullscreen;\n const fullEle =\n document.fullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement;\n if (fullEle && fullEle !== this.player.container) return;\n\n this.player.resize();\n if (fullEle) {\n this.player.events.trigger(\"fullscreen\");\n } else {\n utils.setScrollPosition(this.lastScrollPosition);\n this.player.events.trigger(\"fullscreen_cancel\");\n }\n };\n\n if (/Firefox/.test(navigator.userAgent)) {\n document.addEventListener(\n \"mozfullscreenchange\",\n this.docfullscreenchange,\n );\n document.addEventListener(\"fullscreenchange\", this.docfullscreenchange);\n } else {\n this.player.container.addEventListener(\n \"fullscreenchange\",\n this.fullscreenchange,\n );\n this.player.container.addEventListener(\n \"webkitfullscreenchange\",\n this.fullscreenchange,\n );\n document.addEventListener(\"msfullscreenchange\", this.docfullscreenchange);\n document.addEventListener(\"MSFullscreenChange\", this.docfullscreenchange);\n }\n }\n\n isFullScreen(type: FullScreenType = \"browser\"): Element | boolean | null {\n const doc = document as DocWithFullscreen;\n switch (type) {\n case \"browser\":\n return (\n document.fullscreenElement ||\n doc.mozFullScreenElement ||\n (doc as DocWithFullscreen & { webkitFullscreenElement?: Element })\n .webkitFullscreenElement ||\n doc.msFullscreenElement ||\n null\n );\n case \"web\":\n return this.player.container.classList.contains(\"kplayer-fulled\");\n }\n }\n\n request(type: FullScreenType = \"browser\"): void {\n const anotherType: FullScreenType = type === \"browser\" ? \"web\" : \"browser\";\n const anotherTypeOn = this.isFullScreen(anotherType);\n if (!anotherTypeOn) {\n this.lastScrollPosition = utils.getScrollPosition();\n }\n\n switch (type) {\n case \"browser\": {\n const el = this.player.container as ElementWithFullscreen;\n const video = this.player.video as VideoWithFullscreen;\n if (el.requestFullscreen) {\n el.requestFullscreen();\n } else if (el.mozRequestFullScreen) {\n el.mozRequestFullScreen();\n } else if (el.webkitRequestFullscreen) {\n el.webkitRequestFullscreen();\n } else if (video.webkitEnterFullscreen) {\n video.webkitEnterFullscreen();\n } else if (video.webkitEnterFullScreen) {\n video.webkitEnterFullScreen();\n } else if (el.msRequestFullscreen) {\n el.msRequestFullscreen();\n }\n break;\n }\n case \"web\":\n this.player.container.classList.add(\"kplayer-fulled\");\n document.body.classList.add(\"kplayer-web-fullscreen-fix\");\n this.player.events.trigger(\"webfullscreen\");\n break;\n }\n\n if (anotherTypeOn) {\n this.cancel(anotherType);\n }\n }\n\n cancel(type: FullScreenType = \"browser\"): void {\n const doc = document as DocWithFullscreen;\n switch (type) {\n case \"browser\":\n if (doc.cancelFullScreen) {\n doc.cancelFullScreen();\n } else if (doc.mozCancelFullScreen) {\n doc.mozCancelFullScreen();\n } else if (doc.webkitCancelFullScreen) {\n doc.webkitCancelFullScreen();\n } else if (doc.webkitCancelFullscreen) {\n doc.webkitCancelFullscreen();\n } else if (doc.msCancelFullScreen) {\n doc.msCancelFullScreen();\n } else if (doc.msExitFullscreen) {\n doc.msExitFullscreen();\n } else if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n break;\n case \"web\":\n this.player.container.classList.remove(\"kplayer-fulled\");\n document.body.classList.remove(\"kplayer-web-fullscreen-fix\");\n this.player.events.trigger(\"webfullscreen_cancel\");\n break;\n }\n }\n\n toggle(type: FullScreenType = \"browser\"): void {\n if (this.isFullScreen(type)) {\n this.cancel(type);\n } else {\n this.request(type);\n }\n }\n\n destroy(): void {\n if (/Firefox/.test(navigator.userAgent)) {\n document.removeEventListener(\n \"mozfullscreenchange\",\n this.docfullscreenchange,\n );\n document.removeEventListener(\n \"fullscreenchange\",\n this.docfullscreenchange,\n );\n } else {\n this.player.container.removeEventListener(\n \"fullscreenchange\",\n this.fullscreenchange,\n );\n this.player.container.removeEventListener(\n \"webkitfullscreenchange\",\n this.fullscreenchange,\n );\n document.removeEventListener(\n \"msfullscreenchange\",\n this.docfullscreenchange,\n );\n document.removeEventListener(\n \"MSFullscreenChange\",\n this.docfullscreenchange,\n );\n }\n }\n}\n\nexport default FullScreen;\n","import utils from \"./utils\";\nimport type { KPlayerOptions } from \"./types\";\n\ntype UserKey = \"opacity\" | \"volume\" | \"unlimited\" | \"awaken\" | \"subtitle\";\n\ninterface UserData {\n opacity: number;\n volume: number;\n unlimited: number;\n awaken: number;\n subtitle: number;\n}\n\nclass User {\n storageName: Record<UserKey, string>;\n default: UserData;\n data: UserData;\n\n constructor(player: { options: KPlayerOptions }) {\n this.storageName = {\n opacity: \"kplayer-awaken-opacity\",\n volume: \"kplayer-volume\",\n unlimited: \"kplayer-awaken-unlimited\",\n awaken: \"kplayer-awaken-show\",\n subtitle: \"kplayer-subtitle-show\",\n };\n this.default = {\n opacity: 0.7,\n volume: player.options.hasOwnProperty(\"volume\")\n ? (player.options.volume ?? 0.7)\n : 0.7,\n unlimited:\n (player.options.awaken &&\n typeof player.options.awaken === \"object\" &&\n player.options.awaken.unlimited\n ? 1\n : 0) || 0,\n awaken: 1,\n subtitle: 1,\n };\n this.data = {} as UserData;\n this.init();\n }\n\n init(): void {\n for (const item in this.storageName) {\n const key = item as UserKey;\n const name = this.storageName[key];\n this.data[key] = parseFloat(\n utils.storage.get(name) || String(this.default[key]),\n );\n }\n }\n\n get(key: UserKey): number {\n return this.data[key];\n }\n\n set(key: UserKey, value: number): void {\n this.data[key] = value;\n utils.storage.set(this.storageName[key], value);\n }\n}\n\nexport default User;\n","import type Events from \"./events\";\nimport type { SubtitleOptions } from \"./types\";\n\nclass Subtitle {\n container: HTMLElement;\n video: HTMLVideoElement;\n options: SubtitleOptions;\n events: Events;\n private _track: TextTrack | null = null;\n\n constructor(\n container: HTMLElement,\n video: HTMLVideoElement,\n options: SubtitleOptions,\n events: Events,\n ) {\n this.container = container;\n this.video = video;\n this.options = options;\n this.events = events;\n this.init();\n }\n\n init(): void {\n this.container.style.fontSize = this.options.fontSize || \"20px\";\n this.container.style.bottom = this.options.bottom || \"40px\";\n this.container.style.color = this.options.color || \"#fff\";\n }\n\n // VTT текстийг parse хийж cue inject хийнэ — <track> ашиглахгүй\n async loadVttText(vttText: string): Promise<void> {\n this._clearTrack();\n\n const track = this.video.addTextTrack(\"subtitles\", \"\", \"\");\n track.mode = \"showing\"; // ← 'hidden' биш 'showing' болгоно\n this._track = track;\n\n const cues = this._parseVtt(vttText);\n\n for (const cue of cues) {\n try {\n track.addCue(cue);\n } catch (e) {\n console.warn(\"[KPlayer] addCue failed:\", e);\n }\n }\n\n // oncuechange-ийн оронд timeupdate ашиглах\n this._onTimeUpdateBound = this._onTimeUpdate.bind(this);\n this.video.addEventListener(\"timeupdate\", this._onTimeUpdateBound);\n }\n\n private _onTimeUpdateBound?: () => void;\n\n private _onTimeUpdate(): void {\n if (!this._track?.activeCues) return;\n\n const cues = this._track.activeCues;\n this.container.innerHTML = \"\";\n\n for (let i = 0; i < cues.length; i++) {\n const cue = cues[i] as VTTCue;\n const p = document.createElement(\"p\");\n p.textContent = cue.text.replace(/<[^>]+>/g, \"\");\n this.container.appendChild(p);\n }\n }\n\n private _clearTrack(): void {\n // timeupdate listener устгах\n if (this._onTimeUpdateBound) {\n this.video.removeEventListener(\"timeupdate\", this._onTimeUpdateBound);\n this._onTimeUpdateBound = undefined;\n }\n\n if (this._track) {\n while (this._track.cues && this._track.cues.length > 0) {\n this._track.removeCue(this._track.cues[0]);\n }\n this._track.mode = \"disabled\";\n this._track.oncuechange = null;\n this._track = null;\n }\n this.container.innerHTML = \"\";\n }\n\n private _parseVtt(vttText: string): VTTCue[] {\n const cues: VTTCue[] = [];\n const text = vttText.replace(/^\\uFEFF/, \"\").trim();\n const blocks = text.split(/\\n\\s*\\n/);\n\n\n for (const block of blocks) {\n const lines = block.trim().split(\"\\n\");\n if (!lines.length) continue;\n\n // WEBVTT, NOTE, STYLE алгасах\n if (\n lines[0].startsWith(\"WEBVTT\") ||\n lines[0].startsWith(\"NOTE\") ||\n lines[0].startsWith(\"STYLE\")\n )\n continue;\n\n // Timestamp мөр хайх\n let timeLineIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes(\"-->\")) {\n timeLineIdx = i;\n break;\n }\n }\n if (timeLineIdx === -1) continue;\n\n const timeLine = lines[timeLineIdx];\n\n // MM:SS.mmm эсвэл HH:MM:SS.mmm хоёуланг дэмжих\n const timeMatch = timeLine.match(\n /((?:\\d{2}:)?\\d{2}:\\d{2}[.,]\\d{3})\\s*-->\\s*((?:\\d{2}:)?\\d{2}:\\d{2}[.,]\\d{3})/,\n );\n\n\n if (!timeMatch) continue;\n\n const start = this._timeToSeconds(timeMatch[1]);\n const end = this._timeToSeconds(timeMatch[2]);\n const cueText = lines\n .slice(timeLineIdx + 1)\n .join(\"\\n\")\n .trim();\n\n\n if (!cueText) continue;\n\n try {\n const cue = new VTTCue(start, end, cueText);\n cues.push(cue);\n } catch (e) {\n console.warn(\"[KPlayer] VTTCue failed:\", e, start, end, cueText);\n }\n }\n\n return cues;\n }\n\n private _timeToSeconds(timeStr: string): number {\n const normalized = timeStr.replace(\",\", \".\");\n const parts = normalized.split(\":\");\n\n if (parts.length === 3) {\n // HH:MM:SS.mmm\n return (\n parseInt(parts[0]) * 3600 +\n parseInt(parts[1]) * 60 +\n parseFloat(parts[2])\n );\n } else if (parts.length === 2) {\n // MM:SS.mmm\n return parseInt(parts[0]) * 60 + parseFloat(parts[1]);\n }\n return 0;\n }\n\n show(): void {\n this.container.classList.remove(\"kplayer-subtitle-hide\");\n if (this._track) this._track.mode = \"hidden\";\n this.events.trigger(\"subtitle_show\");\n }\n\n hide(): void {\n this.container.classList.add(\"kplayer-subtitle-hide\");\n if (this._track) this._track.mode = \"disabled\";\n this.events.trigger(\"subtitle_hide\");\n }\n\n toggle(): void {\n if (this.container.classList.contains(\"kplayer-subtitle-hide\")) {\n this.show();\n } else {\n this.hide();\n }\n }\n\n destroy(): void {\n this._clearTrack();\n }\n}\n\nexport default Subtitle;\n","import type KPlayer from \"./player\";\n\nclass Subtitles {\n player: KPlayer;\n\n constructor(player: KPlayer) {\n this.player = player;\n\n this.player.template.mask.addEventListener(\"click\", () => {\n this.hide();\n });\n\n if (\n this.player.template.subtitlesButton &&\n \"addEventListener\" in this.player.template.subtitlesButton\n ) {\n this.player.template.subtitlesButton.addEventListener(\"click\", () => {\n this.adaptiveHeight();\n this.show();\n });\n }\n\n const items = Array.from(\n this.player.template.subtitlesItem || [],\n ) as HTMLElement[];\n const lastItemIndex = items.length - 1;\n\n if (lastItemIndex < 0) return;\n\n for (let i = 0; i < lastItemIndex; i++) {\n items[i].addEventListener(\"click\", () => {\n this.hide();\n this.selectSubtitle(i);\n });\n }\n\n items[lastItemIndex].addEventListener(\"click\", () => {\n this.hide();\n this.selectOff();\n });\n\n const defaultIdx = this.player.options.subtitle?.index ?? 0;\n if (items[defaultIdx]) {\n items.forEach((el) => el.classList.remove(\"kplayer-selected\"));\n items[defaultIdx].classList.add(\"kplayer-selected\");\n }\n }\n\n reloadTrack(): void {\n const video = this.player.video;\n const track = this.player.template.subtrack;\n\n if (!track) return;\n\n track.default = true;\n\n if (video?.textTracks?.[0]) {\n try {\n video.textTracks[0].mode = \"disabled\";\n video.textTracks[0].mode = \"showing\";\n return;\n } catch (_e) {\n // fallback\n }\n }\n\n if (video && typeof video.load === \"function\") {\n video.load();\n }\n }\n\n clearSelected(): void {\n const items = Array.from(\n this.player.template.subtitlesItem || [],\n ) as HTMLElement[];\n items.forEach((el) => el.classList.remove(\"kplayer-selected\"));\n }\n\n selectSubtitle(index: number): void {\n const items = Array.from(\n this.player.template.subtitlesItem || [],\n ) as HTMLElement[];\n const item = items[index];\n if (!item) return;\n\n this.clearSelected();\n item.classList.add(\"kplayer-selected\");\n this.player.options.subtitle!.index = index;\n\n // <track> src тавихын оронд JS-ээр ачаална\n this.player.loadSubtitleByIndex(index);\n\n if (\n this.player.template.subtitle.classList.contains(\"kplayer-subtitle-hide\")\n ) {\n this.subContainerShow();\n }\n }\n\n selectOff(): void {\n const items = Array.from(\n this.player.template.subtitlesItem || [],\n ) as HTMLElement[];\n const lastItemIndex = items.length - 1;\n const offItem = items[lastItemIndex];\n if (!offItem) return;\n\n this.clearSelected();\n offItem.classList.add(\"kplayer-selected\");\n this.player.options.subtitle!.index = lastItemIndex;\n\n // subtitle.ts дотор track-г нуух\n this.player.subtitle?.hide();\n this.player.template.subtitle.innerHTML = \"\";\n\n this.subContainerHide();\n }\n\n subContainerShow(): void {\n this.player.template.subtitle.classList.remove(\"kplayer-subtitle-hide\");\n this.player.events.trigger(\"subtitle_show\");\n }\n\n subContainerHide(): void {\n this.player.template.subtitle.classList.add(\"kplayer-subtitle-hide\");\n this.player.events.trigger(\"subtitle_hide\");\n }\n\n hide(): void {\n this.player.template.subtitlesBox?.classList.remove(\n \"kplayer-subtitles-box-open\",\n );\n this.player.template.mask.classList.remove(\"kplayer-mask-show\");\n this.player.controller.disableAutoHide = false;\n }\n\n show(): void {\n this.player.template.subtitlesBox?.classList.add(\n \"kplayer-subtitles-box-open\",\n );\n this.player.template.mask.classList.add(\"kplayer-mask-show\");\n this.player.controller.disableAutoHide = true;\n }\n\n adaptiveHeight(): void {\n const items = Array.from(this.player.template.subtitlesItem || []);\n const curBoxHeight = items.length * 30 + 14;\n const stdMaxHeight = this.player.template.videoWrap.offsetHeight * 0.8;\n\n if (this.player.template.subtitlesBox) {\n if (curBoxHeight >= stdMaxHeight - 50) {\n this.player.template.subtitlesBox.style.bottom = \"8px\";\n this.player.template.subtitlesBox.style.maxHeight = `${stdMaxHeight - 8}px`;\n } else {\n this.player.template.subtitlesBox.style.bottom = \"50px\";\n this.player.template.subtitlesBox.style.maxHeight = `${stdMaxHeight - 50}px`;\n }\n }\n }\n\n updateUrls(urls: Array<{ url?: string; lang?: string }>): void {\n if (!Array.isArray(urls)) return;\n\n if (this.player.options.subtitle) {\n this.player.options.subtitle.url =\n urls as typeof this.player.options.subtitle.url;\n }\n }\n}\n\nexport default Subtitles;\n","import type Template from \"./template\";\n\ntype BarType = \"volume\" | \"played\" | \"loaded\" | \"awaken\";\ntype BarDirection = \"width\" | \"height\";\n\nclass Bar {\n elements: Partial<Record<BarType, HTMLElement>>;\n\n constructor(template: Template) {\n this.elements = {};\n if (template.volumeBar) this.elements.volume = template.volumeBar;\n if (template.playedBar) this.elements.played = template.playedBar;\n if (template.loadedBar) this.elements.loaded = template.loadedBar;\n if (template.awakenOpacityBar)\n this.elements.awaken = template.awakenOpacityBar;\n }\n\n set(type: BarType, percentage: number, direction: BarDirection): void {\n percentage = Math.max(percentage, 0);\n percentage = Math.min(percentage, 1);\n if (this.elements[type]) {\n this.elements[type]!.style[direction] = percentage * 100 + \"%\";\n }\n }\n\n get(type: BarType): number {\n return parseFloat(this.elements[type]?.style.width || \"0\") / 100;\n }\n}\n\nexport default Bar;\n","import type KPlayer from \"./player\";\n\ntype TimerType = \"loading\" | \"info\" | \"fps\";\n\nclass Timer {\n player: KPlayer;\n types: TimerType[];\n loadingChecker?: ReturnType<typeof setInterval>;\n infoChecker?: ReturnType<typeof setInterval>;\n enableloadingChecker = false;\n enableinfoChecker = false;\n enablefpsChecker = false;\n fpsStart?: Date;\n fpsIndex = 0;\n\n constructor(player: KPlayer) {\n this.player = player;\n\n window.requestAnimationFrame =\n window.requestAnimationFrame ||\n (\n window as Window & {\n webkitRequestAnimationFrame?: typeof requestAnimationFrame;\n }\n ).webkitRequestAnimationFrame ||\n (\n window as Window & {\n mozRequestAnimationFrame?: typeof requestAnimationFrame;\n }\n ).mozRequestAnimationFrame ||\n (\n window as Window & {\n oRequestAnimationFrame?: typeof requestAnimationFrame;\n }\n ).oRequestAnimationFrame ||\n (\n window as Window & {\n msRequestAnimationFrame?: typeof requestAnimationFrame;\n }\n ).msRequestAnimationFrame ||\n function (callback: FrameRequestCallback) {\n window.setTimeout(callback, 1000 / 60);\n return 0;\n };\n\n this.types = [\"loading\", \"info\", \"fps\"];\n this.init();\n }\n\n init(): void {\n this.types.forEach((item) => {\n if (item !== \"fps\") {\n (this as unknown as Record<string, () => void>)[`init${item}Checker`]();\n }\n });\n }\n\n initloadingChecker(): void {\n let lastPlayPos = 0;\n let currentPlayPos = 0;\n let bufferingDetected = false;\n\n this.loadingChecker = setInterval(() => {\n if (this.enableloadingChecker) {\n currentPlayPos = this.player.video.currentTime;\n if (\n !bufferingDetected &&\n currentPlayPos === lastPlayPos &&\n !this.player.video.paused\n ) {\n this.player.container.classList.add(\"kplayer-loading\");\n bufferingDetected = true;\n }\n if (\n bufferingDetected &&\n currentPlayPos > lastPlayPos &&\n !this.player.video.paused\n ) {\n this.player.container.classList.remove(\"kplayer-loading\");\n bufferingDetected = false;\n }\n lastPlayPos = currentPlayPos;\n }\n }, 100);\n }\n\n initfpsChecker(): void {\n window.requestAnimationFrame(() => {\n if (this.enablefpsChecker) {\n this.initfpsChecker();\n if (!this.fpsStart) {\n this.fpsStart = new Date();\n this.fpsIndex = 0;\n } else {\n this.fpsIndex++;\n const fpsCurrent = new Date();\n if (fpsCurrent.getTime() - this.fpsStart.getTime() > 1000) {\n this.player.infoPanel.fps(\n (this.fpsIndex /\n (fpsCurrent.getTime() - this.fpsStart.getTime())) *\n 1000,\n );\n this.fpsStart = new Date();\n this.fpsIndex = 0;\n }\n }\n } else {\n this.fpsStart = undefined;\n this.fpsIndex = 0;\n }\n });\n }\n\n initinfoChecker(): void {\n this.infoChecker = setInterval(() => {\n if (this.enableinfoChecker) {\n this.player.infoPanel.update();\n }\n }, 1000);\n }\n\n enable(type: TimerType): void {\n (this as unknown as Record<string, boolean>)[`enable${type}Checker`] = true;\n if (type === \"fps\") {\n this.initfpsChecker();\n }\n }\n\n disable(type: TimerType): void {\n (this as unknown as Record<string, boolean>)[`enable${type}Checker`] =\n false;\n }\n\n destroy(): void {\n this.types.forEach((item) => {\n (this as unknown as Record<string, boolean>)[`enable${item}Checker`] =\n false;\n const checker = (\n this as unknown as Record<string, ReturnType<typeof setInterval>>\n )[`${item}Checker`];\n if (checker) clearInterval(checker);\n });\n }\n}\n\nexport default Timer;\n","class Bezel {\n container: HTMLElement;\n\n constructor(container: HTMLElement) {\n this.container = container;\n this.container.addEventListener(\"animationend\", () => {\n this.container.classList.remove(\"kplayer-bezel-transition\");\n });\n }\n\n switch(icon: string): void {\n this.container.innerHTML = icon;\n this.container.classList.add(\"kplayer-bezel-transition\");\n }\n}\n\nexport default Bezel;\n","import type Events from \"./events\";\n\ninterface ThumbnailsOptions {\n container: HTMLElement;\n barWidth: number;\n url: string;\n events?: Events;\n}\n\nclass Thumbnails {\n container: HTMLElement;\n barWidth: number;\n events?: Events;\n\n constructor(options: ThumbnailsOptions) {\n this.container = options.container;\n this.barWidth = options.barWidth;\n this.container.style.backgroundImage = `url('${options.url}')`;\n this.events = options.events;\n }\n\n resize(width: number, height: number, barWrapWidth: number): void {\n this.container.style.width = `${width}px`;\n this.container.style.height = `${height}px`;\n this.container.style.top = `${-height + 2}px`;\n this.barWidth = barWrapWidth;\n }\n\n show(): void {\n this.container.style.display = \"block\";\n this.events && this.events.trigger(\"thumbnails_show\");\n }\n\n move(position: number): void {\n this.container.style.backgroundPosition = `-${(Math.ceil((position / this.barWidth) * 100) - 1) * 160}px 0`;\n this.container.style.left = `${Math.min(\n Math.max(position - this.container.offsetWidth / 2, -10),\n this.barWidth - 150,\n )}px`;\n }\n\n hide(): void {\n this.container.style.display = \"none\";\n this.events && this.events.trigger(\"thumbnails_hide\");\n }\n}\n\nexport default Thumbnails;\n","import utils from \"./utils\";\nimport Thumbnails from \"./thumbnails\";\nimport Icons from \"./icons\";\nimport type KPlayer from \"./player\";\n\ndeclare let cast:\n | {\n SessionRequest: new (appId: string) => unknown;\n ApiConfig: new (\n req: unknown,\n cb1: () => void,\n cb2: (status: string) => void,\n ) => unknown;\n ReceiverAvailability: { AVAILABLE: string };\n initialize: (config: unknown, cb: () => void) => void;\n requestSession: (\n success: (s: unknown) => void,\n err: (e: { code: string }) => void,\n ) => void;\n media: {\n DEFAULT_MEDIA_RECEIVER_APP_ID: string;\n MediaInfo: new (url: string) => unknown;\n LoadRequest: new (info: unknown) => unknown;\n };\n }\n | undefined;\n\nlet runOnce = true;\nlet isCasting = false;\n\nclass Controller {\n player: KPlayer;\n autoHideTimer = 0;\n disableAutoHide = false;\n thumbnails?: Thumbnails;\n setAutoHideHandler?: () => void;\n private _skipBtn: HTMLButtonElement | null = null;\n private _skipTarget: number | null = null;\n private session: unknown = undefined;\n private currentMedia: unknown = null;\n\n constructor(player: KPlayer) {\n this.player = player;\n\n if (!utils.isMobile) {\n this.setAutoHideHandler = this.setAutoHide.bind(this);\n this.player.container.addEventListener(\n \"mousemove\",\n this.setAutoHideHandler,\n );\n this.player.container.addEventListener(\"click\", this.setAutoHideHandler);\n this.player.on(\"play\", this.setAutoHideHandler);\n this.player.on(\"pause\", this.setAutoHideHandler);\n }\n\n this.initPlayButton();\n this.initSeekButtons();\n this.initThumbnails();\n this.initPlayedBar();\n this.initFullButton();\n this.initQualityButton();\n this.initScreenshotButton();\n if (this.player.options.subtitle) {\n if (typeof this.player.options.subtitle.url === \"string\") {\n this.initSubtitleButton();\n }\n }\n this.initHighlights();\n this.initAirplayButton();\n this.initChromecastButton();\n if (!utils.isMobile) {\n this.initVolumeButton();\n }\n }\n\n initPlayButton(): void {\n this.player.template.playButton.addEventListener(\"click\", () => {\n this.player.toggle();\n });\n\n this.player.template.mobilePlayButton.addEventListener(\"click\", () => {\n this.player.toggle();\n });\n\n if (!utils.isMobile) {\n if (!this.player.options.preventClickToggle) {\n this.player.template.videoWrap.addEventListener(\"click\", () => {\n this.player.toggle();\n });\n this.player.template.controllerMask.addEventListener(\"click\", () => {\n this.player.toggle();\n });\n }\n } else {\n this.player.template.videoWrap.addEventListener(\"click\", () => {\n this.toggle();\n });\n this.player.template.controllerMask.addEventListener(\"click\", () => {\n this.toggle();\n });\n }\n\n const mobileRewind = this.player.container.querySelector<HTMLElement>(\n \".kplayer-mobile-rewind\",\n );\n const mobileForward = this.player.container.querySelector<HTMLElement>(\n \".kplayer-mobile-forward\",\n );\n const mobilePlayBtn = this.player.container.querySelector<HTMLElement>(\n \".kplayer-mobile-play-btn\",\n );\n\n mobileRewind?.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.seek(this.player.video.currentTime - 10);\n this.setAutoHide();\n });\n mobileForward?.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.seek(this.player.video.currentTime + 10);\n this.setAutoHide();\n });\n mobilePlayBtn?.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.toggle();\n });\n }\n\n initSeekButtons(): void {\n const rewindBtn = this.player.container.querySelector<HTMLElement>(\n \".kplayer-rewind-icon\",\n );\n const forwardBtn = this.player.container.querySelector<HTMLElement>(\n \".kplayer-forward-icon\",\n );\n\n rewindBtn?.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.seek(this.player.video.currentTime - 10);\n });\n forwardBtn?.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.seek(this.player.video.currentTime + 10);\n });\n }\n\n initHighlights(): void {\n this._createSkipButton();\n\n this.player.on(\"durationchange\", () => {\n if (\n this.player.video.duration !== 1 &&\n this.player.video.duration !== Infinity\n ) {\n if (this.player.options.highlight) {\n const highlights =\n this.player.template.playedBarWrap.querySelectorAll(\n \".kplayer-highlight\",\n );\n Array.from(highlights).forEach((item) => {\n this.player.template.playedBarWrap.removeChild(item);\n });\n for (let i = 0; i < this.player.options.highlight.length; i++) {\n const h = this.player.options.highlight[i];\n if (!h.text || !h.time) continue;\n\n const p = document.createElement(\"div\");\n p.classList.add(\"kplayer-highlight\");\n p.style.left = (h.time / this.player.video.duration) * 100 + \"%\";\n p.innerHTML = `<span class=\"kplayer-highlight-text\">${h.text}</span>`;\n p.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.seek(h.time);\n if (this.player.paused) this.player.play();\n });\n this.player.template.playedBarWrap.insertBefore(\n p,\n this.player.template.playedBarTime,\n );\n }\n }\n }\n });\n\n this.player.on(\"timeupdate\", () => {\n this._updateSkipButton();\n });\n }\n\n private _createSkipButton(): void {\n if (this.player.container.querySelector(\".kplayer-skip-btn\")) return;\n\n const btn = document.createElement(\"button\");\n btn.classList.add(\"kplayer-skip-btn\");\n btn.style.display = \"none\";\n btn.innerHTML = `<span class=\"kplayer-skip-btn-text\"></span>`;\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (this._skipTarget != null) {\n this.player.seek(this._skipTarget);\n if (this.player.paused) this.player.play();\n }\n btn.style.display = \"none\";\n });\n\n this.player.template.videoWrap.appendChild(btn);\n this._skipBtn = btn;\n this._skipTarget = null;\n }\n\n private _updateSkipButton(): void {\n if (!this.player.options.highlight || !this._skipBtn) return;\n\n const highlights = this.player.options.highlight;\n const currentTime = this.player.video.currentTime;\n let found = false;\n\n for (let i = 0; i < highlights.length - 1; i++) {\n const cur = highlights[i];\n const nxt = highlights[i + 1];\n\n const curIsStart = /\\bstart\\b|\\bэхлэл\\b/i.test(cur.text);\n if (!curIsStart) continue;\n const nxtIsEnd = /\\bend\\b|\\bтөгсгөл\\b/i.test(nxt.text);\n if (!nxtIsEnd) continue;\n if (currentTime < cur.time || currentTime >= nxt.time) continue;\n\n this._skipTarget = nxt.time;\n this._skipBtn.querySelector(\".kplayer-skip-btn-text\")!.textContent =\n cur.text;\n this._skipBtn.style.display = \"flex\";\n found = true;\n break;\n }\n\n if (!found) {\n this._skipBtn.style.display = \"none\";\n }\n }\n\n initThumbnails(): void {\n if (this.player.options.video.thumbnails) {\n this.thumbnails = new Thumbnails({\n container: this.player.template.barPreview,\n barWidth: this.player.template.barWrap.offsetWidth,\n url: this.player.options.video.thumbnails,\n events: this.player.events,\n });\n\n this.player.on(\"loadedmetadata\", () => {\n this.thumbnails?.resize(\n 160,\n (this.player.video.videoHeight / this.player.video.videoWidth) * 160,\n this.player.template.barWrap.offsetWidth,\n );\n });\n }\n }\n\n initPlayedBar(): void {\n const thumbMove = (e: MouseEvent | TouchEvent) => {\n let percentage =\n (((e as MouseEvent).clientX ||\n (e as TouchEvent).changedTouches[0].clientX) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.playedBarWrap,\n )) /\n this.player.template.playedBarWrap.clientWidth;\n percentage = Math.max(0, Math.min(1, percentage));\n this.player.bar.set(\"played\", percentage, \"width\");\n this.player.template.ptime.innerHTML = utils.secondToTime(\n percentage * this.player.video.duration,\n );\n };\n\n const thumbUp = (e: MouseEvent | TouchEvent) => {\n document.removeEventListener(\n utils.nameMap.dragEnd,\n thumbUp as EventListener,\n );\n document.removeEventListener(\n utils.nameMap.dragMove,\n thumbMove as EventListener,\n );\n let percentage =\n (((e as MouseEvent).clientX ||\n (e as TouchEvent).changedTouches[0].clientX) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.playedBarWrap,\n )) /\n this.player.template.playedBarWrap.clientWidth;\n percentage = Math.max(0, Math.min(1, percentage));\n this.player.bar.set(\"played\", percentage, \"width\");\n this.player.seek(\n this.player.bar.get(\"played\") * this.player.video.duration,\n );\n this.player.moveBar = false;\n };\n\n this.player.template.playedBarWrap.addEventListener(\n utils.nameMap.dragStart,\n () => {\n this.player.moveBar = true;\n document.addEventListener(\n utils.nameMap.dragMove,\n thumbMove as EventListener,\n );\n document.addEventListener(\n utils.nameMap.dragEnd,\n thumbUp as EventListener,\n );\n },\n );\n\n this.player.template.playedBarWrap.addEventListener(\n utils.nameMap.dragMove,\n (e) => {\n if (this.player.video.duration) {\n const px =\n this.player.template.playedBarWrap.getBoundingClientRect().left;\n const tx =\n ((e as MouseEvent).clientX ||\n (e as TouchEvent).changedTouches[0].clientX) - px;\n if (tx < 0 || tx > this.player.template.playedBarWrap.offsetWidth)\n return;\n const time =\n this.player.video.duration *\n (tx / this.player.template.playedBarWrap.offsetWidth);\n if (utils.isMobile) this.thumbnails?.show();\n this.thumbnails?.move(tx);\n this.player.template.playedBarTime.style.left = `${tx - (time >= 3600 ? 25 : 20)}px`;\n this.player.template.playedBarTime.innerText =\n utils.secondToTime(time);\n this.player.template.playedBarTime.classList.remove(\"hidden\");\n }\n },\n );\n\n this.player.template.playedBarWrap.addEventListener(\n utils.nameMap.dragEnd,\n () => {\n if (utils.isMobile) this.thumbnails?.hide();\n },\n );\n\n if (!utils.isMobile) {\n this.player.template.playedBarWrap.addEventListener(\"mouseenter\", () => {\n if (this.player.video.duration) {\n this.thumbnails?.show();\n this.player.template.playedBarTime.classList.remove(\"hidden\");\n }\n });\n this.player.template.playedBarWrap.addEventListener(\"mouseleave\", () => {\n if (this.player.video.duration) {\n this.thumbnails?.hide();\n this.player.template.playedBarTime.classList.add(\"hidden\");\n }\n });\n }\n }\n\n initFullButton(): void {\n this.player.template.browserFullButton.addEventListener(\"click\", () => {\n this.player.fullScreen.toggle(\"browser\");\n });\n this.player.template.webFullButton.addEventListener(\"click\", () => {\n this.player.fullScreen.toggle(\"web\");\n });\n }\n\n initVolumeButton(): void {\n const vWidth = 35;\n\n const volumeMove = (event: Event) => {\n const e = event as MouseEvent | TouchEvent;\n const percentage =\n (((e as MouseEvent).clientX ||\n (e as TouchEvent).changedTouches[0].clientX) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.volumeBarWrap,\n ) -\n 5.5) /\n vWidth;\n this.player.volume(percentage);\n };\n\n const volumeUp = () => {\n document.removeEventListener(utils.nameMap.dragEnd, volumeUp);\n document.removeEventListener(utils.nameMap.dragMove, volumeMove);\n this.player.template.volumeButton.classList.remove(\n \"kplayer-volume-active\",\n );\n };\n\n this.player.template.volumeBarWrapWrap.addEventListener(\n \"click\",\n (event) => {\n const percentage =\n ((event.clientX || 0) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.volumeBarWrap,\n ) -\n 5.5) /\n vWidth;\n this.player.volume(percentage);\n },\n );\n\n this.player.template.volumeBarWrapWrap.addEventListener(\n utils.nameMap.dragStart,\n () => {\n document.addEventListener(utils.nameMap.dragMove, volumeMove);\n document.addEventListener(utils.nameMap.dragEnd, volumeUp);\n this.player.template.volumeButton.classList.add(\n \"kplayer-volume-active\",\n );\n },\n );\n\n this.player.template.volumeButtonIcon.addEventListener(\"click\", () => {\n if (this.player.video.muted) {\n this.player.video.muted = false;\n this.player.switchVolumeIcon();\n this.player.bar.set(\"volume\", this.player.volume(), \"width\");\n } else {\n this.player.video.muted = true;\n this.player.template.volumeIcon.innerHTML = Icons.volumeOff;\n this.player.bar.set(\"volume\", 0, \"width\");\n }\n });\n }\n\n initQualityButton(): void {\n if (this.player.options.video.quality) {\n const defIdx = this.player.options.video.defaultQuality || 0;\n const items =\n this.player.template.qualityList.querySelectorAll<HTMLElement>(\n \".kplayer-quality-item\",\n );\n if (items[defIdx]) items[defIdx].classList.add(\"kplayer-selected\");\n\n this.player.template.qualityList.addEventListener(\"click\", (e) => {\n const item = (e.target as HTMLElement).closest<HTMLElement>(\n \".kplayer-quality-item\",\n );\n if (item) {\n items.forEach((el) => el.classList.remove(\"kplayer-selected\"));\n item.classList.add(\"kplayer-selected\");\n this.player.switchQuality(Number(item.dataset.index));\n }\n });\n }\n }\n\n initScreenshotButton(): void {\n if (this.player.options.screenshot && this.player.template.camareButton) {\n this.player.template.camareButton.addEventListener(\"click\", () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = this.player.video.videoWidth;\n canvas.height = this.player.video.videoHeight;\n canvas\n .getContext(\"2d\")\n ?.drawImage(this.player.video, 0, 0, canvas.width, canvas.height);\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const dataURL = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = dataURL;\n link.download = \"kplayer.png\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(dataURL);\n this.player.events.trigger(\"screenshot\", dataURL);\n });\n });\n }\n }\n\n initAirplayButton(): void {\n if (this.player.options.airplay) {\n if (\n (window as Window & { WebKitPlaybackTargetAvailabilityEvent?: unknown })\n .WebKitPlaybackTargetAvailabilityEvent\n ) {\n this.player.video.addEventListener(\n \"webkitplaybacktargetavailabilitychanged\",\n function (this: KPlayer, event: Event) {\n const ev = event as Event & { availability: string };\n if (ev.availability === \"available\") {\n this.template.airplayButton &&\n ((\n this.template.airplayButton as HTMLElement & {\n disable?: boolean;\n }\n ).disable = false);\n } else {\n this.template.airplayButton &&\n ((\n this.template.airplayButton as HTMLElement & {\n disable?: boolean;\n }\n ).disable = true);\n }\n this.template.airplayButton?.addEventListener(\"click\", () => {\n (\n this.video as HTMLVideoElement & {\n webkitShowPlaybackTargetPicker?: () => void;\n }\n ).webkitShowPlaybackTargetPicker?.();\n });\n }.bind(this.player),\n );\n } else {\n if (this.player.template.airplayButton) {\n (this.player.template.airplayButton as HTMLElement).style.display =\n \"none\";\n }\n }\n }\n }\n\n initChromecast(): void {\n const script = document.createElement(\"script\");\n script.setAttribute(\"type\", \"text/javascript\");\n script.setAttribute(\n \"src\",\n \"https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1\",\n );\n document.body.appendChild(script);\n\n (\n window as Window & { __onGCastApiAvailable?: (v: boolean) => void }\n ).__onGCastApiAvailable = (isAvailable: boolean) => {\n if (isAvailable) {\n cast = (window as Window & { chrome?: { cast: typeof cast } }).chrome\n ?.cast;\n if (!cast) return;\n const sessionRequest = new cast.SessionRequest(\n cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n );\n const apiConfig = new cast.ApiConfig(\n sessionRequest,\n () => {},\n (status: string) => {\n if (status === cast!.ReceiverAvailability.AVAILABLE) {\n console.log(\"chromecast:\", status);\n }\n },\n );\n cast.initialize(apiConfig, () => {});\n }\n };\n }\n\n initChromecastButton(): void {\n if (this.player.options.chromecast) {\n if (runOnce) {\n runOnce = false;\n this.initChromecast();\n }\n\n const launchMedia = (media: string): boolean => {\n if (!cast) return false;\n const mediaInfo = new cast.media.MediaInfo(media);\n const request = new cast.media.LoadRequest(mediaInfo);\n if (!this.session) {\n window.open(media);\n return false;\n }\n (\n this.session as {\n loadMedia: (\n r: unknown,\n s: unknown,\n e: unknown,\n ) => { play: () => void };\n }\n )\n .loadMedia(\n request,\n onMediaDiscovered.bind(this, \"loadMedia\"),\n onMediaError,\n )\n .play();\n return true;\n };\n\n const onMediaDiscovered = (_how: string, media: unknown) => {\n this.currentMedia = media;\n };\n\n const onMediaError = (err: unknown) => {\n console.error(\"Error launching media\", err);\n };\n\n this.player.template.chromecastButton?.addEventListener(\"click\", () => {\n if (isCasting) {\n isCasting = false;\n (this.currentMedia as { stop: () => void })?.stop();\n (this.session as { stop: () => void })?.stop();\n this.initChromecast();\n } else {\n isCasting = true;\n cast?.requestSession(\n (s) => {\n this.session = s;\n launchMedia(this.player.options.video.url || \"\");\n },\n (err) => {\n if (err.code === \"cancel\") {\n this.session = undefined;\n } else {\n console.error(\"Error selecting cast device\", err);\n }\n },\n );\n }\n });\n }\n }\n\n initSubtitleButton(): void {\n this.player.events.on(\"subtitle_show\", () => {\n if (\n this.player.template.subtitleButton &&\n \"dataset\" in this.player.template.subtitleButton\n ) {\n (this.player.template.subtitleButton as HTMLElement).dataset.balloon =\n this.player.tran(\"hide-subs\");\n }\n if (this.player.template.subtitleButtonInner) {\n this.player.template.subtitleButtonInner.style.opacity = \"\";\n }\n this.player.user.set(\"subtitle\", 1);\n });\n\n this.player.events.on(\"subtitle_hide\", () => {\n if (\n this.player.template.subtitleButton &&\n \"dataset\" in this.player.template.subtitleButton\n ) {\n (this.player.template.subtitleButton as HTMLElement).dataset.balloon =\n this.player.tran(\"show-subs\");\n }\n if (this.player.template.subtitleButtonInner) {\n this.player.template.subtitleButtonInner.style.opacity = \"0.4\";\n }\n this.player.user.set(\"subtitle\", 0);\n });\n\n if (\n this.player.template.subtitleButton &&\n \"addEventListener\" in this.player.template.subtitleButton\n ) {\n (this.player.template.subtitleButton as HTMLElement).addEventListener(\n \"click\",\n () => {\n this.player.subtitle?.toggle();\n },\n );\n }\n }\n\n _showTitleBar(): void {\n const bar = this.player.template.titleBar;\n if (!bar) return;\n bar.style.opacity = \"1\";\n bar.style.visibility = \"visible\";\n bar.style.transform = \"translateY(0)\";\n bar.style.pointerEvents = \"auto\";\n }\n\n _hideTitleBar(): void {\n const bar = this.player.template.titleBar;\n if (!bar) return;\n bar.style.opacity = \"0\";\n bar.style.visibility = \"hidden\";\n bar.style.transform = \"translateY(-8px)\";\n bar.style.pointerEvents = \"none\";\n }\n\n setAutoHide(): void {\n this.show();\n clearTimeout(this.autoHideTimer);\n this.autoHideTimer = window.setTimeout(() => {\n if (\n this.player.video.played.length &&\n !this.player.paused &&\n !this.disableAutoHide\n ) {\n this.hide();\n }\n }, 1500);\n }\n\n show(): void {\n this.player.container.classList.remove(\"kplayer-hide-controller\");\n this._showTitleBar();\n }\n\n hide(): void {\n this.player.container.classList.add(\"kplayer-hide-controller\");\n this.player.setting.hide();\n this._hideTitleBar();\n }\n\n isShow(): boolean {\n return !this.player.container.classList.contains(\"kplayer-hide-controller\");\n }\n\n toggle(): void {\n if (this.isShow()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n destroy(): void {\n if (!utils.isMobile && this.setAutoHideHandler) {\n this.player.container.removeEventListener(\n \"mousemove\",\n this.setAutoHideHandler,\n );\n this.player.container.removeEventListener(\n \"click\",\n this.setAutoHideHandler,\n );\n }\n clearTimeout(this.autoHideTimer);\n }\n}\n\nexport default Controller;\n","import utils from \"./utils\";\nimport type KPlayer from \"./player\";\n\nclass Setting {\n player: KPlayer;\n loop: boolean;\n showAwaken: number;\n unlimitAwaken: number;\n airplayEntry: HTMLElement | null;\n chromecastEntry: HTMLElement | null;\n screenshotEntry: HTMLElement | null;\n\n constructor(player: KPlayer) {\n this.player = player;\n\n this.player.template.mask.addEventListener(\"click\", () => {\n this.hide();\n });\n this.player.template.settingButton.addEventListener(\"click\", () => {\n this.show();\n });\n\n // loop\n this.loop = this.player.options.loop || false;\n this.player.template.loopToggle.checked = this.loop;\n this.player.template.loop.addEventListener(\"click\", () => {\n this.player.template.loopToggle.checked =\n !this.player.template.loopToggle.checked;\n this.loop = this.player.template.loopToggle.checked;\n });\n\n // show awaken\n this.showAwaken = this.player.user.get(\"awaken\");\n if (!this.showAwaken) {\n this.player.awaken &&\n (this.player.awaken as unknown as { hide: () => void }).hide();\n }\n this.player.template.showAwakenToggle.checked = !!this.showAwaken;\n this.player.template.showAwaken.addEventListener(\"click\", () => {\n this.player.template.showAwakenToggle.checked =\n !this.player.template.showAwakenToggle.checked;\n if (this.player.template.showAwakenToggle.checked) {\n this.showAwaken = 1;\n (this.player.awaken as unknown as { show: () => void })?.show();\n } else {\n this.showAwaken = 0;\n (this.player.awaken as unknown as { hide: () => void })?.hide();\n }\n this.player.user.set(\"awaken\", this.showAwaken ? 1 : 0);\n this.hide();\n });\n\n // unlimit awaken\n this.unlimitAwaken = this.player.user.get(\"unlimited\");\n this.player.template.unlimitAwakenToggle.checked = !!this.unlimitAwaken;\n this.player.template.unlimitAwaken.addEventListener(\"click\", () => {\n this.player.template.unlimitAwakenToggle.checked =\n !this.player.template.unlimitAwakenToggle.checked;\n if (this.player.template.unlimitAwakenToggle.checked) {\n this.unlimitAwaken = 1;\n (\n this.player.awaken as unknown as { unlimit: (v: boolean) => void }\n )?.unlimit(true);\n } else {\n this.unlimitAwaken = 0;\n (\n this.player.awaken as unknown as { unlimit: (v: boolean) => void }\n )?.unlimit(false);\n }\n this.player.user.set(\"unlimited\", this.unlimitAwaken ? 1 : 0);\n this.hide();\n });\n\n // speed\n this.player.template.speed.addEventListener(\"click\", () => {\n this.player.template.settingBox.classList.add(\n \"kplayer-setting-box-speed\",\n );\n });\n\n const speeds = this.player.options.playbackSpeed || [];\n const defaultSpeedIdx = speeds.indexOf(1);\n if (\n defaultSpeedIdx >= 0 &&\n this.player.template.speedItem[defaultSpeedIdx]\n ) {\n this.player.template.speedItem[defaultSpeedIdx].classList.add(\n \"kplayer-selected\",\n );\n }\n\n Array.from(this.player.template.speedItem).forEach((el, i) => {\n el.addEventListener(\"click\", () => {\n Array.from(this.player.template.speedItem).forEach((s) =>\n s.classList.remove(\"kplayer-selected\"),\n );\n el.classList.add(\"kplayer-selected\");\n this.player.speed(Number((el as HTMLElement).dataset.speed));\n\n const badge = this.player.container.querySelector(\n \"#kplayer-speed-current\",\n );\n if (badge) {\n const spd = (el as HTMLElement).dataset.speed;\n badge.textContent = spd === \"1\" ? \"1×\" : spd + \"×\";\n }\n });\n });\n\n // subtitle entry\n if (this.player.template.subtitleEntry) {\n this.player.template.subtitleEntry.addEventListener(\"click\", () => {\n this.player.template.settingBox.classList.add(\n \"kplayer-setting-box-subtitle\",\n );\n });\n }\n\n // quality entry\n if (this.player.template.qualityEntry) {\n this.player.template.qualityEntry.addEventListener(\"click\", () => {\n this.player.template.settingBox.classList.add(\n \"kplayer-setting-box-quality\",\n );\n });\n }\n\n // action entries\n this.airplayEntry = this.player.container.querySelector(\n \".kplayer-setting-airplay-entry\",\n );\n this.chromecastEntry = this.player.container.querySelector(\n \".kplayer-setting-chromecast-entry\",\n );\n this.screenshotEntry = this.player.container.querySelector(\n \".kplayer-setting-screenshot-entry\",\n );\n\n if (this.screenshotEntry && this.player.template.camareButton) {\n this.screenshotEntry.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.template.camareButton?.click();\n this.hide();\n });\n }\n\n if (this.airplayEntry && this.player.template.airplayButton) {\n this.airplayEntry.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.template.airplayButton?.click();\n this.hide();\n });\n }\n\n if (this.chromecastEntry && this.player.template.chromecastButton) {\n this.chromecastEntry.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.player.template.chromecastButton?.click();\n this.hide();\n });\n }\n\n // back buttons\n const backBtns = this.player.container.querySelectorAll(\n \".kplayer-setting-back-main\",\n );\n backBtns.forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-speed\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-subtitle\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-quality\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-narrow\",\n );\n });\n });\n\n // awaken opacity\n if (this.player.awaken) {\n const dWidth = 130;\n this.player.on(\"awaken_opacity\", (percentage) => {\n this.player.bar.set(\"awaken\", percentage as number, \"width\");\n this.player.user.set(\"opacity\", percentage as number);\n });\n (\n this.player.awaken as unknown as { opacity: (v: number) => void }\n )?.opacity(this.player.user.get(\"opacity\"));\n\n const awakenMove = (event: Event) => {\n const e = event as MouseEvent | TouchEvent;\n let percentage =\n (((e as MouseEvent).clientX ||\n (e as TouchEvent).changedTouches?.[0]?.clientX ||\n 0) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.awakenOpacityBarWrap!,\n )) /\n dWidth;\n percentage = Math.max(0, Math.min(1, percentage));\n (\n this.player.awaken as unknown as { opacity: (v: number) => void }\n )?.opacity(percentage);\n };\n\n const awakenUp = () => {\n document.removeEventListener(utils.nameMap.dragEnd, awakenUp);\n document.removeEventListener(utils.nameMap.dragMove, awakenMove);\n this.player.template.awakenOpacityBox?.classList.remove(\n \"kplayer-setting-awaken-active\",\n );\n };\n\n this.player.template.awakenOpacityBarWrapWrap?.addEventListener(\n \"click\",\n (event) => {\n let percentage =\n ((event.clientX || 0) -\n utils.getBoundingClientRectViewLeft(\n this.player.template.awakenOpacityBarWrap!,\n )) /\n dWidth;\n percentage = Math.max(0, Math.min(1, percentage));\n (\n this.player.awaken as unknown as { opacity: (v: number) => void }\n )?.opacity(percentage);\n },\n );\n\n this.player.template.awakenOpacityBarWrapWrap?.addEventListener(\n utils.nameMap.dragStart,\n () => {\n document.addEventListener(utils.nameMap.dragMove, awakenMove);\n document.addEventListener(utils.nameMap.dragEnd, awakenUp);\n this.player.template.awakenOpacityBox?.classList.add(\n \"kplayer-setting-awaken-active\",\n );\n },\n );\n }\n }\n\n hide(): void {\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-open\",\n );\n this.player.template.mask.classList.remove(\"kplayer-mask-show\");\n setTimeout(() => {\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-narrow\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-speed\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-subtitle\",\n );\n this.player.template.settingBox.classList.remove(\n \"kplayer-setting-box-quality\",\n );\n }, 300);\n\n this.player.controller.disableAutoHide = false;\n }\n\n show(): void {\n this.player.template.settingBox.classList.add(\"kplayer-setting-box-open\");\n this.player.template.mask.classList.add(\"kplayer-mask-show\");\n this.player.controller.disableAutoHide = true;\n }\n}\n\nexport default Setting;\n","import type KPlayer from \"./player\";\n\nclass HotKey {\n player: KPlayer;\n doHotKeyHandler: (e: KeyboardEvent) => void;\n cancelFullScreenHandler: (e: KeyboardEvent) => void;\n\n constructor(player: KPlayer) {\n this.player = player;\n this.doHotKeyHandler = this.doHotKey.bind(this);\n this.cancelFullScreenHandler = this.cancelFullScreen.bind(this);\n\n if (this.player.options.hotkey) {\n document.addEventListener(\"keydown\", this.doHotKeyHandler);\n }\n document.addEventListener(\"keydown\", this.cancelFullScreenHandler);\n }\n\n doHotKey(e: KeyboardEvent): void {\n if (this.player.focus) {\n const tag = (document.activeElement as HTMLElement).tagName.toUpperCase();\n const editable = document.activeElement?.getAttribute(\"contenteditable\");\n if (\n tag !== \"INPUT\" &&\n tag !== \"TEXTAREA\" &&\n editable !== \"\" &&\n editable !== \"true\"\n ) {\n let percentage: number;\n switch (e.keyCode) {\n case 32:\n e.preventDefault();\n this.player.toggle();\n break;\n case 37:\n e.preventDefault();\n if (this.player.options.live) break;\n this.player.seek(this.player.video.currentTime - 10);\n this.player.controller.setAutoHide();\n break;\n case 39:\n e.preventDefault();\n if (this.player.options.live) break;\n this.player.seek(this.player.video.currentTime + 10);\n this.player.controller.setAutoHide();\n break;\n case 38:\n e.preventDefault();\n percentage = this.player.volume() + 0.1;\n this.player.volume(percentage);\n break;\n case 40:\n e.preventDefault();\n percentage = this.player.volume() - 0.1;\n this.player.volume(percentage);\n break;\n }\n }\n }\n }\n\n cancelFullScreen(e: KeyboardEvent): void {\n switch (e.keyCode) {\n case 27:\n if (this.player.fullScreen.isFullScreen(\"web\")) {\n this.player.fullScreen.cancel(\"web\");\n }\n break;\n }\n }\n\n destroy(): void {\n if (this.player.options.hotkey) {\n document.removeEventListener(\"keydown\", this.doHotKeyHandler);\n }\n document.removeEventListener(\"keydown\", this.cancelFullScreenHandler);\n }\n}\n\nexport default HotKey;\n","import type KPlayer from \"./player\";\n\nclass ContextMenu {\n player: KPlayer;\n shown = false;\n contextmenuHandler: (e: MouseEvent) => void;\n videoContextHandler: (e: MouseEvent) => void;\n\n constructor(player: KPlayer) {\n this.player = player;\n\n Array.prototype.slice\n .call(this.player.template.menuItem)\n .forEach((item: HTMLElement, index: number) => {\n const menuItem = this.player.options.contextmenu?.[index];\n if (menuItem?.click) {\n item.addEventListener(\"click\", () => {\n menuItem.click!(this.player);\n this.hide();\n });\n }\n });\n\n this.contextmenuHandler = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const clientRect = this.player.container.getBoundingClientRect();\n const x = e.clientX - clientRect.left;\n const y = e.clientY - clientRect.top;\n\n if (this.shown) {\n this.hide();\n return;\n }\n this.show(x, y);\n };\n\n this.player.container.addEventListener(\n \"contextmenu\",\n this.contextmenuHandler,\n );\n\n this.videoContextHandler = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const clientRect = this.player.container.getBoundingClientRect();\n const x = e.clientX - clientRect.left;\n const y = e.clientY - clientRect.top;\n\n if (this.shown) {\n this.hide();\n return;\n }\n this.show(x, y);\n };\n\n this.player.video.addEventListener(\"contextmenu\", this.videoContextHandler);\n }\n\n show(x: number, y: number): void {\n this.player.template.menu.classList.add(\"kplayer-menu-show\");\n\n const clientRect = this.player.container.getBoundingClientRect();\n if (x + this.player.template.menu.offsetWidth >= clientRect.width) {\n this.player.template.menu.style.right = clientRect.width - x + \"px\";\n this.player.template.menu.style.left = \"initial\";\n } else {\n this.player.template.menu.style.left = x + \"px\";\n this.player.template.menu.style.right = \"initial\";\n }\n if (y + this.player.template.menu.offsetHeight >= clientRect.height) {\n this.player.template.menu.style.bottom = clientRect.height - y + \"px\";\n this.player.template.menu.style.top = \"initial\";\n } else {\n this.player.template.menu.style.top = y + \"px\";\n this.player.template.menu.style.bottom = \"initial\";\n }\n\n this.player.template.mask.classList.add(\"kplayer-mask-show\");\n this.shown = true;\n this.player.events.trigger(\"contextmenu_show\");\n }\n\n hide(): void {\n this.player.template.mask.classList.remove(\"kplayer-mask-show\");\n this.player.template.menu.classList.remove(\"kplayer-menu-show\");\n this.shown = false;\n this.player.events.trigger(\"contextmenu_hide\");\n }\n\n destroy(): void {\n this.player.container.removeEventListener(\n \"contextmenu\",\n this.contextmenuHandler,\n );\n if (this.videoContextHandler) {\n this.player.video.removeEventListener(\n \"contextmenu\",\n this.videoContextHandler,\n );\n }\n }\n}\n\nexport default ContextMenu;\n","import type KPlayer from \"./player\";\nimport type Template from \"./template\";\n\ndeclare const KPLAYER_VERSION: string;\ndeclare const GIT_HASH: string;\n\nclass InfoPanel {\n container: HTMLElement;\n template: Template;\n video: HTMLVideoElement;\n player: KPlayer;\n beginTime = 0;\n\n constructor(player: KPlayer) {\n this.container = player.template.infoPanel!;\n this.template = player.template;\n this.video = player.video;\n this.player = player;\n\n this.template.infoPanelClose?.addEventListener(\"click\", () => {\n this.hide();\n });\n }\n\n show(): void {\n this.beginTime = Date.now();\n this.update();\n this.player.timer.enable(\"info\");\n this.player.timer.enable(\"fps\");\n this.container.classList.remove(\"kplayer-info-panel-hide\");\n }\n\n hide(): void {\n this.player.timer.disable(\"info\");\n this.player.timer.disable(\"fps\");\n this.container.classList.add(\"kplayer-info-panel-hide\");\n }\n\n triggle(): void {\n if (this.container.classList.contains(\"kplayer-info-panel-hide\")) {\n this.show();\n } else {\n this.hide();\n }\n }\n\n update(): void {\n if (this.template.infoVersion) {\n this.template.infoVersion.innerHTML = `v${KPLAYER_VERSION} ${GIT_HASH}`;\n }\n if (this.template.infoType) {\n this.template.infoType.innerHTML = this.player.type || \"\";\n }\n if (this.template.infoUrl) {\n this.template.infoUrl.innerHTML = this.player.options.video?.url || \"\";\n }\n if (this.template.infoResolution) {\n this.template.infoResolution.innerHTML = `${this.video.videoWidth} x ${this.video.videoHeight}`;\n }\n if (this.template.infoDuration) {\n this.template.infoDuration.innerHTML = String(this.video.duration);\n }\n if (\n this.player.options.awaken &&\n typeof this.player.options.awaken === \"object\"\n ) {\n if (this.template.infoAwakenId) {\n this.template.infoAwakenId.innerHTML =\n this.player.options.awaken.id || \"\";\n }\n if (this.template.infoAwakenApi) {\n this.template.infoAwakenApi.innerHTML =\n this.player.options.awaken.api || \"\";\n }\n }\n }\n\n fps(value: number): void {\n if (this.template.infoFPS) {\n this.template.infoFPS.innerHTML = `${value.toFixed(1)}`;\n }\n }\n}\n\nexport default InfoPanel;\n","import utils from \"./utils\";\nimport handleOption from \"./options\";\nimport { i18n } from \"./i18n\";\nimport Template from \"./template\";\nimport Icons from \"./icons\";\nimport Ad from \"./ad\";\nimport Events from \"./events\";\nimport FullScreen from \"./fullscreen\";\nimport User from \"./user\";\nimport Subtitle from \"./subtitle\";\nimport Subtitles from \"./subtitles\";\nimport Bar from \"./bar\";\nimport Timer from \"./timer\";\nimport Bezel from \"./bezel\";\nimport Controller from \"./controller\";\nimport Setting from \"./setting\";\nimport HotKey from \"./hotkey\";\nimport ContextMenu from \"./contextmenu\";\nimport InfoPanel from \"./info-panel\";\nimport renderVideo from \"../template/video\";\nimport type { KPlayerOptions, SubtitleItem } from \"./types\";\n\ndeclare const KPLAYER_VERSION: string;\ndeclare const GIT_HASH: string;\n\ninterface HlsLevel {\n height?: number;\n bitrate?: number;\n}\n\ninterface HlsInstance {\n levels: HlsLevel[];\n currentLevel: number;\n nextLevel: number;\n loadLevel: number;\n autoLevelEnabled: boolean;\n loadSource(src: string): void;\n attachMedia(video: HTMLVideoElement): void;\n destroy(): void;\n on(event: string, cb: (...args: unknown[]) => void): void;\n DefaultConfig?: { loader: unknown };\n}\n\ndeclare const KPLAYER_VERSION_PLACEHOLDER: string;\n\nlet index = 0;\nconst instances: KPlayer[] = [];\n\nfunction createBlobHLSLoader(Hls: {\n DefaultConfig: { loader: new (config: unknown) => unknown };\n}) {\n const DefaultLoader = Hls.DefaultConfig.loader;\n\n return class BlobHLSLoader extends (DefaultLoader as new (\n config: unknown,\n ) => {\n load: (\n context: unknown,\n config: unknown,\n callbacks: Record<string, unknown>,\n ) => void;\n }) {\n constructor(config: unknown) {\n super(config);\n const superLoad = this.load.bind(this);\n\n this.load = function (\n context: { type?: string },\n cfg: unknown,\n callbacks: {\n onSuccess: (\n response: { data?: unknown; url: string },\n stats: unknown,\n ctx: unknown,\n nd: unknown,\n ) => void;\n },\n ) {\n const originalOnSuccess = callbacks.onSuccess;\n\n callbacks.onSuccess = function (response, stats, ctx, networkDetails) {\n try {\n if (context.type === \"fragment\") {\n const data = response.data;\n let blobData: ArrayBuffer | undefined;\n if (data instanceof ArrayBuffer) {\n blobData = data;\n } else if (typeof data === \"string\") {\n blobData = new TextEncoder().encode(data).buffer;\n }\n if (blobData) {\n const blob = new Blob([blobData], { type: \"video/mp2t\" });\n const blobUrl = URL.createObjectURL(blob);\n response.url = blobUrl;\n setTimeout(() => URL.revokeObjectURL(blobUrl), 10000);\n }\n }\n } catch (e) {\n console.warn(\"[KPlayer] BlobHLSLoader error:\", e);\n }\n originalOnSuccess(response, stats, ctx, networkDetails);\n };\n\n superLoad(context, cfg, callbacks as Record<string, unknown>);\n };\n }\n };\n}\n\nasync function fetchAndDecryptVtt(\n url: string,\n encrypt?: boolean,\n keyHex?: string,\n ivHex?: string,\n): Promise<string> {\n const res = await fetch(url, { mode: \"cors\" });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n let text = await res.text();\n\n if (encrypt && keyHex && ivHex) {\n const TIMESTAMP_REGEX =\n /^\\d{2}:\\d{2}:\\d{2}[.,]\\d{3}\\s*-->\\s*\\d{2}:\\d{2}:\\d{2}[.,]\\d{3}$/;\n\n const decryptLine = async (\n hex: string,\n key: CryptoKey,\n iv: Uint8Array,\n ): Promise<string> => {\n const encrypted = new Uint8Array(\n hex.match(/.{2}/g)!.map((b) => parseInt(b, 16)),\n );\n const decrypted = await crypto.subtle.decrypt(\n { name: \"AES-CBC\", iv: iv.buffer as ArrayBuffer },\n key,\n encrypted.buffer as ArrayBuffer,\n );\n return new TextDecoder().decode(decrypted);\n };\n\n const keyBuf = new Uint8Array(\n keyHex.match(/.{2}/g)!.map((b) => parseInt(b, 16)),\n );\n const ivBuf = new Uint8Array(\n ivHex.match(/.{2}/g)!.map((b) => parseInt(b, 16)),\n );\n const cryptoKey = await crypto.subtle.importKey(\n \"raw\",\n keyBuf.buffer as ArrayBuffer,\n { name: \"AES-CBC\" },\n false,\n [\"decrypt\"],\n );\n\n // base64 decode → hex encoded vtt string авна\n let hexVtt: string;\n try {\n hexVtt = atob(text.trim()); // base64 → hex string\n } catch {\n hexVtt = text; // base64 биш бол шууд hex гэж үзнэ\n }\n\n\n const lines = hexVtt.split(\"\\n\");\n const out: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n out.push(line);\n continue;\n }\n if (TIMESTAMP_REGEX.test(trimmed)) {\n out.push(line);\n continue;\n }\n // hex string эсэхийг шалгах\n if (/^[0-9a-fA-F]+$/.test(trimmed) && trimmed.length % 2 === 0) {\n try {\n const decrypted = await decryptLine(trimmed, cryptoKey, ivBuf);\n out.push(decrypted);\n } catch {\n out.push(line);\n }\n } else {\n // hex биш мөр (WEBVTT, NOTE гэх мэт) — шууд дамжуулна\n out.push(line);\n }\n }\n text = out.join(\"\\n\");\n }\n\n return text;\n}\n\nclass KPlayer {\n options: KPlayerOptions;\n tran: (key: string) => string;\n events: Events;\n user: User;\n container: HTMLElement;\n noticeList: Record<string, ReturnType<typeof setTimeout> | null>;\n hlsQualityList: unknown[];\n hlsCurrentLevel: number;\n hlsAutoEnabled: boolean;\n template: Template;\n video: HTMLVideoElement;\n bar: Bar;\n bezel: Bezel;\n fullScreen: FullScreen;\n controller: Controller;\n setting: Setting;\n plugins: Record<string, unknown>;\n docClickFun: () => void;\n containerClickFun: () => void;\n focus = false;\n paused = true;\n timer: Timer;\n hotkey: HotKey;\n contextmenu: ContextMenu;\n infoPanel: InfoPanel;\n ad?: Ad;\n subtitle?: Subtitle;\n subtitles?: Subtitles;\n awaken?: unknown;\n moveBar = false;\n type?: string;\n qualityIndex?: number;\n quality?: { name: string; url: string; type?: string };\n switchingQuality = false;\n prevIndex?: number;\n prevVideo?: HTMLVideoElement;\n\n constructor(\n options: Partial<KPlayerOptions> & { video: KPlayerOptions[\"video\"] },\n ) {\n this.options = handleOption({\n preload: options.video?.type === \"webtorrent\" ? \"none\" : \"metadata\",\n ...options,\n });\n\n if (this.options.video.quality) {\n this.qualityIndex = this.options.video.defaultQuality ?? 0;\n this.quality = this.options.video.quality[this.qualityIndex];\n }\n\n this.tran = new (i18n as unknown as new (lang: string) => {\n tran: (k: string) => string;\n })(this.options.lang || \"en\").tran;\n this.events = new Events();\n this.user = new User(this);\n this.container = this.options.container;\n this.noticeList = {};\n this.hlsQualityList = [];\n this.hlsCurrentLevel = -1;\n this.hlsAutoEnabled = true;\n\n this.container.classList.add(\"kplayer\");\n if (!this.options.awaken) {\n this.container.classList.add(\"kplayer-no-awaken\");\n }\n if (this.options.live) {\n this.container.classList.add(\"kplayer-live\");\n } else {\n this.container.classList.remove(\"kplayer-live\");\n }\n if (utils.isMobile) {\n this.container.classList.add(\"kplayer-mobile\");\n }\n if (this.container.offsetWidth <= 500) {\n this.container.classList.add(\"kplayer-arrow\");\n }\n\n // multi subtitles setup\n if (this.options.subtitle && Array.isArray(this.options.subtitle.url)) {\n const offSubtitle: SubtitleItem = { subtitle: \"\", lang: \"off\", url: \"\" };\n (this.options.subtitle.url as SubtitleItem[]).push(offSubtitle);\n\n if (this.options.subtitle.defaultSubtitle !== undefined) {\n const ds = this.options.subtitle.defaultSubtitle;\n if (typeof ds === \"string\") {\n this.options.subtitle.index = (\n this.options.subtitle.url as SubtitleItem[]\n ).findIndex((sub) => sub.lang === ds || sub.name === ds);\n } else if (typeof ds === \"number\") {\n this.options.subtitle.index = ds;\n }\n }\n\n const urlArr = this.options.subtitle.url as SubtitleItem[];\n if (\n this.options.subtitle.index === -1 ||\n this.options.subtitle.index == null ||\n this.options.subtitle.index > urlArr.length - 1\n ) {\n this.options.subtitle.index = urlArr.findIndex(\n (sub) => sub.lang === this.options.lang,\n );\n }\n if (this.options.subtitle.index === -1) {\n this.options.subtitle.index = urlArr.length - 1;\n }\n }\n\n this.template = new Template({\n container: this.container,\n options: this.options,\n index,\n tran: this.tran,\n });\n\n this.video = this.template.video;\n this.bar = new Bar(this.template);\n this.bezel = new Bezel(this.template.bezel);\n this.fullScreen = new FullScreen(this);\n this.controller = new Controller(this);\n this.setting = new Setting(this);\n this.plugins = {};\n\n this.docClickFun = () => {\n this.focus = false;\n };\n this.containerClickFun = () => {\n this.focus = true;\n };\n document.addEventListener(\"click\", this.docClickFun, true);\n this.container.addEventListener(\"click\", this.containerClickFun, true);\n\n this.paused = true;\n this.timer = new Timer(this);\n this.hotkey = new HotKey(this);\n this.contextmenu = new ContextMenu(this);\n this.initVideo(\n this.video,\n (this.quality && this.quality.type) || this.options.video.type || \"auto\",\n );\n this.infoPanel = new InfoPanel(this);\n\n if (this.options.ad || this.options.vastAD) {\n this.ad = new Ad(this);\n }\n if (this.options.vastAD && this.options.vastADURL) {\n this.ad?._loadVAST(this.options.vastADURL);\n }\n\n // Title back button\n if (this.template.titleBack) {\n this.template.titleBack.addEventListener(\"click\", () => {\n if (typeof this.options.title?.onBack === \"function\") {\n this.options.title.onBack(this);\n } else {\n window.history.back();\n }\n this.events.trigger(\"title_back\");\n });\n }\n\n if (!this.awaken && this.options.autoplay) {\n this.play();\n }\n\n this.moveBar = false;\n index++;\n instances.push(this);\n }\n\n seek(time: number): void {\n time = Math.max(time, 0);\n if (this.video.duration) {\n time = Math.min(time, this.video.duration);\n }\n if (this.video.currentTime < time) {\n this.notice(\n `${this.tran(\"ff\").replace(\"%s\", (time - this.video.currentTime).toFixed(0))}`,\n );\n } else if (this.video.currentTime > time) {\n this.notice(\n `${this.tran(\"rew\").replace(\"%s\", (this.video.currentTime - time).toFixed(0))}`,\n );\n }\n\n this.video.currentTime = time;\n\n if (this.awaken) {\n (this.awaken as { seek: () => void }).seek();\n }\n\n this.bar.set(\"played\", time / this.video.duration, \"width\");\n this.template.ptime.innerHTML = utils.secondToTime(time);\n }\n\n play(fromNative?: boolean): void {\n this.paused = false;\n if (this.video.paused && !utils.isMobile) {\n this.bezel.switch(Icons.play);\n }\n\n this.template.playButton.innerHTML = Icons.pause;\n this.template.mobilePlayButton.innerHTML = Icons.pause;\n\n if (!fromNative) {\n Promise.resolve(this.video.play()).catch(() => {\n this.pause();\n });\n }\n\n this.timer.enable(\"loading\");\n this.container.classList.remove(\"kplayer-paused\");\n this.container.classList.add(\"kplayer-playing\");\n\n if (this.awaken) {\n (this.awaken as { play: () => void }).play();\n }\n\n if (this.options.mutex) {\n for (const inst of instances) {\n if (this !== inst) inst.pause();\n }\n }\n\n const mobilePlayBtn = this.container.querySelector<HTMLElement>(\n \".kplayer-mobile-play-btn .kplayer-icon-content\",\n );\n if (mobilePlayBtn) mobilePlayBtn.innerHTML = Icons.pause;\n }\n\n pause(fromNative?: boolean): void {\n this.paused = true;\n this.container.classList.remove(\"kplayer-loading\");\n\n if (!this.video.paused && !utils.isMobile) {\n this.bezel.switch(Icons.pause);\n }\n\n this.template.playButton.innerHTML = Icons.play;\n this.template.mobilePlayButton.innerHTML = Icons.play;\n\n if (!fromNative) {\n this.video.pause();\n }\n\n this.timer.disable(\"loading\");\n this.container.classList.remove(\"kplayer-playing\");\n this.container.classList.add(\"kplayer-paused\");\n\n if (this.awaken) {\n (this.awaken as { pause: () => void }).pause();\n }\n\n const mobilePlayBtn = this.container.querySelector<HTMLElement>(\n \".kplayer-mobile-play-btn .kplayer-icon-content\",\n );\n if (mobilePlayBtn) mobilePlayBtn.innerHTML = Icons.play;\n }\n\n switchVolumeIcon(): void {\n if (this.volume() >= 0.95) {\n this.template.volumeIcon.innerHTML = Icons.volumeUp;\n } else if (this.volume() > 0) {\n this.template.volumeIcon.innerHTML = Icons.volumeDown;\n } else {\n this.template.volumeIcon.innerHTML = Icons.volumeOff;\n }\n }\n\n volume(percentage?: number, nostorage?: boolean, nonotice?: boolean): number {\n const pct = parseFloat(String(percentage));\n if (!isNaN(pct)) {\n const clamped = Math.max(0, Math.min(1, pct));\n this.bar.set(\"volume\", clamped, \"width\");\n const formatPercentage = `${(clamped * 100).toFixed(0)}%`;\n (\n this.template.volumeBarWrapWrap as HTMLElement & {\n dataset: DOMStringMap;\n }\n ).dataset.balloon = formatPercentage;\n if (!nostorage) this.user.set(\"volume\", clamped);\n if (!nonotice) {\n this.notice(\n `${this.tran(\"volume\")} ${(clamped * 100).toFixed(0)}%`,\n undefined,\n undefined,\n \"volume\",\n );\n }\n this.video.volume = clamped;\n if (this.video.muted) this.video.muted = false;\n this.switchVolumeIcon();\n }\n return this.video.volume;\n }\n\n toggle(): void {\n if (this.video.paused) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n on(name: string, callback: (info?: unknown) => void): void {\n this.events.on(name, callback);\n }\n\n initMSE(video: HTMLVideoElement, type: string): void {\n this.type = type;\n\n if (this.options.video.customType?.[type]) {\n const customFn = this.options.video.customType[type];\n if (typeof customFn === \"function\") {\n customFn(this.video, this);\n } else {\n console.error(`Illegal customType: ${type}`);\n }\n return;\n }\n\n let resolvedType = type;\n if (resolvedType === \"auto\") {\n if (/m3u8(#|\\?|$)/i.exec(video.src)) {\n resolvedType = \"hls\";\n } else if (/.flv(#|\\?|$)/i.exec(video.src)) {\n resolvedType = \"flv\";\n } else if (/.mpd(#|\\?|$)/i.exec(video.src)) {\n resolvedType = \"dash\";\n } else {\n resolvedType = \"normal\";\n }\n }\n\n if (\n resolvedType === \"auto\" &&\n (video.canPlayType(\"application/x-mpegURL\") ||\n video.canPlayType(\"application/vnd.apple.mpegURL\"))\n ) {\n resolvedType = \"normal\";\n }\n\n this.type = resolvedType;\n const src = this.quality ? this.quality.url : video.src;\n\n switch (resolvedType) {\n case \"hls\": {\n const HlsLib = (\n window as Window & {\n Hls?: {\n isSupported: () => boolean;\n DefaultConfig: { loader: unknown };\n Events: Record<string, string>;\n } & (new (opts: unknown) => HlsInstance);\n }\n ).Hls;\n if (!HlsLib) {\n this.notice(\"Error: Can't find Hls.\");\n return;\n }\n if (!HlsLib.isSupported()) {\n this.notice(\"Error: Hls is not supported.\");\n return;\n }\n\n const userOptions = this.options.pluginOptions?.hls || {};\n const BlobLoader = createBlobHLSLoader(\n HlsLib as unknown as {\n DefaultConfig: { loader: new (c: unknown) => unknown };\n },\n );\n const hls = new HlsLib({\n ...userOptions,\n loader: BlobLoader,\n }) as HlsInstance;\n\n this.plugins.hls = hls;\n hls.loadSource(video.src);\n hls.attachMedia(video);\n\n hls.on(HlsLib.Events.MANIFEST_PARSED, () => {\n this.buildHlsQualityMenu(hls);\n this.updateHlsQualityCurrentLabel();\n });\n hls.on(\n HlsLib.Events.LEVEL_SWITCHED,\n (_: unknown, data: { level: number }) => {\n this.hlsCurrentLevel = data.level;\n this.updateHlsQualityCurrentLabel();\n },\n );\n this.events.on(\"destroy\", () => {\n hls.destroy();\n delete this.plugins.hls;\n });\n break;\n }\n case \"flv\": {\n const flvjs = (\n window as Window & {\n flvjs?: {\n isSupported: () => boolean;\n createPlayer: (\n src: unknown,\n cfg?: unknown,\n ) => {\n attachMediaElement: (v: HTMLVideoElement) => void;\n load: () => void;\n unload: () => void;\n detachMediaElement: () => void;\n destroy: () => void;\n };\n };\n }\n ).flvjs;\n if (flvjs) {\n if (flvjs.isSupported()) {\n const flvPlayer = flvjs.createPlayer(\n Object.assign(\n this.options.pluginOptions?.flv?.mediaDataSource || {},\n {\n type: \"flv\",\n url: video.src,\n },\n ),\n this.options.pluginOptions?.flv?.config,\n );\n this.plugins.flvjs = flvPlayer;\n flvPlayer.attachMediaElement(video);\n flvPlayer.load();\n this.events.on(\"destroy\", () => {\n flvPlayer.unload();\n flvPlayer.detachMediaElement();\n flvPlayer.destroy();\n delete this.plugins.flvjs;\n });\n this.events.on(\"quality_end\", () => {\n if (src !== this.quality?.url) {\n flvPlayer.unload();\n flvPlayer.detachMediaElement();\n flvPlayer.destroy();\n }\n });\n } else {\n this.notice(\"Error: flvjs is not supported.\");\n }\n } else {\n this.notice(\"Error: Can't find flvjs.\");\n }\n break;\n }\n case \"dash\": {\n const dashjs = (\n window as Window & {\n dashjs?: {\n MediaPlayer: () => {\n create: () => {\n initialize: (\n v: HTMLVideoElement,\n src: string,\n autoplay: boolean,\n startTime: number,\n ) => void;\n updateSettings: (opts: unknown) => void;\n reset: () => void;\n };\n reset: () => void; // ← энд нэмнэ\n };\n };\n }\n ).dashjs;\n if (dashjs) {\n const dashjsPlayer = dashjs.MediaPlayer().create();\n dashjsPlayer.initialize(video, video.src, false, 0);\n dashjsPlayer.updateSettings(this.options.pluginOptions?.dash || {});\n this.plugins.dash = dashjsPlayer;\n this.events.on(\"destroy\", () => {\n dashjs.MediaPlayer().reset();\n delete this.plugins.dash;\n });\n this.events.on(\"quality_end\", () => {\n if (src !== this.quality?.url) dashjs.MediaPlayer().reset();\n });\n } else {\n this.notice(\"Error: Can't find dashjs.\");\n }\n break;\n }\n case \"webtorrent\": {\n const WebTorrent = (\n window as Window & {\n WebTorrent?: {\n WEBRTC_SUPPORT: boolean;\n new (opts?: unknown): {\n add: (\n id: string,\n cb: (torrent: {\n files: Array<{\n name: string;\n renderTo: (v: HTMLVideoElement, opts: unknown) => void;\n }>;\n }) => void,\n ) => void;\n remove: (id: string) => void;\n destroy: () => void;\n };\n };\n }\n ).WebTorrent;\n if (WebTorrent) {\n if (WebTorrent.WEBRTC_SUPPORT) {\n this.container.classList.add(\"kplayer-loading\");\n const client = new WebTorrent(\n this.options.pluginOptions?.webtorrent || {},\n );\n this.plugins.webtorrent = client;\n const torrentId = video.src;\n video.src = \"\";\n video.preload = \"metadata\";\n video.addEventListener(\n \"durationchange\",\n () => this.container.classList.remove(\"kplayer-loading\"),\n { once: true },\n );\n client.add(torrentId, (torrent) => {\n const file = torrent.files.find((f) => f.name.endsWith(\".mp4\"));\n file?.renderTo(this.video, {\n autoplay: this.options.autoplay,\n controls: false,\n });\n });\n this.events.on(\"destroy\", () => {\n client.remove(torrentId);\n client.destroy();\n delete this.plugins.webtorrent;\n });\n this.events.on(\"quality_end\", () => {\n if (src !== this.quality?.url) {\n client.remove(torrentId);\n client.destroy();\n }\n });\n } else {\n this.notice(\"Error: Webtorrent is not supported.\");\n }\n } else {\n this.notice(\"Error: Can't find Webtorrent.\");\n }\n break;\n }\n }\n }\n\n initVideo(video: HTMLVideoElement, type: string): void {\n this.initMSE(video, type);\n\n this.on(\"durationchange\", () => {\n if (video.duration !== 1 && video.duration !== Infinity) {\n this.template.dtime.innerHTML = utils.secondToTime(video.duration);\n }\n });\n\n this.on(\"progress\", () => {\n const percentage = video.buffered.length\n ? video.buffered.end(video.buffered.length - 1) / video.duration\n : 0;\n this.bar.set(\"loaded\", percentage, \"width\");\n });\n\n this.on(\"error\", () => {\n if (!this.video.error) return;\n if (this.tran && this.notice && this.type !== \"webtorrent\") {\n this.notice(this.tran(\"video-failed\"));\n }\n });\n\n this.on(\"ended\", () => {\n this.bar.set(\"played\", 1, \"width\");\n if (!this.setting.loop) {\n this.pause();\n } else {\n this.seek(0);\n this.play();\n }\n if (this.awaken) {\n (this.awaken as { danIndex: number }).danIndex = 0;\n }\n });\n\n this.on(\"play\", () => {\n if (this.paused) this.play(true);\n });\n\n this.on(\"pause\", () => {\n if (!this.paused) this.pause(true);\n });\n\n this.on(\"timeupdate\", () => {\n if (!this.moveBar) {\n this.bar.set(\n \"played\",\n this.video.currentTime / this.video.duration,\n \"width\",\n );\n }\n const currentTime = utils.secondToTime(this.video.currentTime);\n if (this.template.ptime.innerHTML !== currentTime) {\n this.template.ptime.innerHTML = currentTime;\n }\n });\n\n for (const eventName of this.events.videoEvents) {\n video.addEventListener(eventName, (e) => {\n this.events.trigger(eventName, e);\n });\n }\n\n this.volume(this.user.get(\"volume\"), true, true);\n\n if (this.options.subtitle) {\n this.subtitle = new Subtitle(\n this.template.subtitle,\n this.video,\n this.options.subtitle,\n this.events,\n );\n if (Array.isArray(this.options.subtitle.url)) {\n this.subtitles = new Subtitles(this);\n }\n if (!this.user.get(\"subtitle\")) {\n this.subtitle.hide();\n }\n this._loadSubtitleTexts();\n }\n }\n\n getHlsLevelLabel(level: HlsLevel): string {\n if (!level) return \"Auto\";\n if (level.height) return `${level.height}p`;\n if (level.bitrate) return `${Math.round(level.bitrate / 1000)}kbps`;\n return \"Auto\";\n }\n\n updateHlsQualityCurrentLabel(): void {\n const label = this.container.querySelector<HTMLElement>(\n \"#kplayer-quality-current\",\n );\n if (!label || !this.plugins.hls) return;\n\n const hls = this.plugins.hls as HlsInstance;\n if (hls.autoLevelEnabled) {\n const lvl = hls.levels[hls.currentLevel];\n label.textContent = lvl ? `Auto (${lvl.height}p)` : \"Auto\";\n } else {\n const lvl = hls.levels[hls.currentLevel];\n label.textContent = lvl ? `${lvl.height}p` : \"Manual\";\n }\n }\n\n buildHlsQualityMenu(hls: HlsInstance): void {\n if (!hls?.levels?.length) return;\n\n const used = new Set<string>();\n const levels: Array<{\n index: number;\n name: string;\n height: number;\n bitrate: number;\n }> = [];\n\n hls.levels.forEach((level, idx) => {\n const key = `${level.height}-${level.bitrate}`;\n if (used.has(key)) return;\n used.add(key);\n levels.push({\n index: idx,\n name: level.height\n ? `${level.height}p`\n : `${Math.round((level.bitrate || 0) / 1000)}kbps`,\n height: level.height || 0,\n bitrate: level.bitrate || 0,\n });\n });\n\n levels.sort((a, b) => b.height - a.height || b.bitrate - a.bitrate);\n const list = [{ index: -1, name: \"Auto\" }, ...levels];\n\n const wrap = this.container.querySelector<HTMLElement>(\n \".kplayer-quality-list\",\n );\n if (!wrap) return;\n\n wrap.innerHTML = list\n .map(\n (item) => `\n <div class=\"kplayer-quality-item\" data-level=\"${item.index}\">\n <span class=\"kplayer-label\">${item.name}</span>\n </div>\n `,\n )\n .join(\"\");\n\n const items = wrap.querySelectorAll<HTMLElement>(\".kplayer-quality-item\");\n const label = this.container.querySelector<HTMLElement>(\n \"#kplayer-quality-current\",\n );\n\n items.forEach((el) => {\n el.addEventListener(\"click\", () => {\n const level = Number(el.dataset.level);\n hls.currentLevel = level;\n hls.nextLevel = level;\n hls.loadLevel = level;\n items.forEach((i) => i.classList.remove(\"active\"));\n el.classList.add(\"active\");\n if (label) label.textContent = el.textContent?.trim() || \"\";\n });\n });\n\n if (label) label.textContent = \"Auto\";\n }\n\n switchQuality(index: number | string): void {\n index = typeof index === \"string\" ? parseInt(index) : index;\n if (this.qualityIndex === index || this.switchingQuality) return;\n\n this.prevIndex = this.qualityIndex;\n this.qualityIndex = index;\n this.switchingQuality = true;\n this.quality = this.options.video.quality?.[index];\n if (!this.quality) return;\n\n if (this.template.qualityButton) {\n this.template.qualityButton.innerHTML = this.quality.name;\n }\n\n const qualityCurrent = this.container.querySelector<HTMLElement>(\n \"#kplayer-quality-current\",\n );\n if (qualityCurrent) qualityCurrent.textContent = this.quality.name;\n\n const paused = this.video.paused;\n this.video.pause();\n\n const videoHTML = renderVideo({\n current: false,\n pic: undefined,\n screenshot: this.options.screenshot,\n preload: \"auto\",\n url: this.quality.url,\n subtitle: this.options.subtitle,\n });\n\n const videoEle = new DOMParser().parseFromString(videoHTML, \"text/html\")\n .body.firstChild as HTMLVideoElement;\n\n this.template.videoWrap.insertBefore(\n videoEle,\n this.template.videoWrap.getElementsByTagName(\"div\")[0],\n );\n\n this.prevVideo = this.video;\n this.video = videoEle;\n this.initVideo(\n this.video,\n this.quality.type || this.options.video.type || \"auto\",\n );\n this.seek(this.prevVideo.currentTime);\n this.notice(\n `${this.tran(\"switching-quality\").replace(\"%q\", this.quality.name)}`,\n -1,\n undefined,\n \"switch-quality\",\n );\n this.events.trigger(\"quality_start\", this.quality);\n\n this.on(\"canplay\", () => {\n if (this.prevVideo) {\n if (this.video.currentTime !== this.prevVideo.currentTime) {\n this.seek(this.prevVideo.currentTime);\n return;\n }\n this.template.videoWrap.removeChild(this.prevVideo);\n this.video.classList.add(\"kplayer-video-current\");\n if (!paused) this.video.play();\n this.prevVideo = undefined;\n this.notice(\n `${this.tran(\"switched-quality\").replace(\"%q\", this.quality!.name)}`,\n undefined,\n undefined,\n \"switch-quality\",\n );\n this.switchingQuality = false;\n this.events.trigger(\"quality_end\");\n }\n });\n\n this.on(\"error\", () => {\n if (!this.video.error) return;\n if (this.prevVideo) {\n this.template.videoWrap.removeChild(this.video);\n this.video = this.prevVideo;\n if (!paused) this.video.play();\n this.qualityIndex = this.prevIndex;\n this.quality = this.options.video.quality?.[this.qualityIndex ?? 0];\n this.prevVideo = undefined;\n this.switchingQuality = false;\n }\n });\n }\n\n notice(text: string, time = 2000, opacity = 0.8, id?: string): void {\n let oldNoticeEle: HTMLElement | undefined;\n\n if (id) {\n oldNoticeEle = document.getElementById(`kplayer-notice-${id}`) as\n | HTMLElement\n | undefined;\n if (oldNoticeEle) oldNoticeEle.innerHTML = text;\n if (this.noticeList[id]) {\n clearTimeout(this.noticeList[id]!);\n this.noticeList[id] = null;\n }\n }\n\n if (!oldNoticeEle) {\n const notice = Template.NewNotice(text, opacity, id);\n this.template.noticeList.appendChild(notice);\n oldNoticeEle = notice;\n }\n\n this.events.trigger(\"notice_show\", oldNoticeEle);\n\n if (time > 0) {\n this.noticeList[id || \"\"] = setTimeout(\n ((e: HTMLElement, dp: KPlayer) => () => {\n e.addEventListener(\"animationend\", () => {\n dp.template.noticeList.removeChild(e);\n });\n e.classList.add(\"remove-notice\");\n dp.events.trigger(\"notice_hide\");\n dp.noticeList[id || \"\"] = null;\n })(oldNoticeEle, this),\n time,\n );\n }\n }\n\n resize(): void {\n if (this.awaken) {\n (this.awaken as { resize: () => void }).resize();\n }\n if (this.controller.thumbnails) {\n this.controller.thumbnails.resize(\n 160,\n (this.video.videoHeight / this.video.videoWidth) * 160,\n this.template.barWrap.offsetWidth,\n );\n }\n this.events.trigger(\"resize\");\n }\n\n speed(rate: number): void {\n this.video.playbackRate = rate;\n }\n\n destroy(): void {\n instances.splice(instances.indexOf(this), 1);\n this.pause();\n document.removeEventListener(\"click\", this.docClickFun, true);\n this.container.removeEventListener(\"click\", this.containerClickFun, true);\n this.fullScreen.destroy();\n this.hotkey.destroy();\n this.contextmenu.destroy();\n this.controller.destroy();\n this.timer.destroy();\n this.video.src = \"\";\n this.container.innerHTML = \"\";\n this.ad?.destroy();\n this.events.trigger(\"destroy\");\n }\n\n static get version(): string {\n return KPLAYER_VERSION;\n }\n\n private async _loadSubtitleTexts(): Promise<void> {\n const opts = this.options.subtitle;\n if (!opts?.url || !Array.isArray(opts.url)) return;\n\n const idx = opts.index ?? 0;\n\n // Зөвхөн идэвхтэй subtitle-г ачаална\n const item = (opts.url as SubtitleItem[])[idx];\n if (!item?.url || item.lang === \"off\") return;\n\n try {\n const text = await fetchAndDecryptVtt(\n item.url,\n opts.encrypt,\n opts.key,\n opts.iv,\n );\n await this.subtitle?.loadVttText(text);\n } catch (e) {\n console.warn(\"[KPlayer] Subtitle load failed:\", e);\n }\n }\n\n // subtitle солих үед дуудах (subtitles.ts дотор)\n public async loadSubtitleByIndex(index: number): Promise<void> {\n const opts = this.options.subtitle;\n if (!opts?.url || !Array.isArray(opts.url)) return;\n\n const item = (opts.url as SubtitleItem[])[index];\n if (!item?.url || item.lang === \"off\") {\n this.subtitle?.hide();\n return;\n }\n\n try {\n const text = await fetchAndDecryptVtt(\n item.url,\n opts.encrypt,\n opts.key,\n opts.iv,\n );\n await this.subtitle?.loadVttText(text);\n this.subtitle?.show();\n } catch (e) {\n console.warn(\"[KPlayer] Subtitle switch failed:\", e);\n }\n }\n}\n\nexport default KPlayer;\n"],"names":["isMobile","utils","second","add0","num","hour","min","sec","element","actualLeft","current","elementScrollLeft","scrollTop","fn","temp","rect","offset","left","top","key","value","color","number","handleOption","options","_a","defaultOption","defaultKey","i18n","lang","tranTxt","standard","play","pause","volumeUp","volumeDown","volumeOff","full","fullWeb","setting","right","camera","airplay","subtitle","loading","chromecast","back","rewind","forward","video","Icons","escapeAttr","renderVideo","pic","screenshot","preload","url","attr","html","checked","renderPlayer","_index","tran","icons","_mobile","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","theme","awakenBottom","subtitleIsString","qualityName","backHTML","titleHTML","speed","item","subItem","label","i","text","Template","q","sel","qa","opacity","id","notice","Ad","player","wrap","pct","ad","marker","tooltip","tooltipText","duration","m","currentTime","img","bg","seconds","textEl","lastAd","resumeTime","xml","vmapNS","adBreaks","vastAds","adBreak","timeOffset","startTime","adTagURI","vastUrl","e","mediaFile","videoUrl","skipOffsetAttr","skipTime","impressionUrl","render","defaultSkip","str","parts","Events","name","callback","info","FullScreen","doc","fullEle","type","anotherType","anotherTypeOn","el","User","Subtitle","container","events","vttText","track","cues","cue","p","blocks","block","lines","timeLineIdx","timeMatch","start","end","cueText","timeStr","Subtitles","items","lastItemIndex","defaultIdx","index","offItem","curBoxHeight","stdMaxHeight","urls","Bar","template","percentage","direction","Timer","lastPlayPos","currentPlayPos","bufferingDetected","fpsCurrent","checker","Bezel","icon","Thumbnails","width","height","barWrapWidth","position","runOnce","isCasting","Controller","mobileRewind","mobileForward","mobilePlayBtn","rewindBtn","forwardBtn","highlights","h","btn","found","cur","nxt","thumbMove","thumbUp","px","tx","time","volumeMove","event","defIdx","canvas","blob","dataURL","link","script","isAvailable","sessionRequest","apiConfig","status","launchMedia","media","mediaInfo","request","onMediaDiscovered","onMediaError","_how","err","s","bar","Setting","defaultSpeedIdx","badge","spd","awakenMove","awakenUp","HotKey","tag","editable","ContextMenu","menuItem","clientRect","x","y","InfoPanel","instances","createBlobHLSLoader","Hls","DefaultLoader","config","superLoad","context","cfg","callbacks","originalOnSuccess","response","stats","ctx","networkDetails","data","blobData","blobUrl","fetchAndDecryptVtt","encrypt","keyHex","ivHex","res","TIMESTAMP_REGEX","decryptLine","hex","iv","encrypted","b","decrypted","keyBuf","ivBuf","cryptoKey","hexVtt","out","line","trimmed","KPlayer","offSubtitle","ds","sub","urlArr","fromNative","inst","nostorage","nonotice","clamped","formatPercentage","customFn","resolvedType","src","HlsLib","userOptions","BlobLoader","hls","_","flvjs","flvPlayer","dashjs","dashjsPlayer","WebTorrent","client","torrentId","torrent","file","f","eventName","level","lvl","used","levels","idx","a","list","qualityCurrent","paused","videoHTML","videoEle","oldNoticeEle","dp","rate","opts"],"mappings":"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"}
|