Greasy Fork

Greasy Fork is available in English.

阿里云盘批量重命名

批量重命名阿里云盘里的文件

当前为 2023-11-16 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         阿里云盘批量重命名
// @namespace    vite-plugin-monkey
// @version      0.1.2
// @author       a1mersnow
// @description  批量重命名阿里云盘里的文件
// @license      GPL
// @icon         data:image/png;base64,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/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAAsTAAALEwEAmpwYAAASvUlEQVRoga2be4wkxXnAf9WP6ce8d4978MYHDiaO4zkShOwkh4Ox/IjssxIDhxIlkeFMrMhRJDhiORLiD8t3xFJiZOVhzsGyIw4cSE6xElnigjF2FAdkFuKE12F8L253z3s7+5id6Znp6cofVf2c2b09lJLupru6un71ffXVV1Vf9QrJ+umOGotMPQywn7igAbCEUHcChPqBNoAhAZrwEhc/ukHdYiL4jnDng8nNfvUzGYyI2RqsnrOwhQUhEbDzn09uEnx380Hu+XJ6PwnM0jhYcVmrKnL8GKDzzBjFGsM+DPDlsYL5tJQ0vPhkbVLxlV3LPy1kGQWs+fB5kCo18rc5ta2uro6Vv7i+66aNwJ/fHDaVWGR+mhl2rGnVpDOcgZXL1wXfbT7I/3dSHX8xALuy6Az41k2Ja4zlSJBqDKUyHwegAywuLsIZnb1zUj13P7kZLlH2JjWt4uDodDqdDh0AFl0AtiwwTMkJ+O7Ndi+QGJeSVGaoBaPu5O62ZMgxeHN6TtLSWM5kDziMyy8tscACKVmP403oebmufiPVWKn0LBNtn4KKvgyK77rAkkUIDC9XjkxLfEHyqm7WPq+tHdZpuCzllAEYDGS2G7Ayulfgz18IV6dx3Z4q9qkqJ6Wci286lU5nKgXfvanxu7w8VmV6fRqg00EGQRAEUKZcHqSPt2kuHeCmBHxhhpVFQ6rsfCqnufNsOw3D2ND47xh898a1T1JHI3eXIzv6t5k40W2cZtsQhkP92k4NPo/A+wv3K10xa/SdwWDg9JvdK60pWAS/wKUNbdU7P+VS1RUMyxCohgq5CdexH2AJ6tBdNYxfm78i0cL+k1vf6CyPVny6cVZfCqBT6bBw5XGVtVpd7esWnQOX9zyDlZtVzpPW1hrXNx+Y+Xomay/Quv/0zLZTAAQu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
// @source       https://github.com/a1mersnow/aliyundrive-rename
// @match        https://www.aliyundrive.com/drive/file/backup/*
// @match        https://www.aliyundrive.com/drive/resource/backup/*
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js
// @grant        none
// ==/UserScript==

