@lzwme/m3u8-dl 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ .app-layout[data-v-c730956f]{position:relative;min-height:100vh}.main-content[data-v-c730956f]{transition:margin-left .3s ease,width .3s ease;margin-left:16rem;width:calc(100% - 16rem);padding:.25rem}.main-content.sidebar-collapsed[data-v-c730956f]{margin-left:0;width:100%}.nav-item[data-v-c730956f]{text-align:left}@media(max-width:768px){.main-content[data-v-c730956f]{margin-left:0!important;width:100%!important;padding:.25rem}}@media(min-width:769px)and (max-width:1024px){.main-content[data-v-c730956f]{margin-left:12rem;width:calc(100% - 12rem)}.sidebar[data-v-c730956f]{width:12rem}}.fixed.inset-0[data-v-80015324]{position:fixed;inset:0}.playlist-overlay[data-v-80015324]{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .25s cubic-bezier(.4,0,.2,1),visibility .25s cubic-bezier(.4,0,.2,1)}.playlist-overlay.playlist-overlay-visible[data-v-80015324]{opacity:1;visibility:visible;pointer-events:auto}.playlist-sidebar[data-v-80015324]{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1),margin-right .3s cubic-bezier(.4,0,.2,1),border-left-color .3s cubic-bezier(.4,0,.2,1);will-change:transform,opacity,width}@media(min-width:768px){.playlist-sidebar[data-v-80015324]{opacity:0;width:0;min-width:0;margin-right:0;border-left-color:transparent;overflow:hidden}.playlist-sidebar.playlist-sidebar-visible[data-v-80015324]{opacity:1;width:20rem;min-width:20rem;margin-right:0;border-left-color:#374151}}@media(max-width:767px){.playlist-sidebar[data-v-80015324]{position:fixed;top:0;right:0;bottom:0;z-index:50;border-left:none;width:85vw;max-width:320px;box-shadow:-4px 0 24px #00000080;opacity:0;transform:translate(100%);visibility:hidden;pointer-events:none;transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1),visibility .3s cubic-bezier(.4,0,.2,1)}.playlist-sidebar.playlist-sidebar-visible[data-v-80015324]{opacity:1;transform:translate(0);visibility:visible;pointer-events:auto}}input[type=checkbox][data-v-51fd32c8]{min-width:20px}.web-browser-container[data-v-64486f5d]{box-shadow:0 1px 3px #0000001a}.m3u8-list-container[data-v-64486f5d]{max-height:calc(100vh - 280px)}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-300:oklch(87.1% .15 154.449);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-800:oklch(43.8% .218 303.724);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-lg:.5rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-3{top:calc(var(--spacing)*3)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.z-\[9999\]{z-index:9999}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing)*2)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-full{height:100%}.max-h-\[98vh\]{max-height:98vh}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-80{width:calc(var(--spacing)*80)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[calc\(35vw\)\]{max-width:35vw}.max-w-\[calc\(100vw-100px\)\]{max-width:calc(100vw - 100px)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-blue-200{border-color:var(--color-blue-200)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-700{border-color:var(--color-gray-700)}.border-red-200{border-color:var(--color-red-200)}.border-t-blue-500{border-top-color:var(--color-blue-500)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-4{padding-right:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-blue-300{color:var(--color-blue-300)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-300{color:var(--color-green-300)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-purple-400{color:var(--color-purple-400)}.text-purple-600{color:var(--color-purple-600)}.text-red-300{color:var(--color-red-300)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-green-50:hover{background-color:var(--color-green-50)}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-purple-500\/20:hover{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-purple-500\/20:hover{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-yellow-50:hover{background-color:var(--color-yellow-50)}.hover\:bg-yellow-200:hover{background-color:var(--color-yellow-200)}.hover\:bg-yellow-500\/20:hover{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-yellow-500\/20:hover{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-green-600:hover{color:var(--color-green-600)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-purple-300:hover{color:var(--color-purple-300)}.hover\:text-purple-800:hover{color:var(--color-purple-800)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:text-yellow-400:hover{color:var(--color-yellow-400)}.hover\:text-yellow-500:hover{color:var(--color-yellow-500)}.hover\:text-yellow-600:hover{color:var(--color-yellow-600)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:min-w-\[200px\]{min-width:200px}.sm\:flex-initial{flex:0 auto}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:px-3{padding-inline:calc(var(--spacing)*3)}.sm\:px-4{padding-inline:calc(var(--spacing)*4)}}@media(min-width:48rem){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:gap-2{gap:calc(var(--spacing)*2)}:where(.md\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.md\:p-2{padding:calc(var(--spacing)*2)}.md\:p-4{padding:calc(var(--spacing)*4)}.md\:px-3{padding-inline:calc(var(--spacing)*3)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}}:root{--color-primary:#3b82f6;--color-primary-hover:#2563eb;--color-success:#10b981;--color-warning:#f59e0b;--color-danger:#ef4444;--color-info:#3b82f6;--color-border:#e5e7eb;--spacing-xs:.25rem;--spacing-sm:.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem}*,:after,:before{border-color:var(--color-border);box-sizing:border-box;border-style:solid}::-moz-placeholder{font-size:14px}::placeholder{font-size:14px}button{cursor:pointer}#app{background-color:#f5f5f5;max-width:1920px;min-height:100vh;margin:auto;position:relative}.sidebar{z-index:1;background-color:#fff;width:16rem;transition:all .3s;position:absolute;top:0;bottom:0;left:0;box-shadow:2px 0 5px #0000001a}.download-item{transition:all .3s}.download-item:hover{background-color:#f8f9fa}.progress-bar{height:4px;transition:width .3s}.nav-item{transition:all .3s}.nav-item:hover{background-color:#f0f0f0;transform:translate(4px)}.nav-item.active{color:#1890ff;background-color:#e6f3ff}@media(max-width:768px){.sidebar{transform:translate(-100%)}.sidebar.show{transform:translate(0)}.menu-toggle{display:block!important}}@media(min-width:769px)and (max-width:1024px){.sidebar{width:12rem}}.menu-toggle{z-index:51;cursor:pointer;background:#fff;border-radius:.5rem;width:42px;height:42px;padding:.5rem;display:none;position:fixed;top:1rem;left:1rem;box-shadow:0 2px 4px #0000001a}.main-content{width:calc(100% - 16rem);margin-left:16rem;transition:margin-left .3s}.custom-toast{color:#333;z-index:99999;background:#fff;border-radius:4px;align-items:center;min-width:250px;max-width:400px;padding:15px 25px 15px 15px;transition:transform .3s;display:flex;position:fixed;top:20px;right:20px;transform:translate(150%);box-shadow:0 4px 12px #00000026}.custom-toast.show{transform:translate(0)}.custom-toast.hide{transform:translate(150%)}.custom-toast-success{border-left:4px solid #28a745}.custom-toast-error{border-left:4px solid #dc3545}.custom-toast-warning{border-left:4px solid #ffc107}.custom-toast-info{border-left:4px solid #17a2b8}.modal-overlay{background-color:#00000080;font-size:14px}.modal-overlay textarea,.modal-overlay input{padding-top:.25rem;padding-bottom:.25rem;font-size:16px}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
package/client/index.html CHANGED
@@ -12,8 +12,8 @@
12
12
  crossorigin="anonymous" referrerpolicy="no-referrer" />
13
13
  <script src="https://s4.zstatic.net/ajax/libs/blueimp-md5/2.19.0/js/md5.min.js" crossorigin="anonymous"
14
14
  referrerpolicy="no-referrer"></script>
15
- <script type="module" crossorigin src="/assets/main-DZTEqg-V.js"></script>
16
- <link rel="stylesheet" crossorigin href="/assets/main-ChJ1yjNN.css">
15
+ <script type="module" crossorigin src="/assets/main-BSWj1VKy.js"></script>
16
+ <link rel="stylesheet" crossorigin href="/assets/main-T6xR17Gh.css">
17
17
  </head>
18
18
  <body>
19
19
  <div id="app"></div>
@@ -4,7 +4,7 @@
4
4
  // @homepage https://m3u8-player.lzw.me/download.html
5
5
  // @supportURL https://github.com/lzwme/m3u8-dl/issues
6
6
  // @icon https://gh-proxy.org/raw.githubusercontent.com/lzwme/m3u8-dl/refs/heads/main/packages/frontend/public/logo.png
7
- // @version 1.0.0
7
+ // @version 1.0.1
8
8
  // @description 自动抓取网页中的多种媒体链接(m3u8、mp4、mkv、avi、mov、音频等),支持可配置的媒体类型,支持跳转到 m3u8-dl webui 下载
9
9
  // @author lzw
10
10
  // @updateURL https://gh-proxy.org/raw.githubusercontent.com/lzwme/m3u8-dl/refs/heads/main/client/m3u8-capture.user.js
@@ -22,9 +22,9 @@
22
22
  // @run-at document-idle
23
23
  // ==/UserScript==
24
24
 
25
- (function(){"use strict";const j="m3u8_capture_webui_url",K="m3u8_capture_exclude_urls",J="m3u8_capture_panel_pos",Q="m3u8_capture_panel_visible",Z="m3u8_capture_media_ext_list",ut=["m3u8","mp4","mkv","avi","mov","wmv","flv","webm","m4v","m3u","m4a","aac","flac","ape","mp3","wav","ogg","wma"];function V(){return GM_getValue(j,"http://localhost:6600").replace(/\/$/,"")}function tt(){return GM_getValue(K,"")}function ft(t){GM_setValue(K,t)}function U(){const t=GM_getValue(Z,[]);return t&&Array.isArray(t)&&t.length>0?t:[...ut]}function pt(t){if(Array.isArray(t)&&t.length>0){const e=t.map(n=>n.trim().toLowerCase()).filter(n=>n&&/^[a-z0-9]+$/i.test(n));return GM_setValue(Z,e),e}return null}function mt(){return GM_getValue(J,null)}function xt(t){GM_setValue(J,t)}function wt(){return GM_getValue(Q,!1)}function et(t){GM_setValue(Q,t)}function W(t,e=document.head,n="css"){const o=t.length<50?GM_getResourceText(t):t;return Promise.resolve(GM_addElement(e,n==="css"?"style":"script",{type:n==="css"?"text/css":"text/javascript",textContent:o}))}function gt(){const t=U();return new RegExp(`\\.(${t.join("|")})(\\?|$|#)`,"i")}function k(t){const e=window.location.href;if(e.startsWith(V()))return!0;const n=tt();if(!n||!n.trim())return!1;const o=n.split(`
26
- `).map(i=>i.trim()).filter(i=>i);for(const i of o)try{if(e.includes(i)||i.startsWith("/")&&i.endsWith("/")&&new RegExp(i.slice(1,-1)).test(e))return!0}catch(a){console.warn("[M3U8 Capture] 排除规则格式错误:",i,a)}return!1}function nt(t){return new Promise((e,n)=>{navigator.clipboard?.writeText?navigator.clipboard.writeText(t).then(()=>e(!0)).catch(()=>{ot(t)?e(!0):n(new Error("复制失败"))}):ot(t)?e(!0):n(new Error("复制失败"))})}function ot(t){try{const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",e.style.left="-9999px",document.body.appendChild(e),e.select(),e.setSelectionRange(0,t.length);const n=document.execCommand("copy");return document.body.removeChild(e),n}catch(e){return console.error("[M3U8 Capture] fallbackCopy failed:",e),!1}}function ht(t){try{const e=new URL(t);return`${e.protocol}//${e.host}${e.pathname}`}catch{return t}}function O(t){return"touches"in t&&t.touches.length>0?{x:t.touches[0].clientX,y:t.touches[0].clientY}:"changedTouches"in t&&t.changedTouches.length>0?{x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}:{x:t.clientX,y:t.clientY}}function y(t){if(!t||typeof t!="string"||!t.startsWith("http"))return!1;const e=t.toLowerCase();return!!(gt().test(e)||e.includes(".m3u8"))}function it(t){if(!t||typeof t!="string")return"media";const e=t.toLowerCase(),n=U();for(const o of n)if(new RegExp(`\\.${o}(\\?|$|#)`,"i").test(e))return o;return/m3u8/i.test(e)?"m3u8":"media"}function q(t=document){let e="";const n=["h1.title","h2.title","h1","h2"];for(const o of n){const i=t.querySelector(o);if(i?.textContent){e=i.textContent.trim();break}}if(e||(e=(t.title||"").split(/[-|_]/)[0].trim()),!e&&window.top!==window.self)try{e=q(window.top?.document)}catch{}return e}function yt(t){if(!t||typeof t!="string")return null;try{const e=new URL(t);for(const[n,o]of e.searchParams.entries()){if(!o)continue;const i=decodeURIComponent(o);if(y(i))return i}}catch{}return null}function bt(){const t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(n,o,i,a,s){return y(o.toString())&&this.addEventListener("load",function(){this.status>=200&&this.status<300&&h(o.toString())}),t.call(this,n,o,i??!0,a,s)};const e=window.fetch;window.fetch=function(n,o){const i=typeof n=="string"?n:n&&typeof n=="object"&&"url"in n?n.url:"";return y(i)?e.call(this,n,o).then(a=>(a.ok&&h(i),a)):e.call(this,n,o)}}function vt(){if(typeof PerformanceObserver>"u")return;const t=new PerformanceObserver(e=>{for(const n of e.getEntries())n.name&&y(n.name)&&h(n.name)});try{t.observe({entryTypes:["resource"]})}catch{console.log("[M3U8 Capture] PerformanceObserver not supported")}}function A(){if(document.querySelectorAll("video").forEach(t=>{t.src&&y(t.src)&&h(t.src,t.getAttribute("title")||""),t.querySelectorAll("source").forEach(e=>{e.src&&y(e.src)&&h(e.src,t.getAttribute("title")||"")})}),document.querySelectorAll("a[href]").forEach(t=>{const e=t.getAttribute("href");if(e&&y(e))try{const n=new URL(e,window.location.href).href;h(n,t.textContent?.trim()||"")}catch{}}),document.body){const t=document.body.innerText||"",n=U().join("|"),o=new RegExp(`https?:\\/\\/[^\\s"'<>]+\\.(${n})(\\?[^\\s"'<>]*)?`,"gi");let i;for(;(i=o.exec(t))!==null;)h(i[0])}}async function Et(){let t=document.body;const e=o=>{t=o},n=()=>t;unsafeWindow.SetSwalTarget=e,window.SetSwalTarget=e,unsafeWindow.GetSwalTarget=n,window.GetSwalTarget=n;try{const o=GM_getResourceText("SwalJS").replace(/document\.body/g,"GetSwalTarget()"),i=()=>W(o,document.head||document.documentElement,"script").then(()=>{const a=window.Swal||window.Sweetalert2||unsafeWindow.Swal||unsafeWindow.Sweetalert2;a&&(window.Swal=a,unsafeWindow.Swal=a)}).catch(a=>{console.error("[M3U8 Capture] Failed to add SweetAlert2 script:",a)});document.head||document.documentElement?await i():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>i()):setTimeout(i,50)}catch(o){console.error("[M3U8 Capture] Failed to load SweetAlert2:",o)}}function St(t,e){W(GM_getResourceText("SwalCSS").replace(/:root *{/,`#${e.id} {`).replace(/body/g,""),t,"css"),setTimeout(()=>{const n=window.Swal;typeof window.SetSwalTarget=="function"&&n&&(window.SetSwalTarget(e),window.Swal=n.mixin({target:e}))},500)}const m=window.top&&window.top!==window.self;let S=null,b=null,l=null,r=null,p=null,$=wt(),B=!1;const P={x:0,y:0};let M=!1;const R={x:0,y:0};let z={x:0,y:0},C=!1,L=null;const g={x:0,y:0};let x;function Mt(t){x=t}function rt(){if(S)return b;S=document.createElement("div"),S.id="m3u8-capture-shadow-host",S.style.cssText="position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9999;",document.body.appendChild(S),b=S.attachShadow({mode:"open"}),W("TailwindCSS",b,"css");const t=document.createElement("div");t.id="m3u8-capture-swal-container",b.appendChild(t);const e=document.createElement("style");return e.textContent=[":host { all: initial; font-family: system-ui, -apple-system, sans-serif; }","* { box-sizing: border-box; }",".hidden { display: none !important; }",`#${t.id},`,`#${t.id} * { pointer-events: auto !important; }`].join(`
27
- `),b.appendChild(e),Et().then(()=>{St(b,t)}),b}function at(){if(r||m)return;const t=rt();if(!t)return;r=document.createElement("div"),r.id="m3u8-capture-toggle-btn",r.style.cssText="position: fixed; bottom: 40px; right: 20px; width: 50px; height: 50px; pointer-events: auto; z-index: 999998; will-change: transform;",r.className=`fixed bottom-10 right-5 w-[50px] h-[50px] bg-blue-500 rounded-full flex items-center justify-center cursor-move shadow-lg text-2xl transition-all duration-200 hover:scale-110 hover:shadow-xl select-none touch-none ${$?"hidden":"flex"}`;const e=document.createElement("span");e.textContent="🎬",r.appendChild(e),p=document.createElement("span"),p.id="m3u8-capture-toggle-badge",p.style.cssText="position: absolute; top: -4px; right: -4px; min-width: 18px; height: 18px; background: #ef4444; color: white; border-radius: 9px; font-size: 11px; font-weight: bold; display: flex; align-items: center; justify-content: center; padding: 0 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); line-height: 1;",p.textContent="0",p.classList.add("hidden"),r.appendChild(p);const n=o=>{if(!r)return;M=!0,C=!1;const i=O(o);z={x:i.x,y:i.y};const a=r.getBoundingClientRect();R.x=i.x-a.left,R.y=i.y-a.top,g.x=a.left,g.y=a.top;const s=window.getComputedStyle(r);s.transform&&s.transform!=="none"&&(r.style.transform="none",r.style.left=`${a.left}px`,r.style.top=`${a.top}px`,r.style.right="auto",r.style.bottom="auto"),r.style.cursor="move",r.style.transition="none",o.preventDefault(),o.stopPropagation()};r.addEventListener("mousedown",n),r.addEventListener("touchstart",n,{passive:!1}),r.addEventListener("click",()=>{C||st()}),r.addEventListener("touchend",o=>{M&&!C&&(o.preventDefault(),o.stopPropagation(),st())},{passive:!1}),t.appendChild(r),F()}function F(){if(!p||m||!x)return;const t=x.size;t>0?(p.textContent=t>99?"99+":t.toString(),p.classList.remove("hidden")):p.classList.add("hidden")}function st(){m||!ct()||($=!0,et(!0),l&&(l.style.display="flex"),r&&r.classList.add("hidden"))}function H(){m||($=!1,et(!1),l&&(l.style.display="none"),r?r.classList.remove("hidden"):at(),F())}function lt(){const t=window.Swal;t&&t.fire({title:"确认清空",text:"确定要清空所有媒体链接吗?",icon:"warning",showCancelButton:!0,confirmButtonText:"确定",cancelButtonText:"取消",confirmButtonColor:"#3b82f6"}).then(e=>{e.isConfirmed&&x&&(x.clear(),N())})}function ct(){if(!document.body||m)return null;if(l)return l;const t=rt();if(!t)return null;const e=document.createElement("div");e.id="m3u8-capture-panel";const n=mt(),o=n&&window.innerWidth>768?{left:`${Math.max(0,Math.min(n.x,window.innerWidth-450))}px`,top:`${Math.max(0,Math.min(n.y,window.innerHeight-350))}px`,right:"auto"}:{right:"20px",top:"20px"};e.className="fixed w-[420px] max-w-[90vw] max-h-[85vh] bg-white border-2 border-blue-500 rounded-xl shadow-2xl font-sans flex flex-col",e.style.cssText=`
25
+ (function(){"use strict";const K="m3u8_capture_webui_url",J="m3u8_capture_exclude_urls",Q="m3u8_capture_panel_pos",Z="m3u8_capture_panel_visible",tt="m3u8_capture_media_ext_list",et="m3u8_capture_auto_start",nt="m3u8_capture_title_replace_rules",ot="m3u8_capture_auto_close_webui",bt=["m3u8","mp4","mkv","avi","mov","wmv","flv","webm","m4v","m3u","m4a","aac","flac","ape","mp3","wav","ogg","wma"],yt=["localhost:6600","/example.com/","lzw.me","doubleclick.net"];function D(){return GM_getValue(K,"http://localhost:6600").replace(/\/$/,"")}function rt(){return GM_getValue(J,"")}function vt(t){GM_setValue(J,t)}function B(){const t=GM_getValue(tt,[]);return t&&Array.isArray(t)&&t.length>0?t:[...bt]}function Et(t){if(Array.isArray(t)&&t.length>0){const e=t.map(r=>r.trim().toLowerCase()).filter(r=>r&&/^[a-z0-9]+$/i.test(r));return GM_setValue(tt,e),e}return null}function St(){return GM_getValue(Q,null)}function Ct(t){GM_setValue(Q,t)}function _t(){return GM_getValue(Z,!1)}function at(t){GM_setValue(Z,t)}function it(){return GM_getValue(et,!1)}function Mt(t){GM_setValue(et,t)}function st(){return GM_getValue(nt,"")}function Lt(t){GM_setValue(nt,t)}function lt(){return GM_getValue(ot,!1)}function Tt(t){GM_setValue(ot,t)}function q(t,e=document.head,r="css"){const o=t.length<50?GM_getResourceText(t):t;return Promise.resolve(GM_addElement(e,r==="css"?"style":"script",{type:r==="css"?"text/css":"text/javascript",textContent:o}))}function Ut(){const t=B();return new RegExp(`\\.(${t.join("|")})(\\?|$|#)`,"i")}function $(t){const e=t||window.location.href;if(e.startsWith(D()))return!0;const r=[...yt],o=rt();o.trim()&&r.push(...o.split(`
26
+ `).map(n=>n.trim()).filter(n=>n));for(const n of r)try{if(e.includes(n)||n.startsWith("/")&&n.endsWith("/")&&new RegExp(n.slice(1,-1)).test(e))return!0}catch(i){console.warn("[M3U8 Capture] 排除规则格式错误:",n,i)}return!1}function ct(t){return new Promise((e,r)=>{navigator.clipboard?.writeText?navigator.clipboard.writeText(t).then(()=>e(!0)).catch(()=>{ut(t)?e(!0):r(new Error("复制失败"))}):ut(t)?e(!0):r(new Error("复制失败"))})}function ut(t){try{const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",e.style.left="-9999px",document.body.appendChild(e),e.select(),e.setSelectionRange(0,t.length);const r=document.execCommand("copy");return document.body.removeChild(e),r}catch(e){return console.error("[M3U8 Capture] fallbackCopy failed:",e),!1}}function Rt(t){try{const e=new URL(t);return`${e.protocol}//${e.host}${e.pathname}`}catch{return t}}function z(t){return"touches"in t&&t.touches.length>0?{x:t.touches[0].clientX,y:t.touches[0].clientY}:"changedTouches"in t&&t.changedTouches.length>0?{x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}:{x:t.clientX,y:t.clientY}}function $t(t){if(!t)return t;const e=st();if(!e.trim())return t;try{const r=e.split(/,|\n/).map(n=>n.trim()).filter(n=>n);let o=t;for(const n of r)if(n)try{if(n.startsWith("/")&&n.endsWith("/")&&n.length>2){const i=n.lastIndexOf("/"),c=n.slice(1,i),l=n.slice(i+1),s=new RegExp(c,l);o=o.replace(s,"")}else o=o.replaceAll(n,"")}catch(i){console.warn("[M3U8 Capture] 标题替换规则格式错误:",n,i)}return o=o.replace(/\s+/g," ").trim(),o}catch(r){return console.warn("[M3U8 Capture] 应用标题替换规则失败:",r),t}}function C(t){if(!t||typeof t!="string"||!t.startsWith("http"))return!1;const e=t.toLowerCase();return!!(Ut().test(e)||e.includes(".m3u8"))}function At(t){if(!t||typeof t!="string")return"media";const e=t.toLowerCase(),r=B();for(const o of r)if(new RegExp(`\\.${o}(\\?|$|#)`,"i").test(e))return o;return/m3u8/i.test(e)?"m3u8":"media"}function dt(t=document){let e="";const r=["h1.title","h2.title","h1","h2"];for(const o of r){const n=t.querySelector(o);if(n?.textContent){e=n.textContent.trim();break}}if(e||(e=(t.title||"").split(/ [-|_] /)[0].trim()),!e&&window.top!==window.self)try{e=dt(window.top?.document)}catch{}return e}function kt(t){if(!t||typeof t!="string")return null;try{const e=new URL(t);for(const[r,o]of e.searchParams.entries()){if(!o)continue;const n=decodeURIComponent(o);if(C(n))return n}}catch{}return null}function It(){const t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(r,o,n,i,c){return C(o.toString())&&this.addEventListener("load",function(){this.status>=200&&this.status<300&&v(o.toString())}),t.call(this,r,o,n??!0,i,c)};const e=window.fetch;window.fetch=function(r,o){const n=typeof r=="string"?r:r&&typeof r=="object"&&"url"in r?r.url:"";return C(n)?e.call(this,r,o).then(i=>(i.ok&&v(n),i)):e.call(this,r,o)}}function Bt(){if(typeof PerformanceObserver>"u")return;const t=new PerformanceObserver(e=>{for(const r of e.getEntries())r.name&&C(r.name)&&v(r.name)});try{t.observe({entryTypes:["resource"]})}catch{console.log("[M3U8 Capture] PerformanceObserver not supported")}}function W(){if(document.querySelectorAll("video").forEach(t=>{t.src&&C(t.src)&&v(t.src,t.getAttribute("title")||""),t.querySelectorAll("source").forEach(e=>{e.src&&C(e.src)&&v(e.src,t.getAttribute("title")||"")})}),document.querySelectorAll("a[href]").forEach(t=>{const e=t.getAttribute("href");if(e&&C(e))try{const r=new URL(e,window.location.href).href;v(r,t.textContent?.trim()||"")}catch{}}),document.body){const t=document.body.innerText||"",r=B().join("|"),o=new RegExp(`https?:\\/\\/[^\\s"'<>]+\\.(${r})(\\?[^\\s"'<>]*)?`,"gi");let n;for(;(n=o.exec(t))!==null;)v(n[0])}}async function Wt(){let t=document.body;const e=o=>{t=o},r=()=>t;unsafeWindow.SetSwalTarget=e,window.SetSwalTarget=e,unsafeWindow.GetSwalTarget=r,window.GetSwalTarget=r;try{const o=GM_getResourceText("SwalJS").replace(/document\.body/g,"GetSwalTarget()"),n=()=>q(o,document.head||document.documentElement,"script").then(()=>{const i=window.Swal||window.Sweetalert2||unsafeWindow.Swal||unsafeWindow.Sweetalert2;i&&(window.Swal=i,unsafeWindow.Swal=i)}).catch(i=>{console.error("[M3U8 Capture] Failed to add SweetAlert2 script:",i)});document.head||document.documentElement?await n():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>n()):setTimeout(n,50)}catch(o){console.error("[M3U8 Capture] Failed to load SweetAlert2:",o)}}function Pt(t,e){q(GM_getResourceText("SwalCSS").replace(/:root *{/,`#${e.id} {`).replace(/body/g,""),t,"css"),setTimeout(()=>{const r=window.Swal;typeof window.SetSwalTarget=="function"&&r&&(window.SetSwalTarget(e),window.Swal=r.mixin({target:e}))},500)}const w=window.top&&window.top!==window.self;let M=null,b=null,u=null,a=null,x=null,A=_t(),P=!1;const G={x:0,y:0};let L=!1;const V={x:0,y:0};let F={x:0,y:0},T=!1,U=null;const y={x:0,y:0};let h;function Gt(t){h=t}function pt(){if(M)return b;M=document.createElement("div"),M.id="m3u8-capture-shadow-host",M.style.cssText="position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 9999;",document.body.appendChild(M),b=M.attachShadow({mode:"open"}),q("TailwindCSS",b,"css");const t=document.createElement("div");t.id="m3u8-capture-swal-container",b.appendChild(t);const e=document.createElement("style");return e.textContent=[":host { all: initial; font-family: system-ui, -apple-system, sans-serif; }","* { box-sizing: border-box; }",".hidden { display: none !important; }",`#${t.id},`,`#${t.id} * { pointer-events: auto !important; }`].join(`
27
+ `),b.appendChild(e),Wt().then(()=>{Pt(b,t)}),b}function ft(){if(a||w)return;const t=pt();if(!t)return;a=document.createElement("div"),a.id="m3u8-capture-toggle-btn",a.style.cssText="position: fixed; bottom: 30vh; right: 20px; width: 50px; height: 50px; pointer-events: auto; z-index: 99998; will-change: transform;",a.className=`fixed bottom-10 right-5 w-[50px] h-[50px] bg-blue-500 rounded-full flex items-center justify-center cursor-move shadow-lg text-2xl transition-all duration-200 hover:scale-110 hover:shadow-xl select-none touch-none ${A?"hidden":"flex"}`;const e=document.createElement("span");e.textContent="🎬",a.appendChild(e),x=document.createElement("span"),x.id="m3u8-capture-toggle-badge",x.style.cssText="position: absolute; top: -4px; right: -4px; min-width: 18px; height: 18px; background: #ef4444; color: white; border-radius: 9px; font-size: 11px; font-weight: bold; display: flex; align-items: center; justify-content: center; padding: 0 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); line-height: 1;",x.textContent="0",x.classList.add("hidden"),a.appendChild(x);const r=o=>{if(!a)return;L=!0,T=!1;const n=z(o);F={x:n.x,y:n.y};const i=a.getBoundingClientRect();V.x=n.x-i.left,V.y=n.y-i.top,y.x=i.left,y.y=i.top;const c=window.getComputedStyle(a);c.transform&&c.transform!=="none"&&(a.style.transform="none",a.style.left=`${i.left}px`,a.style.top=`${i.top}px`,a.style.right="auto",a.style.bottom="auto"),a.style.cursor="move",a.style.transition="none",o.preventDefault(),o.stopPropagation()};a.addEventListener("mousedown",r),a.addEventListener("touchstart",r,{passive:!1}),a.addEventListener("click",()=>{T||mt()}),a.addEventListener("touchend",o=>{L&&!T&&(o.preventDefault(),o.stopPropagation(),mt())},{passive:!1}),t.appendChild(a),Y()}function Y(){if(!x||w||!h)return;const t=h.size;t>0?(x.textContent=t>99?"99+":t.toString(),x.classList.remove("hidden")):x.classList.add("hidden")}function mt(){w||!gt()||(A=!0,at(!0),u&&(u.style.display="flex"),a&&a.classList.add("hidden"))}function H(){w||(A=!1,at(!1),u&&(u.style.display="none"),a?a.classList.remove("hidden"):ft(),Y())}function xt(){const t=window.Swal;t&&t.fire({title:"确认清空",text:"确定要清空所有媒体链接吗?",icon:"warning",showCancelButton:!0,confirmButtonText:"确定",cancelButtonText:"取消",confirmButtonColor:"#3b82f6"}).then(e=>{e.isConfirmed&&h&&(h.clear(),X())})}function gt(){if(!document.body||w)return null;if(u)return u;const t=pt();if(!t)return null;const e=document.createElement("div");e.id="m3u8-capture-panel";const r=St(),o=r&&window.innerWidth>768?{left:`${Math.max(0,Math.min(r.x,window.innerWidth-450))}px`,top:`${Math.max(0,Math.min(r.y,window.innerHeight-350))}px`,right:"auto"}:{right:"20px",top:"20px"};e.className="fixed w-[420px] max-w-[90vw] max-h-[85vh] bg-white border-2 border-blue-500 rounded-xl shadow-2xl font-sans flex flex-col",e.style.cssText=`
28
28
  position: fixed;
29
29
  width: 420px;
30
30
  max-width: 90vw;
@@ -34,7 +34,7 @@
34
34
  ${o.left?`left: ${o.left};`:""}
35
35
  ${o.top?`top: ${o.top};`:""}
36
36
  ${`right: ${o.right};`}
37
- display: ${$?"flex":"none"};
37
+ display: ${A?"flex":"none"};
38
38
  `,e.innerHTML=`
39
39
  <div id="m3u8-capture-header" class="bg-gradient-to-br from-blue-500 to-blue-600 text-white px-4 py-3.5 rounded-t-lg flex justify-between items-center cursor-move select-none touch-none">
40
40
  <div class="font-semibold text-[15px] flex items-center gap-2">
@@ -56,39 +56,59 @@
56
56
  <div class="text-xs text-gray-300 mt-2">浏览网页时会自动抓取</div>
57
57
  </div>
58
58
  </div>
59
- `,t.appendChild(e),l=e;const i=e.querySelector("#m3u8-capture-header");if(!i)return l;const a=u=>{const f=u.target;if(f.tagName==="BUTTON"||f.closest("button"))return;B=!0;const T=O(u),_=e.getBoundingClientRect();P.x=T.x-_.left,P.y=T.y-_.top,e.style.cursor="move",u.preventDefault(),u.stopPropagation()};i.addEventListener("mousedown",a),i.addEventListener("touchstart",a,{passive:!1});const s=u=>{const f=O(u);if(B&&l){u.preventDefault();const T=f.x-P.x,_=f.y-P.y,X=window.innerWidth-e.offsetWidth,Y=window.innerHeight-e.offsetHeight,D=Math.max(0,Math.min(T,X)),G=Math.max(0,Math.min(_,Y));e.style.left=`${D}px`,e.style.top=`${G}px`,e.style.right="auto",xt({x:D,y:G})}if(M&&r){u.preventDefault();const T=f.x-R.x,_=f.y-R.y,X=window.innerWidth-r.offsetWidth,Y=window.innerHeight-r.offsetHeight,D=Math.max(0,Math.min(T,X)),G=Math.max(0,Math.min(_,Y));g.x=D,g.y=G,L||(L=requestAnimationFrame(()=>{r&&M&&(r.style.transform=`translate(${g.x}px, ${g.y}px)`,r.style.left="0",r.style.top="0",r.style.right="auto",r.style.bottom="auto"),L=null})),Math.sqrt((f.x-z.x)**2+(f.y-z.y)**2)>5&&(C=!0)}},d=u=>{B&&(B=!1,l&&(l.style.cursor="default"),u.preventDefault()),M&&(M=!1,L&&(cancelAnimationFrame(L),L=null),r&&(r.style.cursor="move",r.style.transition="",C&&(r.style.transform=`translate(${g.x}px, ${g.y}px)`,r.style.left="0",r.style.top="0",r.style.right="auto",r.style.bottom="auto")),C&&u.preventDefault())};document.addEventListener("mousemove",s),document.addEventListener("mouseup",d),document.addEventListener("touchmove",s,{passive:!1}),document.addEventListener("touchend",d,{passive:!1}),document.addEventListener("touchcancel",d,{passive:!1});const c=u=>f=>{f.preventDefault(),f.stopPropagation(),u()},v=e.querySelector("#m3u8-capture-toggle");v&&(v.addEventListener("click",c(()=>H())),v.addEventListener("touchend",c(()=>H()),{passive:!1}));const w=e.querySelector("#m3u8-capture-clear");w&&(w.addEventListener("click",c(()=>lt())),w.addEventListener("touchend",c(()=>lt()),{passive:!1}));const E=e.querySelector("#m3u8-capture-settings");return E&&(E.addEventListener("click",c(()=>dt())),E.addEventListener("touchend",c(()=>dt()),{passive:!1})),!$&&!r&&at(),l}function dt(){const t=window.Swal;if(!t)return;const e=tt(),n=U();t.fire({title:"设置",html:`
59
+ `,t.appendChild(e),u=e;const n=e.querySelector("#m3u8-capture-header");if(!n)return u;const i=d=>{const p=d.target;if(p.tagName==="BUTTON"||p.closest("button"))return;P=!0;const E=z(d),S=e.getBoundingClientRect();G.x=E.x-S.left,G.y=E.y-S.top,e.style.cursor="move",d.preventDefault(),d.stopPropagation()};n.addEventListener("mousedown",i),n.addEventListener("touchstart",i,{passive:!1});const c=d=>{const p=z(d);if(P&&u){d.preventDefault();const E=p.x-G.x,S=p.y-G.y,k=window.innerWidth-e.offsetWidth,I=window.innerHeight-e.offsetHeight,R=Math.max(0,Math.min(E,k)),_=Math.max(0,Math.min(S,I));e.style.left=`${R}px`,e.style.top=`${_}px`,e.style.right="auto",Ct({x:R,y:_})}if(L&&a){d.preventDefault();const E=p.x-V.x,S=p.y-V.y,k=window.innerWidth-a.offsetWidth,I=window.innerHeight-a.offsetHeight,R=Math.max(0,Math.min(E,k)),_=Math.max(0,Math.min(S,I));y.x=R,y.y=_,U||(U=requestAnimationFrame(()=>{a&&L&&(a.style.transform=`translate(${y.x}px, ${y.y}px)`,a.style.left="0",a.style.top="0",a.style.right="auto",a.style.bottom="auto"),U=null})),Math.sqrt((p.x-F.x)**2+(p.y-F.y)**2)>5&&(T=!0)}},l=d=>{P&&(P=!1,u&&(u.style.cursor="default"),d.preventDefault()),L&&(L=!1,U&&(cancelAnimationFrame(U),U=null),a&&(a.style.cursor="move",a.style.transition="",T&&(a.style.transform=`translate(${y.x}px, ${y.y}px)`,a.style.left="0",a.style.top="0",a.style.right="auto",a.style.bottom="auto")),T&&d.preventDefault())};document.addEventListener("mousemove",c),document.addEventListener("mouseup",l),document.addEventListener("touchmove",c,{passive:!1}),document.addEventListener("touchend",l,{passive:!1}),document.addEventListener("touchcancel",l,{passive:!1});const s=d=>p=>{p.preventDefault(),p.stopPropagation(),d()},m=e.querySelector("#m3u8-capture-toggle");m&&(m.addEventListener("click",s(()=>H())),m.addEventListener("touchend",s(()=>H()),{passive:!1}));const f=e.querySelector("#m3u8-capture-clear");f&&(f.addEventListener("click",s(()=>xt())),f.addEventListener("touchend",s(()=>xt()),{passive:!1}));const g=e.querySelector("#m3u8-capture-settings");return g&&(g.addEventListener("click",s(()=>wt())),g.addEventListener("touchend",s(()=>wt()),{passive:!1})),!A&&!a&&ft(),u}function wt(t=b){const e=window.Swal;if(!e)return;const r=rt(),o=B(),n=it(),i=st(),c=lt();e.fire({title:"设置",html:`
60
60
  <div class="text-left">
61
61
  <label class="block text-sm font-medium text-gray-700 mb-1">WebUI 地址</label>
62
- <input id="swal-webui-url" type="text" value="${V()}"
62
+ <input id="swal-webui-url" type="text" value="${D()}"
63
63
  class="w-full p-2.5 border border-gray-300 rounded-md mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500"
64
64
  placeholder="http://localhost:6600">
65
65
  <label class="block text-sm font-medium text-gray-700 mb-1">媒体扩展名(每行一个,用逗号或换行分隔)</label>
66
- <textarea id="swal-media-ext-list" rows="3"
66
+ <textarea id="swal-media-ext-list" rows="2"
67
67
  class="w-full p-2.5 border border-gray-300 rounded-md mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500"
68
- placeholder="例如:m3u8, mp4, mkv, avi, mov, wmv, flv, webm, m4v, ts, m3u, m4a, aac, flac, ape, mp3, wav, ogg, wma">${n.join(", ")}</textarea>
68
+ placeholder="例如:m3u8, mp4, mkv, avi, mov, wmv, flv, webm, m4v, ts, m3u, m4a, aac, flac, ape, mp3, wav, ogg, wma">${o.join(", ")}</textarea>
69
69
  <p class="text-xs text-gray-500 mb-4">支持的媒体文件扩展名,将用于识别和抓取媒体链接</p>
70
70
  <label class="block text-sm font-medium text-gray-700 mb-1">排除网址规则(每行一个,支持正则表达式,以 / 开头和结尾)</label>
71
- <textarea id="swal-exclude-urls" rows="6"
72
- class="w-full p-2.5 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
73
- placeholder="例如:&#10;localhost:6600&#10;/example.com/&#10;127.0.0.1">${e}</textarea>
74
- <p class="text-xs text-gray-500 mt-1">匹配的网址将不展示面板且不抓取媒体链接</p>
71
+ <textarea id="swal-exclude-urls" rows="2"
72
+ class="w-full p-2.5 border border-gray-300 rounded-md mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500"
73
+ placeholder="例如:&#10;localhost:6600&#10;/example.com/&#10;127.0.0.1">${r}</textarea>
74
+ <p class="text-xs text-gray-500 mb-4">匹配的网址将不展示面板且不抓取媒体链接</p>
75
+ <label class="block text-sm font-medium text-gray-700 mb-1">标题内容替换规则(支持正则,多个规则以逗号分割)</label>
76
+ <textarea id="swal-title-replace-rules" rows="2"
77
+ class="w-full p-2.5 border border-gray-300 rounded-md mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500"
78
+ placeholder="例如:/\\[.*?\\]//g, /第.*?话//g">${i}</textarea>
79
+ <p class="text-xs text-gray-500 mb-4">在获取标题后,将根据这些规则进行替换。支持正则表达式,格式:/pattern/flags 或 plain-text</p>
80
+ <div class="flex items-center mb-4">
81
+ <input id="swal-auto-start" type="checkbox" ${n?"checked":""}
82
+ class="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500">
83
+ <label for="swal-auto-start" class="ml-2 text-sm font-medium text-gray-700">自动开始下载</label>
84
+ </div>
85
+ <p class="text-xs text-gray-500 mb-4">启用后,跳转到下载页面时将自动触发开始下载(延迟1秒)</p>
86
+ <div class="flex items-center mb-4">
87
+ <input id="swal-auto-close-webui" type="checkbox" ${c?"checked":""}
88
+ class="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500">
89
+ <label for="swal-auto-close-webui" class="ml-2 text-sm font-medium text-gray-700">开始下载后自动关闭WebUI页面</label>
90
+ </div>
91
+ <p class="text-xs text-gray-500">仅当"自动开始下载"开启时有效,开始下载后将自动关闭打开的WebUI页面</p>
75
92
  </div>
76
- `,showCancelButton:!0,confirmButtonText:"保存",cancelButtonText:"取消",confirmButtonColor:"#3b82f6",width:"600px",preConfirm:()=>{const o=document.getElementById("swal-webui-url"),i=document.getElementById("swal-exclude-urls"),a=document.getElementById("swal-media-ext-list"),s=o?o.value.trim():"",d=i?i.value.trim():"",c=a?a.value.trim():"",v=window.Swal;if(!s)return v?.showValidationMessage("WebUI 地址不能为空"),!1;const w=c.split(/[,\n\s]+/).map(E=>E.trim()).filter(E=>E);return w.length===0?(v?.showValidationMessage("媒体扩展名列表不能为空"),!1):{url:s,excludeUrls:d,mediaExtList:w}}}).then(o=>{if(o.isConfirmed&&o.value){const i=o.value;GM_setValue(j,i.url),ft(i.excludeUrls);const a=pt(i.mediaExtList),s=window.Swal;a&&s?s.fire({icon:"success",title:"设置已保存",html:`已保存 ${a.length} 个媒体扩展名类型`,timer:2e3,showConfirmButton:!1}):s&&s.fire({icon:"error",title:"保存失败",text:"媒体扩展名列表格式错误",timer:2e3,showConfirmButton:!1})}})}function Ct(t){const e=window.top&&window.top!==window;try{const o=window.open(t,"_blank");if(o&&!o.closed)return!0}catch(o){console.log("[M3U8 Capture] window.open failed:",o)}if(e&&window.top){try{const o=window.top.open(t,"_blank");if(o&&!o.closed)return!0}catch(o){console.log("[M3U8 Capture] window.top.open failed:",o)}try{return window.top.location.href=t,!0}catch(o){console.log("[M3U8 Capture] window.top.location.href failed:",o)}}const n=()=>{const o=window.Swal;o&&o.fire({icon:"info",title:"链接已复制",html:`由于 iframe 限制,链接已复制到剪贴板<br><br><code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${t}</code><br><br>请手动打开`,timer:4e3,showConfirmButton:!0,confirmButtonText:"确定"})};return nt(t).then(()=>n()).catch(()=>{const o=window.Swal;o&&o.fire({icon:"warning",title:"无法复制链接",html:`由于 iframe 限制,请手动复制并打开:<br><br><code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${t}</code>`,confirmButtonText:"确定"})}),!1}function N(){if(m||!x||!ct())return;F();const t=l?.querySelector("#m3u8-capture-list"),e=l?.querySelector("#m3u8-capture-empty"),n=l?.querySelector("#m3u8-capture-count");if(!t||!e||!n)return;if(n.textContent=x.size.toString(),x.size===0){t.classList.add("hidden"),e.classList.remove("hidden");return}t.classList.remove("hidden"),e.classList.add("hidden"),t.innerHTML="",Array.from(x.values()).sort((i,a)=>a.timestamp-i.timestamp).forEach(i=>{const a=document.createElement("div");a.className="border border-gray-200 rounded-lg p-3 bg-white transition-all duration-200 shadow-sm hover:bg-gray-50 hover:shadow-md";const s=i.title||"",d=i.type.toUpperCase();let c="bg-gray-500";d==="M3U8"||d==="M3U"?c="bg-blue-500":["MP4","MKV","AVI","MOV","WMV","FLV","WEBM","M4V","TS"].includes(d)?c="bg-green-500":["MP3","M4A","AAC","FLAC","APE","WAV","OGG","WMA"].includes(d)&&(c="bg-purple-500"),a.innerHTML=`
93
+ `,showCancelButton:!0,confirmButtonText:"保存",cancelButtonText:"取消",confirmButtonColor:"#3b82f6",width:"600px",preConfirm:()=>{if(!t)return!1;const l=t.getElementById("swal-webui-url"),s=t.getElementById("swal-exclude-urls"),m=t.getElementById("swal-media-ext-list"),f=t.getElementById("swal-title-replace-rules"),g=t.getElementById("swal-auto-start"),d=t.getElementById("swal-auto-close-webui"),p=l?l.value.trim():"",E=s?s.value.trim():"",S=m?m.value.trim():"",k=f?f.value.trim():"",I=g?g.checked:!1,R=d?d.checked:!1,_=window.Swal;if(!p)return _.showValidationMessage("WebUI 地址不能为空"),!1;const N=S.split(/[,\n\s]+/).map(j=>j.trim()).filter(j=>j);return N.length===0?(_.showValidationMessage("媒体扩展名列表不能为空"),!1):{url:p,excludeUrls:E,mediaExtList:N,titleReplaceRules:k,autoStart:I,autoCloseWebui:R}}}).then(l=>{if(l.isConfirmed&&l.value){const s=l.value;GM_setValue(K,s.url),vt(s.excludeUrls),Mt(s.autoStart),Tt(s.autoCloseWebui),Lt(s.titleReplaceRules);const m=Et(s.mediaExtList),f=window.Swal;if(m&&f){let g=`已保存 ${m.length} 个媒体扩展名类型`;if(s.titleReplaceRules){const d=s.titleReplaceRules.split(",").filter(p=>p.trim()).length;g+=`<br>已设置 ${d} 个标题替换规则`}s.autoCloseWebui&&(g+="<br>已启用自动关闭WebUI页面"),f.fire({icon:"success",title:"设置已保存",html:g,timer:2500,showConfirmButton:!1})}else f&&f.fire({icon:"error",title:"保存失败",text:"媒体扩展名列表格式错误",timer:2e3,showConfirmButton:!1})}})}function ht(t){const e=window.top&&window.top!==window;try{const o=window.open(t,"_blank");if(o&&!o.closed)return!0}catch(o){console.log("[M3U8 Capture] window.open failed:",o)}if(e&&window.top){try{const o=window.top.open(t,"_blank");if(o&&!o.closed)return!0}catch(o){console.log("[M3U8 Capture] window.top.open failed:",o)}try{return window.top.location.href=t,!0}catch(o){console.log("[M3U8 Capture] window.top.location.href failed:",o)}}const r=()=>{const o=window.Swal;o&&o.fire({icon:"info",title:"链接已复制",html:`由于 iframe 限制,链接已复制到剪贴板<br><br><code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${t}</code><br><br>请手动打开`,timer:4e3,showConfirmButton:!0,confirmButtonText:"确定"})};return ct(t).then(()=>r()).catch(()=>{const o=window.Swal;o&&o.fire({icon:"warning",title:"无法复制链接",html:`由于 iframe 限制,请手动复制并打开:<br><br><code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${t}</code>`,confirmButtonText:"确定"})}),!1}function X(){if(w||!h||!gt())return;Y();const t=u?.querySelector("#m3u8-capture-list"),e=u?.querySelector("#m3u8-capture-empty"),r=u?.querySelector("#m3u8-capture-count");if(!t||!e||!r)return;if(r.textContent=h.size.toString(),h.size===0){t.classList.add("hidden"),e.classList.remove("hidden");return}t.classList.remove("hidden"),e.classList.add("hidden"),t.innerHTML="",Array.from(h.values()).sort((n,i)=>i.timestamp-n.timestamp).forEach(n=>{const i=document.createElement("div");i.className="border border-gray-200 rounded-lg p-3 bg-white transition-all duration-200 shadow-sm hover:bg-gray-50 hover:shadow-md";const c=n.title||"",l=n.type.toUpperCase();let s="bg-gray-500";l==="M3U8"||l==="M3U"?s="bg-blue-500":["MP4","MKV","AVI","MOV","WMV","FLV","WEBM","M4V","TS"].includes(l)?s="bg-green-500":["MP3","M4A","AAC","FLAC","APE","WAV","OGG","WMA"].includes(l)&&(s="bg-purple-500"),i.innerHTML=`
77
94
  <div class="flex justify-between items-start gap-2 mb-2">
78
95
  <div class="flex-1 min-w-0">
79
96
  <div class="flex items-center gap-1.5 mb-1.5">
80
- <span class="font-semibold text-[13px] text-gray-900 overflow-hidden text-ellipsis whitespace-nowrap" title="${s}">${s||"未命名媒体"}</span>
81
- <span class="${c} text-white px-2 py-0.5 rounded-xl text-[10px] font-bold">${d}</span>
97
+ <span class="font-semibold text-[13px] text-gray-900 overflow-hidden text-ellipsis whitespace-nowrap" title="${c}">${c||"未命名媒体"}</span>
98
+ <span class="${s} text-white px-2 py-0.5 rounded-xl text-[10px] font-bold">${l}</span>
82
99
  </div>
83
- <div class="text-[11px] text-gray-500 overflow-hidden text-ellipsis whitespace-nowrap leading-snug max-w-[320px]" title="${i.url}">${i.url}</div>
100
+ <div class="text-[11px] text-gray-500 overflow-hidden text-ellipsis whitespace-nowrap leading-snug max-w-[320px]" title="${n.url}">${n.url}</div>
84
101
  </div>
85
102
  </div>
86
103
  <div class="flex gap-2">
87
- <button class="m3u8-capture-download-btn flex-1 bg-blue-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs font-medium transition-all duration-200 hover:bg-blue-600 hover:-translate-y-0.5" data-url="${encodeURIComponent(i.url)}" data-title="${encodeURIComponent(s)}">
104
+ <button class="m3u8-capture-download-btn flex-1 bg-blue-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs font-medium transition-all duration-200 hover:bg-blue-600 hover:-translate-y-0.5" data-url="${encodeURIComponent(n.url)}" data-title="${encodeURIComponent(c)}">
88
105
  跳转下载
89
106
  </button>
90
- <button class="m3u8-capture-copy-btn bg-gray-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs transition-all duration-200 hover:bg-gray-600" data-url="${i.url}">
107
+ <button class="m3u8-capture-preview-btn bg-green-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs font-medium transition-all duration-200 hover:bg-green-600" data-url="${encodeURIComponent(n.url)}">
108
+ 预览
109
+ </button>
110
+ <button class="m3u8-capture-copy-btn bg-gray-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs transition-all duration-200 hover:bg-gray-600" data-url="${n.url}">
91
111
  复制
92
112
  </button>
93
113
  </div>
94
- `,t.appendChild(a)}),l?.querySelectorAll(".m3u8-capture-download-btn").forEach(i=>{i.addEventListener("click",a=>{a.stopPropagation();const s=decodeURIComponent(i.getAttribute("data-url")||""),d=decodeURIComponent(i.getAttribute("data-title")||""),c=`${V()}/page/download?from=capture&action=new&url=${encodeURIComponent(s+(d?`|${d}`:""))}`;Ct(c)})}),l?.querySelectorAll(".m3u8-capture-copy-btn").forEach(i=>{i.addEventListener("click",async a=>{a.stopPropagation();const s=i.getAttribute("data-url")||"",d=i.textContent,c=i.className;try{await nt(s),i.textContent="已复制",i.className="m3u8-capture-copy-btn bg-green-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs transition-all duration-200",setTimeout(()=>{i.textContent=d,i.className=c},2e3)}catch{const w=window.Swal;if(!w)return;w.fire({icon:"error",title:"复制失败",text:"请手动复制链接",html:`<code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${s}</code>`,confirmButtonText:"确定"})}})})}const I=new Map;Mt(I);function h(t,e=""){if(t=yt(t)||t,!t)return;if(m){try{const i={url:t,title:e||q(),type:it(t),pageUrl:window.location.href,timestamp:Date.now()};window.top?.postMessage({type:"m3u8-capture-link",data:i},"*")}catch(i){console.warn("[M3U8 Capture] Failed to send link to top window:",i)}return}const n=ht(t);I.get(n)?.title||(I.set(n,{url:t,title:e||q(),type:it(t),pageUrl:window.location.href,timestamp:Date.now()}),N())}function Lt(){if(k())return;m||window.addEventListener("message",n=>{if(n.data?.type==="m3u8-capture-link"&&n.data.data){const o=n.data.data;h(o.url,o.title)}}),bt(),vt();const t=()=>{if(!k()){if(m)return A();document.body&&(A(),I.size>0&&N())}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):setTimeout(t,100);let e=location.href;new MutationObserver(()=>{const n=location.href;if(n!==e){if(e=n,k()){H();return}setTimeout(()=>A(),1e3)}}).observe(document,{subtree:!0,childList:!0}),setInterval(()=>{document.body&&!k()&&A()},5e3)}Lt()})();
114
+ `,t.appendChild(i)}),u?.querySelectorAll(".m3u8-capture-download-btn").forEach(n=>{n.addEventListener("click",i=>{i.stopPropagation();const c=decodeURIComponent(n.getAttribute("data-url")||""),l=decodeURIComponent(n.getAttribute("data-title")||""),s=it()?"&autoStart=1":"",m=s&&lt()?"&autoClose=1":"",f=`${D()}/page/download?from=capture&action=new${s}${m}&url=${encodeURIComponent(c+(l?`|${l}`:""))}`;ht(f)})}),u?.querySelectorAll(".m3u8-capture-preview-btn").forEach(n=>{n.addEventListener("click",i=>{i.stopPropagation();const c=decodeURIComponent(n.getAttribute("data-url")||""),l=`https://m3u8-player.lzw.me?from=capture&url=${encodeURIComponent(c)}`;ht(l)})}),u?.querySelectorAll(".m3u8-capture-copy-btn").forEach(n=>{n.addEventListener("click",async i=>{i.stopPropagation();const c=n.getAttribute("data-url")||"",l=n.textContent,s=n.className;try{await ct(c),n.textContent="已复制",n.className="m3u8-capture-copy-btn bg-green-500 text-white border-none px-3.5 py-2 rounded-md cursor-pointer text-xs transition-all duration-200",setTimeout(()=>{n.textContent=l,n.className=s},2e3)}catch{const f=window.Swal;if(!f)return;f.fire({icon:"error",title:"复制失败",text:"请手动复制链接",html:`<code style="word-break: break-all; background: #f3f4f6; padding: 8px; border-radius: 4px; display: block; font-size: 12px;">${c}</code>`,confirmButtonText:"确定"})}})})}const O=new Map;Gt(O);function v(t,e=""){if(t=kt(t)||t,!t||$(t))return;const r=e||dt(),o={url:t,title:$t(r),type:At(t),pageUrl:window.location.href,timestamp:Date.now()};if(w){try{window.top?.postMessage({type:"m3u8-capture-link",data:o},"*")}catch(c){console.warn("[M3U8 Capture] Failed to send link to top window:",c)}return}const n=Rt(t);O.get(n)?.title||(O.set(n,o),X())}function Vt(){if($())return;w||window.addEventListener("message",r=>{if(r.data?.type==="m3u8-capture-link"&&r.data.data){const o=r.data.data;v(o.url,o.title)}}),It(),Bt();const t=()=>{if(!$()){if(w)return W();document.body&&(W(),O.size>0&&X())}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):setTimeout(t,100);let e=location.href;new MutationObserver(()=>{const r=location.href;if(r!==e){if(e=r,$()){H();return}setTimeout(()=>W(),1e3)}}).observe(document,{subtree:!0,childList:!0}),setInterval(()=>{document.body&&!$()&&W()},5e3)}Vt()})();
package/client/play.html CHANGED
@@ -44,8 +44,8 @@
44
44
  data: {
45
45
  playType: playUrl.includes('dplayer') ? 'dplayer' : 'artplayer',
46
46
  videoUrl: decodeURIComponent(playUrl),
47
- dpInstance: null,
48
- artInstance: null,
47
+ dpInc: null,
48
+ artInc: null,
49
49
  },
50
50
  play(videoUrl, playType) {
51
51
  if (videoUrl && videoUrl !== T.data.videoUrl) T.data.videoUrl = videoUrl;
@@ -81,9 +81,9 @@
81
81
  return new Promise(resolve => setTimeout(resolve, ms));
82
82
  },
83
83
  async dplayer(videoUrl) {
84
- if (T.data.dpInstance) {
85
- T.data.dpInstance.destroy();
86
- T.data.dpInstance = null;
84
+ if (T.data.dpInc) {
85
+ T.data.dpInc.destroy();
86
+ T.data.dpInc = null;
87
87
  await T.sleep(100);
88
88
  } else {
89
89
  await T.loadJS(CDN_CONFIG.dplayer);
@@ -116,28 +116,36 @@
116
116
  console.log('[dplayer]播放完毕', videoUrl);
117
117
  T.next_video();
118
118
  });
119
- T.data.dpInstance = dp;
119
+ T.data.dpInc = dp;
120
120
  return dp;
121
121
  },
122
122
  /** 使用 artplayer 播放 */
123
123
  async artplayer(videoUrl) {
124
- if (T.data.artInstance) {
125
- T.data.artInstance.destroy();
126
- T.data.artInstance = null;
127
- await T.sleep(100);
124
+ let art = T.data.artInc;
125
+
126
+ if (art) {
127
+ art.url = videoUrl;
128
+ art.playbackRate = +art.storage.get('playbackRate') || 1;
129
+ return art;
128
130
  } else {
129
131
  await T.loadJS(CDN_CONFIG.artplayer);
130
132
  }
131
133
 
132
- const art = new Artplayer({
134
+ Artplayer.PLAYBACK_RATE = [0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 8];
135
+ Artplayer.SEEK_STEP = 10;
136
+
137
+ // 从 videoUrl 提取文件类型
138
+ const type = ['.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm', '.m4v', '.m3u8', '.ogg', '.flv', '.webm'].find(d => videoUrl.includes(d)) || 'm3u8';
139
+
140
+ art = new Artplayer({
133
141
  container: document.getElementById('dplayer'),
134
142
  url: videoUrl, // 'https://playertest.longtailvideo.com/adaptive/elephants_dream_v4/index.m3u8',
135
- // airplay: true,
143
+ // airplay: true, // 是否显示AirPlay功能。效果并不好
136
144
  aspectRatio: true, // 是否显示视频长宽比功能
137
145
  autoplay: true,
138
146
  autoOrientation: true,
139
147
  // autoMini: true, // 当播放器滚动到浏览器视口以外时,自动进入 迷你播放 模式
140
- autoPlayback: true,
148
+ autoPlayback: true, // 是否使用自动 回放功能
141
149
  // autoSize: true, // 自动调整播放器尺寸
142
150
  fastForward: true,
143
151
  flip: true, // 是否显示视频翻转功能
@@ -150,7 +158,7 @@
150
158
  screenshot: true,
151
159
  setting: true,
152
160
  theme: '#39f',
153
- type: videoUrl.includes('mp4') ? 'mp4' : 'm3u8',
161
+ type,
154
162
  customType: {
155
163
  m3u8: function playM3u8(video, url, art) {
156
164
  if (Hls.isSupported()) {
@@ -200,8 +208,8 @@
200
208
  },
201
209
  }],
202
210
  contextmenu: [
203
- { html: '在线播放器', click: () => window.open('https://m3u8-player.lzw.me', '_blank') },
204
- { html: '在线下载器', click: () => window.open('https://m3u8-downloader.lzw.me', '_blank') },
211
+ // { index: 80, html: 'M3U8在线播放器', click: () => window.open(`https://m3u8-player.lzw.me`, '_blank') },
212
+ { index: 99, html: 'M3U8在线下载器', click: () => window.open(`https://m3u8-downloader.lzw.me`, '_blank') },
205
213
  ],
206
214
  });
207
215
 
@@ -209,8 +217,17 @@
209
217
  console.log('[artplayer]播放完毕', videoUrl);
210
218
  T.next_video();
211
219
  });
220
+ art.on('video:ratechange', () => {
221
+ // console.log('[artplayer]播放进度', art.playbackRate);
222
+ art.storage.set('playbackRate', art.playbackRate);
223
+ });
224
+ art.on('ready', () => {
225
+ art.playbackRate = +art.storage.get('playbackRate') || 1;
226
+ art.contextmenu.remove('version');
227
+ });
228
+
212
229
  // console.log('[artplayer]播放器初始化完成', art);
213
- T.data.artInstance = art;
230
+ T.data.artInc = art;
214
231
  return art;
215
232
  },
216
233
  previous_video() {
@@ -231,9 +248,9 @@
231
248
  // 监听来自父窗口的消息
232
249
  window.addEventListener('message', (event) => {
233
250
  const data = event.data;
234
- if (!data) return;
251
+ if (!data || typeof data !== 'object') return;
235
252
 
236
- if (typeof data === 'object' && data.url) {
253
+ if (data.url) {
237
254
  T.data.videoUrl = data.url;
238
255
  if (data.playType) T.data.playType = data.playType;
239
256
  T.play();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lzwme/m3u8-dl",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "A free, open-source, and powerful m3u8 video batch downloader with multi-threaded downloading, play-while-downloading, WebUI management, video parsing, and more.",
5
5
  "main": "cjs/index.js",
6
6
  "types": "cjs/index.d.ts",
@@ -26,17 +26,20 @@
26
26
  "lint:all": "biome lint && pnpm -F @lzwme/m3u8-capture lint && pnpm -F @lzwme/m3u8-dl-frontend lint",
27
27
  "format": "biome format --write",
28
28
  "fix": "biome check --fix",
29
+ "fix:all": "biome check --fix && pnpm -F @lzwme/m3u8-capture fix && pnpm -F @lzwme/m3u8-dl-frontend fix && pnpm -F @lzwme/m3u8-dl-portal fix",
29
30
  "build": "npm run clean && npm run build:cjs && npm run build:frontend && npm run build:capture",
30
31
  "build:cjs": "tsc -p tsconfig.cjs.json",
31
32
  "build:frontend": "pnpm -F @lzwme/m3u8-dl-frontend build",
32
33
  "build:capture": "pnpm -F @lzwme/m3u8-capture build",
33
34
  "download-cdn": "node scripts/download-cdn-resources.js",
34
- "doc": "typedoc src/ --exclude **/*.spec.ts --out docs --tsconfig tsconfig.module.json",
35
+ "doc": "pnpm doc:api && pnpm doc:portal",
36
+ "doc:api": "typedoc src --tsconfig tsconfig.module.json",
37
+ "doc:portal": "pnpm -F @lzwme/m3u8-dl-portal build",
35
38
  "version": "standard-version",
36
39
  "dist": "npm run build",
37
40
  "release": "npm run dist && npm run version",
38
41
  "clean": "flh rm -f ./cjs ./esm ./docs ./client/assets",
39
- "test": "npm run lint"
42
+ "test": "npm run lint:all"
40
43
  },
41
44
  "bin": {
42
45
  "m3u8dl": "bin/m3u8dl.js"
@@ -61,7 +64,7 @@
61
64
  "@lzwme/fed-lint-helper": "^2.6.6",
62
65
  "@types/express": "^5.0.5",
63
66
  "@types/m3u8-parser": "^7.2.5",
64
- "@types/node": "^24.10.0",
67
+ "@types/node": "^24.10.1",
65
68
  "@types/ws": "^8.18.1",
66
69
  "@typescript-eslint/eslint-plugin": "^8.46.4",
67
70
  "@typescript-eslint/parser": "^8.46.4",
@@ -74,6 +77,7 @@
74
77
  "nodemon": "^3.1.11",
75
78
  "prettier": "^3.6.2",
76
79
  "standard-version": "^9.5.0",
80
+ "typedoc": "^0.28.14",
77
81
  "typescript": "^5.9.3",
78
82
  "typescript-eslint": "^8.46.4",
79
83
  "ws": "^8.18.3"
@@ -1 +0,0 @@
1
- .app-layout[data-v-c730956f]{position:relative;min-height:100vh}.main-content[data-v-c730956f]{transition:margin-left .3s ease,width .3s ease;margin-left:16rem;width:calc(100% - 16rem);padding:.25rem}.main-content.sidebar-collapsed[data-v-c730956f]{margin-left:0;width:100%}.nav-item[data-v-c730956f]{text-align:left}@media(max-width:768px){.main-content[data-v-c730956f]{margin-left:0!important;width:100%!important;padding:.25rem}}@media(min-width:769px)and (max-width:1024px){.main-content[data-v-c730956f]{margin-left:12rem;width:calc(100% - 12rem)}.sidebar[data-v-c730956f]{width:12rem}}.fixed.inset-0[data-v-ffb38195]{position:fixed;inset:0}.fade-enter-active[data-v-ffb38195],.fade-leave-active[data-v-ffb38195]{transition:opacity .3s ease}.fade-enter-from[data-v-ffb38195],.fade-leave-to[data-v-ffb38195]{opacity:0}.slide-enter-active[data-v-ffb38195],.slide-leave-active[data-v-ffb38195]{transition:transform .3s ease,opacity .3s ease,width .3s ease,margin-right .3s ease}.slide-enter-from[data-v-ffb38195],.slide-leave-to[data-v-ffb38195]{opacity:0}@media(min-width:768px){.slide-enter-active.playlist-sidebar[data-v-ffb38195],.slide-leave-active.playlist-sidebar[data-v-ffb38195]{overflow:hidden}.slide-enter-from.playlist-sidebar[data-v-ffb38195],.slide-leave-to.playlist-sidebar[data-v-ffb38195]{width:0!important;min-width:0!important;margin-right:0;opacity:0;border-left:none}}@media(max-width:767px){.playlist-sidebar[data-v-ffb38195]{position:fixed;top:0;right:0;bottom:0;z-index:50;border-left:none;width:85vw;max-width:320px;box-shadow:-4px 0 24px #00000080;transform:translate(0)}.slide-enter-from[data-v-ffb38195],.slide-leave-to[data-v-ffb38195]{transform:translate(100%);opacity:0}}input[type=checkbox][data-v-51fd32c8]{min-width:20px}.web-browser-container[data-v-64486f5d]{box-shadow:0 1px 3px #0000001a}.m3u8-list-container[data-v-64486f5d]{max-height:calc(100vh - 280px)}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-300:oklch(87.1% .15 154.449);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-lg:.5rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-3{top:calc(var(--spacing)*3)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.z-\[9999\]{z-index:9999}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing)*2)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-full{height:100%}.max-h-\[98vh\]{max-height:98vh}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-80{width:calc(var(--spacing)*80)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[calc\(100vw-100px\)\]{max-width:calc(100vw - 100px)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-blue-200{border-color:var(--color-blue-200)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-700{border-color:var(--color-gray-700)}.border-red-200{border-color:var(--color-red-200)}.border-t-blue-500{border-top-color:var(--color-blue-500)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-4{padding-right:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-blue-300{color:var(--color-blue-300)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-300{color:var(--color-green-300)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-red-300{color:var(--color-red-300)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-green-50:hover{background-color:var(--color-green-50)}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-yellow-50:hover{background-color:var(--color-yellow-50)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-green-600:hover{color:var(--color-green-600)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-yellow-600:hover{color:var(--color-yellow-600)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:gap-2{gap:calc(var(--spacing)*2)}:where(.md\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.md\:p-2{padding:calc(var(--spacing)*2)}.md\:p-4{padding:calc(var(--spacing)*4)}.md\:px-3{padding-inline:calc(var(--spacing)*3)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}}:root{--color-primary:#3b82f6;--color-primary-hover:#2563eb;--color-success:#10b981;--color-warning:#f59e0b;--color-danger:#ef4444;--color-info:#3b82f6;--color-border:#e5e7eb;--spacing-xs:.25rem;--spacing-sm:.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem}*,:after,:before{border-color:var(--color-border);box-sizing:border-box;border-style:solid}::-moz-placeholder{font-size:14px}::placeholder{font-size:14px}button{cursor:pointer}#app{background-color:#f5f5f5;max-width:1920px;min-height:100vh;margin:auto;position:relative}.sidebar{z-index:1;background-color:#fff;width:16rem;transition:all .3s;position:absolute;top:0;bottom:0;left:0;box-shadow:2px 0 5px #0000001a}.download-item{transition:all .3s}.download-item:hover{background-color:#f8f9fa}.progress-bar{height:4px;transition:width .3s}.nav-item{transition:all .3s}.nav-item:hover{background-color:#f0f0f0;transform:translate(4px)}.nav-item.active{color:#1890ff;background-color:#e6f3ff}@media(max-width:768px){.sidebar{transform:translate(-100%)}.sidebar.show{transform:translate(0)}.menu-toggle{display:block!important}}@media(min-width:769px)and (max-width:1024px){.sidebar{width:12rem}}.menu-toggle{z-index:51;cursor:pointer;background:#fff;border-radius:.5rem;width:42px;height:42px;padding:.5rem;display:none;position:fixed;top:1rem;left:1rem;box-shadow:0 2px 4px #0000001a}.main-content{width:calc(100% - 16rem);margin-left:16rem;transition:margin-left .3s}.custom-toast{color:#333;z-index:99999;background:#fff;border-radius:4px;align-items:center;min-width:250px;max-width:400px;padding:15px 25px 15px 15px;transition:transform .3s;display:flex;position:fixed;top:20px;right:20px;transform:translate(150%);box-shadow:0 4px 12px #00000026}.custom-toast.show{transform:translate(0)}.custom-toast.hide{transform:translate(150%)}.custom-toast-success{border-left:4px solid #28a745}.custom-toast-error{border-left:4px solid #dc3545}.custom-toast-warning{border-left:4px solid #ffc107}.custom-toast-info{border-left:4px solid #17a2b8}.modal-overlay{background-color:#00000080;font-size:14px}.modal-overlay textarea,.modal-overlay input{padding-top:.25rem;padding-bottom:.25rem;font-size:16px}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}