// ==UserScript== // @name MissAV去广告、影院模式 // @description MissAV去广告|单手模式|MissAV自动展开详情|MissAV自动高画质|MissAV重定向支持|MissAV自动登录|定制播放器 支持 jable po*nhub 等通用 // @version 5.1.0 // @author Chris_C // @match *://*.missav.ws/* // @match *://*.missav.ai/* // @match *://*.jable.tv/* // @match *://*/* // @grant none // @icon https://missav.ws/img/favicon.ico // @license MIT // @namespace loadingi.local // @noframes // @run-at document-start // @downloadURL https://update.greasyfork.icu/scripts/453300/MissAV%E5%8E%BB%E5%B9%BF%E5%91%8A%E3%80%81%E5%BD%B1%E9%99%A2%E6%A8%A1%E5%BC%8F.user.js // @updateURL https://update.greasyfork.icu/scripts/453300/MissAV%E5%8E%BB%E5%B9%BF%E5%91%8A%E3%80%81%E5%BD%B1%E9%99%A2%E6%A8%A1%E5%BC%8F.meta.js // ==/UserScript== /*! For license information please see miss_player.user.js.LICENSE.txt */ (()=>{"use strict";var t={56:(t,e,n)=>{t.exports=function(t){var e=n.nc;e&&t.setAttribute("nonce",e)}},72:t=>{var e=[];function n(t){for(var n=-1,r=0;r{t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},314:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n="",r=void 0!==e[5];return e[4]&&(n+="@supports (".concat(e[4],") {")),e[2]&&(n+="@media ".concat(e[2]," {")),r&&(n+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),n+=t(e),r&&(n+="}"),e[2]&&(n+="}"),e[4]&&(n+="}"),n})).join("")},e.i=function(t,n,r,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var a={};if(r)for(var s=0;s0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=i),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),o&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=o):u[4]="".concat(o)),e.push(u))}},e}},540:t=>{t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},601:t=>{t.exports=function(t){return t[1]}},610:(t,e,n)=>{n.r(e),n.d(e,{default:()=>g});var r=n(72),o=n.n(r),i=n(825),a=n.n(i),s=n(659),l=n.n(s),c=n(56),u=n.n(c),d=n(540),h=n.n(d),p=n(113),f=n.n(p),m=n(935),v={};v.styleTagTransform=f(),v.setAttributes=u(),v.insert=l().bind(null,"head"),v.domAPI=a(),v.insertStyleElement=h(),o()(m.A,v);const g=m.A&&m.A.locals?m.A.locals:void 0},659:t=>{var e={};t.exports=function(t,n){var r=function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}e[t]=n}return e[t]}(t);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},825:t=>{t.exports=function(t){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=t.insertStyleElement(t);return{update:function(n){!function(t,e,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var i=n.sourceMap;i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(r,t,e.options)}(e,t,n)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},935:(t,e,n)=>{n.d(e,{A:()=>s});var r=n(601),o=n.n(r),i=n(314),a=n.n(i)()(o());a.push([t.id,'/* =========== 基础变量定义 =========== */\n:root {\n /* 颜色系统 - 符合Apple Dark Mode设计规范 */\n --shadcn-background: 0 0% 0%; /* 纯黑色背景 */\n --shadcn-foreground: 0 0% 100%; /* 纯白色前景 */\n --shadcn-card: 0 0% 5%; /* 深灰色卡片背景 */\n --shadcn-card-foreground: 0 0% 95%; /* 淡灰白色卡片前景 */\n --shadcn-popover: 0 0% 10%; /* 深灰色弹出层背景 */\n --shadcn-popover-foreground: 0 0% 95%; /* 淡灰白色弹出层前景 */\n --shadcn-primary: 210 10% 90%; /* 淡蓝灰色主色 */\n --shadcn-primary-foreground: 210 20% 10%; /* 深蓝灰色主色前景 */\n --shadcn-secondary: 0 0% 15%; /* 次要颜色为深灰色 */\n --shadcn-secondary-foreground: 0 0% 95%; /* 淡灰白色次要前景 */\n --shadcn-muted: 0 0% 30%; /* 柔和的深灰色 */\n --shadcn-muted-foreground: 0 0% 70%; /* 柔和的浅灰色前景 */\n --shadcn-accent: 212 40% 30%; /* 柔和的蓝灰色强调色 */\n --shadcn-accent-foreground: 0 0% 95%; /* 淡灰白色强调前景 */\n --shadcn-destructive: 0 50% 40%; /* 柔和的红色 */\n --shadcn-destructive-foreground: 0 0% 95%; /* 淡灰白色破坏性操作前景 */\n --shadcn-border: 0 0% 30%; /* 深灰色边框 */\n --shadcn-input: 0 0% 15%; /* 深灰色输入框 */\n --shadcn-ring: 212 70% 45%; /* 蓝色环 */\n \n /* 状态颜色 - 符合Apple设计规范的柔和色调 */\n --shadcn-green: 142 50% 45%; /* 柔和的绿色 */\n --shadcn-green-foreground: 0 0% 95%; /* 淡灰白色绿色前景 */\n --shadcn-blue: 211 70% 55%; /* 柔和的蓝色 */\n --shadcn-blue-foreground: 0 0% 95%; /* 淡灰白色蓝色前景 */\n --shadcn-red: 0 60% 50%; /* 柔和的红色 */\n --shadcn-red-foreground: 0 0% 95%; /* 淡灰白色红色前景 */\n --shadcn-orange: 25 80% 50%; /* 柔和的橙色 */\n --shadcn-orange-foreground: 0 0% 95%; /* 淡灰白色橙色前景 */\n --shadcn-purple: 262 60% 60%; /* 柔和的紫色 */\n --shadcn-purple-foreground: 0 0% 95%; /* 淡灰白色紫色前景 */\n \n /* 圆角 */\n --shadcn-radius: 0.5rem;\n --shadcn-radius-sm: 0.3rem;\n --shadcn-radius-lg: 0.8rem;\n \n /* 按钮尺寸 */\n --button-sm: 20px;\n --button-md: 32px;\n --button-lg: 40px;\n --button-xl: 48px;\n \n /* 常用动画 */\n --anim-quick: 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n --anim-smooth: 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n --anim-bounce: 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n \n /* 阴影 - Apple风格阴影更柔和 */\n --shadow-sm: 0 2px 5px rgba(0, 0, 0, 0.2);\n --shadow-md: 0 4px 10px rgba(0, 0, 0, 0.25);\n --shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.3);\n \n /* 字体 */\n --font-sans: "SF Pro Display", "SF Pro", "Segoe UI", "Microsoft YaHei", "微软雅黑", "PingFang SC", "苹方", "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";\n}\n\n/* 全局字体设置 */\nhtml, body, button, input, select, textarea {\n font-family: var(--font-sans);\n}\n\n/* 确保所有元素都使用全局字体 */\n*, *::before, *::after {\n font-family: inherit;\n}\n\n.tm-video-overlay * {\n font-family: var(--font-sans);\n}\n\n/* =========== 通用组件样式 =========== */\n\n/* 浮动按钮 */\n.tm-floating-button {\n position: fixed;\n bottom: 30px;\n right: 30px;\n padding: 3px;\n width: calc(var(--button-xl));\n height: calc(var(--button-xl));\n border-radius: calc(var(--button-xl) / 2);\n background-color: rgba(35, 17, 29, 0.8);\n color: rgb(254, 98, 142);\n border: none;\n box-shadow: var(--shadow-md), 0 0 0 1px rgba(255, 255, 255, 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9980;\n cursor: pointer;\n transition: all var(--anim-smooth);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n.tm-floating-button:hover {\n transform: translateY(-3px) scale(1.05);\n box-shadow: var(--shadow-lg), 0 0 0 1px rgba(255, 255, 255, 0.15);\n}\n\n.tm-floating-button:active {\n transform: scale(0.95);\n}\n\n/* =========== 视频播放器样式 =========== */\n\n/* 整体布局 */\n.tm-video-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 100vh;\n background-color: rgba(35, 17, 29, 0.8); /* 更深的背景色 */\n z-index: 9990;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n backdrop-filter: blur(30px); /* 增加模糊效果,符合iOS风格 */\n -webkit-backdrop-filter: blur(30px);\n padding: 0; /* 移除默认padding */\n}\n\n/* 播放器容器 - 现在与视频覆盖层同级 */\n.tm-player-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n width: 100%;\n background-color: transparent;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n z-index: 9991;\n /* 确保能完全包含所有子元素 */\n height: 100%;\n overflow: visible;\n pointer-events: auto;\n}\n\n/* 按钮容器 - 放置在视频容器顶部外面 */\n.tm-button-container {\n width: 100%;\n display: flex;\n justify-content: space-between;\n padding: 6px 10px;\n box-sizing: border-box;\n z-index: 9993;\n /* 保持在顶部 */\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.tm-video-container {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: auto;\n max-height: 80vh;\n margin-top: 44px;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n background-color: hsl(var(--shadcn-card));\n border-radius: var(--shadcn-radius-lg);\n box-shadow: var(--shadow-lg);\n z-index: 9992;\n}\n\n.tm-video-wrapper {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n will-change: transform;\n border-radius: var(--shadcn-radius) var(--shadcn-radius) 0 0;\n}\n\n/* 确保视频元素随容器高度变化 */\n.tm-video-wrapper video {\n width: auto !important; \n height: 100% !important; \n max-width: none !important; \n object-fit: contain !important; \n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n touch-action: pan-y; \n cursor: grab; \n}\n\n/* 调整手柄 */\n.tm-handle-container {\n left: 0;\n right: 0;\n bottom: 10px;\n height: 30px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 9992;\n width: 100%;\n}\n\n.tm-resize-handle {\n position: absolute;\n height: 5px;\n width: 134px;\n max-width: 134px;\n background-color: hsla(var(--shadcn-foreground) / 0.6);\n border-radius: 2.5px;\n cursor: ns-resize;\n touch-action: none;\n opacity: 0.5;\n will-change: transform;\n transition: all var(--anim-quick);\n box-shadow: none;\n}\n\n.tm-resize-handle::after {\n content: \'\';\n position: absolute;\n left: -10px;\n right: -10px;\n top: -15px;\n bottom: -15px;\n background: transparent;\n}\n\n.tm-resize-handle:hover {\n opacity: 1;\n background-color: hsla(var(--shadcn-foreground) / 0.8);\n}\n\n/* 控制按钮基础样式 */\n.tm-control-button-base {\n color: hsl(var(--shadcn-secondary-foreground));\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all var(--anim-quick);\n backdrop-filter: blur(12px); /* 增加模糊效果 */\n -webkit-backdrop-filter: blur(12px);\n box-shadow: var(--shadow-sm);\n}\n\n/* 关闭按钮 */\n.tm-close-button {\n position: relative;\n width: var(--button-md);\n height: var(--button-md);\n border-radius: calc(var(--button-md) / 2);\n background-color: hsla(var(--shadcn-secondary) / 0.5); /* 更透明的背景 */\n color: hsl(var(--shadcn-secondary-foreground));\n border: 1px solid hsla(var(--shadcn-border) / 0.1); /* 减少边框强度 */\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all var(--anim-smooth);\n z-index: 9994;\n}\n\n.tm-close-button:hover {\n background-color: hsl(var(--shadcn-destructive));\n transform: scale(1.1);\n box-shadow: var(--shadow-md);\n}\n\n.tm-close-button:active {\n transform: scale(0.9);\n}\n\n/* 设置按钮 */\n.tm-settings-button {\n position: relative;\n width: var(--button-md);\n height: var(--button-md);\n border-radius: calc(var(--button-md) / 2);\n background-color: hsla(var(--shadcn-secondary) / 0.7);\n color: hsl(var(--shadcn-secondary-foreground));\n border: 1px solid hsla(var(--shadcn-border) / 0.2);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9993;\n cursor: pointer;\n transition: all var(--anim-quick);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n box-shadow: var(--shadow-sm);\n}\n\n.tm-settings-button:hover {\n background-color: hsla(var(--shadcn-accent) / 0.9);\n transform: scale(1.1) rotate(30deg);\n box-shadow: var(--shadow-md);\n}\n\n.tm-settings-button:active {\n transform: scale(0.9);\n}\n\n/* 设置面板 */\n.tm-settings-panel {\n position: absolute;\n top: calc(env(safe-area-inset-top, 8px) + 60px);\n right: 16px;\n background-color: hsla(var(--shadcn-card) / 0.7);\n backdrop-filter: blur(15px);\n -webkit-backdrop-filter: blur(15px);\n border-radius: var(--shadcn-radius);\n border: 1px solid hsla(var(--shadcn-border) / 0.1); /* 淡化边框 */\n padding: 12px;\n box-shadow: var(--shadow-md);\n z-index: 9996;\n min-width: 200px;\n transform: translateY(-10px);\n opacity: 0;\n pointer-events: none;\n transition: transform var(--anim-smooth), opacity var(--anim-smooth);\n}\n\n.tm-settings-panel.active {\n transform: translateY(0);\n opacity: 1;\n pointer-events: auto;\n}\n\n/* 设置选项 */\n.tm-settings-option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px;\n border-radius: var(--shadcn-radius-sm);\n margin-bottom: 8px;\n transition: background-color var(--anim-quick);\n}\n\n.tm-settings-option:hover {\n background-color: hsla(var(--shadcn-muted) / 0.5); /* 半透明悬停效果 */\n}\n\n.tm-settings-option:last-child {\n margin-bottom: 0;\n}\n\n.tm-settings-label {\n font-family: var(--font-sans);\n font-size: 14px;\n color: hsl(var(--shadcn-foreground));\n}\n\n/* 切换开关 */\n.tm-toggle-switch {\n position: relative;\n display: inline-block;\n width: 40px;\n height: 24px;\n}\n\n.tm-toggle-switch input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.tm-toggle-slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: hsla(var(--shadcn-muted) / 0.7); /* 关闭状态背景 */\n border-radius: 12px;\n transition: var(--anim-quick);\n}\n\n.tm-toggle-slider:before {\n position: absolute;\n content: "";\n height: 20px;\n width: 20px;\n left: 2px;\n bottom: 2px;\n background-color: hsl(var(--shadcn-foreground));\n border-radius: 50%;\n transition: var(--anim-quick);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 细微阴影 */\n}\n\n.tm-toggle-slider.checked {\n background-color: hsl(var(--shadcn-blue)); /* 开启状态背景 */\n}\n\n.tm-toggle-slider.checked:before {\n transform: translateX(16px);\n}\n\n/* 播放速率滑块 */\n.tm-playback-rate-slider {\n display: flex;\n align-items: center;\n margin-left: 0;\n height: var(--button-md);\n width: 100%;\n background: hsl(var(--shadcn-card) / 0.85);\n border-radius: 8px;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n position: relative;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transition: box-shadow 0.3s ease, transform 0.2s ease;\n cursor: pointer;\n}\n\n.tm-playback-rate-slider:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transform: translateY(-1px);\n}\n\n.tm-playback-rate-slider.dragging {\n box-shadow: var(--shadow-md);\n background: hsla(var(--shadcn-card) / 0.9);\n}\n\n.tm-slider-container {\n width: 100%;\n height: 100%;\n background: hsla(var(--shadcn-secondary) / 0.8);\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n}\n\n.tm-slider-level {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: hsl(0 0% 50% / 1);\n width: 50%;\n transform-origin: left;\n transition: width 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n z-index: 1;\n}\n\n.tm-slider-text {\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0 12px;\n z-index: 2;\n position: relative;\n}\n\n.tm-speed-label {\n color: hsl(var(--shadcn-muted-foreground));\n font-size: 13px;\n font-weight: 500;\n transition: color 0.3s ease;\n}\n\n.tm-speed-value {\n color: hsl(var(--shadcn-foreground));\n font-size: 13px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* 速度标签和值 */\n.tm-speed-label {\n color: hsl(var(--shadcn-muted-foreground));\n font-size: 13px;\n font-weight: 400;\n transition: color var(--anim-quick);\n}\n\n.tm-playback-rate-slider:hover .tm-speed-label {\n color: hsl(var(--shadcn-foreground));\n}\n\n.tm-speed-value {\n color: hsl(var(--shadcn-foreground));\n font-size: 13px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* 速度值颜色状态 */\n.tm-speed-value.fast {\n color: hsl(var(--shadcn-orange));\n}\n\n.tm-speed-value.slow {\n color: hsl(var(--shadcn-blue));\n}\n\n.tm-speed-value.normal {\n color: hsl(var(--shadcn-foreground));\n}\n\n/* 进度条控制组件 */\n.tm-progress-controls {\n position: relative;\n width: 100%;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n z-index: 9991;\n border-radius: 0 0 var(--shadcn-radius-lg) var(--shadcn-radius-lg);\n font-family: var(--font-sans);\n transition: opacity var(--anim-smooth);\n}\n\n/* 进度条容器 */\n.tm-progress-bar-container {\n position: relative;\n height: 12px;\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none; /* 防止文本选择 */\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n touch-action: none; /* 防止触摸设备上的默认行为 */\n}\n\n/* 进度条 */\n.tm-progress-bar {\n width: 100%;\n height: 8px;\n background-color: hsla(var(--shadcn-muted) / 0.5);\n border-radius: 8px;\n overflow: hidden;\n position: relative;\n transition: height 0.15s;\n}\n\n.tm-progress-bar:hover {\n height: 6px;\n}\n\n/* 添加进度条交互状态样式 */\n.tm-progress-bar-expanded {\n height: 16px !important;\n}\n\n.tm-progress-bar-normal {\n height: 8px !important;\n}\n\n/* 进度条拖动状态 */\n.tm-progress-bar.tm-dragging {\n height: 16px !important;\n background-color: hsla(var(--shadcn-muted-foreground) / 0.7);\n cursor: grabbing;\n}\n\n/* 容器在拖动时的样式 */\n.tm-progress-bar-container:has(.tm-dragging) {\n cursor: grabbing;\n}\n\n/* 进度指示器 */\n.tm-progress-indicator {\n height: 100%;\n width: 0%;\n background-color: hsla(var(--shadcn-muted) / 0.8);\n border-radius: 0;\n position: absolute;\n left: 0;\n top: 0;\n transition: width 0.1s linear;\n overflow: hidden;\n}\n\n/* 拖动时的进度指示器样式 */\n.tm-dragging .tm-progress-indicator {\n background-color: hsl(var(--shadcn-card-foreground));\n box-shadow: none;\n transition: none; /* 拖动时禁用过渡效果,使响应更即时 */\n}\n\n/* 确保进度条容器正确处理溢出 */\n.tm-progress-bar {\n overflow: hidden;\n}\n\n/* 进度条手柄 */\n.tm-progress-handle {\n width: 12px;\n height: 12px;\n background-color: hsl(var(--shadcn-blue));\n border: 2px solid hsl(var(--shadcn-card));\n border-radius: 50%;\n position: absolute;\n top: 50%;\n left: 0%;\n transform: translate(0, -50%);\n z-index: 2;\n opacity: 1;\n transition: opacity 0.15s, width 0.15s, height 0.15s, box-shadow 0.15s;\n box-shadow: 0 0 0 4px hsl(var(--shadcn-blue) / 0.2);\n cursor: grab;\n}\n\n.tm-progress-handle:hover,\n.tm-progress-handle.dragging {\n transform: translate(0, -50%) scale(1.1);\n box-shadow: 0 0 0 6px hsl(var(--shadcn-blue) / 0.3);\n}\n\n/* 循环标记 - Apple Design风格优化 */\n.tm-loop-marker {\n position: absolute;\n width: 4px;\n height: 100%; /* 与进度条等高 */\n top: 0; /* 位于进度条上方,不是突出来的 */\n transform: translateX(-50%);\n z-index: 3;\n transition: opacity 0.3s cubic-bezier(0.25, 0.1, 0.25, 1), \n transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275),\n box-shadow 0.2s cubic-bezier(0.25, 0.1, 0.25, 1);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n/* 循环开始标记(A) */\n.tm-loop-start-marker {\n background-color: hsla(var(--shadcn-green) / 0.5);\n border-radius: 2px;\n box-shadow: 0 0 6px hsla(var(--shadcn-green) / 0.3);\n}\n\n/* 循环结束标记(B) */\n.tm-loop-end-marker {\n background-color: hsla(var(--shadcn-orange) / 0.5);\n border-radius: 2px;\n box-shadow: 0 0 6px hsla(var(--shadcn-orange) / 0.3);\n}\n\n/* 循环标记悬停效果 */\n.tm-loop-marker:hover {\n cursor: pointer;\n z-index: 4;\n}\n\n.tm-loop-start-marker:hover {\n background-color: hsla(var(--shadcn-green) / 0.7);\n box-shadow: 0 0 10px hsla(var(--shadcn-green) / 0.5);\n}\n\n.tm-loop-end-marker:hover {\n background-color: hsla(var(--shadcn-orange) / 0.7);\n box-shadow: 0 0 10px hsla(var(--shadcn-orange) / 0.5);\n}\n\n/* 循环激活时的标记样式 */\n.tm-loop-marker.active {\n opacity: 1;\n}\n\n.tm-loop-marker:not(.active) {\n opacity: 0.7;\n}\n\n/* 添加标记的文本标签 */\n.tm-loop-marker::before {\n content: attr(data-label);\n position: absolute;\n top: -24px;\n left: 50%;\n transform: translateX(-50%);\n background-color: hsla(var(--shadcn-card) / 0.7);\n color: hsl(var(--shadcn-card-foreground));\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n opacity: 0;\n transition: opacity 0.2s ease, transform 0.2s ease;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border: 1px solid hsla(var(--shadcn-border) / 0.1);\n white-space: nowrap;\n z-index: 5;\n}\n\n.tm-loop-start-marker::before {\n content: "循环起点";\n}\n\n.tm-loop-end-marker::before {\n content: "循环终点";\n}\n\n.tm-loop-marker:hover::before {\n opacity: 1;\n transform: translateX(-50%) translateY(-4px);\n}\n\n/* 时间容器状态样式 */\n.tm-start-time-container-hover {\n background-color: hsl(var(--shadcn-green) / 0.1);\n border-color: hsl(var(--shadcn-green) / 0.3);\n}\n\n.tm-start-time-container-default {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border-color: hsl(var(--shadcn-border) / 0.1);\n}\n\n.tm-end-time-container-hover {\n background-color: hsl(var(--shadcn-orange) / 0.1);\n border-color: hsl(var(--shadcn-orange) / 0.3);\n}\n\n.tm-end-time-container-default {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border-color: hsl(var(--shadcn-border) / 0.1);\n}\n\n/* 循环按钮状态 */\n.tm-loop-button-hover {\n background-color: hsl(var(--shadcn-accent) / 0.3);\n transform: translateY(-1px);\n}\n\n.tm-loop-button-active {\n background-color: hsl(var(--shadcn-muted) / 0.7);\n}\n\n.tm-loop-button-default {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n transform: translateY(0);\n}\n\n/* 暂停/播放速度指示器 */\n.tm-indicator-base {\n position: absolute;\n padding: 8px 16px;\n background-color: hsla(var(--shadcn-card) / 0.6); /* 更透明 */\n color: hsl(var(--shadcn-card-foreground));\n border-radius: var(--shadcn-radius);\n opacity: 0;\n backdrop-filter: blur(15px); /* 增强模糊效果 */\n -webkit-backdrop-filter: blur(15px);\n box-shadow: var(--shadow-md);\n border: 1px solid hsla(var(--shadcn-border) / 0.1); /* 淡化边框 */\n transform: translateY(20px);\n transition: opacity var(--anim-smooth), transform var(--anim-smooth);\n pointer-events: none;\n z-index: 9994;\n font-size: 15px;\n font-weight: 500;\n}\n\n.tm-indicator-base.visible {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n/* 暂停指示器 */\n.tm-pause-indicator {\n width: 80px;\n height: 80px;\n}\n\n/* 播放速度指示器 */\n.tm-playback-rate-indicator {\n top: 30%;\n border-radius: var(--shadcn-radius);\n padding: 10px 16px;\n font-size: 16px;\n font-weight: bold;\n}\n\n/* 进度条相关布局样式 */\n.tm-progress-row {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n}\n\n.tm-seek-control-row {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n width: 100%;\n box-sizing: border-box;\n}\n\n.tm-loop-control-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n position: relative;\n}\n\n.tm-playback-control-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n width: 100%;\n}\n\n/* 播放控制区域相关样式 */\n.tm-left-controls, .tm-center-controls, .tm-right-controls {\n flex: 1;\n display: flex;\n}\n\n.tm-left-controls {\n justify-content: flex-start;\n}\n\n.tm-center-controls {\n justify-content: center;\n}\n\n.tm-right-controls {\n justify-content: flex-end;\n}\n\n/* 时间显示 */\n.tm-time-display {\n display: flex;\n justify-content: space-between;\n color: hsl(var(--shadcn-foreground) / 0.9);\n font-size: 12px;\n margin-top: -2px;\n font-variant-numeric: tabular-nums;\n gap: 8px;\n}\n\n.tm-time-display-container {\n display: flex;\n justify-content: space-between;\n width: 100%;\n padding: 0px 1px;\n margin-bottom: 4px;\n}\n\n.tm-current-time, .tm-total-duration {\n color: hsl(var(--shadcn-card-foreground) / 0.9);\n font-size: 0.8rem;\n min-width: 60px;\n font-variant-numeric: tabular-nums;\n font-weight: 400;\n line-height: 1;\n}\n\n.tm-current-time {\n text-align: left;\n}\n\n.tm-total-duration {\n text-align: right;\n}\n\n.tm-loop-control {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.tm-start-time-container, .tm-end-time-container {\n display: flex;\n align-items: center;\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border: 1px solid hsl(var(--shadcn-border) / 0.1);\n border-radius: 6px;\n padding: 4px 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n/* 添加悬停效果 */\n.tm-start-time-container:hover {\n background-color: hsl(var(--shadcn-green) / 0.1);\n border-color: hsl(var(--shadcn-green) / 0.3);\n transform: translateY(-1px);\n}\n\n.tm-end-time-container:hover {\n background-color: hsl(var(--shadcn-orange) / 0.1);\n border-color: hsl(var(--shadcn-orange) / 0.3);\n transform: translateY(-1px);\n}\n\n.tm-set-loop-start-label, .tm-set-loop-end-label {\n font-size: 1rem;\n font-weight: 600;\n padding: 0px 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* A按钮标签 - 始终保持绿色 */\n.tm-set-loop-start-label {\n color: hsl(var(--shadcn-green));\n}\n\n/* B按钮标签 - 始终保持橙色 */\n.tm-set-loop-end-label {\n color: hsl(var(--shadcn-orange));\n}\n\n.tm-loop-toggle-button {\n display: flex;\n align-items: center;\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border: 1px solid hsl(var(--shadcn-border) / 0.1);\n border-radius: 6px;\n padding: 4px 8px;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s ease;\n font-weight: 500;\n gap: 6px;\n color: hsl(var(--shadcn-foreground));\n}\n\n/* Loop按钮标签样式 */\n.tm-loop-toggle-label {\n font-size: 1rem;\n font-weight: 600;\n padding: 0px 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: hsl(var(--shadcn-muted-foreground) / 0.9);\n transition: color 0.2s ease;\n}\n\n/* 添加标签激活状态 */\n.tm-loop-toggle-label.active {\n color: hsl(var(--shadcn-red));\n}\n\n/* 循环按钮 - 两种状态 */\n.tm-loop-toggle-button.active {\n background-color: hsl(var(--shadcn-red) / 0.1);\n border-color: hsl(var(--shadcn-red) / 0.3);\n}\n\n.tm-loop-toggle-button:not(.active) {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border-color: hsl(var(--shadcn-border) / 0.1);\n}\n\n\n.tm-loop-toggle-button:active {\n transform: scale(0.98);\n}\n\n.tm-loop-indicator-circle {\n transition: fill 0.2s ease;\n}\n\n\n.tm-loop-toggle-button.active .tm-loop-indicator-circle {\n fill: hsl(var(--shadcn-red));\n}\n\n/* 添加新的样式 */\n/* 快进/快退按钮组样式 */\n.tm-rewind-group, .tm-forward-group {\n display: flex;\n flex-direction: column;\n width: 50%;\n gap: 8px;\n align-items: center;\n}\n\n.tm-rewind-buttons-container {\n display: flex;\n flex-direction: row-reverse;\n flex-wrap: wrap;\n width: 100%;\n justify-content: flex-end;\n align-content: flex-start;\n gap: 6px;\n}\n\n.tm-forward-buttons-container {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: 100%;\n justify-content: flex-end;\n align-content: flex-start;\n gap: 6px;\n}\n\n/* 循环时间显示样式 */\n.tm-loop-start-position, .tm-loop-end-position {\n color: hsl(var(--shadcn-muted-foreground));\n font-size: 0.875rem;\n min-width: 70px;\n text-align: center;\n display: inline-block;\n font-variant-numeric: tabular-nums;\n}\n\n/* 时间控制按钮基础样式 */\n.tm-time-control-button {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n color: hsl(var(--shadcn-secondary-foreground));\n border: 1px solid hsl(var(--shadcn-border) / 0.1);\n border-radius: var(--shadcn-radius-sm);\n padding: 0;\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(.25,.8,.25,1);\n white-space: nowrap;\n font-weight: 500;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n width: var(--button-xl);\n height: var(--button-lg);\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n}\n\n.tm-time-control-button:hover {\n background-color: hsl(var(--shadcn-accent) / 0.6);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.tm-time-control-button:active {\n transform: scale(0.95);\n box-shadow: none;\n}\n\n.tm-time-control-button-active {\n transform: scale(0.95);\n box-shadow: none;\n}\n\n.tm-time-control-button-after-active {\n transform: none;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);\n}\n\n.tm-time-control-button-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.tm-rewind-icon {\n margin-right: -2px;\n}\n\n.tm-forward-icon {\n margin-left: -2px;\n}\n\n.tm-time-text-margin-left {\n margin-left: 2px;\n}\n\n.tm-time-text-margin-right {\n margin-right: 2px;\n}\n\n/* 控制按钮状态 */\n.tm-control-button-hover {\n background-color: hsl(var(--shadcn-accent) / 0.3);\n transform: none;\n}\n\n.tm-control-button-default {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n transform: none;\n}\n\n/* 控制面板容器 */\n.tm-control-buttons {\n position: absolute;\n bottom: calc(10px + env(safe-area-inset-bottom, 0px)); /* 保持距离底部10px,同时考虑iOS安全区域 */\n left: 50%;\n transform: translateX(-50%);\n width: 95%;\n max-width: 700px;\n min-width: 350px; /* 与竖屏模式保持一致 */\n background-color: hsla(var(--shadcn-card) / 0.8);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9991;\n padding: 12px;\n padding-bottom: 12px; /* 移除原来的calc计算,因为我们已经在bottom属性中处理了 */\n border-radius: 12px;\n border: 1px solid hsla(var(--shadcn-border) / 0.1);\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n transition: opacity 0.3s ease, transform 0.3s ease;\n gap: 10px;\n \n /* 添加 flex 布局属性 */\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n/* 控制界面隐藏时的动画效果 - 更新选择器 */\nbody.controls-hidden .tm-player-container .tm-control-buttons {\n opacity: 0;\n transform: translateX(-50%) translateY(20px);\n pointer-events: none;\n}\n\n/* 控制界面显示时的动画效果 - 更新选择器 */\nbody:not(.controls-hidden) .tm-player-container .tm-control-buttons {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n pointer-events: auto;\n}\n\n/* 控制界面隐藏时的动画效果 - 更新选择器 */\nbody.controls-hidden .tm-player-container .tm-button-container {\n opacity: 0;\n transform: translateY(-20px);\n pointer-events: none;\n}\n\n/* 控制界面显示时的动画效果 - 更新选择器 */\nbody:not(.controls-hidden) .tm-player-container .tm-button-container {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n/* 控制按钮 */\n.tm-control-button {\n position: relative;\n width: var(--button-md);\n height: var(--button-md);\n border-radius: calc(var(--button-md) / 2);\n background-color: hsla(var(--shadcn-secondary) / 0.6);\n color: hsl(var(--shadcn-secondary-foreground));\n border: 1px solid hsla(var(--shadcn-border) / 0.1);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all var(--anim-quick);\n}\n\n.tm-control-button:hover {\n background-color: hsla(var(--shadcn-accent) / 0.7);\n transform: translateY(-2px);\n box-shadow: var(--shadow-sm);\n}\n\n.tm-control-button:active {\n transform: scale(0.95);\n box-shadow: none;\n}\n\n.tm-control-button.active {\n background-color: hsla(var(--shadcn-blue) / 0.7);\n color: hsl(var(--shadcn-blue-foreground));\n box-shadow: 0 0 0 2px hsla(var(--shadcn-blue) / 0.3);\n}\n\n.tm-control-button svg,\n.tm-control-button img {\n width: 16px;\n height: 16px;\n}\n\n/* 控制行 */\n.tm-control-row {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n opacity: 1;\n transition: opacity var(--anim-quick), height var(--anim-quick);\n height: auto;\n overflow: hidden;\n}\n\n.tm-control-row.hidden {\n opacity: 0;\n height: 0;\n margin: 0;\n}\n\n/* \n * 静态样式迁移总结:\n * 1. 已将进度条高度变化从行内样式转为CSS类:tm-progress-bar-expanded, tm-progress-bar-normal\n * 2. 已将循环标记点样式从行内样式转为CSS类:tm-loop-marker-point等\n * 3. 已将时间容器交互状态从行内样式转为CSS类:tm-start-time-container-hover等\n * 4. 已将循环按钮交互状态从行内样式转为CSS类:tm-loop-button-hover等\n * 5. 已将倍速滑块交互状态从行内样式转为CSS类:tm-playback-slider-hover等\n * 6. 已将控制按钮交互状态从行内样式转为CSS类:tm-control-button-hover等\n * 7. 已将时间控制按钮交互状态从行内样式转为CSS类:tm-time-control-button-hover等\n * \n * 注意:某些动态计算的样式值(如宽度百分比)仍使用行内样式直接设置\n */\n\n/* 时间控制按钮状态 */\n.tm-time-control-button-hover {\n background-color: hsl(var(--shadcn-accent) / 0.6);\n transform: none;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.tm-time-control-button-active {\n transform: scale(0.95);\n box-shadow: none;\n}\n\n.tm-time-control-button-default {\n transform: translateY(0);\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n}\n\n.tm-time-control-button-after-active {\n transform: none;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);\n}\n\n/* =========== 横屏模式样式 =========== */\n@media screen and (orientation: landscape) {\n /* 视频容器横屏样式 */\n .tm-video-container {\n width: 100%;\n height: 100vh !important;\n max-height: 100vh !important;\n min-height: auto !important;\n margin: 0;\n padding: 0;\n /* 安全区域 */\n padding-left: env(safe-area-inset-left, 16px);\n padding-right: env(safe-area-inset-right, 16px);\n border-radius: 0;\n box-shadow: none;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: black;\n }\n\n /* 视频包装器横屏样式 */\n .tm-video-wrapper {\n width: 100%;\n height: 100%;\n border-radius: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n }\n\n /* 视频元素横屏样式 */\n .tm-video-wrapper video {\n width: 100% !important;\n height: auto !important;\n max-height: 100vh !important;\n object-fit: contain !important;\n }\n\n /* 当视频高度比例大于宽度比例时的样式 */\n .tm-video-wrapper.video-portrait video {\n width: auto !important;\n height: 100% !important;\n max-width: 100% !important;\n }\n\n /* 按钮容器横屏样式 - 只保留退出按钮 */\n .tm-button-container {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 9995;\n background-color: transparent;\n padding: 16px;\n padding-top: calc(env(safe-area-inset-top, 8px) + 8px);\n display: flex;\n justify-content: space-between;\n transition: opacity 0.3s ease, transform 0.3s ease;\n }\n\n /* 控制界面隐藏时的动画效果 */\n .tm-video-overlay.controls-hidden .tm-button-container {\n opacity: 0;\n transform: translateY(-20px);\n pointer-events: none;\n }\n\n /* 控制界面显示时的动画效果 */\n .tm-video-overlay .tm-button-container {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n }\n\n /* 设置按钮在横屏时不再隐藏 */\n .tm-settings-button {\n display: flex;\n background-color: hsla(var(--shadcn-secondary) / 0.3);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n }\n\n /* 关闭按钮半透明 */\n .tm-close-button {\n background-color: hsla(var(--shadcn-secondary) / 0.3);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n }\n\n /* 控制面板横屏样式 */\n .tm-control-buttons {\n position: absolute;\n bottom: calc(10px + env(safe-area-inset-bottom, 0px)); /* 保持距离底部10px,同时考虑iOS安全区域 */\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 700px;\n min-width: 350px; /* 与竖屏模式保持一致 */\n background-color: hsla(var(--shadcn-card) / 0.3);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n z-index: 9994;\n padding: 12px;\n padding-bottom: 12px; /* 移除原来的calc计算,因为我们已经在bottom属性中处理了 */\n border-radius: 12px;\n border: 1px solid hsla(var(--shadcn-border) / 0.1);\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n transition: opacity 0.3s ease, transform 0.3s ease;\n }\n\n /* 控制界面隐藏时的动画效果 */\n .tm-video-overlay.controls-hidden .tm-control-buttons {\n opacity: 0;\n transform: translateX(-50%) translateY(20px);\n pointer-events: none;\n }\n\n /* 控制界面显示时的动画效果 */\n .tm-video-overlay .tm-control-buttons {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n pointer-events: auto;\n }\n\n /* 横屏模式下的播放器遮罩层 */\n .tm-video-overlay {\n background-color: black;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n /* 浮动按钮样式 - 确保在所有屏幕方向上正确显示 */\n .tm-floating-button {\n bottom: 30px;\n right: 30px;\n padding: 3px;\n width: calc(var(--button-xl));\n height: calc(var(--button-xl));\n }\n}\n\n/* 进度条拖动时间指示器 */\n.tm-time-indicator {\n position: absolute;\n background-color: hsla(var(--shadcn-card) / 0.8);\n color: hsl(var(--shadcn-card-foreground));\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n pointer-events: none;\n z-index: 9995;\n opacity: 0;\n transform: translateY(-8px);\n transition: opacity 0.2s, transform 0.2s;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n border: 1px solid hsla(var(--shadcn-border) / 0.1);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n}\n\n/* 循环时间容器状态样式 - 优化版 */\n/* A按钮容器 - 两种状态 */\n.tm-start-time-container.active {\n background-color: hsl(var(--shadcn-green) / 0.15);\n border-color: hsl(var(--shadcn-green) / 0.4);\n}\n\n.tm-start-time-container:not(.active) {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border-color: hsl(var(--shadcn-border) / 0.1);\n}\n\n/* B按钮容器 - 两种状态 */\n.tm-end-time-container.active {\n background-color: hsl(var(--shadcn-orange) / 0.15);\n border-color: hsl(var(--shadcn-orange) / 0.4);\n}\n\n.tm-end-time-container:not(.active) {\n background-color: hsl(var(--shadcn-secondary) / 0.5);\n border-color: hsl(var(--shadcn-border) / 0.1);\n}\n\n/* A按钮标签 - 两种状态 */\n.tm-set-loop-start-label.active {\n color: hsl(var(--shadcn-green));\n opacity: 1;\n}\n\n.tm-set-loop-start-label:not(.active) {\n opacity: 0.9;\n}\n\n/* B按钮标签 - 两种状态 */\n.tm-set-loop-end-label.active {\n color: hsl(var(--shadcn-orange));\n opacity: 1;\n}\n\n.tm-set-loop-end-label:not(.active) {\n opacity: 0.9;\n}\n\n/* 循环时间文本 - 两种状态 */\n.tm-loop-start-position.active, .tm-loop-end-position.active {\n color: hsl(var(--shadcn-foreground));\n opacity: 1;\n}\n\n.tm-loop-start-position:not(.active), .tm-loop-end-position:not(.active) {\n color: hsl(var(--shadcn-muted-foreground));\n opacity: 0.9;\n}\n\n/* 循环按钮 - 两种状态 */\n.tm-loop-toggle-button.active {\n background-color: hsl(var(--shadcn-red) / 0.1);\n border-color: hsl(var(--shadcn-red) / 0.3);\n}\n\n\n.tm-loop-toggle-button:active {\n transform: scale(0.98);\n}\n\n/* 循环区间连接效果 */\n.tm-loop-range {\n position: absolute;\n height: 4px;\n background: linear-gradient(90deg, \n hsla(var(--shadcn-green) / 0.3) 0%, \n hsla(var(--shadcn-orange) / 0.3) 100%);\n top: 50%;\n transform: translateY(-50%);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.3s ease;\n z-index: 1;\n pointer-events: none;\n}\n\n.tm-loop-range.active {\n opacity: 0.7;\n box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);\n}\n\n/* 循环区间悬停效果 */\n.tm-progress-bar-container:hover .tm-loop-range.active {\n opacity: 0.9;\n height: 6px;\n}',""]);const s=a}},e={};function n(r){var o=e[r];if(void 0!==o)return o.exports;var i=e[r]={id:r,exports:{}};return t[r](i,i.exports,n),i.exports}function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function o(t,e){for(var n=0;n{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nc=void 0;var s=function(){return t=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)},e=[{key:"throttle",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,n=0;return function(){var r=Date.now();if(!(r-n1&&void 0!==arguments[1]?arguments[1]:200,n=null;return function(){for(var r=this,o=arguments.length,i=new Array(o),a=0;awindow.innerWidth}},{key:"checkDeviceAndOrientation",value:function(){return this.isPortrait()}},{key:"getSafeAreaInsets",value:function(){var t=window.getComputedStyle(document.documentElement);return{top:parseInt(t.getPropertyValue("--sat")||t.getPropertyValue("--safe-area-inset-top")||"0",10)||44,right:parseInt(t.getPropertyValue("--sar")||t.getPropertyValue("--safe-area-inset-right")||"0",10)||16,bottom:parseInt(t.getPropertyValue("--sab")||t.getPropertyValue("--safe-area-inset-bottom")||"0",10)||34,left:parseInt(t.getPropertyValue("--sal")||t.getPropertyValue("--safe-area-inset-left")||"0",10)||16}}},{key:"createElementWithStyle",value:function(t,e,n){var r=document.createElement(t);return e&&(r.className=e),n&&(r.style.cssText=n),r}},{key:"createSVGIcon",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:24,n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("width",e),n.setAttribute("height",e),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("fill","none"),n.setAttribute("stroke","currentColor"),n.setAttribute("stroke-width","2"),n.setAttribute("stroke-linecap","round"),n.setAttribute("stroke-linejoin","round");var r=document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d",t),n.appendChild(r),n}},{key:"findVideoElement",value:function(){for(var t=0,e=["#player video","#video video","div.plyr__video-wrapper video",".video-js video","#player > video","#video-player > video","video[preload]:not([muted])","video[src]","video.video-main","main video","video"];t0)return console.log("[Utils] 找到视频元素:".concat(n)),r[0]}return null}},{key:"formatTime",value:function(t){var e=Math.floor(t/3600),n=Math.floor(t%3600/60),r=Math.floor(t%60);return e>0?"".concat(e,":").concat(n<10?"0":"").concat(n,":").concat(r<10?"0":"").concat(r):"".concat(n,":").concat(r<10?"0":"").concat(r)}},{key:"updateSafariThemeColor",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"#000000",e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.isSafari()||this.isIOS()){var n=document.querySelector('meta[name="theme-color"]');e&&n&&!this._theme.original.dark&&(this._theme.original.dark=n.content),n||((n=document.createElement("meta")).name="theme-color",document.head.appendChild(n)),n.content=t}}},{key:"restoreSafariThemeColor",value:function(){if(this._theme.original.dark)this.updateSafariThemeColor(this._theme.original.dark);else{var t=document.querySelector('meta[name="theme-color"]');t&&t.parentNode&&t.parentNode.removeChild(t)}}}],null&&o(t.prototype,null),e&&o(t,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function c(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function u(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),console.log("[PlayerCore] 初始化..."),this.defaultPlaybackRate=1,this.targetVideo=null,this.videoState={currentTime:0,isPlaying:!1,volume:1,playbackRate:1},this.options=Object.assign({containerId:"tm-video-container",startLooped:!1,startMuted:!1},e),this.callingButton=this.options.callingButton||null,this.initialized=!1},e=[{key:"init",value:function(){if(!this.initialized)return this.cleanupExistingOverlays(),this.targetVideo=this.findTargetVideo(),this.targetVideo?(this.saveVideoState(),this.initialized=!0,console.log("[PlayerCore] 核心初始化完成"),this.targetVideo):(console.error("[PlayerCore] 未找到视频元素"),void(this.callingButton&&(this.callingButton.style.display="flex")))}},{key:"cleanupExistingOverlays",value:function(){var t=document.querySelectorAll(".tm-video-overlay");t.length>0&&(console.log("[PlayerCore] 清理 ".concat(t.length," 个现有overlay元素")),t.forEach((function(t){t&&t.parentNode&&t.parentNode.removeChild(t)})))}},{key:"findTargetVideo",value:function(){for(var t=null,e=0,n=["#player video","#video video","div.plyr__video-wrapper video",".video-js video","#player > video","#video-player > video","video[preload]:not([muted])"];e50&&t.rect.height>50})).map((function(t){return u(u({},t),{},{area:t.rect.width*t.rect.height})})).sort((function(t,e){return e.area-t.area}));return i.length>0?(console.log("[PlayerCore] 选择最大的可见视频"),i[0].element):(console.log("[PlayerCore] 回退到第一个视频元素"),o[0])}},{key:"saveVideoState",value:function(){this.targetVideo&&(this.originalParent=this.targetVideo.parentNode,this.originalIndex=Array.from(this.originalParent.children).indexOf(this.targetVideo),this.videoState={currentTime:this.targetVideo.currentTime,isPaused:this.targetVideo.paused,videoSrc:this.targetVideo.src,posterSrc:this.targetVideo.poster,wasMuted:this.targetVideo.muted,controls:this.targetVideo.controls})}},{key:"restoreVideoState",value:function(){var t=this;try{this.targetVideo.playbackRate=this.defaultPlaybackRate,this.targetVideo.currentTime=this.videoState.currentTime;var e=this.targetVideo.play();void 0!==e&&e.catch((function(e){console.log("视频自动播放被阻止,尝试静音播放: ",e),t.targetVideo.muted=!0,t.targetVideo.play().catch((function(t){console.error("即使静音也无法自动播放: ",t)}))}))}catch(t){console.error("尝试播放时出错: ",t)}}},{key:"close",value:function(t,e,n){if(t){this.videoState.currentTime=this.targetVideo.currentTime,this.videoState.isPlaying=!this.targetVideo.paused,this.videoState.volume=this.targetVideo.volume,this.videoState.playbackRate=this.targetVideo.playbackRate,this.targetVideo.paused||this.targetVideo.pause(),this.originalParent&&this.targetVideo&&this.targetVideo.parentNode&&this.targetVideo.parentNode!==this.originalParent&&(-1!==this.originalIndex&&this.originalParent.childNodes.length>this.originalIndex?this.originalParent.insertBefore(this.targetVideo,this.originalParent.childNodes[this.originalIndex]):this.originalParent.appendChild(this.targetVideo),this.targetVideo.style.width="",this.targetVideo.style.height="",this.targetVideo.style.maxHeight="",this.targetVideo.style.margin="",this.targetVideo.style.position=""),t.parentNode&&t.parentNode.removeChild(t),n&&n.parentNode&&n.parentNode.removeChild(n),document.body.classList.remove("controls-hidden");var r=document.getElementById("tm-fullscreen-style");r&&r.parentNode.removeChild(r),this.initialized=!1,s.restoreSafariThemeColor(),this.callingButton&&(this.callingButton.style.display="flex")}}}],e&&h(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function m(t){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},m(t)}function v(t,e){for(var n=0;n\n '),this.handle.addEventListener("mouseenter",(function(){t.handle.style.opacity="1",t.handle.style.backgroundColor="hsla(var(--shadcn-foreground) / 0.8)"})),this.handle.addEventListener("mouseleave",(function(){t.isDraggingHandle||(t.handle.style.opacity="0.5",t.handle.style.backgroundColor="hsla(var(--shadcn-foreground) / 0.6)")})),this.handle.addEventListener("mousedown",(function(){t.handle.style.cursor="grabbing",window.navigator.vibrate&&window.navigator.vibrate(5)})),document.addEventListener("mouseup",(function(){t.isDraggingHandle||(t.handle.style.cursor="grab")})),this.handle.addEventListener("touchstart",(function(){t.handle.style.opacity="1",t.handle.style.backgroundColor="hsla(var(--shadcn-foreground) / 0.8)",window.navigator.vibrate&&window.navigator.vibrate(5)}),{passive:!0}),this.handle.addEventListener("touchend",(function(){t.isDraggingHandle||(t.handle.style.opacity="0.5",t.handle.style.backgroundColor="hsla(var(--shadcn-foreground) / 0.6)")})),this.handleContainer.appendChild(this.handle)}},{key:"createCloseButton",value:function(){var t=this;this.closeBtn=document.createElement("button"),this.closeBtn.className="tm-close-button tm-control-button-base",this.closeBtn.innerHTML='\n \n \n \n ',this.closeBtn.addEventListener("mouseenter",(function(){t.closeBtn.style.backgroundColor="hsla(var(--shadcn-destructive) / 0.9)",t.closeBtn.style.transform="scale(1.1)"})),this.closeBtn.addEventListener("mouseleave",(function(){t.closeBtn.style.backgroundColor="hsla(var(--shadcn-background) / 0.7)",t.closeBtn.style.transform="scale(1)"}))}},{key:"createSettingsButton",value:function(){var t=this;this.settingsBtn=document.createElement("button"),this.settingsBtn.className="tm-settings-button tm-control-button-base",this.settingsBtn.innerHTML='\n \n \n \n \n ',this.settingsBtn.addEventListener("mouseenter",(function(){t.settingsBtn.style.backgroundColor="hsla(var(--shadcn-accent) / 0.9)",t.settingsBtn.style.transform="rotate(45deg)"})),this.settingsBtn.addEventListener("mouseleave",(function(){t.settingsBtn.style.backgroundColor="hsla(var(--shadcn-background) / 0.7)",t.settingsBtn.style.transform="rotate(0deg)"}))}},{key:"createSettingsPanel",value:function(){this.settingsPanel=document.createElement("div"),this.settingsPanel.className="tm-settings-panel",this.settingsPanel.style.display="none"}},{key:"createButtonContainer",value:function(){this.buttonContainer=document.createElement("div"),this.buttonContainer.className="tm-button-container",this.buttonContainer.style.display="flex",this.buttonContainer.style.alignItems="center",this.buttonContainer.style.gap="10px",this.buttonContainer.style.zIndex="99999"}},{key:"setupOrientationListener",value:function(){var t=this;this.checkOrientation(),window.addEventListener("orientationchange",(function(){setTimeout((function(){t.checkOrientation()}),300)})),window.addEventListener("resize",(function(){t.checkOrientation()}))}},{key:"setupInteractionListeners",value:function(){var t=this;console.log("[UIManager] 设置交互事件监听器"),this.overlay&&(this.overlay.addEventListener("mousemove",(function(){t.isLandscape&&(t.showControls(),t.autoHideControls())})),this.overlay.addEventListener("touchmove",(function(){t.isLandscape&&(t.showControls(),t.autoHideControls())}),{passive:!0}),this.overlay.addEventListener("touchstart",(function(e){t.isLandscape&&e.target.closest(".tm-control-button, .tm-time-control-button, .tm-close-button")&&(t.showControls(),t.autoHideControls(),e.stopPropagation())}),{passive:!1}))}},{key:"checkOrientation",value:function(){var t=window.innerWidth>window.innerHeight;this.isLandscape!==t&&(this.isLandscape=t,this.handleOrientationChange())}},{key:"handleOrientationChange",value:function(){console.log("[UIManager] 屏幕方向变化:",this.isLandscape?"横屏":"竖屏"),this.updateContainerMinHeight(),this.updateVideoAspectRatio(),this.playerCore.controlManager&&(this.playerCore.controlManager.updateProgressBar(),this.playerCore.controlManager.updateCurrentTimeDisplay(),this.updateControlPanelVisibility()),this.handleContainer&&(this.handleContainer.style.display=this.isLandscape?"none":"flex"),this.isLandscape?(this.showControls(),this.autoHideControls()):(this.showControls(),this.controlsHideTimeout&&(clearTimeout(this.controlsHideTimeout),this.controlsHideTimeout=null))}},{key:"updateControlPanelVisibility",value:function(){if(this.playerCore.controlManager){var t=this.playerCore.controlManager.controlButtonsContainer;if(t){var e=t.querySelector(".tm-progress-row"),n=t.querySelector(".tm-seek-control-row"),r=t.querySelector(".tm-loop-control-row"),o=t.querySelector(".tm-playback-control-row");if(this.isLandscape){e&&(e.style.display="flex",e.style.backgroundColor="transparent"),n&&(n.style.display="flex",n.style.justifyContent="center",n.style.alignItems="center",n.style.gap="20px",n.style.backgroundColor="transparent"),r&&(r.style.display="flex",r.style.backgroundColor="transparent"),o&&(o.style.display="flex",o.style.backgroundColor="transparent"),this.settingsBtn&&(this.settingsBtn.style.display="flex",this.settingsBtn.style.backgroundColor="hsla(var(--shadcn-secondary) / 0.3)",this.settingsBtn.style.backdropFilter="blur(4px)");var i=t.querySelector(".tm-rewind-group"),a=t.querySelector(".tm-forward-group");i&&(i.style.width="auto",i.style.flex="0 1 auto"),a&&(a.style.width="auto",a.style.flex="0 1 auto")}else{e&&(e.style.display=""),n&&(n.style.display="",n.style.justifyContent="",n.style.alignItems="",n.style.gap=""),r&&(r.style.display=""),o&&(o.style.display=""),this.settingsBtn&&(this.settingsBtn.style.display="",this.settingsBtn.style.backgroundColor="",this.settingsBtn.style.backdropFilter="");var s=t.querySelector(".tm-rewind-group"),l=t.querySelector(".tm-forward-group");s&&(s.style.width="",s.style.flex=""),l&&(l.style.width="",l.style.flex="")}}}}},{key:"updateVideoAspectRatio",value:function(){if(this.videoWrapper&&this.targetVideo){var t=this.targetVideo.videoWidth,e=this.targetVideo.videoHeight;if(t&&e){var n=t/e,r=n<1;r?this.videoWrapper.classList.add("video-portrait"):this.videoWrapper.classList.remove("video-portrait"),console.log("[UIManager] 视频比例更新:",n,r?"竖屏视频":"横屏视频")}}}},{key:"showControls",value:function(){this.overlay&&(this.overlay.classList.remove("controls-hidden"),document.body.classList.remove("controls-hidden"),this.controlsVisible=!0,this.controlsHideTimeout&&(clearTimeout(this.controlsHideTimeout),this.controlsHideTimeout=null))}},{key:"hideControls",value:function(){this.overlay&&this.isLandscape&&(this.overlay.classList.add("controls-hidden"),document.body.classList.add("controls-hidden"),this.controlsVisible=!1)}},{key:"toggleControlsVisibility",value:function(){this.controlsVisible?this.hideControls():(this.showControls(),this.autoHideControls())}},{key:"autoHideControls",value:function(){var t=this;this.isLandscape&&(this.controlsHideTimeout&&clearTimeout(this.controlsHideTimeout),this.controlsHideTimeout=setTimeout((function(){t.hideControls()}),3e3))}},{key:"updateContainerMinHeight",value:function(){if(this.container&&this.targetVideo)if(this.isLandscape)console.log("[UIManager] 横屏模式,使用CSS样式控制高度");else{var t=this.targetVideo.videoWidth||this.targetVideo.naturalWidth,e=this.targetVideo.videoHeight||this.targetVideo.naturalHeight;if(t&&e){var n=window.innerWidth*(e/t);this.container.style.minHeight="".concat(n,"px"),console.log("[UIManager] 更新容器最小高度:",n)}}}},{key:"assembleDOM",value:function(){this.container.appendChild(this.videoWrapper),this.buttonContainer.appendChild(this.closeBtn),this.buttonContainer.appendChild(this.settingsBtn),this.playerContainer.appendChild(this.buttonContainer),this.playerContainer.appendChild(this.container),this.playerContainer.appendChild(this.handleContainer),this.playerContainer.appendChild(this.settingsPanel),this.playerCore.controlManager&&this.playerCore.controlManager.controlButtonsContainer&&this.playerContainer.appendChild(this.playerCore.controlManager.controlButtonsContainer),document.body.appendChild(this.overlay),document.body.appendChild(this.playerContainer),this.updateContainerMinHeight(),this.setupInteractionListeners(),console.log("[UIManager] DOM组装完成",{overlay:this.overlay.isConnected,playerContainer:this.playerContainer.isConnected,container:this.container.isConnected,videoWrapper:this.videoWrapper.isConnected,video:this.targetVideo.isConnected})}}],e&&v(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function b(t){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b(t)}function w(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nLoop\n \n \n \n ',i.appendChild(h);var p=h;p.addEventListener("mouseover",(function(){})),p.addEventListener("mouseout",(function(){})),p.addEventListener("click",(function(){t.loopManager?t.loopManager.toggleLoop():console.error("[ControlManager] 循环管理器未设置,无法调用toggleLoop")})),this.loopToggleButton=p,o.appendChild(u),o.appendChild(d),r.appendChild(o),r.appendChild(i),this.controlButtonsContainer.appendChild(n),this.controlButtonsContainer.appendChild(r);var f=document.createElement("div");f.className="tm-playback-control-row";var m=document.createElement("div");m.className="tm-left-controls";var v=document.createElement("div");v.className="tm-center-controls";var g=document.createElement("div");return g.className="tm-right-controls",f.appendChild(m),f.appendChild(v),f.appendChild(g),this.muteButton=this.addControlButton(m,"",(function(){t.targetVideo.muted=!t.targetVideo.muted,t.updateMuteButton()})),this.playPauseButton=this.addControlButton(v,"",(function(){t.targetVideo.paused?(t.targetVideo.play(),t.updatePlayPauseButton()):(t.targetVideo.pause(),t.updatePlayPauseButton())})),this.createPlaybackRateSlider(g),this.controlButtonsContainer.appendChild(f),this.updatePlayPauseButton(),this.updateMuteButton(),this.controlButtonsContainer}},{key:"createPlaybackRateSlider",value:function(t){var e=this,n=document.createElement("div");n.className="tm-playback-rate-slider";var r=!1,o=1,i=null,a=document.createElement("div");a.className="tm-slider-container";var s=document.createElement("div");s.className="tm-slider-level";var l=document.createElement("div");l.className="tm-slider-marks";var c=[{pos:Math.round(.4/2.9*100),label:"0.5x"},{pos:Math.round(.9/2.9*100),label:"1.0x"},{pos:Math.round(1.4/2.9*100),label:"1.5x"},{pos:Math.round(1.9/2.9*100),label:"2.0x"},{pos:Math.round(100),label:"3.0x"}];c.forEach((function(t){var e=t.pos,n=(t.label,document.createElement("div"));n.className="tm-slider-mark",n.style.left="".concat(e,"%"),l.appendChild(n)}));var u=document.createElement("div");u.className="tm-slider-text";var d=document.createElement("div");d.className="tm-speed-label",d.textContent="Speed";var h=document.createElement("div");h.className="tm-speed-value",h.textContent="1.0x",u.appendChild(d),u.appendChild(h),a.appendChild(l),a.appendChild(s),a.appendChild(u),n.appendChild(a),t.appendChild(n);var p=function(t){s.style.width="".concat(t,"%");var n=.1+t/100*2.9;n=.1*Math.round(n/.1),(n=Math.max(.1,Math.min(3,n)))!==o&&(o=n,e.targetVideo.playbackRate=n,h.textContent="".concat(n.toFixed(1),"x"),h.classList.remove("tm-speed-value-fast","tm-speed-value-slow","tm-speed-value-normal"),n>1.5?h.classList.add("tm-speed-value-fast"):n<.8?h.classList.add("tm-speed-value-slow"):h.classList.add("tm-speed-value-normal"))},f=function(t){r&&g(t)},m=function(t){r=!0,n.classList.add("dragging"),n.classList.add("tm-playback-slider-dragging"),g(t)},v=function(){r&&(r=!1,n.classList.remove("dragging"),n.classList.remove("tm-playback-slider-dragging"),n.classList.add("tm-playback-slider-default"),i&&(cancelAnimationFrame(i),i=null))},g=function(t){t.preventDefault();var e=t.type.includes("touch")?t.touches[0].clientX:t.clientX,n=a.getBoundingClientRect(),r=n.width;i&&cancelAnimationFrame(i),i=requestAnimationFrame((function(){var t=(e-n.left)/r*100;t=Math.max(0,Math.min(100,t));var o,i=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return w(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?w(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,o=function(){};return{s:o,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}(c.map((function(t){return t.pos})));try{for(i.s();!(o=i.n()).done;){var a=o.value;if(Math.abs(t-a)<5){t=a,window.navigator.vibrate&&window.navigator.vibrate(5);break}}}catch(t){i.e(t)}finally{i.f()}p(t)}))};a.addEventListener("mousedown",m,{passive:!1}),a.addEventListener("touchstart",m,{passive:!1}),window.addEventListener("mousemove",f,{passive:!1}),window.addEventListener("touchmove",f,{passive:!1}),window.addEventListener("mouseup",v),window.addEventListener("touchend",v),window.addEventListener("mouseleave",v),n.addEventListener("dblclick",(function(){p(30)})),p(30),this.playbackRateSlider=n,this.updatePlaybackRateSlider=p}},{key:"updatePlayPauseButton",value:function(){this.playPauseButton&&(this.targetVideo.paused?this.playPauseButton.innerHTML='\n \n \n \n ':this.playPauseButton.innerHTML='\n \n \n \n \n ')}},{key:"updateMuteButton",value:function(){this.muteButton&&(this.targetVideo.muted?this.muteButton.innerHTML='\n \n \n \n \n \n ':this.muteButton.innerHTML='\n \n \n \n \n \n ')}},{key:"updateProgressBar",value:function(){if(this.targetVideo&&this.progressBarElement&&this.progressIndicator){var t=this.targetVideo.currentTime,e=this.targetVideo.duration;if(!(isNaN(e)||e<=0)){var n=t/e*100;this.progressIndicator.style.width="".concat(n,"%"),this.updateCurrentTimeDisplay(),this.loopManager&&this.loopManager.loopActive&&null!==this.loopManager.loopStartTime&&null!==this.loopManager.loopEndTime&&t>=this.loopManager.loopEndTime&&(this.targetVideo.currentTime=this.loopManager.loopStartTime)}}}},{key:"updateCurrentTimeDisplay",value:function(){if(this.targetVideo&&this.currentTimeDisplay&&this.totalDurationDisplay){var t=this.targetVideo.currentTime,e=this.targetVideo.duration;if(!isNaN(e)){this.currentTimeDisplay.textContent=this.formatTime(t);var n=e-t;this.totalDurationDisplay.textContent="-".concat(this.formatTime(n))}}}},{key:"addTimeControlButton",value:function(t,e,n){var r=function(t){var e=parseInt(t.replace(/[+-]/g,"")),n=t.includes("m")?"m":"s",r=.5;return"s"===n?r=e<=5?.5:e<=10?.6:.7:"m"===n&&(r=1===e?.8:5===e?.9:1),r}(e),o=document.createElement("button");o.className="tm-time-control-button",o.style.backgroundColor="hsl(var(--shadcn-secondary) / ".concat(r,")");var i=e.includes("-"),a=e.includes("+"),s=e.replace(/[+-]/g,"");return i?o.innerHTML='
'.concat('\n \n ','').concat(s,"
"):a?o.innerHTML='
'.concat(s,"").concat('\n \n ',"
"):o.textContent=e,o.addEventListener("click",n),o.addEventListener("mouseover",(function(){o.classList.add("tm-time-control-button-hover"),o.classList.remove("tm-time-control-button-default")})),o.addEventListener("mouseout",(function(){o.classList.add("tm-time-control-button-default"),o.classList.remove("tm-time-control-button-hover","tm-time-control-button-active","tm-time-control-button-after-active")})),o.addEventListener("mousedown",(function(){o.classList.add("tm-time-control-button-active"),o.classList.remove("tm-time-control-button-hover","tm-time-control-button-default","tm-time-control-button-after-active")})),o.addEventListener("mouseup",(function(){o.classList.add("tm-time-control-button-after-active"),o.classList.remove("tm-time-control-button-active","tm-time-control-button-hover","tm-time-control-button-default")})),t.appendChild(o),o}},{key:"seekRelative",value:function(t){if(this.targetVideo){var e=Math.max(0,Math.min(this.targetVideo.duration,this.targetVideo.currentTime+t));this.targetVideo.currentTime=e}}},{key:"formatTime",value:function(t){var e=Math.floor(t/3600),n=Math.floor(t%3600/60),r=Math.floor(t%60);return"".concat(e,":").concat(n.toString().padStart(2,"0"),":").concat(r.toString().padStart(2,"0"))}},{key:"addControlButton",value:function(t,e,n){var r=document.createElement("button");return r.className="tm-control-button",r.textContent=e,r.addEventListener("click",n),r.addEventListener("mouseover",(function(){r.classList.add("tm-control-button-hover"),r.classList.remove("tm-control-button-default")})),r.addEventListener("mouseout",(function(){r.classList.add("tm-control-button-default"),r.classList.remove("tm-control-button-hover")})),t.appendChild(r),r}},{key:"showPauseIndicator",value:function(){var t=this;this.pauseIndicator&&(this.pauseIndicator.parentNode&&this.pauseIndicator.parentNode.removeChild(this.pauseIndicator),this.pauseIndicator=null),this.pauseIndicator=document.createElement("div"),this.pauseIndicator.className="tm-indicator-base tm-pause-indicator",this.pauseIndicator.style.position="absolute",this.pauseIndicator.style.top="50%",this.pauseIndicator.style.left="50%",this.pauseIndicator.style.transform="translate(-50%, -50%)",this.pauseIndicator.style.display="flex",this.pauseIndicator.style.justifyContent="center",this.pauseIndicator.style.alignItems="center",this.pauseIndicator.innerHTML='\n \n \n \n ',this.uiElements.videoWrapper.appendChild(this.pauseIndicator),requestAnimationFrame((function(){t.pauseIndicator.classList.add("visible")})),setTimeout((function(){t.pauseIndicator&&(t.pauseIndicator.classList.remove("visible"),setTimeout((function(){t.pauseIndicator&&t.pauseIndicator.parentNode&&(t.pauseIndicator.parentNode.removeChild(t.pauseIndicator),t.pauseIndicator=null)}),300))}),1e3)}},{key:"showPlaybackRateIndicator",value:function(t){var e=this;this.playbackRateIndicator&&(clearTimeout(this.playbackRateIndicator.hideTimeout),this.playbackRateIndicator.parentNode&&this.playbackRateIndicator.parentNode.removeChild(this.playbackRateIndicator),this.playbackRateIndicator=null),this.playbackRateIndicator=document.createElement("div"),this.playbackRateIndicator.className="tm-indicator-base tm-playback-rate-indicator",this.playbackRateIndicator.style.position="absolute",this.playbackRateIndicator.style.top="20%",this.playbackRateIndicator.style.left="50%",this.playbackRateIndicator.style.transform="translateX(-50%)",this.playbackRateIndicator.textContent="".concat(t.toFixed(1),"x"),t>1.5?this.playbackRateIndicator.style.color="hsl(var(--shadcn-orange))":t<.8&&(this.playbackRateIndicator.style.color="hsl(var(--shadcn-blue))"),this.uiElements.videoWrapper.appendChild(this.playbackRateIndicator),requestAnimationFrame((function(){e.playbackRateIndicator.classList.add("visible")})),this.playbackRateIndicator.hideTimeout=setTimeout((function(){e.playbackRateIndicator&&(e.playbackRateIndicator.classList.remove("visible"),setTimeout((function(){e.playbackRateIndicator&&e.playbackRateIndicator.parentNode&&(e.playbackRateIndicator.parentNode.removeChild(e.playbackRateIndicator),e.playbackRateIndicator=null)}),300))}),1500)}}],e&&k(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function E(t){return E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},E(t)}function S(t,e){for(var n=0;n200||(this.uiElements.handleContainer.style.height="".concat(n,"px"),this.updateHandlePosition())}}},{key:"handleMouseUp",value:function(t){this.isDraggingHandle=!1,document.removeEventListener("mousemove",this.handleMoveHandler),document.removeEventListener("mouseup",this.handleEndHandler),this.updateHandlePosition()}},{key:"handleMouseLeave",value:function(t){this.isDraggingHandle=!1,document.removeEventListener("mousemove",this.handleMoveHandler),document.removeEventListener("mouseup",this.handleEndHandler),this.updateHandlePosition()}}],e&&S(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function T(t){return T="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},T(t)}function M(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n=1?l():this.targetVideo.addEventListener("loadedmetadata",l)}}else if(e.match(/^\d{2}:\d{2}:\d{2}$/)){var c=this._parseTimeString(e);if(null!==c){console.log("[LoopManager] 从URL解析时间点: ".concat(e));var u=function(){if(t.currentPositionDisplay){t.currentPositionDisplay.textContent=t.formatTimeWithHours(c),t.currentPositionDisplay.classList.add("active");var e=document.querySelector(".tm-start-time-container");e&&e.classList.add("active")}t.targetVideo.currentTime=c,t.setState({loopStartTime:c}),t.updateLoopMarkers(),t.targetVideo.removeEventListener("loadedmetadata",u)};this.targetVideo.readyState>=1?u():this.targetVideo.addEventListener("loadedmetadata",u)}}}}},{key:"_parseTimeString",value:function(t){if(!t)return null;var e=t.match(/^(\d{2}):(\d{2}):(\d{2})$/);return e?3600*parseInt(e[1],10)+60*parseInt(e[2],10)+parseInt(e[3],10):null}},{key:"_updateUrlHash",value:function(){var t="";if(null!==this.loopStartTime&&(t=this.formatTimeWithHours(this.loopStartTime),null!==this.loopEndTime&&(t+="-".concat(this.formatTimeWithHours(this.loopEndTime)))),t){var e=window.location.pathname+window.location.search+"#"+t;window.history.replaceState(null,"",e),console.log("[LoopManager] 更新URL: ".concat(e))}}},{key:"_clickCopyStartTime",value:function(){document.querySelector("input#clip-start-time + a").click()}},{key:"_clickCopyEndTime",value:function(){document.querySelector("input#clip-end-time + a").click()}},{key:"_toggleLooping",value:function(){document.querySelector(".sm\\:ml-6 button").click()}},{key:"setLoopEnd",value:function(){if(this.targetVideo){var t=this.targetVideo.currentTime;if(window.location.hostname.includes("missav"))this._clickCopyEndTime(),this.setState({loopEndTime:t});else{if(null!==this.loopStartTime&&t<=this.loopStartTime)return void console.log("[LoopManager] 循环结束点必须在开始点之后");this.setState({loopEndTime:t}),console.log("[LoopManager] 设置循环结束点: ".concat(this.formatTimeWithHours(t))),this._updateUrlHash()}window.navigator.vibrate&&window.navigator.vibrate(10)}}},{key:"setLoopStart",value:function(){if(this.targetVideo){var t=this.targetVideo.currentTime;if(window.location.hostname.includes("missav"))this._clickCopyStartTime(),this.setState({loopStartTime:t});else{if(null!==this.loopEndTime&&t>=this.loopEndTime)return void console.log("[LoopManager] 循环开始点必须在结束点之前");this.setState({loopStartTime:t}),console.log("[LoopManager] 设置循环开始点: ".concat(this.formatTimeWithHours(t))),this._updateUrlHash()}window.navigator.vibrate&&window.navigator.vibrate(10)}}},{key:"toggleLoop",value:function(){if(window.location.hostname.includes("missav"))this._toggleLooping();else{if(null===this.loopStartTime||null===this.loopEndTime)return void console.log("请先使用 A 和 B 按钮记录循环的开始和结束时间。");this.loopActive?this.disableLoop():this.enableLoop()}}},{key:"enableLoop",value:function(){var t=this;this.targetVideo&&null!==this.loopStartTime&&null!==this.loopEndTime?(console.log("[LoopManager] 启用循环播放: ".concat(this.formatTimeWithHours(this.loopStartTime)," - ").concat(this.formatTimeWithHours(this.loopEndTime))),this.setState({loopActive:!0}),this.targetVideo.removeEventListener("timeupdate",this._handleLoopTimeUpdate),this.targetVideo.addEventListener("timeupdate",this._handleLoopTimeUpdate),(this.targetVideo.currentTimethis.loopEndTime)&&(this.targetVideo.currentTime=this.loopStartTime),this.targetVideo.paused&&this.targetVideo.play().catch((function(e){console.log("视频自动播放被阻止: ",e),t.targetVideo.muted=!0,t.targetVideo.play().catch((function(t){console.error("即使静音也无法播放: ",t)}))})),window.navigator.vibrate&&window.navigator.vibrate([10,30,10])):console.log("[LoopManager] 无法启用循环: 循环点未设置")}},{key:"disableLoop",value:function(){this.loopActive&&(console.log("[LoopManager] 禁用循环播放"),this.targetVideo.removeEventListener("timeupdate",this._handleLoopTimeUpdate),this.setState({loopActive:!1}))}},{key:"_handleLoopTimeUpdate",value:function(){if(this.loopActive&&null!==this.loopStartTime&&null!==this.loopEndTime){var t=this.targetVideo.currentTime;(t>=this.loopEndTime||t=0&&e<=r){var i=e/r*100;o.style.left="".concat(i,"%"),o.style.display="block",t.loopActive?o.classList.add("active"):o.classList.remove("active"),o.setAttribute("title",n?"循环起点: ".concat(t.formatTimeWithHours(e)):"循环终点: ".concat(t.formatTimeWithHours(e))),o.setAttribute("data-time",t.formatTimeWithHours(e))}else o.style.display="none"};if(o(this.loopStartTime,!0),o(this.loopEndTime,!1),this.loopActive&&null!==this.loopStartTime&&null!==this.loopEndTime){if(this.loopStartMarker.classList.add("active"),this.loopEndMarker.classList.add("active"),this.loopRangeElement){var i=this.loopStartTime/r*100,a=this.loopEndTime/r*100-i;a>0?(this.loopRangeElement.style.left="".concat(i,"%"),this.loopRangeElement.style.width="".concat(a,"%"),this.loopRangeElement.style.display="block",this.loopRangeElement.classList.add("active")):this.loopRangeElement.style.display="none"}}else this.loopStartMarker.classList.remove("active"),this.loopEndMarker.classList.remove("active"),this.loopRangeElement&&(this.loopRangeElement.classList.remove("active"),this.loopRangeElement.style.display="none")}}}}},{key:"formatTimeWithHours",value:function(t){if(isNaN(t)||t<0)return"00:00:00";var e=Math.floor(t),n=Math.floor(e/3600),r=Math.floor(e%3600/60),o=e%60;return"".concat(n.toString().padStart(2,"0"),":").concat(r.toString().padStart(2,"0"),":").concat(o.toString().padStart(2,"0"))}}],e&&B(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function D(t){return D="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},D(t)}function j(t,e){for(var n=0;n1&&void 0!==arguments[1])||arguments[1];return this.offset=Math.max(-this.maxOffset,Math.min(t,this.maxOffset)),this.video.style.transition=e?"transform 0.2s cubic-bezier(0.215, 0.61, 0.355, 1)":"none",this.video.style.transform="translateX(".concat(this.offset,"px)"),this._updateHandlePosition(),this}},{key:"_updateHandleState",value:function(t){if(this.handle){if(this._updateHandleWidth(),t){this.handle.style.cursor="grab",this.video.style.cursor="grab";var e=this.handle.parentElement;e&&(e.style.cursor="grab")}else this.handle.style.cursor="default",this.video.style.cursor="default";this._updateHandlePosition()}}},{key:"_updateHandleWidth",value:function(){this.handle&&(this.handle.style.width="".concat(30,"%"))}},{key:"_updateHandlePosition",value:function(){if(this.handle){var t=this.handle.parentElement;if(t){if(this.maxOffset<=0)return this.handle.style.left="50%",void(this.handle.style.transform="translateX(-50%)");var e=t.offsetWidth,n=e-this.handle.offsetWidth,r=(1-(this.offset+this.maxOffset)/(2*this.maxOffset))*n/e*100;this.handle.style.left="".concat(r,"%"),this.handle.style.transform=""}}}},{key:"_trackVelocity",value:function(t){var e=Date.now(),n=this.velocityTracker;for(n.positions.push({x:t,time:e});n.positions.length>1&&e-n.positions[0].time>100;)n.positions.shift();if(n.positions.length>1){var r=n.positions[0],o=n.positions[n.positions.length-1],i=o.time-r.time;i>0&&(n.currentVelocity=(o.x-r.x)/i)}n.lastTimestamp=e}},{key:"_applyInertia",value:function(){if(!(Math.abs(this.velocityTracker.currentVelocity)<.1)){var t=this.velocityTracker.currentVelocity,e=t*t/.004*Math.sign(t),n=this.offset+e;n=Math.max(-this.maxOffset,Math.min(n,this.maxOffset));var r=Math.min(.8*Math.abs(t/.002),400);this._animateTo(n,r)}}},{key:"_animateTo",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;this.animation.active&&cancelAnimationFrame(this.animation.rafId),this.animation.active=!0,this.animation.targetOffset=t,this.animation.startTime=Date.now(),this.animation.duration=n;var r=function(){var o=Date.now()-e.animation.startTime;if(o>=n)return e._applyOffset(t,!1),void(e.animation.active=!1);var i=1-Math.pow(1-o/n,3),a=e.offset+(t-e.offset)*i;e._applyOffset(a,!1),e.animation.rafId=requestAnimationFrame(r)};this.animation.rafId=requestAnimationFrame(r)}},{key:"_handlePointerDown",value:function(t){this.maxOffset<=0||t.isPrimary&&(this.animation.active&&(cancelAnimationFrame(this.animation.rafId),this.animation.active=!1),this.isDragging=!0,this.startX=t.clientX,this.startOffset=this.offset,this.dragDistance=0,this.velocityTracker.positions=[],this.velocityTracker.lastTimestamp=Date.now(),this.velocityTracker.currentVelocity=0,this._trackVelocity(t.clientX),this.video.style.cursor="grabbing",this.video.style.transition="none",this.video.setPointerCapture&&this.video.setPointerCapture(t.pointerId),this.video.addEventListener("pointermove",this._pointerMoveHandler),this.video.addEventListener("pointerup",this._pointerUpHandler),this.video.addEventListener("pointercancel",this._pointerUpHandler),window.navigator.vibrate&&window.navigator.vibrate(5),t.preventDefault())}},{key:"_handlePointerMove",value:function(t){if(this.isDragging&&t.isPrimary){var e=t.clientX-this.startX;this.dragDistance=Math.max(this.dragDistance,Math.abs(e));var n=Math.max(-this.maxOffset,Math.min(this.startOffset+e,this.maxOffset));this._applyOffset(n,!1),this._trackVelocity(t.clientX),t.preventDefault()}}},{key:"_handlePointerUp",value:function(t){this.isDragging&&t.isPrimary&&(this.isDragging=!1,this.dragDistance>this.minDragDistance?(this.wasDragging=!0,this.dragEndTimestamp=Date.now()):this.wasDragging=!1,this.video.releasePointerCapture&&this.video.releasePointerCapture(t.pointerId),this.video.removeEventListener("pointermove",this._pointerMoveHandler),this.video.removeEventListener("pointerup",this._pointerUpHandler),this.video.removeEventListener("pointercancel",this._pointerUpHandler),this.video.style.cursor="grab",this._applyInertia(),t.preventDefault())}},{key:"_handleHandlePointerDown",value:function(t){if(!(this.maxOffset<=0)&&t.isPrimary){this.animation.active&&(cancelAnimationFrame(this.animation.rafId),this.animation.active=!1),this.isHandleDragging=!0,this.startX=t.clientX,this.dragDistance=0,this.startOffset=this.offset;var e=this.handle.parentElement,n=e?e.offsetWidth:0;if(n>0){var r=this.handle.getBoundingClientRect();this.startHandleLeft=r.left-e.getBoundingClientRect().left,this.startHandleLeftPercent=this.startHandleLeft/n*100}else this.startHandleLeft=0,this.startHandleLeftPercent=0;this.handle.style.cursor="grabbing",this.handle.style.transition="none",this.handle.setPointerCapture&&this.handle.setPointerCapture(t.pointerId),this.handle.addEventListener("pointermove",this._handlePointerMoveHandler),this.handle.addEventListener("pointerup",this._handlePointerUpHandler),this.handle.addEventListener("pointercancel",this._handlePointerUpHandler),window.navigator.vibrate&&window.navigator.vibrate(5),t.preventDefault()}}},{key:"_handleHandlePointerMove",value:function(t){if(this.isHandleDragging&&t.isPrimary){var e=this.handle.parentElement;if(e){var n=e.offsetWidth,r=this.handle.offsetWidth;if(!(n<=0||r<=0)){var o=t.clientX-this.startX;this.dragDistance=Math.max(this.dragDistance,Math.abs(o));var i=this.startHandleLeft+o,a=n-r;i=Math.max(0,Math.min(i,a)),this._trackHandleVelocity(i);for(var s=!1,l=0,c=[0,a/2,a];l0?i/a:0))*this.maxOffset-this.maxOffset;this.video.style.transform="translateX(".concat(h,"px)"),this.video.style.transition="none",this.offset=h,t.preventDefault()}}}}},{key:"_handleHandlePointerUp",value:function(t){this.isHandleDragging&&t.isPrimary&&(this.isHandleDragging=!1,this.dragDistance>this.minDragDistance?(this.wasDragging=!0,this.dragEndTimestamp=Date.now()):this.wasDragging=!1,this.lastSnapPosition=null,this.handle.releasePointerCapture&&this.handle.releasePointerCapture(t.pointerId),this.handle.removeEventListener("pointermove",this._handlePointerMoveHandler),this.handle.removeEventListener("pointerup",this._handlePointerUpHandler),this.handle.removeEventListener("pointercancel",this._handlePointerUpHandler),this.handle.style.cursor="grab",this._applyHandleInertia(),t.preventDefault())}},{key:"_trackHandleVelocity",value:function(t){var e=Date.now(),n=this.handleVelocityTracker;for(n.positions.push({position:t,time:e});n.positions.length>1&&e-n.positions[0].time>100;)n.positions.shift();if(n.positions.length>1){var r=n.positions[0],o=n.positions[n.positions.length-1],i=o.time-r.time;i>0&&(n.currentVelocity=(o.position-r.position)/i)}n.lastTimestamp=e}},{key:"_applyHandleInertia",value:function(){if(!(Math.abs(this.handleVelocityTracker.currentVelocity)<.1)){var t=this.handle.parentElement;if(t){for(var e=t.offsetWidth,n=e-this.handle.offsetWidth,r=this.handle.getBoundingClientRect(),o=t.getBoundingClientRect(),i=r.left-o.left,a=this.handleVelocityTracker.currentVelocity,s=i+a*a/.004*Math.sign(a),l=[0,n/2,n],c=s=Math.max(0,Math.min(s,n)),u=Number.MAX_VALUE,d=0,h=l;d0?s/n:0))*this.maxOffset-this.maxOffset;this.handle.style.transition="left 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)",this.video.style.transition="transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)",this.handle.style.left="".concat(m,"%"),this.video.style.transform="translateX(".concat(v,"px)"),this.offset=v,u1&&void 0!==arguments[1])||arguments[1];return this._applyOffset(t,e)}},{key:"reset",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this._applyOffset(0,t),this.wasDragging=!1,this}},{key:"updateSize",value:function(){if(console.log("[VideoSwipeManager] 更新尺寸和约束"),this.video&&this.container){var t=this.video.getBoundingClientRect(),e=this.container.getBoundingClientRect();console.log("[VideoSwipeManager] 视频尺寸: ".concat(t.width,"x").concat(t.height,", 容器尺寸: ").concat(e.width,"x").concat(e.height));var n=this._updateConstraints();console.log("[VideoSwipeManager] 约束更新结果: ".concat(n,", 最大偏移量: ").concat(this.maxOffset))}else console.error("[VideoSwipeManager] 视频或容器元素不存在");return this}},{key:"destroy",value:function(){this.video&&(this.video.removeEventListener("pointerdown",this._pointerDownHandler),this.video.style.transform="",this.video.style.willChange="",this.video.style.transition="",this.video.style.cursor=""),this.handle&&(this.handle.removeEventListener("pointerdown",this._handlePointerDownHandler),this.handle.style.willChange="",this.handle.style.transition="",this.handle.style.left="",this.handle.style.width="",this.handle.style.cursor=""),this.animation.active&&(cancelAnimationFrame(this.animation.rafId),this.animation.active=!1),this.wasDragging=!1}},{key:"wasRecentlyDragging",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:150;return!(!this.wasDragging||Date.now()-this.dragEndTimestamp>t&&(this.wasDragging=!1,1))}}],e&&X(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function Q(t){return Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Q(t)}function Z(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),console.log("[CustomVideoPlayer] 初始化..."),this.playerCore=new f(e),this.callingButton=e.callingButton||null,this.managers={},this.initialized=!1},(e=[{key:"init",value:function(){var t=this;if(!this.initialized){if(this.playerCore||(this.playerCore=new f({callingButton:this.callingButton})),this.playerCore.init(),!this.playerCore.targetVideo)return console.error("[CustomVideoPlayer] 核心初始化失败: 未找到视频元素"),void(this.callingButton&&(this.callingButton.style.display="flex"));var e=new y(this.playerCore),n=e.createUI();this.managers.uiManager=e;var r=new q(this.playerCore,n);r.init(),this.managers.settingsManager=r;var o=new C(this.playerCore,n);o.createProgressControls(),o.createControlButtonsContainer(),this.managers.controlManager=o,this.playerCore.controlManager=o;var i=new H(this.playerCore,n);i.init({progressBarElement:o.progressBarElement,progressIndicator:o.progressIndicator,currentTimeDisplay:o.currentTimeDisplay,totalDurationDisplay:o.totalDurationDisplay,timeIndicator:o.timeIndicator}),this.managers.progressManager=i;var a=new O(this.playerCore,n);a.init({loopStartMarker:o.loopStartMarker,loopEndMarker:o.loopEndMarker,loopRangeElement:o.loopRangeElement,currentPositionDisplay:o.currentPositionDisplay,durationDisplay:o.durationDisplay,loopToggleButton:o.loopToggleButton}),this.managers.loopManager=a,o.setLoopManager(a);var l=new P(this.playerCore,n);l.init(),this.managers.dragManager=l,this.playerCore.targetVideo&&n.videoWrapper&&n.handle&&(console.log("[CustomVideoPlayer] 初始化SwipeManager..."),this.swipeManager=new G(this.playerCore.targetVideo,n.videoWrapper,n.handle),this.managers.swipeManager=this.swipeManager);var c=new A(this.playerCore,n,this.managers);c.init(),this.managers.eventManager=c,e.assembleDOM(),r.updateControlRowsVisibility(),this.playerCore.restoreVideoState(),i.updateProgressBar(),i.updateCurrentTimeDisplay(),s.updateSafariThemeColor("#000000",!0),setTimeout((function(){t.swipeManager&&t.swipeManager.updateSize(),l.updateHandlePosition()}),100),setTimeout((function(){console.log("[CustomVideoPlayer] 执行URL参数相关UI二次检查"),a&&(a._updateUI(),a.updateLoopTimeDisplay(),a.updateLoopMarkers()),i&&(i.updateProgressBar(),i.updateCurrentTimeDisplay())}),500),this.initialized=!0,console.log("[CustomVideoPlayer] 初始化完成")}}},{key:"close",value:function(){for(var t in this.playerCore.close(this.managers.uiManager.overlay,this.managers.uiManager.container,this.managers.uiManager.playerContainer),this.managers.eventManager&&this.managers.eventManager.cleanup(),this.swipeManager&&(this.swipeManager.destroy(),this.swipeManager=null),this.managers)this.managers[t]&&"function"==typeof this.managers[t].cleanup&&this.managers[t].cleanup(),this.managers[t]=null;this.initialized=!1,this.managers={},this.playerCore=null}}])&&Z(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function K(t){return K="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},K(t)}function tt(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.button=null,this.videoPlayer=null,this.resizeTimeout=null,this.playerState=e.playerState||null,this.videoCheckInterval=null,this.mutationObserver=null},e=[{key:"init",value:function(){this.cleanupExistingButtons(),s.findVideoElement()?(this.createButton(),window.addEventListener("resize",this.handleResize.bind(this)),window.matchMedia("(orientation: portrait)").addEventListener("change",this.handleResize.bind(this)),this.setupMutationObserver(),console.log("[FloatingButton] 已创建浮动按钮,页面中存在视频元素")):(console.log("[FloatingButton] 页面中未检测到视频元素,不显示浮动按钮"),this.startVideoElementCheck(),this.setupMutationObserver())}},{key:"setupMutationObserver",value:function(){this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver(this.handleDomMutations.bind(this)),this.mutationObserver.observe(document.body,{childList:!0,subtree:!0})}},{key:"handleDomMutations",value:function(){var t=this;this.mutationTimeout&&clearTimeout(this.mutationTimeout),this.mutationTimeout=setTimeout((function(){var e=s.findVideoElement();e&&!t.button?(t.createButton(),window.addEventListener("resize",t.handleResize.bind(t)),window.matchMedia("(orientation: portrait)").addEventListener("change",t.handleResize.bind(t)),console.log("[FloatingButton] DOM变化检测到视频元素,已创建浮动按钮")):!e&&t.button?(t.button.style.display="none",console.log("[FloatingButton] DOM变化检测到视频元素已移除,已隐藏浮动按钮")):e&&t.button&&"none"===t.button.style.display&&(t.button.style.display="flex",console.log("[FloatingButton] DOM变化检测到视频元素已添加,已显示浮动按钮"))}),300)}},{key:"startVideoElementCheck",value:function(){var t=this;this.videoCheckInterval&&clearInterval(this.videoCheckInterval),this.videoCheckInterval=setInterval((function(){s.findVideoElement()&&(t.button?"none"===t.button.style.display&&(t.button.style.display="flex",console.log("[FloatingButton] 定时检测到视频元素,已显示浮动按钮")):(t.createButton(),window.addEventListener("resize",t.handleResize.bind(t)),window.matchMedia("(orientation: portrait)").addEventListener("change",t.handleResize.bind(t)),console.log("[FloatingButton] 定时检测到视频元素,已创建浮动按钮")),clearInterval(t.videoCheckInterval),t.videoCheckInterval=null)}),2e3)}},{key:"cleanupExistingButtons",value:function(){var t=document.querySelectorAll(".tm-floating-button");t.length>0&&(console.log("[FloatingButton] 清理 ".concat(t.length," 个现有浮动按钮")),t.forEach((function(t){t&&t.parentNode&&t.parentNode.removeChild(t)})))}},{key:"handleResize",value:function(){var t=this;this.resizeTimeout&&clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout((function(){s.findVideoElement()?(t.button.style.display="flex",t.updateButtonPosition()):t.button&&(t.button.style.display="none")}),200)}},{key:"createButton",value:function(){var t=this;if(this.button=s.createElementWithStyle("button","tm-floating-button"),this.button.innerHTML='\n \n \n \n \n ',this.button.addEventListener("mousedown",(function(e){var n=document.createElement("span"),r=t.button.getBoundingClientRect(),o=Math.max(r.width,r.height),i=e.clientX-r.left-o/2,a=e.clientY-r.top-o/2;n.style.cssText="\n position: absolute;\n width: ".concat(o,"px;\n height: ").concat(o,"px;\n left: ").concat(i,"px;\n top: ").concat(a,"px;\n background-color: rgba(255, 255, 255, 0.3);\n border-radius: 50%;\n transform: scale(0);\n pointer-events: none;\n animation: ripple-effect 0.6s ease-out forwards;\n "),t.button.appendChild(n),setTimeout((function(){n.remove()}),600)})),this.button.addEventListener("click",(function(){t.handleButtonClick()})),this.button.style.display="flex",document.body.appendChild(this.button),!document.getElementById("tm-ripple-style")){var e=document.createElement("style");e.id="tm-ripple-style",e.textContent="\n @keyframes ripple-effect {\n 0% {\n transform: scale(0);\n opacity: 1;\n }\n 80% {\n transform: scale(1.5);\n opacity: 0.5;\n }\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n ",document.head.appendChild(e)}return this.updateButtonPosition(),this.button}},{key:"updateButtonPosition",value:function(){if(this.button){var t=s.getSafeAreaInsets();s.isPortrait()?(this.button.style.bottom="".concat(Math.max(20,t.bottom),"px"),this.button.style.right="20px",this.button.style.left="auto"):(this.button.style.bottom="".concat(Math.max(20,t.bottom+10),"px"),this.button.style.right="".concat(Math.max(20,t.right+10),"px"),this.button.style.left="auto"),this.button.style.zIndex="9980"}}},{key:"handleButtonClick",value:function(){this.button.style.display="none",this.videoPlayer=new J({playerState:this.playerState,callingButton:this.button}),this.videoPlayer.init()}},{key:"remove",value:function(){this.button&&this.button.parentNode&&this.button.parentNode.removeChild(this.button),window.removeEventListener("resize",this.handleResize),this.videoCheckInterval&&(clearInterval(this.videoCheckInterval),this.videoCheckInterval=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.button=null}}],e&&tt(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function rt(t){return rt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},rt(t)}function ot(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:3e3,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"rgba(0, 0, 0, 0.8)",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"#fff",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"top",i=document.createElement("div");i.innerText=t,i.style.cssText="\n position: fixed;\n z-index: 100000;\n left: 50%;\n transform: translateX(-50%);\n padding: 10px 15px;\n border-radius: 4px;\n color: ".concat(r,";\n background: ").concat(n,";\n font-size: 14px;\n max-width: 80%;\n text-align: center;\n word-break: break-all;\n "),"top"===o?i.style.top="10%":"bottom"===o?i.style.bottom="10%":"center"===o&&(i.style.top="50%",i.style.transform="translate(-50%, -50%)"),document.body.appendChild(i),setTimeout((function(){i.style.opacity="0",i.style.transition="opacity 0.5s",setTimeout((function(){document.body.removeChild(i)}),500)}),e)}},{key:"throttle",value:function(t,e){var n=0;return function(){var r=Date.now();if(r-n>=e){n=r;for(var o=arguments.length,i=new Array(o),a=0;a1&&void 0!==arguments[1]?arguments[1]:1e4,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;return new Promise((function(r,o){var i=document.querySelector(t);if(i)return r(i);var a=Date.now(),s=setInterval((function(){var n=document.querySelector(t);if(n)return clearInterval(s),r(n);Date.now()-a>e&&(clearInterval(s),o(new Error("等待元素 ".concat(t," 超时"))))}),n)}))}},{key:"getValue",value:function(t,e){try{var n=localStorage.getItem("autologin_".concat(t));if(null!==n)try{return JSON.parse(n)}catch(t){return n}return e}catch(t){return console.error("获取存储值失败:",t),e}}},{key:"setValue",value:function(t,e){try{var n="object"===st(e)?JSON.stringify(e):e;localStorage.setItem("autologin_".concat(t),n)}catch(t){console.error("设置存储值失败:",t)}}}],null&<(t.prototype,null),e&<(t,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function dt(t){return dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},dt(t)}function ht(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:"")||this.userLang;return(this.strings[e]||this.strings.en)[t]||this.strings.en[t]}}],null&&ht(t.prototype,null),e&&ht(t,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}();function yt(t){return yt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yt(t)}function bt(){bt=function(){return e};var t,e={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function u(t,e,n,r){var i=e&&e.prototype instanceof g?e:g,a=Object.create(i.prototype),s=new B(r||[]);return o(a,"_invoke",{value:L(t,n,s)}),a}function d(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}e.wrap=u;var h="suspendedStart",p="suspendedYield",f="executing",m="completed",v={};function g(){}function y(){}function b(){}var w={};c(w,a,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(V([])));x&&x!==n&&r.call(x,a)&&(w=x);var C=b.prototype=g.prototype=Object.create(w);function E(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function n(o,i,a,s){var l=d(t[o],t,i);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==yt(u)&&r.call(u,"__await")?e.resolve(u.__await).then((function(t){n("next",t,a,s)}),(function(t){n("throw",t,a,s)})):e.resolve(u).then((function(t){c.value=t,a(c)}),(function(t){return n("throw",t,a,s)}))}s(l.arg)}var i;o(this,"_invoke",{value:function(t,r){function o(){return new e((function(e,o){n(t,r,e,o)}))}return i=i?i.then(o,o):o()}})}function L(e,n,r){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:t,done:!0}}for(r.method=i,r.arg=a;;){var s=r.delegate;if(s){var l=P(s,r);if(l){if(l===v)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===h)throw o=m,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=f;var c=d(e,n,r);if("normal"===c.type){if(o=r.done?m:p,c.arg===v)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=m,r.method="throw",r.arg=c.arg)}}}function P(e,n){var r=n.method,o=e.iterator[r];if(o===t)return n.delegate=null,"throw"===r&&e.iterator.return&&(n.method="return",n.arg=t,P(e,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),v;var i=d(o,e.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,v;var a=i.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,v):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,v)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function M(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function B(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function V(e){if(e||""===e){var n=e[a];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function n(){for(;++o=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),M(n),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;M(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:V(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),v}},e}function wt(t,e,n,r,o,i,a){try{var s=t[i](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,o)}function kt(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){wt(i,r,o,a,s,"next",t)}function s(t){wt(i,r,o,a,s,"throw",t)}a(void 0)}))}}function xt(t,e){for(var n=0;n\n \n \n
\n \n
\n "),(o=n.querySelector(".flex")).parentNode.insertBefore(r,o.nextSibling),i=ut.getValue("autoLogin",!0),document.getElementById("auto_login").checked=i,document.getElementById("auto_login").addEventListener("change",(function(){var t=document.getElementById("auto_login").checked;ut.setValue("autoLogin",t),e&&e({autoLogin:t})})),(a=document.querySelector("form[x-show=\"currentPage === 'login'\"]"))&&(s=a.querySelector('button[type="submit"]'))&&s.addEventListener("click",(function(){setTimeout((function(){var t=document.getElementById("login_email"),n=document.getElementById("login_password"),r=document.getElementById("auto_login");if(t&&n&&r&&r.checked){var o=t.value,i=n.value;ut.setValue("userEmail",o),ut.setValue("userPassword",i),e&&e({email:o,password:i,autoLogin:!0})}}),100)})),t.next=19;break;case 16:t.prev=16,t.t0=t.catch(0),console.error("添加自动登录选项时出错:",t.t0);case 19:case"end":return t.stop()}}),t,null,[[0,16]])}))),function(e){return t.apply(this,arguments)})}]);var t,e,n,r}();function St(t){return St="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},St(t)}function Lt(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),M(n),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;M(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:V(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),v}},e}function Tt(t,e,n,r,o,i,a){try{var s=t[i](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,o)}function Mt(t){return function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){Tt(i,r,o,a,s,"next",t)}function s(t){Tt(i,r,o,a,s,"throw",t)}a(void 0)}))}}function Bt(t,e){for(var n=0;n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}(this.providers);try{for(e.s();!(t=e.n()).done;){var n=t.value;if(n.isSupportedSite())return n}}catch(t){e.e(t)}finally{e.f()}return null}},{key:"checkLoginAndAutoLogin",value:(e=Mt(Pt().mark((function t(){return Pt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.activeProvider){t.next=2;break}return t.abrupt("return");case 2:return t.prev=2,t.next=5,this.activeProvider.checkLoginStatus();case 5:if(t.sent||!this.autoLogin||!this.userEmail||!this.userPassword){t.next=10;break}return console.log("用户未登录,尝试自动登录"),t.next=10,this.activeProvider.login(this.userEmail,this.userPassword);case 10:t.next=15;break;case 12:t.prev=12,t.t0=t.catch(2),console.error("登录检查过程出错:",t.t0);case 15:case"end":return t.stop()}}),t,this,[[2,12]])}))),function(){return e.apply(this,arguments)})},{key:"login",value:(t=Mt(Pt().mark((function t(e,n){return Pt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.activeProvider){t.next=3;break}return console.error("没有匹配的登录提供者"),t.abrupt("return",!1);case 3:return this.handleLoginInfoChange({email:e,password:n}),t.next=6,this.activeProvider.login(e,n);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t,this)}))),function(e,n){return t.apply(this,arguments)})}]);var t,e,n}();function Dt(t){return Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Dt(t)}function jt(){jt=function(){return e};var t,e={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function u(t,e,n,r){var i=e&&e.prototype instanceof g?e:g,a=Object.create(i.prototype),s=new B(r||[]);return o(a,"_invoke",{value:L(t,n,s)}),a}function d(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}e.wrap=u;var h="suspendedStart",p="suspendedYield",f="executing",m="completed",v={};function g(){}function y(){}function b(){}var w={};c(w,a,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(V([])));x&&x!==n&&r.call(x,a)&&(w=x);var C=b.prototype=g.prototype=Object.create(w);function E(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function S(t,e){function n(o,i,a,s){var l=d(t[o],t,i);if("throw"!==l.type){var c=l.arg,u=c.value;return u&&"object"==Dt(u)&&r.call(u,"__await")?e.resolve(u.__await).then((function(t){n("next",t,a,s)}),(function(t){n("throw",t,a,s)})):e.resolve(u).then((function(t){c.value=t,a(c)}),(function(t){return n("throw",t,a,s)}))}s(l.arg)}var i;o(this,"_invoke",{value:function(t,r){function o(){return new e((function(e,o){n(t,r,e,o)}))}return i=i?i.then(o,o):o()}})}function L(e,n,r){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:t,done:!0}}for(r.method=i,r.arg=a;;){var s=r.delegate;if(s){var l=P(s,r);if(l){if(l===v)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===h)throw o=m,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=f;var c=d(e,n,r);if("normal"===c.type){if(o=r.done?m:p,c.arg===v)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=m,r.method="throw",r.arg=c.arg)}}}function P(e,n){var r=n.method,o=e.iterator[r];if(o===t)return n.delegate=null,"throw"===r&&e.iterator.return&&(n.method="return",n.arg=t,P(e,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),v;var i=d(o,e.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,v;var a=i.arg;return a?a.done?(n[e.resultName]=a.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,v):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,v)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function M(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function B(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function V(e){if(e||""===e){var n=e[a];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function n(){for(;++o=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),M(n),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;M(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:V(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),v}},e}function It(t,e,n,r,o,i,a){try{var s=t[i](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,o)}function Ht(){return _t.apply(this,arguments)}function _t(){var t;return t=jt().mark((function t(){var e;return jt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,e=new Ot,t.next=4,e.init();case 4:return t.abrupt("return",e);case 7:return t.prev=7,t.t0=t.catch(0),console.error("自动登录模块初始化失败:",t.t0),t.abrupt("return",null);case 11:case"end":return t.stop()}}),t,null,[[0,7]])})),_t=function(){var e=this,n=arguments;return new Promise((function(r,o){var i=t.apply(e,n);function a(t){It(i,r,o,a,s,"next",t)}function s(t){It(i,r,o,a,s,"throw",t)}a(void 0)}))},_t.apply(this,arguments)}function Rt(t){return Rt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Rt(t)}function Nt(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n0&&void 0!==arguments[0]?arguments[0]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.adSelectors=e.adSelectors||[],this.customStyles=e.customStyles||[],this.blockedUrlPatternsSet=new Set(e.blockedUrlPatterns||[]),this.adKeywordsRegex=/ads|analytics|tracker|affiliate|stat|pixel|banner|pop|click|outstream\.video|vast|vmap|preroll|midroll|postroll|adserve/i}),[{key:"isEmpty",value:function(){return 0===this.adSelectors.length&&0===this.customStyles.length&&0===this.blockedUrlPatternsSet.size}},{key:"shouldBlockUrl",value:function(t){if(!t||"string"!=typeof t)return!1;if(this.adKeywordsRegex.test(t))return!0;var e,n=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return Nt(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Nt(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,o=function(){};return{s:o,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}(this.blockedUrlPatternsSet);try{for(n.s();!(e=n.n()).done;){var r=e.value;if(t.includes(r))return!0}}catch(t){n.e(t)}finally{n.f()}return!1}}])}();const Ut=Wt;function qt(t){return qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},qt(t)}function Ft(t,e){for(var n=0;n0&&(e+=this.config.adSelectors.join(", ")+" { display: none !important; visibility: hidden !important; height: 0 !important; min-height: 0 !important; }"),this.config.customStyles.length>0&&(e+="\n"+this.config.customStyles.map((function(t){return"".concat(t.selector," { ").concat(t.styles," }")})).join("\n")),t.textContent=e,document.head.appendChild(t),console.log("已应用广告屏蔽样式")}}}])}();const Gt=Yt;function Qt(t){return Qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Qt(t)}function Zt(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:null)||document.getElementsByTagName("iframe"),e=0;e=t.maxAttempts)&&(clearInterval(n),console.log("[DetailExpander] 完成尝试 (".concat(e+1,"次)")))}),this.attemptInterval)}},{key:"expandDetailsSingle",value:function(){try{var t=document.querySelector(this.SHOW_MORE_SELECTOR);if(t)return console.log('[DetailExpander] 找到"显示更多"按钮,点击展开'),t.click(),!0}catch(t){console.error("[DetailExpander] 展开详情时出错:",t)}return!1}}])}();function me(t){return me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},me(t)}function ve(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n=t.maxAttempts)&&(clearInterval(n),console.log("[QualityManager] 完成尝试 (".concat(e+1,"次)")))}),this.attemptInterval);window.addEventListener("load",(function(){return t.setHighestQualitySingle()}))}}},{key:"setHighestQualitySingle",value:function(){try{var t=window.player||("undefined"!=typeof unsafeWindow?unsafeWindow.player:null);if(!(t&&t.config&&t.config.quality&&t.config.quality.options&&t.config.quality.options.length))return!1;var e=Math.max.apply(Math,function(t){return function(t){if(Array.isArray(t))return ve(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ve(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ve(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(t.config.quality.options));return console.log("[QualityManager] 设置画质:",e),t.quality=e,t.config.quality.selected=e,"function"==typeof t.quality&&t.quality(e),!0}catch(t){return console.error("[QualityManager] 设置最高画质时出错:",t),!1}}}])}();function we(t){return we="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},we(t)}function ke(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,i=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}(this.redirectRules);try{for(n.s();!(t=n.n()).done;){var r=t.value;if(r.pattern.test(e)){console.log("[UrlRedirector] 匹配到重定向规则:",r);var o=this.applyRedirect(e,r);if(o!==e)return console.log("[UrlRedirector] 重定向到:",o),window.location.href=o,!0}}}catch(t){n.e(t)}finally{n.f()}return!1}},{key:"applyRedirect",value:function(t,e){return e.targetDomain?t.replace(/^(https?:\/\/)(?:www\.)?(missav|thisav)\.com\//i,"$1".concat(e.targetDomain,"/")):t}}])}();function Se(t){return Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Se(t)}function Le(t,e){for(var n=0;n=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),M(n),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;M(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:V(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),v}},e}function Ve(t,e,n,r,o,i,a){try{var s=t[i](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,o)}!function(){var t=null;function e(){return r.apply(this,arguments)}function r(){var e;return e=Be().mark((function e(){return Be().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,r=void 0,document.getElementById("tm-player-styles")||((r=document.querySelector('meta[name="viewport"]'))||((r=document.createElement("meta")).name="viewport",document.head.appendChild(r)),r.content="width=device-width, initial-scale=1.0, viewport-fit=cover",console.log("[Miss NoAD Player] 已配置viewport以支持安全区域"),n(610),console.log("[Miss NoAD Player] 样式注入完成")),(new Te).init(),console.log("[Miss NoAD Player] 用户体验增强模块已初始化"),(t=new at).loadSettings(),new nt({playerState:t}).init(),e.next=10,Ht();case 10:e.sent&&console.log("[Miss NoAD Player] 自动登录模块已初始化"),(new ue).init(),console.log("[Miss NoAD Player] 初始化完成"),e.next=20;break;case 17:e.prev=17,e.t0=e.catch(0),console.error("[Miss NoAD Player] 初始化失败:",e.t0);case 20:case"end":return e.stop()}var r}),e,null,[[0,17]])})),r=function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(t){Ve(i,r,o,a,s,"next",t)}function s(t){Ve(i,r,o,a,s,"throw",t)}a(void 0)}))},r.apply(this,arguments)}"complete"===document.readyState||"interactive"===document.readyState?setTimeout(e,100):document.addEventListener("DOMContentLoaded",(function(){return setTimeout(e,100)}))}()})();