(t=>{if(typeof GM_addStyle=="function"){GM_addStyle(t);return}const o=document.createElement("style");o.textContent=t,document.head.append(o)})(` .clip-enter-from,.clip-leave-to{clip-path:inset(0 100% 100% 0)}.clip-enter-to,.clip-leave-from{clip-path:inset(0 0 0 0)}.clip-enter-active,.clip-leave-active{transition:clip-path .3s ease}.fade-enter-from,.fade-leave-to{opacity:0;transform:translate(10%)}.fade-enter-to,.fade-leave-from{opacity:1;transform:none}.fade-enter-active,.fade-leave-active{transition:opacity .3s,transform .3s ease}.custom-scrollbar[data-v-e4941344]::-webkit-scrollbar{width:6px}.custom-scrollbar[data-v-e4941344]::-webkit-scrollbar-track{--un-bg-opacity:1;background-color:rgba(243,232,255,var(--un-bg-opacity))}.custom-scrollbar[data-v-e4941344]::-webkit-scrollbar-thumb{border-radius:9999px;--un-bg-opacity:1;background-color:rgba(192,132,252,var(--un-bg-opacity));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.custom-scrollbar[data-v-e4941344]::-webkit-scrollbar-thumb:hover{--un-bg-opacity:1;background-color:rgba(147,51,234,var(--un-bg-opacity))}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color, #e5e7eb)}html{line-height:1.5;-webkit-text-size-adjust:100%;text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgba(0,0,0,0);--un-ring-shadow:0 0 rgba(0,0,0,0);--un-shadow-inset: ;--un-shadow:0 0 rgba(0,0,0,0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgba(0,0,0,0);--un-ring-shadow:0 0 rgba(0,0,0,0);--un-shadow-inset: ;--un-shadow:0 0 rgba(0,0,0,0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }@font-face{font-family:DM Mono;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmmono/v14/aFTU7PB1QTsUX8KYthSQBLyM.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Mono;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmmono/v14/aFTU7PB1QTsUX8KYthqQBA.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxRR232VGM.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxRSW32.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:"DM Serif Display";font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmserifdisplay/v15/-nFnOHM81r4j6k0gjAW3mujVU2B2G_5x0ujy.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:"DM Serif Display";font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/dmserifdisplay/v15/-nFnOHM81r4j6k0gjAW3mujVU2B2G_Bx0g.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.i-carbon\\:arrow-right{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m18 6l-1.43 1.393L24.15 15H4v2h20.15l-7.58 7.573L18 26l10-10L18 6z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:arrows-horizontal{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M11.41 26.59L7.83 23H28v-2H7.83l3.58-3.59L10 16l-6 6l6 6l1.41-1.41zM28 10l-6-6l-1.41 1.41L24.17 9H4v2h20.17l-3.58 3.59L22 16l6-6z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:batch-job{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M32 26v-2h-2.101a4.968 4.968 0 0 0-.732-1.753l1.49-1.49l-1.414-1.414l-1.49 1.49A4.964 4.964 0 0 0 26 20.101V18h-2v2.101a4.968 4.968 0 0 0-1.753.732l-1.49-1.49l-1.414 1.414l1.49 1.49A4.964 4.964 0 0 0 20.101 24H18v2h2.101a4.97 4.97 0 0 0 .732 1.753l-1.49 1.49l1.414 1.414l1.49-1.49a4.964 4.964 0 0 0 1.753.732V32h2v-2.101a4.968 4.968 0 0 0 1.753-.732l1.49 1.49l1.414-1.414l-1.49-1.49A4.964 4.964 0 0 0 29.899 26H32zm-7 2c-1.654 0-3-1.346-3-3s1.346-3 3-3s3 1.346 3 3s-1.346 3-3 3zm-5-11h-8a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2zm-8-2h8V4h-8v11z'/%3E%3Cpath fill='currentColor' d='M17 21H8a2 2 0 0 1-2-2V7h2v12h9v2Z'/%3E%3Cpath fill='currentColor' d='M13 25H4c-1.103 0-2-.897-2-2V11h2v12h9v2Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:checkbox{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2ZM6 26V6h20v20Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:checkbox-checked-filled{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2ZM14 21.5l-5-4.957L10.59 15L14 18.346L21.409 11L23 12.577Z'/%3E%3Cpath fill='none' d='m14 21.5l-5-4.957L10.59 15L14 18.346L21.409 11L23 12.577Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:contour-finding{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cdefs/%3E%3Cpath d='M7.7 4.7a14.703 14.703 0 0 0-3 3.1L6.3 9a13.263 13.263 0 0 1 2.6-2.7z' fill='currentColor'/%3E%3Cpath d='M4.6 12.3l-1.9-.6A12.511 12.511 0 0 0 2 16h2a11.476 11.476 0 0 1 .6-3.7z' fill='currentColor'/%3E%3Cpath d='M2.7 20.4a14.403 14.403 0 0 0 2 3.9l1.6-1.2a12.887 12.887 0 0 1-1.7-3.3z' fill='currentColor'/%3E%3Cpath d='M7.8 27.3a14.403 14.403 0 0 0 3.9 2l.6-1.9A12.887 12.887 0 0 1 9 25.7z' fill='currentColor'/%3E%3Cpath d='M11.7 2.7l.6 1.9A11.476 11.476 0 0 1 16 4V2a12.511 12.511 0 0 0-4.3.7z' fill='currentColor'/%3E%3Cpath d='M24.2 27.3a15.18 15.18 0 0 0 3.1-3.1L25.7 23a11.526 11.526 0 0 1-2.7 2.7z' fill='currentColor'/%3E%3Cpath d='M27.4 19.7l1.9.6A15.475 15.475 0 0 0 30 16h-2a11.476 11.476 0 0 1-.6 3.7z' fill='currentColor'/%3E%3Cpath d='M29.2 11.6a14.403 14.403 0 0 0-2-3.9l-1.6 1.2a12.887 12.887 0 0 1 1.7 3.3z' fill='currentColor'/%3E%3Cpath d='M24.1 4.6a14.403 14.403 0 0 0-3.9-2l-.6 1.9a12.887 12.887 0 0 1 3.3 1.7z' fill='currentColor'/%3E%3Cpath d='M20.3 29.3l-.6-1.9a11.476 11.476 0 0 1-3.7.6v2a21.42 21.42 0 0 0 4.3-.7z' fill='currentColor'/%3E%3Cpath d='M16 26a10 10 0 1 1 10-10a10.011 10.011 0 0 1-10 10zm0-18a8 8 0 1 0 8 8a8.01 8.01 0 0 0-8-8z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-carbon\\:pointer-text{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath d='M13.71 12.29L7.41 6H13V4H4v9h2V7.41l6.29 6.3l1.42-1.42z' fill='currentColor'/%3E%3Cpath d='M28 30H12a2 2 0 0 1-2-2V18h2v10h16V12H18v-2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2z' fill='currentColor'/%3E%3Cpath d='M22 15h-5v2h5v2h-4a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h6v-8a2 2 0 0 0-2-2zm0 8h-4v-2h4z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.i-ion\\:dice{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M440.88 129.37L288.16 40.62a64.14 64.14 0 0 0-64.33 0L71.12 129.37a4 4 0 0 0 0 6.9L254 243.85a4 4 0 0 0 4.06 0L440.9 136.27a4 4 0 0 0-.02-6.9ZM256 152c-13.25 0-24-7.16-24-16s10.75-16 24-16s24 7.16 24 16s-10.75 16-24 16Zm-18 118.81L54 163.48a4 4 0 0 0-6 3.46v173.92a48 48 0 0 0 23.84 41.39L234 479.48a4 4 0 0 0 6-3.46V274.27a4 4 0 0 0-2-3.46ZM96 368c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Zm96-32c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Zm266-172.49L274 271.56a4 4 0 0 0-2 3.45V476a4 4 0 0 0 6 3.46l162.15-97.23A48 48 0 0 0 464 340.86V167a4 4 0 0 0-6-3.49ZM320 424c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Zm0-88c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Zm96 32c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Zm0-88c-8.84 0-16-10.75-16-24s7.16-24 16-24s16 10.75 16 24s-7.16 24-16 24Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:1.2em;height:1.2em}.btn{display:inline-block;border-width:1px;border-color:currentColor;border-radius:.25rem;padding:.25rem;--un-text-opacity:1;color:rgba(147,51,234,var(--un-text-opacity));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn:hover{--un-bg-opacity:1;background-color:rgba(147,51,234,var(--un-bg-opacity));--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}.btn:disabled{opacity:.5}.\\[vertical-align\\:-0\\.2em\\]{vertical-align:-.2em}.absolute{position:absolute}.fixed{position:fixed}.bottom-2{bottom:.5rem}.right-0{right:0}.top-2{top:.5rem}.z-9999{z-index:9999}.grid{display:grid}.grid-cols-\\[20px_auto_30px_minmax\\(200px\\,1fr\\)\\]{grid-template-columns:20px auto 30px minmax(200px,1fr)}.m\\[1\\]{margin:1}.mb-1{margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.ml-4{margin-left:1rem}.mt-2{margin-top:.5rem}.block{display:block}.inline-block{display:inline-block}.contents{display:contents}.h-8{height:2rem}.min-h-40px{min-height:40px}.min-h-61px{min-height:61px}.w-\\[max\\(500px\\,50vw\\)\\]{width:max(500px,50vw)}.w-300px{width:300px}.w-60px{width:60px}.w-fit{width:fit-content}.w-full{width:100%}.flex{display:flex}.flex-col{flex-direction:column}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.items-center{align-items:center}.justify-center{justify-content:center}.justify-self-center{justify-self:center}.gap-x-1{column-gap:.25rem}.gap-x-1px{column-gap:1px}.gap-x-2{column-gap:.5rem}.gap-x-3{column-gap:.75rem}.gap-x-4{column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-3{row-gap:.75rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre{white-space:pre}.b,[b=""]{border-width:1px}.border-y-3px{border-top-width:3px;border-bottom-width:3px}.border-l-3px{border-left-width:3px}.border-purple-600{--un-border-opacity:1;border-color:rgba(147,51,234,var(--un-border-opacity))}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.border-solid{border-style:solid}.bg-purple,.bg-purple-400{--un-bg-opacity:1;background-color:rgba(192,132,252,var(--un-bg-opacity))}.bg-purple-100{--un-bg-opacity:1;background-color:rgba(243,232,255,var(--un-bg-opacity))}.bg-purple-600{--un-bg-opacity:1;background-color:rgba(147,51,234,var(--un-bg-opacity))}.bg-white{--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity))}.hover\\:bg-purple-600:hover{--un-bg-opacity:1;background-color:rgba(147,51,234,var(--un-bg-opacity))}.p-3{padding:.75rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2px{padding-left:2px;padding-right:2px}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6px{padding-top:6px;padding-bottom:6px}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.text-center{text-align:center}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-mono{font-family:DM Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\\#1e754f{--un-text-opacity:1;color:rgba(30,117,79,var(--un-text-opacity))}.text-\\#2993a3{--un-text-opacity:1;color:rgba(41,147,163,var(--un-text-opacity))}.text-\\#59873a{--un-text-opacity:1;color:rgba(89,135,58,var(--un-text-opacity))}.text-\\#999{--un-text-opacity:1;color:rgba(153,153,153,var(--un-text-opacity))}.text-\\#ab5959{--un-text-opacity:1;color:rgba(171,89,89,var(--un-text-opacity))}.text-\\#b07d48{--un-text-opacity:1;color:rgba(176,125,72,var(--un-text-opacity))}.text-gray{--un-text-opacity:1;color:rgba(156,163,175,var(--un-text-opacity))}.text-gray-600{--un-text-opacity:1;color:rgba(75,85,99,var(--un-text-opacity))}.text-green-500{--un-text-opacity:1;color:rgba(34,197,94,var(--un-text-opacity))}.text-green-700{--un-text-opacity:1;color:rgba(21,128,61,var(--un-text-opacity))}.text-purple{--un-text-opacity:1;color:rgba(192,132,252,var(--un-text-opacity))}.text-purple-600{--un-text-opacity:1;color:rgba(147,51,234,var(--un-text-opacity))}.text-purple-700{--un-text-opacity:1;color:rgba(126,34,206,var(--un-text-opacity))}.text-red{--un-text-opacity:1;color:rgba(248,113,113,var(--un-text-opacity))}.text-white,.hover\\:text-white:hover{--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color, rgba(0,0,0,.1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color, rgba(0,0,0,.1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease{transition-timing-function:cubic-bezier(.4,0,.2,1)} `);

