diff --git a/README.md b/README.md index c9ed5b5..ac98a9d 100644 --- a/README.md +++ b/README.md @@ -130,9 +130,6 @@ services: 感谢 Harvey 的支持(¥6.66) 首赞

-

- 感谢 飞翔的小鸟 的支持(¥10) -

感谢 阿文 的支持(¥20)

@@ -140,7 +137,16 @@ services: 感谢 贾如 的支持(¥6.66)

- 感谢 新洲方太李 的支持(¥6.66) + 感谢 一叶知秋 的支持(¥20) +

+

+ 感谢 新洲方太李 的支持(¥20) +

+

+ 感谢 畅天 的支持(¥6.66) +

+

+ 感谢 多喝烫水 的支持(¥20)

diff --git a/internal/api/web/assets/AccountFolderField--BsMTn1G.js.gz b/internal/api/web/assets/AccountFolderField--BsMTn1G.js.gz deleted file mode 100644 index 9b5dc99..0000000 Binary files a/internal/api/web/assets/AccountFolderField--BsMTn1G.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AccountFolderField-BfCWRJDf.js.gz b/internal/api/web/assets/AccountFolderField-BfCWRJDf.js.gz new file mode 100644 index 0000000..d85614a Binary files /dev/null and b/internal/api/web/assets/AccountFolderField-BfCWRJDf.js.gz differ diff --git a/internal/api/web/assets/AccountManagement-CFk1dgSN.js.gz b/internal/api/web/assets/AccountManagement-CFk1dgSN.js.gz new file mode 100644 index 0000000..31e768d Binary files /dev/null and b/internal/api/web/assets/AccountManagement-CFk1dgSN.js.gz differ diff --git a/internal/api/web/assets/AccountManagement-DubF4IER.js.gz b/internal/api/web/assets/AccountManagement-DubF4IER.js.gz deleted file mode 100644 index efdc1db..0000000 Binary files a/internal/api/web/assets/AccountManagement-DubF4IER.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AdminRunStatusCell-CAFCSg6l.js.gz b/internal/api/web/assets/AdminRunStatusCell-CAFCSg6l.js.gz new file mode 100644 index 0000000..f0c207a Binary files /dev/null and b/internal/api/web/assets/AdminRunStatusCell-CAFCSg6l.js.gz differ diff --git a/internal/api/web/assets/AdminRunStatusCell-QfWZIbe5.js.gz b/internal/api/web/assets/AdminRunStatusCell-QfWZIbe5.js.gz deleted file mode 100644 index b15a398..0000000 Binary files a/internal/api/web/assets/AdminRunStatusCell-QfWZIbe5.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AdminSettingsDrawer-CL5BW-fr.js.gz b/internal/api/web/assets/AdminSettingsDrawer-CL5BW-fr.js.gz deleted file mode 100644 index 7a1263f..0000000 Binary files a/internal/api/web/assets/AdminSettingsDrawer-CL5BW-fr.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AdminSettingsDrawer-eI84R-qo.js.gz b/internal/api/web/assets/AdminSettingsDrawer-eI84R-qo.js.gz new file mode 100644 index 0000000..2bd2d9a Binary files /dev/null and b/internal/api/web/assets/AdminSettingsDrawer-eI84R-qo.js.gz differ diff --git a/internal/api/web/assets/AdminTaskTabHeader-BpeHtqF0.js.gz b/internal/api/web/assets/AdminTaskTabHeader-BpeHtqF0.js.gz deleted file mode 100644 index 6676cc5..0000000 Binary files a/internal/api/web/assets/AdminTaskTabHeader-BpeHtqF0.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AdminTaskTabHeader-DrurE2CP.js.gz b/internal/api/web/assets/AdminTaskTabHeader-DrurE2CP.js.gz new file mode 100644 index 0000000..e463469 Binary files /dev/null and b/internal/api/web/assets/AdminTaskTabHeader-DrurE2CP.js.gz differ diff --git a/internal/api/web/assets/AdminView-BVP1uHb2.js.gz b/internal/api/web/assets/AdminView-BVP1uHb2.js.gz deleted file mode 100644 index 6e1339c..0000000 Binary files a/internal/api/web/assets/AdminView-BVP1uHb2.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AdminView-qaZ1Z92X.js.gz b/internal/api/web/assets/AdminView-qaZ1Z92X.js.gz new file mode 100644 index 0000000..71c5ce4 Binary files /dev/null and b/internal/api/web/assets/AdminView-qaZ1Z92X.js.gz differ diff --git a/internal/api/web/assets/AppBadge-CRm4W46H.js.gz b/internal/api/web/assets/AppBadge-CRm4W46H.js.gz new file mode 100644 index 0000000..99e2466 Binary files /dev/null and b/internal/api/web/assets/AppBadge-CRm4W46H.js.gz differ diff --git a/internal/api/web/assets/AppBadge-fVj-AKrB.js.gz b/internal/api/web/assets/AppBadge-fVj-AKrB.js.gz deleted file mode 100644 index af53472..0000000 Binary files a/internal/api/web/assets/AppBadge-fVj-AKrB.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppCardActionButton-BDO4PKXc.js.gz b/internal/api/web/assets/AppCardActionButton-BDO4PKXc.js.gz deleted file mode 100644 index d6431e3..0000000 Binary files a/internal/api/web/assets/AppCardActionButton-BDO4PKXc.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppCardActionButton-BIe2vguu.js.gz b/internal/api/web/assets/AppCardActionButton-BIe2vguu.js.gz new file mode 100644 index 0000000..4b1ce6c Binary files /dev/null and b/internal/api/web/assets/AppCardActionButton-BIe2vguu.js.gz differ diff --git a/internal/api/web/assets/AppDropdown-Bh-gTIza.js.gz b/internal/api/web/assets/AppDropdown-Bh-gTIza.js.gz deleted file mode 100644 index c7380d2..0000000 Binary files a/internal/api/web/assets/AppDropdown-Bh-gTIza.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppDropdown-D8ScfjIz.js.gz b/internal/api/web/assets/AppDropdown-D8ScfjIz.js.gz new file mode 100644 index 0000000..fe569b3 Binary files /dev/null and b/internal/api/web/assets/AppDropdown-D8ScfjIz.js.gz differ diff --git a/internal/api/web/assets/AppIconButton-BZTXxbh3.js.gz b/internal/api/web/assets/AppIconButton-BZTXxbh3.js.gz deleted file mode 100644 index c82bc10..0000000 Binary files a/internal/api/web/assets/AppIconButton-BZTXxbh3.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppIconButton-DgBuNwEW.js.gz b/internal/api/web/assets/AppIconButton-DgBuNwEW.js.gz new file mode 100644 index 0000000..dd44dc0 Binary files /dev/null and b/internal/api/web/assets/AppIconButton-DgBuNwEW.js.gz differ diff --git a/internal/api/web/assets/AppInput-DY6Nb_sl.js.gz b/internal/api/web/assets/AppInput-DY6Nb_sl.js.gz deleted file mode 100644 index d5a906b..0000000 Binary files a/internal/api/web/assets/AppInput-DY6Nb_sl.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppInput-LPBAIiNW.js.gz b/internal/api/web/assets/AppInput-LPBAIiNW.js.gz new file mode 100644 index 0000000..ed70581 Binary files /dev/null and b/internal/api/web/assets/AppInput-LPBAIiNW.js.gz differ diff --git a/internal/api/web/assets/AppSelect-By_koM2E.js.gz b/internal/api/web/assets/AppSelect-By_koM2E.js.gz new file mode 100644 index 0000000..91b612f Binary files /dev/null and b/internal/api/web/assets/AppSelect-By_koM2E.js.gz differ diff --git a/internal/api/web/assets/AppSelect-DVdPxsWu.js.gz b/internal/api/web/assets/AppSelect-DVdPxsWu.js.gz deleted file mode 100644 index abd117d..0000000 Binary files a/internal/api/web/assets/AppSelect-DVdPxsWu.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AppStateBlock-CsUZ3Dhf.js.gz b/internal/api/web/assets/AppStateBlock-CsUZ3Dhf.js.gz new file mode 100644 index 0000000..a4c8cb9 Binary files /dev/null and b/internal/api/web/assets/AppStateBlock-CsUZ3Dhf.js.gz differ diff --git a/internal/api/web/assets/AppStateBlock-DYX4GxDu.js.gz b/internal/api/web/assets/AppStateBlock-DYX4GxDu.js.gz deleted file mode 100644 index bd8753c..0000000 Binary files a/internal/api/web/assets/AppStateBlock-DYX4GxDu.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ArchivePreview-CHQj_XQk.js.gz b/internal/api/web/assets/ArchivePreview-CHQj_XQk.js.gz deleted file mode 100644 index 948bc0c..0000000 Binary files a/internal/api/web/assets/ArchivePreview-CHQj_XQk.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ArchivePreview-Dbf0w6-R.js.gz b/internal/api/web/assets/ArchivePreview-Dbf0w6-R.js.gz new file mode 100644 index 0000000..cbcc740 Binary files /dev/null and b/internal/api/web/assets/ArchivePreview-Dbf0w6-R.js.gz differ diff --git a/internal/api/web/assets/AudioPreview-DBGi-2-u.js.gz b/internal/api/web/assets/AudioPreview-DBGi-2-u.js.gz new file mode 100644 index 0000000..de7afb8 Binary files /dev/null and b/internal/api/web/assets/AudioPreview-DBGi-2-u.js.gz differ diff --git a/internal/api/web/assets/AudioPreview-h4SV49tn.js.gz b/internal/api/web/assets/AudioPreview-h4SV49tn.js.gz deleted file mode 100644 index a5e3115..0000000 Binary files a/internal/api/web/assets/AudioPreview-h4SV49tn.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AutomationPanel-B5F8YLdU.js.gz b/internal/api/web/assets/AutomationPanel-B5F8YLdU.js.gz new file mode 100644 index 0000000..977c12b Binary files /dev/null and b/internal/api/web/assets/AutomationPanel-B5F8YLdU.js.gz differ diff --git a/internal/api/web/assets/AutomationPanel-DoFZTquy.js.gz b/internal/api/web/assets/AutomationPanel-DoFZTquy.js.gz deleted file mode 100644 index db6a9da..0000000 Binary files a/internal/api/web/assets/AutomationPanel-DoFZTquy.js.gz and /dev/null differ diff --git a/internal/api/web/assets/AuxToolsManagement-DElCoxjo.js.gz b/internal/api/web/assets/AuxToolsManagement-DElCoxjo.js.gz new file mode 100644 index 0000000..079c744 Binary files /dev/null and b/internal/api/web/assets/AuxToolsManagement-DElCoxjo.js.gz differ diff --git a/internal/api/web/assets/AuxToolsManagement-DYaa2cMx.js.gz b/internal/api/web/assets/AuxToolsManagement-DYaa2cMx.js.gz deleted file mode 100644 index 38e3aa7..0000000 Binary files a/internal/api/web/assets/AuxToolsManagement-DYaa2cMx.js.gz and /dev/null differ diff --git a/internal/api/web/assets/BreadcrumbNav-BQ7FrrbA.js.gz b/internal/api/web/assets/BreadcrumbNav-BQ7FrrbA.js.gz deleted file mode 100644 index 5d9f6d9..0000000 Binary files a/internal/api/web/assets/BreadcrumbNav-BQ7FrrbA.js.gz and /dev/null differ diff --git a/internal/api/web/assets/BreadcrumbNav-De9SG7Wn.js.gz b/internal/api/web/assets/BreadcrumbNav-De9SG7Wn.js.gz new file mode 100644 index 0000000..f1eb6dd Binary files /dev/null and b/internal/api/web/assets/BreadcrumbNav-De9SG7Wn.js.gz differ diff --git a/internal/api/web/assets/BusySpinner-By_HXGtH.js.gz b/internal/api/web/assets/BusySpinner-By_HXGtH.js.gz new file mode 100644 index 0000000..4f8828d Binary files /dev/null and b/internal/api/web/assets/BusySpinner-By_HXGtH.js.gz differ diff --git a/internal/api/web/assets/BusySpinner-CDQC6N1k.js.gz b/internal/api/web/assets/BusySpinner-CDQC6N1k.js.gz deleted file mode 100644 index 5a3ff24..0000000 Binary files a/internal/api/web/assets/BusySpinner-CDQC6N1k.js.gz and /dev/null differ diff --git a/internal/api/web/assets/CacheRetentionPanel-Cz9Ll8Wd.js.gz b/internal/api/web/assets/CacheRetentionPanel-Cz9Ll8Wd.js.gz new file mode 100644 index 0000000..4da09c4 Binary files /dev/null and b/internal/api/web/assets/CacheRetentionPanel-Cz9Ll8Wd.js.gz differ diff --git a/internal/api/web/assets/CacheRetentionPanel-_0Ygaen6.js.gz b/internal/api/web/assets/CacheRetentionPanel-_0Ygaen6.js.gz deleted file mode 100644 index 64030bd..0000000 Binary files a/internal/api/web/assets/CacheRetentionPanel-_0Ygaen6.js.gz and /dev/null differ diff --git a/internal/api/web/assets/CacheSettingsPanel-C3cGkGJm.js.gz b/internal/api/web/assets/CacheSettingsPanel-C3cGkGJm.js.gz deleted file mode 100644 index 7753a6b..0000000 Binary files a/internal/api/web/assets/CacheSettingsPanel-C3cGkGJm.js.gz and /dev/null differ diff --git a/internal/api/web/assets/CacheSettingsPanel-De81KnGJ.js.gz b/internal/api/web/assets/CacheSettingsPanel-De81KnGJ.js.gz new file mode 100644 index 0000000..128159b Binary files /dev/null and b/internal/api/web/assets/CacheSettingsPanel-De81KnGJ.js.gz differ diff --git a/internal/api/web/assets/CrossDriveTransfer-B769U0De.js.gz b/internal/api/web/assets/CrossDriveTransfer-B769U0De.js.gz deleted file mode 100644 index 175ee98..0000000 Binary files a/internal/api/web/assets/CrossDriveTransfer-B769U0De.js.gz and /dev/null differ diff --git a/internal/api/web/assets/CrossDriveTransfer-CdlaXoVZ.js.gz b/internal/api/web/assets/CrossDriveTransfer-CdlaXoVZ.js.gz new file mode 100644 index 0000000..9a27485 Binary files /dev/null and b/internal/api/web/assets/CrossDriveTransfer-CdlaXoVZ.js.gz differ diff --git a/internal/api/web/assets/DashboardManagement-BRJ_A1pi.js.gz b/internal/api/web/assets/DashboardManagement-BRJ_A1pi.js.gz deleted file mode 100644 index 9bc8591..0000000 Binary files a/internal/api/web/assets/DashboardManagement-BRJ_A1pi.js.gz and /dev/null differ diff --git a/internal/api/web/assets/DashboardManagement-Bq0Kkt8l.js.gz b/internal/api/web/assets/DashboardManagement-Bq0Kkt8l.js.gz new file mode 100644 index 0000000..13071c5 Binary files /dev/null and b/internal/api/web/assets/DashboardManagement-Bq0Kkt8l.js.gz differ diff --git a/internal/api/web/assets/DocxPreview-BCUwhJk4.js.gz b/internal/api/web/assets/DocxPreview-BCUwhJk4.js.gz deleted file mode 100644 index e3b6579..0000000 Binary files a/internal/api/web/assets/DocxPreview-BCUwhJk4.js.gz and /dev/null differ diff --git a/internal/api/web/assets/DocxPreview-D181RRYS.js.gz b/internal/api/web/assets/DocxPreview-D181RRYS.js.gz new file mode 100644 index 0000000..8d01f27 Binary files /dev/null and b/internal/api/web/assets/DocxPreview-D181RRYS.js.gz differ diff --git a/internal/api/web/assets/FileShareManagement-By0AZt34.js.gz b/internal/api/web/assets/FileShareManagement-By0AZt34.js.gz deleted file mode 100644 index d3065a1..0000000 Binary files a/internal/api/web/assets/FileShareManagement-By0AZt34.js.gz and /dev/null differ diff --git a/internal/api/web/assets/FileShareManagement-uF--oBDw.js.gz b/internal/api/web/assets/FileShareManagement-uF--oBDw.js.gz new file mode 100644 index 0000000..3a4189b Binary files /dev/null and b/internal/api/web/assets/FileShareManagement-uF--oBDw.js.gz differ diff --git a/internal/api/web/assets/FolderPickerModal-C7kKrJiD.js.gz b/internal/api/web/assets/FolderPickerModal-C7kKrJiD.js.gz deleted file mode 100644 index 2fab938..0000000 Binary files a/internal/api/web/assets/FolderPickerModal-C7kKrJiD.js.gz and /dev/null differ diff --git a/internal/api/web/assets/FolderPickerModal-DNtcOVo8.js.gz b/internal/api/web/assets/FolderPickerModal-DNtcOVo8.js.gz new file mode 100644 index 0000000..91e919f Binary files /dev/null and b/internal/api/web/assets/FolderPickerModal-DNtcOVo8.js.gz differ diff --git a/internal/api/web/assets/FormField-C1-s-cA-.js.gz b/internal/api/web/assets/FormField-C1-s-cA-.js.gz new file mode 100644 index 0000000..23d4e59 Binary files /dev/null and b/internal/api/web/assets/FormField-C1-s-cA-.js.gz differ diff --git a/internal/api/web/assets/FormField-DLm9yQib.js.gz b/internal/api/web/assets/FormField-DLm9yQib.js.gz deleted file mode 100644 index aeb05d6..0000000 Binary files a/internal/api/web/assets/FormField-DLm9yQib.js.gz and /dev/null differ diff --git a/internal/api/web/assets/FuseManagement-C0iYiCL4.js.gz b/internal/api/web/assets/FuseManagement-C0iYiCL4.js.gz new file mode 100644 index 0000000..ba59c85 Binary files /dev/null and b/internal/api/web/assets/FuseManagement-C0iYiCL4.js.gz differ diff --git a/internal/api/web/assets/FuseManagement-CHPWf5KK.js.gz b/internal/api/web/assets/FuseManagement-CHPWf5KK.js.gz deleted file mode 100644 index 53bfde1..0000000 Binary files a/internal/api/web/assets/FuseManagement-CHPWf5KK.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ImagePreview-CAlVquxR.js.gz b/internal/api/web/assets/ImagePreview-CAlVquxR.js.gz deleted file mode 100644 index 9ce05c6..0000000 Binary files a/internal/api/web/assets/ImagePreview-CAlVquxR.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ImagePreview-CjT-UdP_.js.gz b/internal/api/web/assets/ImagePreview-CjT-UdP_.js.gz new file mode 100644 index 0000000..a6e5b40 Binary files /dev/null and b/internal/api/web/assets/ImagePreview-CjT-UdP_.js.gz differ diff --git a/internal/api/web/assets/IndexView-BNRuz6sR.js.gz b/internal/api/web/assets/IndexView-BNRuz6sR.js.gz new file mode 100644 index 0000000..4c41861 Binary files /dev/null and b/internal/api/web/assets/IndexView-BNRuz6sR.js.gz differ diff --git a/internal/api/web/assets/IndexView-WvYjeY8u.js.gz b/internal/api/web/assets/IndexView-WvYjeY8u.js.gz deleted file mode 100644 index d9a2643..0000000 Binary files a/internal/api/web/assets/IndexView-WvYjeY8u.js.gz and /dev/null differ diff --git a/internal/api/web/assets/LoginView-BxmoAj_p.js.gz b/internal/api/web/assets/LoginView-BxmoAj_p.js.gz new file mode 100644 index 0000000..508e148 Binary files /dev/null and b/internal/api/web/assets/LoginView-BxmoAj_p.js.gz differ diff --git a/internal/api/web/assets/LoginView-CooguRDQ.js.gz b/internal/api/web/assets/LoginView-CooguRDQ.js.gz deleted file mode 100644 index 67a0164..0000000 Binary files a/internal/api/web/assets/LoginView-CooguRDQ.js.gz and /dev/null differ diff --git a/internal/api/web/assets/MediaOrganizePanel-m-8xCUkD.js.gz b/internal/api/web/assets/MediaOrganizePanel-m-8xCUkD.js.gz deleted file mode 100644 index 9fb601a..0000000 Binary files a/internal/api/web/assets/MediaOrganizePanel-m-8xCUkD.js.gz and /dev/null differ diff --git a/internal/api/web/assets/MediaOrganizePanel-v8_ba1n6.js.gz b/internal/api/web/assets/MediaOrganizePanel-v8_ba1n6.js.gz new file mode 100644 index 0000000..f2d3a86 Binary files /dev/null and b/internal/api/web/assets/MediaOrganizePanel-v8_ba1n6.js.gz differ diff --git a/internal/api/web/assets/MediaOrganizeSettings-Bn2vpfWB.css.gz b/internal/api/web/assets/MediaOrganizeSettings-Bn2vpfWB.css.gz deleted file mode 100644 index dd653f7..0000000 Binary files a/internal/api/web/assets/MediaOrganizeSettings-Bn2vpfWB.css.gz and /dev/null differ diff --git a/internal/api/web/assets/MediaOrganizeSettings-CJner-pP.js.gz b/internal/api/web/assets/MediaOrganizeSettings-CJner-pP.js.gz new file mode 100644 index 0000000..ea65384 Binary files /dev/null and b/internal/api/web/assets/MediaOrganizeSettings-CJner-pP.js.gz differ diff --git a/internal/api/web/assets/MediaOrganizeSettings-Cjx6veel.js.gz b/internal/api/web/assets/MediaOrganizeSettings-Cjx6veel.js.gz deleted file mode 100644 index 4f6a6e0..0000000 Binary files a/internal/api/web/assets/MediaOrganizeSettings-Cjx6veel.js.gz and /dev/null differ diff --git a/internal/api/web/assets/MediaOrganizeSettings-DuLv9yL4.css.gz b/internal/api/web/assets/MediaOrganizeSettings-DuLv9yL4.css.gz new file mode 100644 index 0000000..09850b9 Binary files /dev/null and b/internal/api/web/assets/MediaOrganizeSettings-DuLv9yL4.css.gz differ diff --git a/internal/api/web/assets/PdfPreview-CqxxvWp9.js.gz b/internal/api/web/assets/PdfPreview-CqxxvWp9.js.gz deleted file mode 100644 index d82c964..0000000 Binary files a/internal/api/web/assets/PdfPreview-CqxxvWp9.js.gz and /dev/null differ diff --git a/internal/api/web/assets/PdfPreview-DNvTBg48.js.gz b/internal/api/web/assets/PdfPreview-DNvTBg48.js.gz new file mode 100644 index 0000000..8e470e7 Binary files /dev/null and b/internal/api/web/assets/PdfPreview-DNvTBg48.js.gz differ diff --git a/internal/api/web/assets/PptxPreview-BsC1RJJG.js.gz b/internal/api/web/assets/PptxPreview-BsC1RJJG.js.gz deleted file mode 100644 index de7b31a..0000000 Binary files a/internal/api/web/assets/PptxPreview-BsC1RJJG.js.gz and /dev/null differ diff --git a/internal/api/web/assets/PptxPreview-JhMEx9RV.js.gz b/internal/api/web/assets/PptxPreview-JhMEx9RV.js.gz new file mode 100644 index 0000000..2d76689 Binary files /dev/null and b/internal/api/web/assets/PptxPreview-JhMEx9RV.js.gz differ diff --git a/internal/api/web/assets/PreviewHeader-1Oe7cYQf.js.gz b/internal/api/web/assets/PreviewHeader-1Oe7cYQf.js.gz new file mode 100644 index 0000000..54cd047 Binary files /dev/null and b/internal/api/web/assets/PreviewHeader-1Oe7cYQf.js.gz differ diff --git a/internal/api/web/assets/PreviewHeader-4VhZ2fM_.js.gz b/internal/api/web/assets/PreviewHeader-4VhZ2fM_.js.gz deleted file mode 100644 index b2bf0e0..0000000 Binary files a/internal/api/web/assets/PreviewHeader-4VhZ2fM_.js.gz and /dev/null differ diff --git a/internal/api/web/assets/PreviewSideNavigation-B2EclPyC.js.gz b/internal/api/web/assets/PreviewSideNavigation-B2EclPyC.js.gz deleted file mode 100644 index 0823517..0000000 Binary files a/internal/api/web/assets/PreviewSideNavigation-B2EclPyC.js.gz and /dev/null differ diff --git a/internal/api/web/assets/PreviewSideNavigation-Bz-VMJ6D.js.gz b/internal/api/web/assets/PreviewSideNavigation-Bz-VMJ6D.js.gz new file mode 100644 index 0000000..0181392 Binary files /dev/null and b/internal/api/web/assets/PreviewSideNavigation-Bz-VMJ6D.js.gz differ diff --git a/internal/api/web/assets/ProxyToolsPanel-CD3ksPpx.js.gz b/internal/api/web/assets/ProxyToolsPanel-CD3ksPpx.js.gz deleted file mode 100644 index 4280dcd..0000000 Binary files a/internal/api/web/assets/ProxyToolsPanel-CD3ksPpx.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ProxyToolsPanel-D9HTiSSQ.js.gz b/internal/api/web/assets/ProxyToolsPanel-D9HTiSSQ.js.gz new file mode 100644 index 0000000..04dbb7c Binary files /dev/null and b/internal/api/web/assets/ProxyToolsPanel-D9HTiSSQ.js.gz differ diff --git a/internal/api/web/assets/SettingsRow-C9E0n_jN.js.gz b/internal/api/web/assets/SettingsRow-C9E0n_jN.js.gz deleted file mode 100644 index 1fed8d8..0000000 Binary files a/internal/api/web/assets/SettingsRow-C9E0n_jN.js.gz and /dev/null differ diff --git a/internal/api/web/assets/SettingsRow-CDG05H3Q.js.gz b/internal/api/web/assets/SettingsRow-CDG05H3Q.js.gz new file mode 100644 index 0000000..9ea7a38 Binary files /dev/null and b/internal/api/web/assets/SettingsRow-CDG05H3Q.js.gz differ diff --git a/internal/api/web/assets/SettingsSegment-DGUBVSn3.js.gz b/internal/api/web/assets/SettingsSegment-DGUBVSn3.js.gz deleted file mode 100644 index 8330de7..0000000 Binary files a/internal/api/web/assets/SettingsSegment-DGUBVSn3.js.gz and /dev/null differ diff --git a/internal/api/web/assets/SettingsSegment-rVKII0nH.js.gz b/internal/api/web/assets/SettingsSegment-rVKII0nH.js.gz new file mode 100644 index 0000000..1626200 Binary files /dev/null and b/internal/api/web/assets/SettingsSegment-rVKII0nH.js.gz differ diff --git a/internal/api/web/assets/SpreadsheetPreview-BooskxnI.js.gz b/internal/api/web/assets/SpreadsheetPreview-BooskxnI.js.gz deleted file mode 100644 index 33fa415..0000000 Binary files a/internal/api/web/assets/SpreadsheetPreview-BooskxnI.js.gz and /dev/null differ diff --git a/internal/api/web/assets/SpreadsheetPreview-CIue9yBi.js.gz b/internal/api/web/assets/SpreadsheetPreview-CIue9yBi.js.gz new file mode 100644 index 0000000..94f838b Binary files /dev/null and b/internal/api/web/assets/SpreadsheetPreview-CIue9yBi.js.gz differ diff --git a/internal/api/web/assets/StatCard-BG1A4203.js.gz b/internal/api/web/assets/StatCard-BG1A4203.js.gz new file mode 100644 index 0000000..b98b5c3 Binary files /dev/null and b/internal/api/web/assets/StatCard-BG1A4203.js.gz differ diff --git a/internal/api/web/assets/StatCard-Di7_ccCK.js.gz b/internal/api/web/assets/StatCard-Di7_ccCK.js.gz deleted file mode 100644 index 1b5b76d..0000000 Binary files a/internal/api/web/assets/StatCard-Di7_ccCK.js.gz and /dev/null differ diff --git a/internal/api/web/assets/StrmScrapePanel-B1_qCFGc.js.gz b/internal/api/web/assets/StrmScrapePanel-B1_qCFGc.js.gz deleted file mode 100644 index c4980e0..0000000 Binary files a/internal/api/web/assets/StrmScrapePanel-B1_qCFGc.js.gz and /dev/null differ diff --git a/internal/api/web/assets/StrmScrapePanel-CeKecF2s.js.gz b/internal/api/web/assets/StrmScrapePanel-CeKecF2s.js.gz new file mode 100644 index 0000000..480197a Binary files /dev/null and b/internal/api/web/assets/StrmScrapePanel-CeKecF2s.js.gz differ diff --git a/internal/api/web/assets/StrmScrapeSettings-DmTcvoeN.js.gz b/internal/api/web/assets/StrmScrapeSettings-DmTcvoeN.js.gz new file mode 100644 index 0000000..fac890f Binary files /dev/null and b/internal/api/web/assets/StrmScrapeSettings-DmTcvoeN.js.gz differ diff --git a/internal/api/web/assets/StrmScrapeSettings-nZ4GZDZe.js.gz b/internal/api/web/assets/StrmScrapeSettings-nZ4GZDZe.js.gz deleted file mode 100644 index a59cfe0..0000000 Binary files a/internal/api/web/assets/StrmScrapeSettings-nZ4GZDZe.js.gz and /dev/null differ diff --git a/internal/api/web/assets/SystemLogs-B597J8tT.js.gz b/internal/api/web/assets/SystemLogs-B597J8tT.js.gz new file mode 100644 index 0000000..6e4adbc Binary files /dev/null and b/internal/api/web/assets/SystemLogs-B597J8tT.js.gz differ diff --git a/internal/api/web/assets/SystemLogs-DJ9nHSiV.js.gz b/internal/api/web/assets/SystemLogs-DJ9nHSiV.js.gz deleted file mode 100644 index 264ad26..0000000 Binary files a/internal/api/web/assets/SystemLogs-DJ9nHSiV.js.gz and /dev/null differ diff --git a/internal/api/web/assets/SystemSettings-BcRAf_mF.js.gz b/internal/api/web/assets/SystemSettings-BcRAf_mF.js.gz new file mode 100644 index 0000000..19ec446 Binary files /dev/null and b/internal/api/web/assets/SystemSettings-BcRAf_mF.js.gz differ diff --git a/internal/api/web/assets/SystemSettings-qC11NZrZ.js.gz b/internal/api/web/assets/SystemSettings-qC11NZrZ.js.gz deleted file mode 100644 index d15c68f..0000000 Binary files a/internal/api/web/assets/SystemSettings-qC11NZrZ.js.gz and /dev/null differ diff --git a/internal/api/web/assets/TaskManagement-5nM53ScW.js.gz b/internal/api/web/assets/TaskManagement-5nM53ScW.js.gz deleted file mode 100644 index ef90532..0000000 Binary files a/internal/api/web/assets/TaskManagement-5nM53ScW.js.gz and /dev/null differ diff --git a/internal/api/web/assets/TaskManagement-CHqIywj9.css.gz b/internal/api/web/assets/TaskManagement-CHqIywj9.css.gz new file mode 100644 index 0000000..310d624 Binary files /dev/null and b/internal/api/web/assets/TaskManagement-CHqIywj9.css.gz differ diff --git a/internal/api/web/assets/TaskManagement-DWQJ4-DQ.js.gz b/internal/api/web/assets/TaskManagement-DWQJ4-DQ.js.gz new file mode 100644 index 0000000..809cd29 Binary files /dev/null and b/internal/api/web/assets/TaskManagement-DWQJ4-DQ.js.gz differ diff --git a/internal/api/web/assets/TaskManagement-DZFsl8pC.css.gz b/internal/api/web/assets/TaskManagement-DZFsl8pC.css.gz deleted file mode 100644 index c51ad62..0000000 Binary files a/internal/api/web/assets/TaskManagement-DZFsl8pC.css.gz and /dev/null differ diff --git a/internal/api/web/assets/TextPreview-BeVp7AfP.js.gz b/internal/api/web/assets/TextPreview-BeVp7AfP.js.gz deleted file mode 100644 index 5f98880..0000000 Binary files a/internal/api/web/assets/TextPreview-BeVp7AfP.js.gz and /dev/null differ diff --git a/internal/api/web/assets/TextPreview-D4mEbGeu.js.gz b/internal/api/web/assets/TextPreview-D4mEbGeu.js.gz new file mode 100644 index 0000000..27274be Binary files /dev/null and b/internal/api/web/assets/TextPreview-D4mEbGeu.js.gz differ diff --git a/internal/api/web/assets/TimeWheelPicker-CFHTowkV.js.gz b/internal/api/web/assets/TimeWheelPicker-CFHTowkV.js.gz new file mode 100644 index 0000000..d125317 Binary files /dev/null and b/internal/api/web/assets/TimeWheelPicker-CFHTowkV.js.gz differ diff --git a/internal/api/web/assets/TimeWheelPicker-Dhkl76mN.js.gz b/internal/api/web/assets/TimeWheelPicker-Dhkl76mN.js.gz deleted file mode 100644 index f3daca0..0000000 Binary files a/internal/api/web/assets/TimeWheelPicker-Dhkl76mN.js.gz and /dev/null differ diff --git a/internal/api/web/assets/TmdbHostsHelpTip-CNUXALXY.js.gz b/internal/api/web/assets/TmdbHostsHelpTip-CNUXALXY.js.gz new file mode 100644 index 0000000..ad3cf40 Binary files /dev/null and b/internal/api/web/assets/TmdbHostsHelpTip-CNUXALXY.js.gz differ diff --git a/internal/api/web/assets/TmdbHostsHelpTip-Z_5Chps_.js.gz b/internal/api/web/assets/TmdbHostsHelpTip-Z_5Chps_.js.gz deleted file mode 100644 index 78fc5d5..0000000 Binary files a/internal/api/web/assets/TmdbHostsHelpTip-Z_5Chps_.js.gz and /dev/null differ diff --git a/internal/api/web/assets/VideoPreview-4D1CuD5a.js.gz b/internal/api/web/assets/VideoPreview-4D1CuD5a.js.gz deleted file mode 100644 index 39c8e8b..0000000 Binary files a/internal/api/web/assets/VideoPreview-4D1CuD5a.js.gz and /dev/null differ diff --git a/internal/api/web/assets/VideoPreview-BNRiqLBF.js.gz b/internal/api/web/assets/VideoPreview-BNRiqLBF.js.gz new file mode 100644 index 0000000..5bb9b8c Binary files /dev/null and b/internal/api/web/assets/VideoPreview-BNRiqLBF.js.gz differ diff --git a/internal/api/web/assets/accounts-BI8nURZW.js.gz b/internal/api/web/assets/accounts-BI8nURZW.js.gz new file mode 100644 index 0000000..ff94e59 Binary files /dev/null and b/internal/api/web/assets/accounts-BI8nURZW.js.gz differ diff --git a/internal/api/web/assets/accounts-G6AcrfMt.js.gz b/internal/api/web/assets/accounts-G6AcrfMt.js.gz new file mode 100644 index 0000000..bc1202f Binary files /dev/null and b/internal/api/web/assets/accounts-G6AcrfMt.js.gz differ diff --git a/internal/api/web/assets/accounts-cW0Cxpne.js.gz b/internal/api/web/assets/accounts-cW0Cxpne.js.gz deleted file mode 100644 index 36c2d92..0000000 Binary files a/internal/api/web/assets/accounts-cW0Cxpne.js.gz and /dev/null differ diff --git a/internal/api/web/assets/accounts-oaM4ANOx.js.gz b/internal/api/web/assets/accounts-oaM4ANOx.js.gz deleted file mode 100644 index f6a2f2b..0000000 Binary files a/internal/api/web/assets/accounts-oaM4ANOx.js.gz and /dev/null differ diff --git a/internal/api/web/assets/admin-table-Bnw1szJc.js.gz b/internal/api/web/assets/admin-table-Bnw1szJc.js.gz new file mode 100644 index 0000000..1859c25 Binary files /dev/null and b/internal/api/web/assets/admin-table-Bnw1szJc.js.gz differ diff --git a/internal/api/web/assets/admin-table-D_-iT-i3.js.gz b/internal/api/web/assets/admin-table-D_-iT-i3.js.gz deleted file mode 100644 index 8881d0a..0000000 Binary files a/internal/api/web/assets/admin-table-D_-iT-i3.js.gz and /dev/null differ diff --git a/internal/api/web/assets/cache-CfGQwTPG.js.gz b/internal/api/web/assets/cache-CfGQwTPG.js.gz deleted file mode 100644 index d85b737..0000000 Binary files a/internal/api/web/assets/cache-CfGQwTPG.js.gz and /dev/null differ diff --git a/internal/api/web/assets/cache-U5MKCCuz.js.gz b/internal/api/web/assets/cache-U5MKCCuz.js.gz new file mode 100644 index 0000000..ebb9b92 Binary files /dev/null and b/internal/api/web/assets/cache-U5MKCCuz.js.gz differ diff --git a/internal/api/web/assets/cacheRetention-BCCkd9Kj.js.gz b/internal/api/web/assets/cacheRetention-BCCkd9Kj.js.gz new file mode 100644 index 0000000..4b1b99f Binary files /dev/null and b/internal/api/web/assets/cacheRetention-BCCkd9Kj.js.gz differ diff --git a/internal/api/web/assets/cacheRetention-D44OnG4e.js.gz b/internal/api/web/assets/cacheRetention-D44OnG4e.js.gz deleted file mode 100644 index 94852e8..0000000 Binary files a/internal/api/web/assets/cacheRetention-D44OnG4e.js.gz and /dev/null differ diff --git a/internal/api/web/assets/cacheSettings-4JAocMMs.js.gz b/internal/api/web/assets/cacheSettings-4JAocMMs.js.gz deleted file mode 100644 index 5a42431..0000000 Binary files a/internal/api/web/assets/cacheSettings-4JAocMMs.js.gz and /dev/null differ diff --git a/internal/api/web/assets/cacheSettings-CjKGRWXN.js.gz b/internal/api/web/assets/cacheSettings-CjKGRWXN.js.gz new file mode 100644 index 0000000..20bbe25 Binary files /dev/null and b/internal/api/web/assets/cacheSettings-CjKGRWXN.js.gz differ diff --git a/internal/api/web/assets/crossTransfer-BD_9O4O9.js.gz b/internal/api/web/assets/crossTransfer-BD_9O4O9.js.gz deleted file mode 100644 index 65206fe..0000000 Binary files a/internal/api/web/assets/crossTransfer-BD_9O4O9.js.gz and /dev/null differ diff --git a/internal/api/web/assets/crossTransfer-Bp-zX7-B.js.gz b/internal/api/web/assets/crossTransfer-Bp-zX7-B.js.gz new file mode 100644 index 0000000..e41e060 Binary files /dev/null and b/internal/api/web/assets/crossTransfer-Bp-zX7-B.js.gz differ diff --git a/internal/api/web/assets/dist-C_apu3oB.js.gz b/internal/api/web/assets/dist-C_apu3oB.js.gz new file mode 100644 index 0000000..7ae8b61 Binary files /dev/null and b/internal/api/web/assets/dist-C_apu3oB.js.gz differ diff --git a/internal/api/web/assets/dist-hpO31Rsk.js.gz b/internal/api/web/assets/dist-hpO31Rsk.js.gz deleted file mode 100644 index a9ea2e7..0000000 Binary files a/internal/api/web/assets/dist-hpO31Rsk.js.gz and /dev/null differ diff --git a/internal/api/web/assets/errors-BIN1s1He.js.gz b/internal/api/web/assets/errors-BIN1s1He.js.gz deleted file mode 100644 index 9abe134..0000000 Binary files a/internal/api/web/assets/errors-BIN1s1He.js.gz and /dev/null differ diff --git a/internal/api/web/assets/errors-G3vO13UV.js.gz b/internal/api/web/assets/errors-G3vO13UV.js.gz new file mode 100644 index 0000000..e9b52d6 Binary files /dev/null and b/internal/api/web/assets/errors-G3vO13UV.js.gz differ diff --git a/internal/api/web/assets/fuse-CTsI5X0O.js.gz b/internal/api/web/assets/fuse-CTsI5X0O.js.gz new file mode 100644 index 0000000..fc5735c Binary files /dev/null and b/internal/api/web/assets/fuse-CTsI5X0O.js.gz differ diff --git a/internal/api/web/assets/fuse-E2RXVfxt.js.gz b/internal/api/web/assets/fuse-E2RXVfxt.js.gz deleted file mode 100644 index 939bde7..0000000 Binary files a/internal/api/web/assets/fuse-E2RXVfxt.js.gz and /dev/null differ diff --git a/internal/api/web/assets/index-C2vNdLPq.js.gz b/internal/api/web/assets/index-C2vNdLPq.js.gz deleted file mode 100644 index d4a0fcd..0000000 Binary files a/internal/api/web/assets/index-C2vNdLPq.js.gz and /dev/null differ diff --git a/internal/api/web/assets/index-CEZ1V13k.js.gz b/internal/api/web/assets/index-CEZ1V13k.js.gz new file mode 100644 index 0000000..bd9e22e Binary files /dev/null and b/internal/api/web/assets/index-CEZ1V13k.js.gz differ diff --git a/internal/api/web/assets/logs-DsTZ8mdS.js.gz b/internal/api/web/assets/logs-DsTZ8mdS.js.gz new file mode 100644 index 0000000..489731a Binary files /dev/null and b/internal/api/web/assets/logs-DsTZ8mdS.js.gz differ diff --git a/internal/api/web/assets/logs-YhKTA10T.js.gz b/internal/api/web/assets/logs-YhKTA10T.js.gz deleted file mode 100644 index fab9a03..0000000 Binary files a/internal/api/web/assets/logs-YhKTA10T.js.gz and /dev/null differ diff --git a/internal/api/web/assets/mediaOrganize-CLTEXlCn.js.gz b/internal/api/web/assets/mediaOrganize-CLTEXlCn.js.gz deleted file mode 100644 index 0b4b42f..0000000 Binary files a/internal/api/web/assets/mediaOrganize-CLTEXlCn.js.gz and /dev/null differ diff --git a/internal/api/web/assets/mediaOrganize-CZPyesCz.js.gz b/internal/api/web/assets/mediaOrganize-CZPyesCz.js.gz new file mode 100644 index 0000000..9c788f9 Binary files /dev/null and b/internal/api/web/assets/mediaOrganize-CZPyesCz.js.gz differ diff --git a/internal/api/web/assets/notifications-C-3hxmNy.js.gz b/internal/api/web/assets/notifications-C-3hxmNy.js.gz new file mode 100644 index 0000000..d06fd27 Binary files /dev/null and b/internal/api/web/assets/notifications-C-3hxmNy.js.gz differ diff --git a/internal/api/web/assets/notifications-DLIhmMkC.js.gz b/internal/api/web/assets/notifications-DLIhmMkC.js.gz deleted file mode 100644 index f186805..0000000 Binary files a/internal/api/web/assets/notifications-DLIhmMkC.js.gz and /dev/null differ diff --git a/internal/api/web/assets/prod-BcBSZtGQ.js.gz b/internal/api/web/assets/prod-BcBSZtGQ.js.gz deleted file mode 100644 index ef40dc0..0000000 Binary files a/internal/api/web/assets/prod-BcBSZtGQ.js.gz and /dev/null differ diff --git a/internal/api/web/assets/prod-BuCUZanj.js b/internal/api/web/assets/prod-BuCUZanj.js new file mode 100644 index 0000000..acfcdc3 --- /dev/null +++ b/internal/api/web/assets/prod-BuCUZanj.js @@ -0,0 +1 @@ +import{s as e}from"./prod-mVYChz01.js";export{e as parseText}; \ No newline at end of file diff --git a/internal/api/web/assets/prod-FFJODt1y.js b/internal/api/web/assets/prod-FFJODt1y.js deleted file mode 100644 index e9cd57a..0000000 --- a/internal/api/web/assets/prod-FFJODt1y.js +++ /dev/null @@ -1 +0,0 @@ -import{s as e}from"./prod-BcBSZtGQ.js";export{e as parseText}; \ No newline at end of file diff --git a/internal/api/web/assets/prod-mVYChz01.js.gz b/internal/api/web/assets/prod-mVYChz01.js.gz new file mode 100644 index 0000000..129e8aa Binary files /dev/null and b/internal/api/web/assets/prod-mVYChz01.js.gz differ diff --git a/internal/api/web/assets/srt-parser-D3bnUdIA.js.gz b/internal/api/web/assets/srt-parser-D3bnUdIA.js.gz deleted file mode 100644 index 3f5fb60..0000000 Binary files a/internal/api/web/assets/srt-parser-D3bnUdIA.js.gz and /dev/null differ diff --git a/internal/api/web/assets/srt-parser-_OWIIC3s.js.gz b/internal/api/web/assets/srt-parser-_OWIIC3s.js.gz new file mode 100644 index 0000000..ae132e0 Binary files /dev/null and b/internal/api/web/assets/srt-parser-_OWIIC3s.js.gz differ diff --git a/internal/api/web/assets/ssa-parser-BFNmRDV5.js.gz b/internal/api/web/assets/ssa-parser-BFNmRDV5.js.gz deleted file mode 100644 index e28ca89..0000000 Binary files a/internal/api/web/assets/ssa-parser-BFNmRDV5.js.gz and /dev/null differ diff --git a/internal/api/web/assets/ssa-parser-DJdZZv0y.js.gz b/internal/api/web/assets/ssa-parser-DJdZZv0y.js.gz new file mode 100644 index 0000000..62379f2 Binary files /dev/null and b/internal/api/web/assets/ssa-parser-DJdZZv0y.js.gz differ diff --git a/internal/api/web/assets/strm-BytLGCI-.js.gz b/internal/api/web/assets/strm-BytLGCI-.js.gz deleted file mode 100644 index f76bbd9..0000000 Binary files a/internal/api/web/assets/strm-BytLGCI-.js.gz and /dev/null differ diff --git a/internal/api/web/assets/strm-CcADeKku.js.gz b/internal/api/web/assets/strm-CcADeKku.js.gz new file mode 100644 index 0000000..a22d3e4 Binary files /dev/null and b/internal/api/web/assets/strm-CcADeKku.js.gz differ diff --git a/internal/api/web/assets/strmScrape-BQxabGoY.js.gz b/internal/api/web/assets/strmScrape-BQxabGoY.js.gz deleted file mode 100644 index dada54e..0000000 Binary files a/internal/api/web/assets/strmScrape-BQxabGoY.js.gz and /dev/null differ diff --git a/internal/api/web/assets/strmScrape-Bm_FFi7G.js.gz b/internal/api/web/assets/strmScrape-Bm_FFi7G.js.gz new file mode 100644 index 0000000..e694a12 Binary files /dev/null and b/internal/api/web/assets/strmScrape-Bm_FFi7G.js.gz differ diff --git a/internal/api/web/assets/useSectionTabRoute-BnDJWh_7.js.gz b/internal/api/web/assets/useSectionTabRoute-BnDJWh_7.js.gz new file mode 100644 index 0000000..20e8b89 Binary files /dev/null and b/internal/api/web/assets/useSectionTabRoute-BnDJWh_7.js.gz differ diff --git a/internal/api/web/assets/useSectionTabRoute-CQPFTux6.js.gz b/internal/api/web/assets/useSectionTabRoute-CQPFTux6.js.gz deleted file mode 100644 index c4cb843..0000000 Binary files a/internal/api/web/assets/useSectionTabRoute-CQPFTux6.js.gz and /dev/null differ diff --git a/internal/api/web/assets/useSettingsLoad-BXXfRF4J.js.gz b/internal/api/web/assets/useSettingsLoad-BXXfRF4J.js.gz new file mode 100644 index 0000000..b3c4ab3 Binary files /dev/null and b/internal/api/web/assets/useSettingsLoad-BXXfRF4J.js.gz differ diff --git a/internal/api/web/assets/useSettingsLoad-N-P9THeu.js.gz b/internal/api/web/assets/useSettingsLoad-N-P9THeu.js.gz deleted file mode 100644 index f1ba97b..0000000 Binary files a/internal/api/web/assets/useSettingsLoad-N-P9THeu.js.gz and /dev/null differ diff --git a/internal/api/web/assets/useSettingsPageDirty-ChYo-ebS.js.gz b/internal/api/web/assets/useSettingsPageDirty-ChYo-ebS.js.gz deleted file mode 100644 index 8b7fce2..0000000 Binary files a/internal/api/web/assets/useSettingsPageDirty-ChYo-ebS.js.gz and /dev/null differ diff --git a/internal/api/web/assets/useSettingsPageDirty-DizAAp4v.js.gz b/internal/api/web/assets/useSettingsPageDirty-DizAAp4v.js.gz new file mode 100644 index 0000000..e4d0249 Binary files /dev/null and b/internal/api/web/assets/useSettingsPageDirty-DizAAp4v.js.gz differ diff --git a/internal/api/web/assets/useStartupCountdown-5xCztbHs.js.gz b/internal/api/web/assets/useStartupCountdown-5xCztbHs.js.gz deleted file mode 100644 index 9243d80..0000000 Binary files a/internal/api/web/assets/useStartupCountdown-5xCztbHs.js.gz and /dev/null differ diff --git a/internal/api/web/assets/useStartupCountdown-p3aOkL9E.js.gz b/internal/api/web/assets/useStartupCountdown-p3aOkL9E.js.gz new file mode 100644 index 0000000..5c20caa Binary files /dev/null and b/internal/api/web/assets/useStartupCountdown-p3aOkL9E.js.gz differ diff --git a/internal/api/web/assets/useUnsavedChanges-DAljbLKI.js.gz b/internal/api/web/assets/useUnsavedChanges-DAljbLKI.js.gz new file mode 100644 index 0000000..0d02dc7 Binary files /dev/null and b/internal/api/web/assets/useUnsavedChanges-DAljbLKI.js.gz differ diff --git a/internal/api/web/assets/useUnsavedChanges-P2ZLrLN1.js.gz b/internal/api/web/assets/useUnsavedChanges-P2ZLrLN1.js.gz deleted file mode 100644 index bbf14fb..0000000 Binary files a/internal/api/web/assets/useUnsavedChanges-P2ZLrLN1.js.gz and /dev/null differ diff --git a/internal/api/web/assets/version-BfQvw10i.js.gz b/internal/api/web/assets/version-BfQvw10i.js.gz deleted file mode 100644 index 415e8d2..0000000 Binary files a/internal/api/web/assets/version-BfQvw10i.js.gz and /dev/null differ diff --git a/internal/api/web/assets/version-D5wfX8iN.js.gz b/internal/api/web/assets/version-D5wfX8iN.js.gz new file mode 100644 index 0000000..b4a9d73 Binary files /dev/null and b/internal/api/web/assets/version-D5wfX8iN.js.gz differ diff --git a/internal/api/web/index.html b/internal/api/web/index.html index 8e375ae..8f82f7b 100644 --- a/internal/api/web/index.html +++ b/internal/api/web/index.html @@ -5,7 +5,7 @@ LitePan - + diff --git a/internal/automation/service_run.go b/internal/automation/service_run.go index 958b1fb..c30f032 100644 --- a/internal/automation/service_run.go +++ b/internal/automation/service_run.go @@ -3,6 +3,8 @@ package automation import ( "context" "fmt" + "math" + "strconv" "strings" "time" @@ -256,24 +258,77 @@ func (s *Service) runOrganize(ctx context.Context, params map[string]any) map[st return map[string]any{"status": "failed", "success": false, "message": err.Error()} } summary := decodeMap(updated.LastRunResult) - failed := anyInt(summary["failed"]) - success := !updated.LastRunAt.IsZero() && !updated.LastRunAt.Before(startedAt.Add(-time.Second)) && failed == 0 && updated.Status != domain.MediaOrganizeStatusError - message := "整理任务执行完成" - if failed > 0 { - message = fmt.Sprintf("整理存在失败项:%d 个", failed) - } + fresh := !updated.LastRunAt.IsZero() && !updated.LastRunAt.Before(startedAt.Add(-time.Second)) + outcome := evaluateOrganizeAction(summary, params, fresh && updated.Status != domain.MediaOrganizeStatusError) return map[string]any{ - "status": ternaryStatus(success), - "success": success, - "message": message, + "status": ternaryStatus(outcome.success), + "success": outcome.success, + "message": outcome.message, "data": map[string]any{ - "task_id": task.ID, - "name": task.TaskName, - "summary": summary, + "task_id": task.ID, + "name": task.TaskName, + "summary": summary, + "risk_percent": outcome.riskPercent, + "max_risk_percent": outcome.maxRiskPercent, + "abnormal_skipped": outcome.abnormalSkipped, + "normal_skipped": outcome.normalSkipped, + "risk_total": outcome.riskTotal, }, } } +type organizeActionOutcome struct { + success bool + message string + riskPercent float64 + maxRiskPercent int + abnormalSkipped int + normalSkipped int + riskTotal int +} + +func evaluateOrganizeAction(summary, params map[string]any, runCompleted bool) organizeActionOutcome { + total := max(0, anyInt(summary["total"])) + failed := max(0, anyInt(summary["failed"])) + skipped := max(0, anyInt(summary["skipped"])) + normalSkipped := max(0, anyInt(summary["normal_skipped"])) + abnormalSkipped := skipped + if summary["abnormal_skipped"] != nil { + abnormalSkipped = max(0, anyInt(summary["abnormal_skipped"])) + } + riskTotal := max(0, total-normalSkipped) + maxRisk := 30 + if params["max_risk_percent"] != nil { + maxRisk = clampInt(anyInt(params["max_risk_percent"]), 0, 100) + } + risk := 0.0 + if riskTotal > 0 { + risk = math.Round(float64(failed+abnormalSkipped)/float64(riskTotal)*10000) / 100 + } + stopped, _ := summary["stopped"].(bool) + success := runCompleted && !stopped && failed == 0 && risk <= float64(maxRisk) + message := "整理完成,异常比例 " + strconv.FormatFloat(risk, 'f', -1, 64) + "%" + switch { + case !runCompleted: + message = "整理任务未正常完成" + case stopped: + message = "整理任务已停止" + case failed > 0: + message = fmt.Sprintf("整理存在失败项:%d 个", failed) + case risk > float64(maxRisk): + message = fmt.Sprintf("整理异常比例 %s%% 超过允许值 %d%%", strconv.FormatFloat(risk, 'f', -1, 64), maxRisk) + } + return organizeActionOutcome{ + success: success, + message: message, + riskPercent: risk, + maxRiskPercent: maxRisk, + abnormalSkipped: abnormalSkipped, + normalSkipped: normalSkipped, + riskTotal: riskTotal, + } +} + func (s *Service) runStrm(ctx context.Context, params map[string]any) map[string]any { taskID := int64(anyInt(params["task_id"])) if taskID <= 0 { diff --git a/internal/automation/service_test.go b/internal/automation/service_test.go index 8efee89..083d7ea 100644 --- a/internal/automation/service_test.go +++ b/internal/automation/service_test.go @@ -212,6 +212,79 @@ func TestStrmScrapeOutcome(t *testing.T) { } } +func TestEvaluateOrganizeAction(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + summary map[string]any + params map[string]any + completed bool + success bool + risk float64 + riskTotal int + messagePart string + }{ + { + name: "异常跳过未超过允许比例", + summary: map[string]any{ + "total": 10, "skipped": 4, "normal_skipped": 2, "abnormal_skipped": 2, + }, + params: map[string]any{"max_risk_percent": 30}, + completed: true, success: true, risk: 25, riskTotal: 8, + messagePart: "异常比例 25%", + }, + { + name: "异常跳过超过允许比例", + summary: map[string]any{ + "total": 10, "skipped": 4, "normal_skipped": 2, "abnormal_skipped": 3, + }, + params: map[string]any{"max_risk_percent": 30}, + completed: true, success: false, risk: 37.5, riskTotal: 8, + messagePart: "超过允许值 30%", + }, + { + name: "真实失败不受允许比例兜底", + summary: map[string]any{ + "total": 10, "failed": 1, + }, + params: map[string]any{"max_risk_percent": 100}, + completed: true, success: false, risk: 10, riskTotal: 10, + messagePart: "失败项:1 个", + }, + { + name: "旧结果缺少异常跳过时使用跳过数", + summary: map[string]any{ + "total": 3, "skipped": 1, + }, + params: map[string]any{}, + completed: true, success: false, risk: 33.33, riskTotal: 3, + messagePart: "超过允许值 30%", + }, + { + name: "任务停止始终失败", + summary: map[string]any{ + "total": 10, "stopped": true, + }, + params: map[string]any{}, + completed: true, success: false, risk: 0, riskTotal: 10, + messagePart: "已停止", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := evaluateOrganizeAction(tt.summary, tt.params, tt.completed) + if got.success != tt.success || got.riskPercent != tt.risk || got.riskTotal != tt.riskTotal { + t.Fatalf("结果 = success:%v risk:%v total:%d,期望 success:%v risk:%v total:%d", + got.success, got.riskPercent, got.riskTotal, tt.success, tt.risk, tt.riskTotal) + } + if !strings.Contains(got.message, tt.messagePart) { + t.Fatalf("消息 %q 不包含 %q", got.message, tt.messagePart) + } + }) + } +} + func TestValidateRuleChecksEveryOrganizeStrmCombination(t *testing.T) { t.Parallel() diff --git a/internal/cache/persist.go b/internal/cache/persist.go index 52dbfdf..8ae15dc 100644 --- a/internal/cache/persist.go +++ b/internal/cache/persist.go @@ -4,7 +4,6 @@ import ( "time" ) -// ConfigurePersistence 启停定时快照;dir 为数据目录下的 cache 子目录。 func (s *Service) ConfigurePersistence(enabled bool, dir string, interval time.Duration) { if interval < time.Minute { interval = time.Minute @@ -13,6 +12,7 @@ func (s *Service) ConfigurePersistence(enabled bool, dir string, interval time.D s.persistMu.Lock() defer s.persistMu.Unlock() + changed := s.persistDir != dir || s.persistInterval != interval s.persistDir = dir s.persistEnabled = enabled s.persistInterval = interval @@ -22,7 +22,10 @@ func (s *Service) ConfigurePersistence(enabled bool, dir string, interval time.D return } if s.persistStop != nil { - return + if !changed { + return + } + s.stopPersistenceLocked() } stop := make(chan struct{}) s.persistStop = stop @@ -37,7 +40,6 @@ func (s *Service) stopPersistenceLocked() { s.persistStop = nil } -// persistLoop 接收自身的 stop 通道,避免与 stopPersistenceLocked 写 s.persistStop 竞争。 func (s *Service) persistLoop(stop chan struct{}) { s.persistMu.Lock() interval := s.persistInterval diff --git a/internal/mediaorganize/config_helpers.go b/internal/mediaorganize/config_helpers.go index c61ad38..e10d686 100644 --- a/internal/mediaorganize/config_helpers.go +++ b/internal/mediaorganize/config_helpers.go @@ -41,7 +41,6 @@ func PlannerSettingsFromAPI(settings map[string]any) map[string]any { return out } -// EnrichPlannerSettings 以 settings.Service 为准补齐 planner 所需 mo_* 键,避免 map 转换遗漏。 func EnrichPlannerSettings(svc *settings.Service, api map[string]any) map[string]any { out := PlannerSettingsFromAPI(api) if svc == nil { @@ -59,7 +58,6 @@ func EnrichPlannerSettings(svc *settings.Service, api map[string]any) map[string } out["mo_api_request_interval_ms"] = svc.Int(settings.KeyMOAPIRequestIntervalMS) out["mo_tmdb_request_interval_ms"] = svc.Int(settings.KeyMOTmdbRequestIntervalMS) - out["mo_min_confidence_threshold"] = svc.String(settings.KeyMOMinConfidenceThreshold) out["mo_file_extensions"] = svc.String(settings.KeyMOFileExtensions) out["mo_metadata_extensions"] = svc.String(settings.KeyMOMetadataExtensions) out["mo_media_tag_order"] = svc.String(settings.KeyMOMediaTagOrder) diff --git a/internal/mediaorganize/planner/export_test.go b/internal/mediaorganize/planner/export_test.go index 5ca8b18..8c6a3de 100644 --- a/internal/mediaorganize/planner/export_test.go +++ b/internal/mediaorganize/planner/export_test.go @@ -6,18 +6,15 @@ import ( "litepan/internal/mediaorganize/rules" ) -// DetectSameWorkDirConflicts 暴露冲突合并逻辑供单测使用。 func DetectSameWorkDirConflicts(p *Planner) { p.detectSameWorkDirConflicts() } -// BatchEntryForTest 是 batchEntry 的测试导出形态。 type BatchEntryForTest struct { Item domain.FileItem Ancestors []rules.Ancestor } -// GroupEntriesForTestExport 暴露分组逻辑供单测使用。 func GroupEntriesForTestExport(p *Planner, entries []BatchEntryForTest) (map[GroupKeyForTest]int, []PendingSkipForTest) { internal := make([]batchEntry, len(entries)) for i, e := range entries { @@ -41,7 +38,6 @@ func GroupEntriesForTestExport(p *Planner, entries []BatchEntryForTest) (map[Gro return out, pendingOut } -// GroupKeyForTest 导出分组键供断言。 type GroupKeyForTest struct { MediaKind string DirID string @@ -50,22 +46,27 @@ type GroupKeyForTest struct { Year *int } -// PendingSkipForTest 导出跳过项供断言。 type PendingSkipForTest struct { Reason string } -// SetActions 供单测注入动作列表。 func (p *Planner) SetActions(actions []moplan.PlanAction) { p.actions = append([]moplan.PlanAction(nil), actions...) } -// Actions 返回当前动作列表。 func (p *Planner) Actions() []moplan.PlanAction { return append([]moplan.PlanAction(nil), p.actions...) } -// SetScannedDirNames 供单测注入目录名索引。 +func ExtensionEnabledForTest(p *Planner, extension string, metadata bool) bool { + extensions := p.mediaExts + if metadata { + extensions = p.metaExts + } + _, ok := extensions[extension] + return ok +} + func (p *Planner) SetScannedDirNames(names map[string]string) { for k, v := range names { p.scannedDirNames[k] = v diff --git a/internal/mediaorganize/planner/planner.go b/internal/mediaorganize/planner/planner.go index ff3262e..916b70a 100644 --- a/internal/mediaorganize/planner/planner.go +++ b/internal/mediaorganize/planner/planner.go @@ -103,25 +103,21 @@ func New( } func (p *Planner) loadSettings() { - extText := p.cfg.FileExtensions - if extText == "" { - extText = strSetting(p.settings, "mo_file_extensions", rules.DefaultMediaExtensions) - } - metaText := p.cfg.MetadataExtensions - if metaText == "" { - metaText = strSetting(p.settings, "mo_metadata_extensions", rules.DefaultMetadataExtensions) - } + extText := extensionSetting(p.settings, "mo_file_extensions", p.cfg.FileExtensions, rules.DefaultMediaExtensions) + metaText := extensionSetting(p.settings, "mo_metadata_extensions", p.cfg.MetadataExtensions, rules.DefaultMetadataExtensions) p.mediaExts = rules.ParseExtensionSet(extText) p.metaExts = rules.ParseExtensionSet(metaText) tagOrderRaw := strSetting(p.settings, "mo_media_tag_order", "") + tagOrderConfigured := false if tagOrderRaw != "" { var order []string - if err := json.Unmarshal([]byte(tagOrderRaw), &order); err == nil && len(order) > 0 { + if err := json.Unmarshal([]byte(tagOrderRaw), &order); err == nil { p.mediaTagOrder = order + tagOrderConfigured = true } } - if len(p.mediaTagOrder) == 0 { + if !tagOrderConfigured { p.mediaTagOrder = rules.DefaultMediaTagOrder } p.alignMediaTags = rules.SettingBool(p.settings["mo_align_media_tags"], false) @@ -167,6 +163,19 @@ func (p *Planner) loadSettings() { } } +func extensionSetting(settings Settings, key, taskValue, fallback string) string { + if raw, ok := settings[key]; ok { + if value := strings.TrimSpace(fmt.Sprint(raw)); value != "" { + return value + } + return fallback + } + if value := strings.TrimSpace(taskValue); value != "" { + return value + } + return fallback +} + func strSetting(settings Settings, key, fallback string) string { if v, ok := settings[key]; ok { if s := strings.TrimSpace(fmt.Sprint(v)); s != "" { diff --git a/internal/mediaorganize/planner/planner_test.go b/internal/mediaorganize/planner/planner_test.go index 2639d04..352eefa 100644 --- a/internal/mediaorganize/planner/planner_test.go +++ b/internal/mediaorganize/planner/planner_test.go @@ -162,6 +162,75 @@ func newTestPlanner(fs *mockFS, tmdb planner.TMDBClient, rootID string) *planner ) } +func TestGlobalExtensionsOverrideTaskSnapshot(t *testing.T) { + p := planner.New( + context.Background(), + nil, + 1, + planner.TaskConfig{ + FileExtensions: rules.DefaultMediaExtensions, + MetadataExtensions: rules.DefaultMetadataExtensions, + }, + planner.Settings{ + "mo_file_extensions": rules.DefaultMediaExtensions + ";vob", + "mo_metadata_extensions": rules.DefaultMetadataExtensions + ";xml", + }, + "task-test", + nil, + nil, + nil, + nil, + ) + if !planner.ExtensionEnabledForTest(p, "vob", false) { + t.Fatal("全局媒体后缀新增 vob 后应立即生效") + } + if !planner.ExtensionEnabledForTest(p, "xml", true) { + t.Fatal("全局元数据后缀新增 xml 后应立即生效") + } +} + +func TestEmptyMediaTagOrderDoesNotRestoreDefaultTags(t *testing.T) { + fs := &mockFS{dirs: map[string][]domain.FileItem{ + "root": {{ + ID: "f1", + Name: "千与千寻.2001.2160p.H265.AAC.mkv", + }}, + }} + p := planner.New( + context.Background(), + fs, + 1, + planner.TaskConfig{ + TargetDirectoryID: "root", + ActionType: "rename", + MediaType: "movie", + RenameMarker: "off", + UseTMDB: false, + Recursive: true, + }, + planner.Settings{"mo_media_tag_order": "[]"}, + "task-test", + nil, + func(string) {}, + nil, + func() error { return nil }, + ) + plan, err := p.Build() + if err != nil { + t.Fatal(err) + } + for _, action := range plan.Actions { + if action.SourceID != "f1" { + continue + } + if strings.Contains(action.TargetName, "[") || strings.Contains(action.TargetName, "]") { + t.Fatalf("媒体标签全部关闭后文件名不应包含方括号,实际 %q", action.TargetName) + } + return + } + t.Fatalf("未生成文件整理动作: actions=%+v skipped=%+v", plan.Actions, plan.Skipped) +} + func TestGroupSpiritedAwayDirs(t *testing.T) { dirA := "千与千寻 蓝光原盘REMUX 国日双音 内封简日字幕" dirB := "[4K][DBD-Raws&诸神字幕组][千与千寻][2160P][BDRip][简繁中日内封][FLAC]" diff --git a/internal/mediaorganize/rules/helpers.go b/internal/mediaorganize/rules/helpers.go index 7fcbb59..89d4e8e 100644 --- a/internal/mediaorganize/rules/helpers.go +++ b/internal/mediaorganize/rules/helpers.go @@ -86,6 +86,8 @@ func ParseExtensionSet(text string) map[string]struct{} { out := make(map[string]struct{}) for _, part := range strings.Split(text, ";") { part = strings.TrimSpace(strings.ToLower(part)) + part = strings.TrimPrefix(part, "*.") + part = strings.TrimLeft(part, ".") if part != "" { out[part] = struct{}{} } diff --git a/internal/mediaorganize/rules/review_fixes_test.go b/internal/mediaorganize/rules/review_fixes_test.go index d471026..b304f6b 100644 --- a/internal/mediaorganize/rules/review_fixes_test.go +++ b/internal/mediaorganize/rules/review_fixes_test.go @@ -31,6 +31,15 @@ func TestBareNumericGuard(t *testing.T) { } } +func TestParseExtensionSetAcceptsCommonForms(t *testing.T) { + extensions := ParseExtensionSet("vob;.VOB;*.MKV") + for _, extension := range []string{"vob", "mkv"} { + if _, ok := extensions[extension]; !ok { + t.Fatalf("后缀 %q 未被识别:%v", extension, extensions) + } + } +} + func TestBracketEpisodeNonAnime(t *testing.T) { got := NormalizeParsedMedia(ParseFilenameStrict("Breaking.Bad.[01].mkv")) if got.Episode == nil || *got.Episode != 1 { diff --git a/internal/mediaorganize/rules/tags.go b/internal/mediaorganize/rules/tags.go index 4c56212..a3f4691 100644 --- a/internal/mediaorganize/rules/tags.go +++ b/internal/mediaorganize/rules/tags.go @@ -159,7 +159,7 @@ func MergeAlignedMediaTags(parsed ParsedMedia, defaults map[string]any) ParsedMe func BuildMediaInfoTags(parsed ParsedMedia, tagOrder []string) string { if len(tagOrder) == 0 { - tagOrder = DefaultMediaTagOrder + return "" } m := parsed.ToMap() parts := make([]string, 0, len(tagOrder)) diff --git a/internal/mediaorganize/settings.go b/internal/mediaorganize/settings.go index 5341bfa..5e2fc9a 100644 --- a/internal/mediaorganize/settings.go +++ b/internal/mediaorganize/settings.go @@ -20,7 +20,6 @@ var moSettingFieldToKey = map[string]string{ "tmdb_language": settings.KeyMOTmdbLanguage, "api_request_interval_ms": settings.KeyMOAPIRequestIntervalMS, "tmdb_request_interval_ms": settings.KeyMOTmdbRequestIntervalMS, - "min_confidence_threshold": settings.KeyMOMinConfidenceThreshold, "file_extensions": settings.KeyMOFileExtensions, "metadata_extensions": settings.KeyMOMetadataExtensions, "media_tag_order": settings.KeyMOMediaTagOrder, @@ -118,6 +117,9 @@ func parseMediaTagOrder(raw any) (json.RawMessage, error) { default: return nil, fmt.Errorf("media_tag_order 格式无效") } + if len(items) == 0 { + return json.RawMessage("[]"), nil + } filtered := make([]string, 0, len(items)) for _, key := range items { if _, ok := validMediaTagKeys[key]; ok { diff --git a/internal/mediaorganize/task_defaults.go b/internal/mediaorganize/task_defaults.go index 0b2d262..4a41181 100644 --- a/internal/mediaorganize/task_defaults.go +++ b/internal/mediaorganize/task_defaults.go @@ -6,15 +6,11 @@ func NormalizeTaskConfig(config map[string]any) map[string]any { "account_id": "", "target_directory": "", "target_directory_id": "", - "file_extensions": "mkv;mp4;avi;ts;mov;wmv;iso;m2ts;rmvb;flv;m4v;webm", - "metadata_extensions": "nfo;ass;ssa;srt;sub;idx;sup;vtt;jpg;jpeg;png;webp;bmp", "action_type": "move", "target_root": "", "target_root_id": "", "media_type": "auto", "rename_marker": "", - "movie_template": "{title} ({year}) {tmdb-{tmdb_id}} [{video_info}]", - "episode_template": "{title} ({year}) {tmdb-{tmdb_id}} S{season:02d}E{episode:02d} [{video_info}]", "season_folder_template": "Season {season:02d}", "use_tmdb": true, "overwrite_existing": false, diff --git a/internal/settings/registry.go b/internal/settings/registry.go index 75f4424..1fdfa63 100644 --- a/internal/settings/registry.go +++ b/internal/settings/registry.go @@ -45,21 +45,20 @@ const ( KeyStrmMetadataSyncMode = "strm_metadata_sync_mode" KeyStrmScrapeWriteMode = "strm_scrape_write_mode" - KeyMOProxyEnabled = "mo_proxy_enabled" - KeyMOProxyURL = "mo_proxy_url" - KeyMOProxyUsername = "mo_proxy_username" - KeyMOProxyPassword = "mo_proxy_password" - KeyMOTmdbAPIKey = "mo_tmdb_api_key" - KeyMOTmdbLanguage = "mo_tmdb_language" - KeyMOAPIRequestIntervalMS = "mo_api_request_interval_ms" - KeyMOTmdbRequestIntervalMS = "mo_tmdb_request_interval_ms" - KeyMOMinConfidenceThreshold = "mo_min_confidence_threshold" - KeyMOFileExtensions = "mo_file_extensions" - KeyMOMetadataExtensions = "mo_metadata_extensions" - KeyMOMediaTagOrder = "mo_media_tag_order" - KeyMOAlignMediaTags = "mo_align_media_tags" - KeyMOMaxWorksPerRun = "mo_max_works_per_run" - KeyMOOverwriteExisting = "mo_overwrite_existing" + KeyMOProxyEnabled = "mo_proxy_enabled" + KeyMOProxyURL = "mo_proxy_url" + KeyMOProxyUsername = "mo_proxy_username" + KeyMOProxyPassword = "mo_proxy_password" + KeyMOTmdbAPIKey = "mo_tmdb_api_key" + KeyMOTmdbLanguage = "mo_tmdb_language" + KeyMOAPIRequestIntervalMS = "mo_api_request_interval_ms" + KeyMOTmdbRequestIntervalMS = "mo_tmdb_request_interval_ms" + KeyMOFileExtensions = "mo_file_extensions" + KeyMOMetadataExtensions = "mo_metadata_extensions" + KeyMOMediaTagOrder = "mo_media_tag_order" + KeyMOAlignMediaTags = "mo_align_media_tags" + KeyMOMaxWorksPerRun = "mo_max_works_per_run" + KeyMOOverwriteExisting = "mo_overwrite_existing" ) // Type 决定后台表单控件与校验方式。 @@ -168,7 +167,7 @@ func defaultSpecs() []Spec { Type: TypeInt, Category: "performance", Label: "持久化快照间隔", - Description: "缓存写入磁盘的间隔,修改后需重启服务生效。", + Description: "缓存写入磁盘的间隔,修改后立即生效。", Default: "10", Unit: "分钟", Min: intp(1), @@ -534,14 +533,6 @@ func defaultSpecs() []Spec { Min: intp(100), Max: intp(5000), }, - { - Key: KeyMOMinConfidenceThreshold, - Type: TypeString, - Category: "media_organize", - Label: "最低置信度阈值", - Description: "低于该置信度的匹配结果将被跳过,范围 0.1–1.0。", - Default: "0.5", - }, { Key: KeyMOFileExtensions, Type: TypeString, diff --git a/internal/strm/service_schedule.go b/internal/strm/service_schedule.go index e7d90c0..5109aa5 100644 --- a/internal/strm/service_schedule.go +++ b/internal/strm/service_schedule.go @@ -95,8 +95,9 @@ func (s *Service) runTaskAsync(task *domain.StrmTask) { if !ok { return } + taskConcurrency := s.settings.Int(settings.KeyStrmTaskConcurrency) s.mu.Lock() - if s.running[task.ID] { + if !s.canStartTaskLocked(task, taskConcurrency) { s.mu.Unlock() releaseFiles() return @@ -210,6 +211,14 @@ func (s *Service) runTaskAsync(task *domain.StrmTask) { }() } +func (s *Service) canStartTaskLocked(task *domain.StrmTask, taskConcurrency int) bool { + if task == nil || s.running[task.ID] || len(s.running) >= taskConcurrency { + return false + } + _, accountRunning := s.runningAccounts[task.AccountID] + return task.AccountID <= 0 || !accountRunning +} + func taskRunContext(parent context.Context) (context.Context, context.CancelFunc) { if parent == nil { parent = context.Background() diff --git a/internal/strm/service_schedule_test.go b/internal/strm/service_schedule_test.go index dde7a6e..fba9ffa 100644 --- a/internal/strm/service_schedule_test.go +++ b/internal/strm/service_schedule_test.go @@ -92,3 +92,23 @@ func TestTaskRunContextHasNoFixedDeadline(t *testing.T) { t.Fatalf("取消任务后错误 = %v,期望 context.Canceled", ctx.Err()) } } + +func TestTaskStartLimitMatchesLegacyScheduler(t *testing.T) { + svc, _ := testService(t) + + svc.mu.Lock() + svc.running[1] = true + svc.runningAccounts[7] = struct{}{} + if svc.canStartTaskLocked(&domain.StrmTask{ID: 2, AccountID: 7}, 3) { + t.Fatal("同一账号的 STRM 任务应串行") + } + if !svc.canStartTaskLocked(&domain.StrmTask{ID: 2, AccountID: 8}, 3) { + t.Fatal("不同账号且未达到全局上限时应允许并发") + } + svc.running[2] = true + svc.running[3] = true + if svc.canStartTaskLocked(&domain.StrmTask{ID: 4, AccountID: 9}, 3) { + t.Fatal("达到全局任务并发上限后应等待") + } + svc.mu.Unlock() +} diff --git a/web/src/api/mediaOrganize.ts b/web/src/api/mediaOrganize.ts index f66e226..a7df255 100644 --- a/web/src/api/mediaOrganize.ts +++ b/web/src/api/mediaOrganize.ts @@ -88,7 +88,6 @@ export interface MediaOrganizeSettings { tmdb_language: string; api_request_interval_ms: number; tmdb_request_interval_ms: number; - min_confidence_threshold: number; file_extensions: string; metadata_extensions: string; media_tag_order: string[] | string; diff --git a/web/src/components/admin/MediaOrganizeSettings.vue b/web/src/components/admin/MediaOrganizeSettings.vue index efd1ac8..6950c99 100644 --- a/web/src/components/admin/MediaOrganizeSettings.vue +++ b/web/src/components/admin/MediaOrganizeSettings.vue @@ -89,7 +89,6 @@ const { tmdb_language: "zh-CN", api_request_interval_ms: 300, tmdb_request_interval_ms: 250, - min_confidence_threshold: 0, file_extensions: "", metadata_extensions: "", media_tag_order: "", diff --git a/web/src/components/admin/StrmSettingsPanel.vue b/web/src/components/admin/StrmSettingsPanel.vue index 69c6504..63d50e9 100644 --- a/web/src/components/admin/StrmSettingsPanel.vue +++ b/web/src/components/admin/StrmSettingsPanel.vue @@ -38,6 +38,7 @@ type StrmSettingsForm = Pick< | "iso_filename_enabled" | "min_file_size_mb" | "conflict_policy" + | "task_concurrency" | "metadata_extensions" | "metadata_max_size_mb" | "metadata_parent_enabled" @@ -51,6 +52,7 @@ const replacingBaseURL = ref(false); const numericSettingKeys = new Set([ "default_scan_interval", "min_file_size_mb", + "task_concurrency", "metadata_max_size_mb", ]); @@ -70,6 +72,7 @@ const { iso_filename_enabled: false, min_file_size_mb: 0, conflict_policy: "size_desc", + task_concurrency: 3, metadata_extensions: "", metadata_max_size_mb: 10, metadata_parent_enabled: true, @@ -92,7 +95,7 @@ const metadataSyncModeOptions = [ { value: "bidirectional", label: "本地与云端互补" }, ]; -function setNumberSetting(key: "min_file_size_mb" | "metadata_max_size_mb", raw: string) { +function setNumberSetting(key: "min_file_size_mb" | "task_concurrency" | "metadata_max_size_mb", raw: string) { settings[key] = parseSettingNumber(raw); } @@ -113,6 +116,7 @@ function applySettings(data: Awaited>) { iso_filename_enabled: !!data.iso_filename_enabled, min_file_size_mb: parseSettingNumber(data.min_file_size_mb), conflict_policy: data.conflict_policy || "size_desc", + task_concurrency: parseSettingNumber(data.task_concurrency) || 3, metadata_extensions: data.metadata_extensions ?? "", metadata_max_size_mb: parseSettingNumber(data.metadata_max_size_mb) || 10, metadata_parent_enabled: !!data.metadata_parent_enabled, @@ -149,6 +153,7 @@ async function saveSettings() { iso_filename_enabled: settings.iso_filename_enabled, min_file_size_mb: settings.min_file_size_mb, conflict_policy: settings.conflict_policy, + task_concurrency: settings.task_concurrency, metadata_extensions: settings.metadata_extensions, metadata_max_size_mb: settings.metadata_max_size_mb, metadata_parent_enabled: settings.metadata_parent_enabled, @@ -296,6 +301,27 @@ defineExpose( + + + + +