kplayer-ts 1.0.3 → 1.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"kplayer-ts.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 xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 -960 960 960\\\" fill=\\\"currentColor\\\" class=\\\"w-6 md:w-8 lg:w-12\\\"><path d=\\\"M360-522h-30q-10.4 0-17.2-7.12-6.8-7.11-6.8-18 0-10.88 7.08-17.38 7.09-6.5 17.92-6.5h55q11 0 17.5 6.5T410-547v212q0 10.83-7.12 17.92-7.11 7.08-18 7.08-10.88 0-17.88-7.08-7-7.09-7-17.92v-187Zm147 212q-18.7 0-31.35-12.65Q463-335.3 463-354v-173q0-18.7 12.65-31.35Q488.3-571 507-571h83q18.7 0 31.35 12.65Q634-545.7 634-527v173q0 18.7-12.65 31.35Q608.7-310 590-310h-83Zm6-50h71v-162h-71v162ZM480-80q-75 0-140.5-28T225-185q-49-49-77-114.5T120-440q0-12.75 8.68-21.38 8.67-8.62 21.5-8.62 12.82 0 21.32 8.62 8.5 8.63 8.5 21.38 0 125.36 87.32 212.68Q354.64-140 480-140q125.36 0 212.68-87.32Q780-314.64 780-440q0-125.36-85-212.68Q610-740 485-740h-22l52 52q9 9 9 21t-8.61 21q-9.39 9-21.39 9t-21-9L368-751q-9-9-9-21t9-21l106-106q8-8 20.5-8t20.85 8q7.65 8 7.65 20.5t-8 20.5l-58 58h23q75 0 140.5 28T735-695q49 49 77 114.5T840-440q0 75-28 140.5T735-185q-49 49-114.5 77T480-80Z\\\"></path></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 -960 960 960\\\" fill=\\\"currentColor\\\" class=\\\"w-6 md:w-8 lg:w-12\\\"><path d=\\\"M480-80q-75 0-140.5-28T225-185q-49-49-77-114.5T120-440q0-75 28-140.5T225-695q49-49 114.5-77T480-800h23l-57-57q-8-8-8-20.5t7.65-20.5q8.35-8 20.35-8.5 12-.5 20 7.5l106 106q9 9 9 21t-9 21L487-646q-9 9-21 9t-21.39-9q-8.61-9-8.61-21t9-21l52-52h-22q-125 0-210 87.32T180-440q0 125.36 87.32 212.68Q354.64-140 480-140q125.36 0 212.68-87.32Q780-314.64 780-440q0-12.75 8.68-21.38 8.67-8.62 21.5-8.62 12.82 0 21.32 8.62 8.5 8.63 8.5 21.38 0 75-28 140.5T735-185q-49 49-114.5 77T480-80ZM360-522h-30q-10.4 0-17.2-7.12-6.8-7.11-6.8-18 0-10.88 7.08-17.38 7.09-6.5 17.92-6.5h55q11 0 17.5 6.5T410-547v212q0 10.83-7.12 17.92-7.11 7.08-18 7.08-10.88 0-17.88-7.08-7-7.09-7-17.92v-187Zm147 212q-18.7 0-31.35-12.65Q463-335.3 463-354v-173q0-18.7 12.65-31.35Q488.3-571 507-571h83q18.7 0 31.35 12.65Q634-545.7 634-527v173q0 18.7-12.65 31.35Q608.7-310 590-310h-83Zm6-50h71v-162h-71v162Z\\\"></path></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, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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: \"100\",\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(255, 255, 255, 0.96)\",\n color: \"rgba(0, 0, 0, 1.0)\",\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(255, 255, 255, 0.96)\",\n color: \"rgba(0, 0, 0, 1.0)\",\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: \"5px 10px\",\n borderRadius: \"2px\",\n background: \"rgba(255, 174, 0, 0.8)\",\n color: \"rgba(255, 255, 255, 1.0)\",\n fontSize: \"12px\",\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 this.player.container.classList.add(\"kplayer-ad-playing\");\n\n // ── Controller, title bar нуух ───────────────────\n this.player.controller.hide();\n this.player.controller.disableAutoHide = true;\n\n // Title bar нуух\n const titleBar = this.player.template.titleBar;\n if (titleBar) {\n titleBar.style.opacity = \"0\";\n titleBar.style.visibility = \"hidden\";\n titleBar.style.pointerEvents = \"none\";\n }\n\n // Settings panel хаах (хэрэв нээлттэй байвал)\n this.player.setting.hide();\n // ─────────────────────────────────────────────────\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 this.player.container.classList.remove(\"kplayer-ad-playing\");\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 // ── Controller, title bar буцаах ─────────────────\n this.player.controller.disableAutoHide = false;\n this.player.controller.show();\n\n // Title bar буцаах\n const titleBar = this.player.template.titleBar;\n if (titleBar) {\n titleBar.style.opacity = \"\";\n titleBar.style.visibility = \"\";\n titleBar.style.pointerEvents = \"\";\n titleBar.style.transform = \"\";\n }\n // ─────────────────────────────────────────────────\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 if (this.player.contextmenu.shown) {\n this.player.contextmenu.hide();\n }\n if (this.player.subtitles) {\n this.player.subtitles.hide();\n }\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 if (\n this.player.template.settingBox.classList.contains(\n \"kplayer-setting-box-open\",\n )\n ) {\n this.hide();\n return;\n }\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;\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 off(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 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, HlsLib); // ← HlsLib дамжуулах\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(\n hls: HlsInstance,\n HlsLib: {\n Events: Record<string, string>;\n isSupported: () => boolean;\n DefaultConfig: { loader: unknown };\n } & (new (opts: unknown) => HlsInstance),\n ): 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\n const qualityName = el.textContent?.trim() || \"\";\n if (label) label.textContent = qualityName;\n\n // Switching notice\n this.notice(\n `${this.tran(\"switching-quality\").replace(\"%q\", qualityName)}`,\n -1,\n undefined,\n \"switch-quality\",\n );\n\n // Switched notice — LEVEL_SWITCHED дээр нэг удаа\n const onSwitched = () => {\n this.notice(\n `${this.tran(\"switched-quality\").replace(\"%q\", qualityName)}`,\n 2000,\n undefined,\n \"switch-quality\",\n );\n hls.off(HlsLib.Events.LEVEL_SWITCHED, onSwitched);\n };\n hls.on(HlsLib.Events.LEVEL_SWITCHED, onSwitched);\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","titleBar","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","onSwitched","qualityCurrent","paused","videoHTML","videoEle","oldNoticeEle","dp","rate","opts"],"mappings":"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"}
1
+ {"version":3,"file":"kplayer-ts.es.js","names":[],"sources":["../src/ts/utils.ts","../src/ts/options.ts","../src/ts/i18n.ts","../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","../src/ts/index.ts"],"sourcesContent":["import type { ScrollPosition, NameMap, StorageUtil } from \"./types\";\n\n// SSR-safe user-agent: на server (Next.js, Node) `navigator` байхгүй тул\n// модуль импортлох үед унахгүйгээр хоосон мөр руу уначна.\nconst userAgent =\n typeof navigator !== \"undefined\" && navigator.userAgent\n ? navigator.userAgent\n : \"\";\n\nconst isMobile = /mobile|android|iphone|ipod|phone|ipad/i.test(userAgent);\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 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 const 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 }\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.scrollX ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0,\n top:\n window.scrollY ||\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(userAgent),\n\n isChrome: /chrome/i.test(userAgent),\n\n isSafari: /safari/i.test(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.slice(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 play: \"Тоглуулах\",\n pause: \"Түр зогсоох\",\n rewind: \"10 секунд хойш\",\n forward: \"10 секунд урагш\",\n mute: \"Дуу хаах\",\n unmute: \"Дуу нээх\",\n seek: \"Хугацааны заагч\",\n \"video-player\": \"Видео тоглуулагч\",\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 play: \"Play\",\n pause: \"Pause\",\n rewind: \"Rewind 10 seconds\",\n forward: \"Forward 10 seconds\",\n mute: \"Mute\",\n unmute: \"Unmute\",\n seek: \"Seek slider\",\n \"video-player\": \"Video player\",\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 play: \"播放\",\n pause: \"暂停\",\n rewind: \"后退10秒\",\n forward: \"前进10秒\",\n mute: \"静音\",\n unmute: \"取消静音\",\n seek: \"进度条\",\n \"video-player\": \"视频播放器\",\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 play: \"播放\",\n pause: \"暫停\",\n rewind: \"後退10秒\",\n forward: \"前進10秒\",\n mute: \"靜音\",\n unmute: \"取消靜音\",\n seek: \"進度條\",\n \"video-player\": \"視訊播放器\",\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 play: \"재생\",\n pause: \"일시정지\",\n rewind: \"10초 뒤로\",\n forward: \"10초 앞으로\",\n mute: \"음소거\",\n unmute: \"음소거 해제\",\n seek: \"탐색 막대\",\n \"video-player\": \"비디오 플레이어\",\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 play: \"Abspielen\",\n pause: \"Pause\",\n rewind: \"10 Sekunden zurück\",\n forward: \"10 Sekunden vor\",\n mute: \"Stummschalten\",\n unmute: \"Ton einschalten\",\n seek: \"Suchleiste\",\n \"video-player\": \"Videoplayer\",\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 play: \"再生\",\n pause: \"一時停止\",\n rewind: \"10秒戻る\",\n forward: \"10秒進む\",\n mute: \"ミュート\",\n unmute: \"ミュート解除\",\n seek: \"シークバー\",\n \"video-player\": \"ビデオプレーヤー\",\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 play: \"Воспроизвести\",\n pause: \"Пауза\",\n rewind: \"Назад на 10 секунд\",\n forward: \"Вперёд на 10 секунд\",\n mute: \"Без звука\",\n unmute: \"Включить звук\",\n seek: \"Полоса перемотки\",\n \"video-player\": \"Видеоплеер\",\n },\n};\n\nexport { i18n };\n","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\n// Бүх icon нь чимэглэлийн зориулалттай (товч/мөр нь aria-label-тай) тул\n// screen reader-ээс нуух + focus авахааргүй болгоно.\nconst decorative = (svg: string): string =>\n svg.replace(/<svg\\b/, '<svg aria-hidden=\"true\" focusable=\"false\"');\n\nconst Icons = {\n play: decorative(play),\n pause: decorative(pause),\n volumeUp: decorative(volumeUp),\n volumeDown: decorative(volumeDown),\n volumeOff: decorative(volumeOff),\n full: decorative(full),\n fullWeb: decorative(fullWeb),\n setting: decorative(setting),\n right: decorative(right),\n pallette: decorative(pallette),\n camera: decorative(camera),\n subtitle: decorative(subtitle),\n loading: decorative(loading),\n airplay: decorative(airplay),\n chromecast: decorative(chromecast),\n back: decorative(back),\n rewind: decorative(rewind),\n forward: decorative(forward),\n video: decorative(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, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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)}\" alt=\"\">\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\" aria-label=\"${attr(tran(\"mute\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.volumeDown)}</span>\n </button>\n <div class=\"kplayer-volume-bar-wrap\" data-balloon-pos=\"up\" role=\"slider\" tabindex=\"0\" aria-label=\"${attr(tran(\"volume\"))}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"${Math.round((options.volume ?? 0.7) * 100)}\">\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\" aria-label=\"${attr(tran(\"rewind\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.rewind)}</span>\n </button>\n <button class=\"kplayer-icon kplayer-play-icon\" aria-label=\"${attr(tran(\"play\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.play)}</span>\n </button>\n <button class=\"kplayer-icon kplayer-forward-icon\" aria-label=\"${attr(tran(\"forward\"))}\">\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\" aria-label=\"${attr(tran(\"setting\"))}\" aria-haspopup=\"true\">\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\" aria-label=\"${attr(tran(\"web-fullscreen\"))}\">\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\" aria-label=\"${attr(tran(\"fullscreen\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.full)}</span>\n </button>\n </div>\n\n <div class=\"kplayer-bar-wrap\" role=\"slider\" tabindex=\"0\" aria-label=\"${attr(tran(\"seek\"))}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" aria-valuetext=\"0:00\">\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\" rel=\"noopener noreferrer\"' : \"\"} href=\"${attr(item.link || \"#\")}\">${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\" aria-label=\"${attr(tran(\"rewind\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.rewind)}</span>\n </button>\n <button class=\"kplayer-mobile-play-btn\" aria-label=\"${attr(tran(\"play\"))}\">\n <span class=\"kplayer-icon-content\">${html(icons.play)}</span>\n </button>\n <button class=\"kplayer-mobile-forward\" aria-label=\"${attr(tran(\"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: \"100\",\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(255, 255, 255, 0.96)\",\n color: \"rgba(0, 0, 0, 1.0)\",\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(255, 255, 255, 0.96)\",\n color: \"rgba(0, 0, 0, 1.0)\",\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: \"5px 10px\",\n borderRadius: \"2px\",\n background: \"rgba(255, 174, 0, 0.8)\",\n color: \"rgba(255, 255, 255, 1.0)\",\n fontSize: \"12px\",\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 this.player.container.classList.add(\"kplayer-ad-playing\");\n\n // ── Controller, title bar нуух ───────────────────\n this.player.controller.hide();\n this.player.controller.disableAutoHide = true;\n\n // Title bar нуух\n const titleBar = this.player.template.titleBar;\n if (titleBar) {\n titleBar.style.opacity = \"0\";\n titleBar.style.visibility = \"hidden\";\n titleBar.style.pointerEvents = \"none\";\n }\n\n // Settings panel хаах (хэрэв нээлттэй байвал)\n this.player.setting.hide();\n // ─────────────────────────────────────────────────\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 this.player.container.classList.remove(\"kplayer-ad-playing\");\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 // ── Controller, title bar буцаах ─────────────────\n this.player.controller.disableAutoHide = false;\n this.player.controller.show();\n\n // Title bar буцаах\n const titleBar = this.player.template.titleBar;\n if (titleBar) {\n titleBar.style.opacity = \"\";\n titleBar.style.visibility = \"\";\n titleBar.style.pointerEvents = \"\";\n titleBar.style.transform = \"\";\n }\n // ─────────────────────────────────────────────────\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 // double-tap seek (mobile) төлөв\n private _tapTime = 0;\n private _tapSide: \"left\" | \"right\" | null = null;\n private _tapTimer = 0;\n private _seekAccum = 0;\n private _rippleTimer = 0;\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 // mobile: видеоны зүүн/баруун хагасыг давхар товшоод ±10 сек гүйлгэнэ,\n // ганц товшилт нь хяналтыг toggle хийнэ.\n this._setupMobileTapSeek();\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 // a11y: гар (keyboard)-аар хугацаа гүйлгэх (role=\"slider\")\n this.player.template.playedBarWrap.addEventListener(\n \"keydown\",\n (e: KeyboardEvent) => {\n const dur = this.player.video.duration;\n if (!dur || !isFinite(dur)) return;\n const cur = this.player.video.currentTime;\n let handled = true;\n switch (e.key) {\n case \"ArrowLeft\":\n this.player.seek(cur - 5);\n break;\n case \"ArrowRight\":\n this.player.seek(cur + 5);\n break;\n case \"PageDown\":\n this.player.seek(cur - 30);\n break;\n case \"PageUp\":\n this.player.seek(cur + 30);\n break;\n case \"Home\":\n this.player.seek(0);\n break;\n case \"End\":\n this.player.seek(dur);\n break;\n default:\n handled = false;\n }\n if (handled) e.preventDefault();\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 // a11y: гар (keyboard)-аар дууны түвшин (role=\"slider\")\n this.player.template.volumeBarWrapWrap.addEventListener(\n \"keydown\",\n (e: KeyboardEvent) => {\n const v = this.player.volume(undefined, true, true);\n let handled = true;\n switch (e.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n this.player.volume(Math.min(1, v + 0.05));\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n this.player.volume(Math.max(0, v - 0.05));\n break;\n case \"Home\":\n this.player.volume(1);\n break;\n case \"End\":\n this.player.volume(0);\n break;\n default:\n handled = false;\n }\n if (handled) e.preventDefault();\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 this.player.events.trigger(\"chromecast_available\", 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 // mobile: давхар товшилтоор ±10 сек гүйлгэх (YouTube маягийн)\n private _setupMobileTapSeek(): void {\n const wrap = this.player.template.videoWrap;\n const DOUBLE_MS = 300;\n wrap.addEventListener(\"click\", (e: MouseEvent) => {\n const rect = wrap.getBoundingClientRect();\n const side: \"left\" | \"right\" =\n e.clientX - rect.left < rect.width / 2 ? \"left\" : \"right\";\n const now = Date.now();\n const isDouble = now - this._tapTime < DOUBLE_MS && this._tapSide === side;\n\n if (isDouble) {\n // 2 дахь товшилт → гүйлгэх (хүлээж байсан single-tap toggle-г цуцална)\n window.clearTimeout(this._tapTimer);\n const cur = this.player.video.currentTime;\n const dur = this.player.video.duration;\n this._seekAccum += 10;\n if (side === \"left\") {\n this.player.seek(Math.max(0, cur - 10));\n } else {\n this.player.seek(dur ? Math.min(dur, cur + 10) : cur + 10);\n }\n this._showSeekRipple(side, this._seekAccum);\n this._tapTime = now; // дараалсан товшилтыг үргэлжлүүлнэ\n } else {\n // эхний товшилт → 2 дахь товшилтыг хүлээнэ, эс бөгөөс toggle\n this._tapTime = now;\n this._tapSide = side;\n this._seekAccum = 0;\n window.clearTimeout(this._tapTimer);\n this._tapTimer = window.setTimeout(() => {\n this.toggle();\n this._tapSide = null;\n }, DOUBLE_MS);\n }\n });\n }\n\n private _showSeekRipple(side: \"left\" | \"right\", seconds: number): void {\n const wrap = this.player.template.videoWrap;\n let el = wrap.querySelector<HTMLElement>(`.kplayer-tap-seek-${side}`);\n if (!el) {\n el = document.createElement(\"div\");\n el.className = `kplayer-tap-seek kplayer-tap-seek-${side}`;\n el.innerHTML = `<div class=\"kplayer-tap-seek-inner\">\n <span class=\"kplayer-tap-seek-icon\">${side === \"left\" ? Icons.rewind : Icons.forward}</span>\n <span class=\"kplayer-tap-seek-text\"></span>\n </div>`;\n wrap.appendChild(el);\n }\n const text = el.querySelector(\".kplayer-tap-seek-text\");\n if (text) text.textContent = `${seconds}`;\n // animation-ийг дахин эхлүүлнэ\n el.classList.remove(\"kplayer-tap-seek-active\");\n void el.offsetWidth; // reflow\n el.classList.add(\"kplayer-tap-seek-active\");\n window.clearTimeout(this._rippleTimer);\n this._rippleTimer = window.setTimeout(() => {\n el?.classList.remove(\"kplayer-tap-seek-active\");\n this._seekAccum = 0;\n }, 600);\n }\n\n destroy(): void {\n window.clearTimeout(this._tapTimer);\n window.clearTimeout(this._rippleTimer);\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 if (this.player.contextmenu.shown) {\n this.player.contextmenu.hide();\n }\n if (this.player.subtitles) {\n this.player.subtitles.hide();\n }\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 this._setupMenuA11y();\n }\n\n // a11y: setting menu-ийн мөрүүдийг keyboard-аар ажиллах боломжтой болгоно\n private _setupMenuA11y(): void {\n const box = this.player.template.settingBox;\n if (!box) return;\n const rowSelector =\n \".kplayer-setting-item, .kplayer-setting-action, .kplayer-setting-speed-item, .kplayer-subtitles-item, .kplayer-quality-item, .kplayer-setting-subtitle-toggle, .kplayer-setting-panel-back\";\n box.querySelectorAll<HTMLElement>(rowSelector).forEach((el) => {\n if (!el.hasAttribute(\"role\")) el.setAttribute(\"role\", \"menuitem\");\n if (!el.hasAttribute(\"tabindex\")) el.setAttribute(\"tabindex\", \"0\");\n });\n // Enter / Space → click (динамикаар нэмэгдсэн мөрийг ч closest-ээр хамаарна)\n box.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n const target = (e.target as HTMLElement)?.closest<HTMLElement>(\n rowSelector,\n );\n if (target && box.contains(target)) {\n e.preventDefault();\n target.click();\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 if (\n this.player.template.settingBox.classList.contains(\n \"kplayer-setting-box-open\",\n )\n ) {\n this.hide();\n return;\n }\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\", (e) => {\n e.preventDefault();\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;\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 off(event: string, cb: (...args: unknown[]) => void): void;\n DefaultConfig?: { loader: unknown };\n}\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: unknown,\n cfg: unknown,\n callbacks: Record<string, unknown>,\n ) {\n const ctx = context as { type?: string };\n const cbs = callbacks as {\n onSuccess: (\n response: { data?: unknown; url: string },\n stats: unknown,\n c: unknown,\n nd: unknown,\n ) => void;\n };\n const originalOnSuccess = cbs.onSuccess;\n\n cbs.onSuccess = function (response, stats, c, networkDetails) {\n try {\n if (ctx.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, c, networkDetails);\n };\n\n superLoad(context, cfg, callbacks);\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 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 resizeObserver?: ResizeObserver;\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 // a11y: player-ийг нэрлэгдсэн бүс (landmark) болгоно\n if (!this.container.hasAttribute(\"role\")) {\n this.container.setAttribute(\"role\", \"region\");\n }\n if (!this.container.hasAttribute(\"aria-label\")) {\n this.container.setAttribute(\n \"aria-label\",\n this.options.title?.title || this.tran(\"video-player\"),\n );\n }\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 // Контейнерийн хэмжээ өөрчлөгдөх бүрт responsive layout-г шинэчилнэ\n // (зөвхөн UA эсвэл анхны өргөнд биш — аливаа embed/resize-д тохирно).\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.container);\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 this._setPlayLabel(this.tran(\"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 this._setPlayLabel(this.tran(\"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 // a11y: play/pause товчнуудын aria-label-г нэг дор шинэчилнэ\n private _setPlayLabel(label: string): void {\n this.template.playButton.setAttribute(\"aria-label\", label);\n this.container\n .querySelector<HTMLElement>(\".kplayer-mobile-play-btn\")\n ?.setAttribute(\"aria-label\", label);\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 // a11y: volume slider + mute/unmute товчны утгыг шинэчилнэ\n const vPct = Math.round(clamped * 100);\n this.template.volumeBarWrapWrap.setAttribute(\n \"aria-valuenow\",\n String(vPct),\n );\n this.template.volumeBarWrapWrap.setAttribute(\n \"aria-valuetext\",\n formatPercentage,\n );\n this.template.volumeButtonIcon?.setAttribute(\n \"aria-label\",\n this.tran(clamped === 0 ? \"unmute\" : \"mute\"),\n );\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 // Safari/iOS нь HLS-г native дэмждэг (iOS дээр MSE байхгүй тул hls.js\n // ажиллахгүй) — энэ тохиолдолд hls.js-ийн оронд native тоглуулна.\n if (\n resolvedType === \"hls\" &&\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, HlsLib); // ← HlsLib дамжуулах\n this.updateHlsQualityCurrentLabel();\n });\n hls.on(HlsLib.Events.LEVEL_SWITCHED, (...args: unknown[]) => {\n const data = args[1] as { level: number };\n this.hlsCurrentLevel = data.level;\n this.updateHlsQualityCurrentLabel();\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 // a11y: seek slider-ийн утгыг шинэчилнэ\n const dur = this.video.duration;\n if (dur && isFinite(dur)) {\n const pct = Math.round((this.video.currentTime / dur) * 100);\n this.template.barWrap.setAttribute(\"aria-valuenow\", String(pct));\n this.template.barWrap.setAttribute(\n \"aria-valuetext\",\n `${currentTime} / ${utils.secondToTime(dur)}`,\n );\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(\n hls: HlsInstance,\n HlsLib: {\n Events: Record<string, string>;\n isSupported: () => boolean;\n DefaultConfig: { loader: unknown };\n } & (new (opts: unknown) => HlsInstance),\n ): 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 // a11y: keyboard-аар сонгох боломжтой болгоно (setting-ийн keydown-д хамаарна)\n el.setAttribute(\"role\", \"menuitem\");\n el.setAttribute(\"tabindex\", \"0\");\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\n const qualityName = el.textContent?.trim() || \"\";\n if (label) label.textContent = qualityName;\n\n // Switching notice\n this.notice(\n `${this.tran(\"switching-quality\").replace(\"%q\", qualityName)}`,\n -1,\n undefined,\n \"switch-quality\",\n );\n\n // Switched notice — LEVEL_SWITCHED дээр нэг удаа\n const onSwitched = () => {\n this.notice(\n `${this.tran(\"switched-quality\").replace(\"%q\", qualityName)}`,\n 2000,\n undefined,\n \"switch-quality\",\n );\n hls.off(HlsLib.Events.LEVEL_SWITCHED, onSwitched);\n };\n hls.on(HlsLib.Events.LEVEL_SWITCHED, onSwitched);\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 // Narrow layout (нарийн контейнер) — өргөнөөс хамаарч responsive болгоно.\n this.container.classList.toggle(\n \"kplayer-arrow\",\n this.container.offsetWidth <= 500,\n );\n\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 this.resizeObserver?.disconnect();\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 // encrypt идэвхтэй үед key/iv-г шийднэ: keyProvider өгсөн бол түүгээр\n // (backend-ээс), эс бөгөөс статик key/iv-г ашиглана.\n private async _resolveSubtitleCrypto(): Promise<{\n key?: string;\n iv?: string;\n }> {\n const opts = this.options.subtitle;\n if (!opts?.encrypt) return {};\n if (opts.keyProvider) {\n try {\n const { key, iv } = await opts.keyProvider();\n return { key, iv };\n } catch (e) {\n console.warn(\"[KPlayer] subtitle keyProvider failed:\", e);\n }\n }\n return { key: opts.key, iv: opts.iv };\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 { key, iv } = await this._resolveSubtitleCrypto();\n const text = await fetchAndDecryptVtt(item.url, opts.encrypt, key, iv);\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 { key, iv } = await this._resolveSubtitleCrypto();\n const text = await fetchAndDecryptVtt(item.url, opts.encrypt, key, iv);\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","import \"../css/index.less\";\nimport KPlayer from \"./player\";\n\nexport default KPlayer;\nexport type {\n KPlayerOptions,\n VideoQuality,\n SubtitleOptions,\n SubtitleItem,\n AdOptions,\n AdItem,\n HighlightItem,\n TitleOptions,\n ContextMenuItem,\n} from \"./types\";\n"],"mappings":"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"}