(function (vue) {
  'use strict';

  const _hoisted_1$1 = { class: "contents" };
  const _hoisted_2$1 = ["title"];
  const _hoisted_3$1 = {
    key: 0,
    class: "i-carbon:arrow-right justify-self-center text-purple-600"
  };
  const _hoisted_4$1 = {
    key: 1,
    class: "i-carbon:arrows-horizontal justify-self-center text-green-500"
  };
  const _hoisted_5$1 = ["title"];
  const _hoisted_6$1 = { key: 0 };
  const _hoisted_7$1 = { key: 1 };
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
    __name: "PreviewEntry",
    props: vue.mergeModels({
      oldName: {},
      id: {},
      newName: {},
      done: { type: Boolean },
      error: { type: Boolean },
      showPick: { type: Boolean, default: false }
    }, {
      "modelValue": { type: Boolean }
    }),
    emits: vue.mergeModels(["pick"], ["update:modelValue"]),
    setup(__props, { emit: __emit }) {
      const emit = __emit;
      const isSame = vue.toRef(() => __props.oldName === __props.newName);
      const disabled = vue.toRef(() => isSame.value || !__props.newName);
      const checked = vue.useModel(__props, "modelValue");
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("li", _hoisted_1$1, [
          vue.createElementVNode("span", {
            class: vue.normalizeClass([[
              checked.value && _ctx.newName && !vue.unref(isSame) ? "i-carbon:checkbox-checked-filled" : "i-carbon:checkbox",
              vue.unref(disabled) ? "opacity-50 cursor-not-allowed" : "cursor-pointer"
            ], "text-sm text-purple-600"]),
            onClick: _cache[0] || (_cache[0] = ($event) => checked.value = !checked.value)
          }, null, 2),
          vue.createElementVNode("span", {
            title: _ctx.oldName,
            class: "truncate whitespace-pre"
          }, [
            vue.createElementVNode("span", {
              class: vue.normalizeClass(vue.unref(disabled) ? "opacity-50" : "")
            }, vue.toDisplayString(_ctx.oldName), 3),
            _ctx.showPick ? (vue.openBlock(), vue.createElementBlock("i", {
              key: 0,
              class: "i-carbon:pointer-text [vertical-align:-0.2em] inline-block cursor-pointer text-xs text-green-700",
              title: "填充到剧名",
              onClick: _cache[1] || (_cache[1] = ($event) => emit("pick", _ctx.id))
            })) : vue.createCommentVNode("", true)
          ], 8, _hoisted_2$1),
          !vue.unref(isSame) ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$1)) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$1)),
          vue.createElementVNode("span", {
            class: vue.normalizeClass([vue.unref(disabled) ? "opacity-50" : "", "truncate whitespace-pre"]),
            title: _ctx.newName
          }, [
            vue.createTextVNode(vue.toDisplayString(_ctx.newName) + " ", 1),
            _ctx.error ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_6$1, "❌")) : _ctx.done ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_7$1, "✅")) : vue.createCommentVNode("", true)
          ], 10, _hoisted_5$1)
        ]);
      };
    }
  });
  const listJsonMask = "ext_marker,items(name,file_id,drive_id,type,size,created_at,updated_at,category,file_extension,parent_file_id,mime_type,starred,thumbnail,url,streams_info,content_hash,user_tags,user_meta,trashed,video_media_metadata,video_preview_metadata,sync_meta,sync_device_flag,sync_flag,punish_flag)";
  const API_DELAY = 150;
  function getToken() {
    const raw = window.localStorage.getItem("token");
    if (!raw)
      throw new Error("no token found");
    return JSON.parse(raw).access_token;
  }
  async function getDriveId() {
    const res = await post("https://user.aliyundrive.com/v2/user/get", {});
    return location.pathname.startsWith("/drive/file/resource") ? res.resource_drive_id : res.backup_drive_id;
  }
  async function getFileListOfCurrentDir(parentId = getParentId()) {
    const listApi = new URL("https://api.aliyundrive.com/adrive/v3/file/list");
    listApi.searchParams.append("jsonmask", listJsonMask);
    const driveId = await getDriveId();
    const res = await post(listApi, {
      all: true,
      drive_id: driveId,
      fields: "*",
      order_by: "name",
      order_direction: "ASC",
      parent_file_id: parentId,
      url_expire_sec: 14400
    });
    return res.items;
  }
  async function rename(driveId, fileId, newName) {
    return post("https://api.aliyundrive.com/v3/file/update", {
      check_name_mode: "refuse",
      drive_id: driveId,
      file_id: fileId,
      name: newName
    });
  }
  function getParentId() {
    const p = location.pathname;
    const i = p.lastIndexOf("/");
    const lastSegment = p.slice(i + 1);
    return /[a-z0-9]{32,}/.test(lastSegment) ? lastSegment : "root";
  }
  function post(api, payload) {
    return fetch(api, {
      method: "POST",
      headers: {
        "Content-Type": "Application/json",
        "Authorization": `Bearer ${getToken()}`
        // 'X-Device-Id': document.cookie.match(/cna=(.+?);/)?.[1] || '',
      },
      body: JSON.stringify(payload)
    }).then((res) => {
      if (res.ok)
        return res.json();
      else
        return Promise.reject(new Error("network error"));
    });
  }
  async function renameOne(resource, newName) {
    await rename(resource.drive_id, resource.file_id, newName);
  }
  function getNewNameByExp(oldName, from, to) {
    try {
      return oldName.replace(new RegExp(from), to);
    } catch {
      return "";
    }
  }
  const SeasonEpisodeExtract = new RegExp("S(?:eason)?[._\\- ]?([0-9]{1,3})(?![0-9])(?:[._\\- ]?E|[._\\- ])([0-9]{1,3})(?![0-9])|E([0-9]{1,3})(?![0-9])|EP([0-9]{1,3})(?![0-9])|(?<![0-9])([0-9]{1,3})(?![0-9])", "i");
  function getNewNameByExtract(oldName, prefix, season) {
    const [_, _s, epm1, epm2, epm3, epm4] = oldName.match(SeasonEpisodeExtract) || [];
    let episode = epm1 || epm2 || epm3 || epm4;
    season = String(+season).padStart(2, "0");
    episode = String(+episode).padStart(3, "0");
    if (!episode || !season)
      return "";
    const m = oldName.match(/(\.[a-z0-9]+)$/i);
    return `${prefix} S${season}E${episode}${m ? m[1] : ""}`;
  }
  function getSeason(oldName) {
    const [_, s] = oldName.match(SeasonEpisodeExtract) || [];
    return s;
  }
  function tryOnScopeDispose(fn) {
    if (vue.getCurrentScope()) {
      vue.onScopeDispose(fn);
      return true;
    }
    return false;
  }
  function toValue(r) {
    return typeof r === "function" ? r() : vue.unref(r);
  }
  const isClient = typeof window !== "undefined" && typeof document !== "undefined";
  typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
  const toString = Object.prototype.toString;
  const isObject = (val) => toString.call(val) === "[object Object]";
  const noop = () => {
  };
  const isIOS = /* @__PURE__ */ getIsIOS();
  function getIsIOS() {
    var _a;
    return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && /* @__PURE__ */ /iP(ad|hone|od)/.test(window.navigator.userAgent);
  }
  function promiseTimeout(ms, throwOnTimeout = false, reason = "Timeout") {
    return new Promise((resolve, reject) => {
      if (throwOnTimeout)
        setTimeout(() => reject(reason), ms);
      else
        setTimeout(resolve, ms);
    });
  }
  function createUntil(r, isNot = false) {
    function toMatch(condition, { flush = "sync", deep = false, timeout, throwOnTimeout } = {}) {
      let stop = null;
      const watcher = new Promise((resolve) => {
        stop = vue.watch(
          r,
          (v) => {
            if (condition(v) !== isNot) {
              stop == null ? void 0 : stop();
              resolve(v);
            }
          },
          {
            flush,
            deep,
            immediate: true
          }
        );
      });
      const promises = [watcher];
      if (timeout != null) {
        promises.push(
          promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop())
        );
      }
      return Promise.race(promises);
    }
    function toBe(value, options) {
      if (!vue.isRef(value))
        return toMatch((v) => v === value, options);
      const { flush = "sync", deep = false, timeout, throwOnTimeout } = options != null ? options : {};
      let stop = null;
      const watcher = new Promise((resolve) => {
        stop = vue.watch(
          [r, value],
          ([v1, v2]) => {
            if (isNot !== (v1 === v2)) {
              stop == null ? void 0 : stop();
              resolve(v1);
            }
          },
          {
            flush,
            deep,
            immediate: true
          }
        );
      });
      const promises = [watcher];
      if (timeout != null) {
        promises.push(
          promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {
            stop == null ? void 0 : stop();
            return toValue(r);
          })
        );
      }
      return Promise.race(promises);
    }
    function toBeTruthy(options) {
      return toMatch((v) => Boolean(v), options);
    }
    function toBeNull(options) {
      return toBe(null, options);
    }
    function toBeUndefined(options) {
      return toBe(void 0, options);
    }
    function toBeNaN(options) {
      return toMatch(Number.isNaN, options);
    }
    function toContains(value, options) {
      return toMatch((v) => {
        const array = Array.from(v);
        return array.includes(value) || array.includes(toValue(value));
      }, options);
    }
    function changed(options) {
      return changedTimes(1, options);
    }
    function changedTimes(n = 1, options) {
      let count = -1;
      return toMatch(() => {
        count += 1;
        return count >= n;
      }, options);
    }
    if (Array.isArray(toValue(r))) {
      const instance = {
        toMatch,
        toContains,
        changed,
        changedTimes,
        get not() {
          return createUntil(r, !isNot);
        }
      };
      return instance;
    } else {
      const instance = {
        toMatch,
        toBe,
        toBeTruthy,
        toBeNull,
        toBeNaN,
        toBeUndefined,
        changed,
        changedTimes,
        get not() {
          return createUntil(r, !isNot);
        }
      };
      return instance;
    }
  }
  function until(r) {
    return createUntil(r);
  }
  function unrefElement(elRef) {
    var _a;
    const plain = toValue(elRef);
    return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
  }
  const defaultWindow = isClient ? window : void 0;
  function useEventListener(...args) {
    let target;
    let events;
    let listeners;
    let options;
    if (typeof args[0] === "string" || Array.isArray(args[0])) {
      [events, listeners, options] = args;
      target = defaultWindow;
    } else {
      [target, events, listeners, options] = args;
    }
    if (!target)
      return noop;
    if (!Array.isArray(events))
      events = [events];
    if (!Array.isArray(listeners))
      listeners = [listeners];
    const cleanups = [];
    const cleanup = () => {
      cleanups.forEach((fn) => fn());
      cleanups.length = 0;
    };
    const register = (el, event, listener, options2) => {
      el.addEventListener(event, listener, options2);
      return () => el.removeEventListener(event, listener, options2);
    };
    const stopWatch = vue.watch(
      () => [unrefElement(target), toValue(options)],
      ([el, options2]) => {
        cleanup();
        if (!el)
          return;
        const optionsClone = isObject(options2) ? { ...options2 } : options2;
        cleanups.push(
          ...events.flatMap((event) => {
            return listeners.map((listener) => register(el, event, listener, optionsClone));
          })
        );
      },
      { immediate: true, flush: "post" }
    );
    const stop = () => {
      stopWatch();
      cleanup();
    };
    tryOnScopeDispose(stop);
    return stop;
  }
  let _iOSWorkaround = false;
  function onClickOutside(target, handler, options = {}) {
    const { window: window2 = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;
    if (!window2)
      return;
    if (isIOS && !_iOSWorkaround) {
      _iOSWorkaround = true;
      Array.from(window2.document.body.children).forEach((el) => el.addEventListener("click", noop));
      window2.document.documentElement.addEventListener("click", noop);
    }
    let shouldListen = true;
    const shouldIgnore = (event) => {
      return ignore.some((target2) => {
        if (typeof target2 === "string") {
          return Array.from(window2.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));
        } else {
          const el = unrefElement(target2);
          return el && (event.target === el || event.composedPath().includes(el));
        }
      });
    };
    const listener = (event) => {
      const el = unrefElement(target);
      if (!el || el === event.target || event.composedPath().includes(el))
        return;
      if (event.detail === 0)
        shouldListen = !shouldIgnore(event);
      if (!shouldListen) {
        shouldListen = true;
        return;
      }
      handler(event);
    };
    const cleanup = [
      useEventListener(window2, "click", listener, { passive: true, capture }),
      useEventListener(window2, "pointerdown", (e) => {
        const el = unrefElement(target);
        shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));
      }, { passive: true }),
      detectIframe && useEventListener(window2, "blur", (event) => {
        setTimeout(() => {
          var _a;
          const el = unrefElement(target);
          if (((_a = window2.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window2.document.activeElement)))
            handler(event);
        }, 0);
      })
    ].filter(Boolean);
    const stop = () => cleanup.forEach((fn) => fn());
    return stop;
  }
  function useAsyncState(promise, initialState, options) {
    const {
      immediate = true,
      delay = 0,
      onError = noop,
      onSuccess = noop,
      resetOnExecute = true,
      shallow = true,
      throwError
    } = options != null ? options : {};
    const state = shallow ? vue.shallowRef(initialState) : vue.ref(initialState);
    const isReady = vue.ref(false);
    const isLoading = vue.ref(false);
    const error = vue.shallowRef(void 0);
    async function execute(delay2 = 0, ...args) {
      if (resetOnExecute)
        state.value = initialState;
      error.value = void 0;
      isReady.value = false;
      isLoading.value = true;
      if (delay2 > 0)
        await promiseTimeout(delay2);
      const _promise = typeof promise === "function" ? promise(...args) : promise;
      try {
        const data = await _promise;
        state.value = data;
        isReady.value = true;
        onSuccess(data);
      } catch (e) {
        error.value = e;
        onError(e);
        if (throwError)
          throw e;
      } finally {
        isLoading.value = false;
      }
      return state.value;
    }
    if (immediate)
      execute(delay);
    const shell = {
      state,
      isReady,
      isLoading,
      error,
      execute
    };
    function waitUntilIsLoaded() {
      return new Promise((resolve, reject) => {
        until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);
      });
    }
    return {
      ...shell,
      then(onFulfilled, onRejected) {
        return waitUntilIsLoaded().then(onFulfilled, onRejected);
      }
    };
  }
  const _withScopeId = (n) => (vue.pushScopeId("data-v-e4941344"), n = n(), vue.popScopeId(), n);
  const _hoisted_1 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("i", { class: "i-carbon:batch-job text-xl" }, null, -1));
  const _hoisted_2 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("span", { class: "text-xs font-medium" }, "重命名", -1));
  const _hoisted_3 = [
    _hoisted_1,
    _hoisted_2
  ];
  const _hoisted_4 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "pb-2" }, " 批量重命名当前目录下的所有文件。 ", -1));
  const _hoisted_5 = { class: "mb-3 flex items-center gap-x-4" };
  const _hoisted_6 = { class: "w-fit flex gap-x-1px overflow-hidden rounded text-xs text-white" };
  const _hoisted_7 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("a", {
    class: "text-xs font-medium text-purple-600 underline",
    href: "https://regex101.com/",
    target: "_blank"
  }, " 正则可视化 ", -1));
  const _hoisted_8 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("a", {
    class: "text-xs font-medium text-purple-600 underline",
    href: "https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace",
    target: "_blank"
  }, " 文档 ", -1));
  const _hoisted_9 = { class: "grid gap-y-3 text-sm" };
  const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("label", { class: "mb-1 block" }, "From", -1));
  const _hoisted_11 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("label", { class: "mb-1 block" }, "To", -1));
  const _hoisted_12 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "text-xs font-mono" }, [
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#b07d48" }, "原文件名"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#999" }, "."),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#59873a" }, "replace"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#2993a3" }, "("),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#ab5959" }, "new"),
    /* @__PURE__ */ vue.createTextVNode(),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#59873a" }, "RegExp"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#1e754f" }, "("),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#b07d48" }, "From"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#1e754f" }, ")"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#999" }, ","),
    /* @__PURE__ */ vue.createTextVNode(),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#b07d48" }, "To"),
    /* @__PURE__ */ vue.createElementVNode("span", { class: "text-#2993a3" }, ")")
  ], -1));
  const _hoisted_13 = { class: "mb-1 block flex items-center gap-x-2" };
  const _hoisted_14 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("label", { class: "mb-1 block" }, "季", -1));
  const _hoisted_15 = { class: "min-h-40px" };
  const _hoisted_16 = {
    key: 0,
    class: "text-xs text-red"
  };
  const _hoisted_17 = {
    key: 1,
    class: "text-xs text-gray"
  };
  const _hoisted_18 = {
    key: 2,
    class: "text-xs text-purple"
  };
  const _hoisted_19 = { class: "flex" };
  const _hoisted_20 = ["disabled"];
  const _hoisted_21 = {
    key: 0,
    class: "i-carbon:contour-finding block animate-spin"
  };
  const _hoisted_22 = {
    key: 0,
    class: "text-xs text-red"
  };
  const _hoisted_23 = { class: "flex items-center gap-x-3 pb-2" };
  const _hoisted_24 = {
    key: 0,
    class: "ml-4 text-sm text-gray-600"
  };
  const _hoisted_25 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("i", { class: "i-carbon:pointer-text [vertical-align:-0.2em] inline-block text-sm text-green-700" }, null, -1));
  const _hoisted_26 = {
    key: 1,
    class: "grid grid-cols-[20px_auto_30px_minmax(200px,1fr)] items-center gap-x-2 gap-y-1 text-xs"
  };
  const _hoisted_27 = {
    key: 2,
    class: "py-8 text-center text-xs text-purple-600"
  };
  const RetryMax = 3;
  const MaxConcurrent = 3;
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
    __name: "App",
    setup(__props) {
      const url = vue.ref(location.href);
      setInterval(() => {
        url.value = location.href;
      }, 1e3);
      const isSmart = vue.computed(() => /\/smart\/?$/.test(url.value));
      const uncheckList = vue.ref([]);
      const doneList = vue.ref([]);
      const errorList = vue.ref([]);
      const newNameMap = vue.ref({});
      let remainRetryCount = RetryMax;
      const { state: list, execute: fetchList, isReady: listReady } = useAsyncState(() => {
        return getFileListOfCurrentDir();
      }, [], {
        immediate: false,
        onSuccess: () => {
          uncheckList.value = [];
          doneList.value = [];
          errorList.value = [];
          newNameMap.value = {};
          guessPrefixAndSeason();
        },
        onError: () => {
          setTimeout(() => {
            if (--remainRetryCount)
              fetchList();
          }, 1e3);
        }
      });
      function handleCheckChange(fileId, checked) {
        return uncheckList.value = uncheckList.value.filter((x) => x !== fileId || !checked);
      }
      const VideoExts = [
        "mp4",
        "flv",
        "f4v",
        "webm",
        "m4v",
        "mov",
        "cpk",
        "dirac",
        "3gp",
        "3g2",
        "rm",
        "rmvb",
        "wmv",
        "avi",
        "asf",
        "mpg",
        "mpeg",
        "mpe",
        "vob",
        "mkv",
        "ram",
        "qt",
        "fli",
        "flc",
        "mod",
        "iso",
        "ts"
      ];
      const videoList = vue.computed(() => {
        return list.value.filter((x) => x.type === "file" && VideoExts.includes(x.file_extension));
      });
      const popupVisible = vue.ref(false);
      const popup = vue.ref();
      const previewRef = vue.ref();
      const trigger = vue.ref();
      function handleClickRenameBtn() {
        popupVisible.value = true;
      }
      onClickOutside(popup, () => {
        popupVisible.value = false;
      }, { ignore: [trigger, previewRef] });
      const running = vue.ref(false);
      const from = vue.ref("");
      const to = vue.ref("");
      const activeMode = vue.ref("extract");
      const prefix = vue.ref("");
      const season = vue.ref("");
      const showList = vue.computed(() => activeMode.value === "extract" ? videoList.value : list.value);
      const selectedList = vue.computed(() => showList.value.filter((x) => !uncheckList.value.includes(x.file_id) && newNameMap.value[x.file_id] && x.name !== newNameMap.value[x.file_id]));
      const hasConflict = vue.computed(() => {
        const l = selectedList.value;
        const newNames = /* @__PURE__ */ new Set();
        for (const item of l) {
          if (!uncheckList.value.includes(item.file_id) && newNameMap.value[item.file_id]) {
            if (newNames.has(newNameMap.value[item.file_id]))
              return true;
            newNames.add(newNameMap.value[item.file_id]);
          }
        }
        return false;
      });
      const disabled = vue.computed(() => activeMode.value === "regexp" && (!from.value || !to.value) || activeMode.value === "extract" && (!prefix.value || !season.value) || !listReady.value || !selectedList.value.length || hasConflict.value);
      vue.watch(url, (v, ov) => {
        if (v && v !== ov && ["/drive/file/backup", "/drive/file/resource"].some((x) => new URL(v).pathname.startsWith(x))) {
          setTimeout(() => {
            fetchList();
            remainRetryCount = RetryMax;
          }, 1e3);
        }
      }, { immediate: true });
      vue.watch(activeMode, () => {
        initRunState();
      });
      vue.watch(popupVisible, async (v) => {
        var _a, _b;
        if (v) {
          await vue.nextTick();
          (_b = (_a = popup.value) == null ? void 0 : _a.querySelector("input")) == null ? void 0 : _b.focus();
        } else {
          initRunState();
        }
      });
      function guessPrefixAndSeason() {
        guessPrefix();
        guessSeason();
      }
      function guessSeason() {
        let currentSeason = "1";
        videoList.value.forEach((v) => {
          const temp = getSeason(v.name);
          if (temp)
            currentSeason = temp;
        });
        season.value = currentSeason;
      }
      const Chinese = /([\u4E00-\u9FA5A-Z0-9]+)/i;
      function guessPrefix() {
        if (videoList.value.length === 0)
          return;
        const m = videoList.value[0].name.match(Chinese);
        if (m == null ? void 0 : m[1]) {
          prefix.value = m[1];
          return;
        }
        const [a, b] = videoList.value.slice(0, 2).map((x) => x.name.replace(`.${x.file_extension}`, ""));
        const lcs = getLcstr(a, b);
        if (lcs)
          prefix.value = lcs.replace(/\s*S[0-9]+E[0-9]*|\s*E[0-9]+/i, "").trim();
      }
      function getLcstr(a, b) {
        if (!a || !b)
          return "";
        const lenA = a.length;
        const lenB = b.length;
        let cache = [[], []];
        let maxLen = 0;
        let maxBEnd;
        for (let i = 0; i < lenA; i++)
          cache[0][i] = a[0] === b[i] ? 1 : 0;
        for (let i = 1; i < lenA; i++) {
          cache[1][0] = a[i] === b[0] ? 1 : 0;
          for (let j = 1; j < lenB; j++) {
            cache[1][j] = a[i] === b[j] ? cache[0][j - 1] + 1 : 0;
            if (cache[1][j] > maxLen) {
              maxLen = cache[1][j];
              maxBEnd = j;
            }
          }
          cache = [cache[1], []];
        }
        return b.slice(maxBEnd - maxLen + 1, maxBEnd + 1);
      }
      const error = vue.ref("");
      const warning = vue.ref("");
      const processData = vue.ref({
        total: 0,
        skip: 0,
        done: 0
      });
      async function run() {
        if (disabled.value || running.value)
          return;
        initRunState();
        running.value = true;
        processData.value.total = showList.value.length;
        processData.value.skip = showList.value.length - selectedList.value.length;
        const queue = selectedList.value.slice();
        while (queue.length) {
          const subQueue = [];
          for (let i = 0; i < MaxConcurrent; i++) {
            const x = queue.shift();
            if (x)
              subQueue.push(x);
            else
              break;
          }
          await Promise.all(subQueue.map(async (item) => {
            const newName = newNameMap.value[item.file_id];
            await renameOne(item, newName).then(() => {
              doneList.value.push(item.file_id);
            }).catch(() => {
              errorList.value.push(item.file_id);
            });
            processData.value.done++;
          }));
          await new Promise((r) => setTimeout(r, API_DELAY));
        }
        running.value = false;
        {
          warning.value = "即将刷新页面...";
          setTimeout(() => {
            location.reload();
          }, 1e3);
        }
      }
      function initRunState() {
        running.value = false;
        error.value = "";
        processData.value = {
          total: 0,
          skip: 0,
          done: 0
        };
      }
      function getNewName(oldName) {
        if (activeMode.value === "extract")
          return getNewNameByExtract(oldName, prefix.value.trim(), season.value.trim());
        else
          return getNewNameByExp(oldName, from.value, to.value);
      }
      vue.watch([list, activeMode, prefix, season, from, to], () => {
        if (list.value.length) {
          newNameMap.value = {};
          if (activeMode.value === "extract" && prefix.value || activeMode.value === "regexp" && from.value && to.value) {
            list.value.forEach((item) => {
              newNameMap.value[item.file_id] = getNewName(item.name);
            });
          }
        }
      }, { immediate: true });
      function fillRandomName() {
        const len = videoList.value.length;
        if (!len)
          return;
        const found = videoList.value[random(len)];
        if (found)
          prefix.value = found.name.replace(`.${found.file_extension}`, "");
      }
      function random(n) {
        return Math.floor(Math.random() * n);
      }
      function manualPickName(id) {
        if (id) {
          const found = videoList.value.find((x) => x.file_id === id);
          if (found)
            prefix.value = found.name.replace(`.${found.file_extension}`, "");
        }
      }
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
          !vue.unref(isSmart) ? (vue.openBlock(), vue.createElementBlock("button", {
            key: 0,
            ref_key: "trigger",
            ref: trigger,
            class: "mt-2 min-h-61px w-60px flex flex-col items-center justify-center gap-y-1 rounded-lg px-2px py-6px text-purple-600 transition hover:bg-purple-600 hover:text-white",
            onClick: handleClickRenameBtn
          }, _hoisted_3, 512)) : vue.createCommentVNode("", true),
          vue.createVNode(vue.Transition, { name: "clip" }, {
            default: vue.withCtx(() => [
              vue.unref(popupVisible) ? (vue.openBlock(), vue.createElementBlock("div", {
                key: 0,
                ref_key: "popup",
                ref: popup,
                class: "absolute z-9999 mt-2 w-300px rounded-lg bg-purple-100 p-3 shadow",
                onKeyup: _cache[6] || (_cache[6] = vue.withKeys(($event) => popupVisible.value = false, ["esc"]))
              }, [
                _hoisted_4,
                vue.createElementVNode("div", _hoisted_5, [
                  vue.createElementVNode("div", _hoisted_6, [
                    vue.createElementVNode("div", {
                      class: vue.normalizeClass(["cursor-pointer bg-purple px-2 py-1", vue.unref(activeMode) === "extract" ? "bg-purple-600" : ""]),
                      onClick: _cache[0] || (_cache[0] = ($event) => activeMode.value = "extract")
                    }, " 剧集模式 ", 2),
                    vue.createElementVNode("div", {
                      class: vue.normalizeClass(["cursor-pointer bg-purple px-2 py-1", vue.unref(activeMode) === "regexp" ? "bg-purple-600" : ""]),
                      onClick: _cache[1] || (_cache[1] = ($event) => activeMode.value = "regexp")
                    }, " 正则模式 ", 2)
                  ]),
                  vue.unref(activeMode) === "regexp" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
                    _hoisted_7,
                    _hoisted_8
                  ], 64)) : vue.createCommentVNode("", true)
                ]),
                vue.createElementVNode("div", _hoisted_9, [
                  vue.unref(activeMode) === "regexp" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
                    vue.createElementVNode("div", null, [
                      _hoisted_10,
                      vue.withDirectives(vue.createElementVNode("input", {
                        "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => vue.isRef(from) ? from.value = $event : null),
                        placeholder: "正则表达式",
                        class: "h-8 w-full rounded bg-white px-3 outline-none"
                      }, null, 512), [
                        [vue.vModelText, vue.unref(from)]
                      ])
                    ]),
                    vue.createElementVNode("div", null, [
                      _hoisted_11,
                      vue.withDirectives(vue.createElementVNode("input", {
                        "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => vue.isRef(to) ? to.value = $event : null),
                        placeholder: "替换表达式",
                        class: "h-8 w-full rounded bg-white px-3 outline-none"
                      }, null, 512), [
                        [vue.vModelText, vue.unref(to)]
                      ])
                    ]),
                    _hoisted_12
                  ], 64)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
                    vue.createElementVNode("div", null, [
                      vue.createElementVNode("label", _hoisted_13, [
                        vue.createTextVNode(" 剧名 "),
                        vue.createElementVNode("i", {
                          class: vue.normalizeClass(["i-ion:dice block text-sm text-purple-700", vue.unref(videoList).length ? "cursor-pointer" : "cursor-not-allowed opacity-50"]),
                          title: "随机填充原文件名",
                          onClick: fillRandomName
                        }, null, 2)
                      ]),
                      vue.withDirectives(vue.createElementVNode("input", {
                        "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => vue.isRef(prefix) ? prefix.value = $event : null),
                        placeholder: "请输入",
                        class: "h-8 w-full rounded bg-white px-3 outline-none"
                      }, null, 512), [
                        [vue.vModelText, vue.unref(prefix)]
                      ])
                    ]),
                    vue.createElementVNode("div", null, [
                      _hoisted_14,
                      vue.withDirectives(vue.createElementVNode("input", {
                        "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => vue.isRef(season) ? season.value = $event : null),
                        type: "number",
                        placeholder: "请输入数字",
                        class: "h-8 w-full rounded bg-white px-3 outline-none"
                      }, null, 512), [
                        [vue.vModelText, vue.unref(season)]
                      ])
                    ])
                  ], 64)),
                  vue.createElementVNode("div", _hoisted_15, [
                    vue.unref(error) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_16, vue.toDisplayString(vue.unref(error)), 1)) : vue.unref(processData).total ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_17, " 总共 " + vue.toDisplayString(vue.unref(processData).total) + " | 跳过 " + vue.toDisplayString(vue.unref(processData).skip) + " | 完成 " + vue.toDisplayString(vue.unref(processData).done), 1)) : vue.createCommentVNode("", true),
                    vue.unref(warning) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_18, vue.toDisplayString(vue.unref(warning)), 1)) : vue.createCommentVNode("", true)
                  ]),
                  vue.createElementVNode("div", _hoisted_19, [
                    vue.createElementVNode("button", {
                      class: "flex items-center justify-center gap-x-1 bg-purple-600 px-3 py-2 text-xs text-white btn",
                      disabled: vue.unref(disabled) || vue.unref(running),
                      onClick: run
                    }, [
                      vue.unref(running) ? (vue.openBlock(), vue.createElementBlock("i", _hoisted_21)) : vue.createCommentVNode("", true),
                      vue.createTextVNode(" Run It! ")
                    ], 8, _hoisted_20)
                  ])
                ])
              ], 544)) : vue.createCommentVNode("", true)
            ]),
            _: 1
          }),
          vue.createVNode(vue.Transition, { name: "fade" }, {
            default: vue.withCtx(() => [
              vue.unref(popupVisible) ? (vue.openBlock(), vue.createElementBlock("div", {
                key: 0,
                ref_key: "previewRef",
                ref: previewRef,
                class: "custom-scrollbar fixed bottom-2 right-0 top-2 z-9999 w-[max(500px,50vw)] overflow-y-auto border-y-3px border-l-3px border-purple-600 rounded-l-lg border-solid bg-white px-4 py-3 font-mono shadow"
              }, [
                vue.unref(hasConflict) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_22, " 更改后的文件名有冲突! ")) : vue.createCommentVNode("", true),
                vue.createElementVNode("div", _hoisted_23, [
                  vue.createElementVNode("button", {
                    class: "text-sm text-purple-600",
                    onClick: _cache[7] || (_cache[7] = ($event) => uncheckList.value = [])
                  }, " 全选 "),
                  vue.createElementVNode("button", {
                    class: "text-sm text-purple-600",
                    onClick: _cache[8] || (_cache[8] = ($event) => uncheckList.value = vue.unref(showList).map((x) => x.file_id))
                  }, " 全不选 "),
                  vue.unref(activeMode) === "extract" && vue.unref(videoList).length ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_24, [
                    vue.createTextVNode(" 点击 "),
                    _hoisted_25,
                    vue.createTextVNode(" 可将其填充到“剧名” ")
                  ])) : vue.createCommentVNode("", true)
                ]),
                vue.unref(showList).length ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_26, [
                  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(showList), (item) => {
                    return vue.openBlock(), vue.createBlock(_sfc_main$1, {
                      id: item.file_id,
                      key: item.file_id,
                      "old-name": item.name,
                      "new-name": vue.unref(newNameMap)[item.file_id] || "",
                      "model-value": !vue.unref(uncheckList).includes(item.file_id),
                      done: vue.unref(doneList).includes(item.file_id),
                      error: vue.unref(errorList).includes(item.file_id),
                      "show-pick": vue.unref(activeMode) === "extract",
                      "onUpdate:modelValue": ($event) => handleCheckChange(item.file_id, $event),
                      onPick: manualPickName
                    }, null, 8, ["id", "old-name", "new-name", "model-value", "done", "error", "show-pick", "onUpdate:modelValue"]);
                  }), 128))
                ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_27, " 当前目录和模式下,没有满足要求的条目~ "))
              ], 512)) : vue.createCommentVNode("", true)
            ]),
            _: 1
          })
        ], 64);
      };
    }
  });
  const _export_sfc = (sfc, props) => {
    const target = sfc.__vccOpts || sfc;
    for (const [key, val] of props) {
      target[key] = val;
    }
    return target;
  };
  const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e4941344"]]);
  let timer;
  Promise.race([
    new Promise((resolve) => {
      timer = window.setInterval(() => {
        const found = document.querySelector('[class^="nav-tab-content--"]');
        if (found)
          resolve(true);
      }, 100);
    }),
    new Promise((resolve) => {
      setTimeout(() => {
        resolve(true);
      }, 1e4);
    })
  ]).then(() => {
    init();
  });
  function init() {
    clearInterval(timer);
    const app = vue.createApp(App);
    app.mount(
      (() => {
        var _a;
        const app2 = document.createElement("div");
        (_a = document.elementFromPoint(0, 0)) == null ? void 0 : _a.append(app2);
        return app2;
      })()
    );
  }

})(Vue);