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