├── .gitignore ├── LICENSE ├── README.md ├── TOTP-Extension-v1.1.zip ├── TOTP-Extension-v1.2.zip ├── TOTP ├── background.js ├── content.js ├── generate_icons.js ├── icon_generator.html ├── icons │ ├── icon128.png │ ├── icon16.png │ └── icon48.png ├── manifest.json ├── options.css ├── options.html ├── options.js ├── popup.css ├── popup.html └── popup.js ├── icons ├── 1hardlink.png ├── 2fa.png ├── GroupChat.png ├── clean.png ├── clean1.png ├── fengchao.png ├── fnos.ico ├── hardlink.png ├── lemon.ico ├── manager.png ├── nexusinvitee.png └── nodeseeksign.png ├── package.json └── plugins ├── fengchaoinvite └── __init__.py ├── fengchaosignin └── __init__.py ├── fnossign ├── README.md ├── __init__.py └── requirements.txt ├── lemonshengyou ├── README.md ├── __init__.py └── requirements.txt ├── logsclean ├── __init__.py └── dist │ ├── assets │ ├── __federation_expose_Config-Cz4Zx2k7.css │ ├── __federation_expose_Config-DEahhRyd.js │ ├── __federation_expose_Dashboard-DzY_5vpv.css │ ├── __federation_expose_Dashboard-iJL_Safg.js │ ├── __federation_expose_Page-CFAOoSNg.js │ ├── __federation_expose_Page-CameGtjZ.css │ ├── __federation_fn_import-JrT3xvdd.js │ ├── __federation_shared_vuetify │ │ └── styles-CZ3C7oSZ.css │ ├── _plugin-vue_export-helper-pcqpp-6-.js │ ├── date-BMtbN87Q.js │ ├── index-B4QZ3I7V.css │ ├── index-CKnbQJB6.js │ └── remoteEntry.js │ └── index.html ├── nexusinvitee ├── README.md ├── __init__.py ├── data.py ├── module_loader.py ├── sites │ ├── __init__.py │ ├── butterfly.py │ ├── hdkylin.py │ ├── hhclub.py │ ├── mteam.py │ ├── nexusphp.py │ └── xiangdao.py └── utils.py ├── nodeseeksign ├── __init__.py └── requirements.txt ├── p1115strmhelper ├── __init__.py ├── dist │ ├── assets │ │ ├── __federation_expose_Config-Bs1x_wA9.css │ │ ├── __federation_expose_Config-Cw1HugOP.js │ │ ├── __federation_expose_Dashboard-BUpqH6KU.js │ │ ├── __federation_expose_Dashboard-C73T-doO.css │ │ ├── __federation_expose_Page-DOiUhroR.js │ │ ├── __federation_expose_Page-O0BRGvQ0.css │ │ ├── __federation_fn_import-JrT3xvdd.js │ │ ├── __federation_shared_vuetify │ │ │ └── styles-CZ3C7oSZ.css │ │ ├── _plugin-vue_export-helper-pcqpp-6-.js │ │ ├── date-9FO_BIsj.js │ │ ├── index-A2g8oXBF.js │ │ ├── index-B35ggjA6.css │ │ └── remoteEntry.js │ └── index.html └── requirements.txt ├── pluginmanagervue ├── __init__.py └── dist │ ├── assets │ ├── __federation_expose_Page-CEUe4Ddt.js │ ├── __federation_expose_Page-GreQ8Kl5.css │ ├── __federation_fn_import-JrT3xvdd.js │ ├── __federation_shared_vuetify │ │ └── styles-CZ3C7oSZ.css │ ├── date-CPBRTuSz.js │ ├── index-B8nVXn33.js │ ├── index-C9FZDa_5.css │ └── remoteEntry.js │ └── index.html ├── smarthardlink └── __init__.py ├── trashclean ├── __init__.py └── dist │ ├── assets │ ├── Config-9f79c6ea.css │ ├── Dashboard-a2f1da0f.css │ ├── Page-0402d23b.css │ ├── __federation_expose_Config-f5e3c41a.js │ ├── __federation_expose_Dashboard-e8365cec.js │ ├── __federation_expose_Page-59789d8c.js │ ├── __federation_fn_import-054b33c3.js │ ├── _plugin-vue_export-helper-c4c0bc37.js │ ├── date-1a9a1148.js │ ├── index-7a81b9ad.css │ ├── index-aedc4433.js │ ├── main-e092a7b0.css │ ├── materialdesignicons-webfont-0b183104.eot │ ├── materialdesignicons-webfont-61e8aba5.ttf │ ├── materialdesignicons-webfont-662fefa8.woff2 │ ├── materialdesignicons-webfont-a5928a0d.woff │ └── remoteEntry.js │ └── index.html └── twofahelper ├── README.md └── __init__.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | *.so 6 | .Python 7 | build/ 8 | develop-eggs/ 9 | downloads/ 10 | eggs/ 11 | .eggs/ 12 | lib/ 13 | lib64/ 14 | parts/ 15 | sdist/ 16 | var/ 17 | wheels/ 18 | *.egg-info/ 19 | .installed.cfg 20 | *.egg 21 | 22 | # Virtual Environment 23 | venv/ 24 | env/ 25 | ENV/ 26 | 27 | # IDE 28 | .idea/ 29 | .vscode/ 30 | *.swp 31 | *.swo 32 | 33 | # Logs 34 | *.log 35 | 36 | # Local development settings 37 | .env 38 | .env.local 39 | 40 | # Plugin specific 41 | plugins/*/history.json 42 | 43 | # OS 44 | .DS_Store 45 | Thumbs.db -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 madrays 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MoviePilot-Plugins 2 | 3 | 这是一个MoviePilot的**第三方插件库**,提供签到相关功能扩展。 4 | 5 | ## 插件列表 6 | 7 | ### 两步验证助手 (twofahelper) 8 | - 生成TOTP两步验证码,无需手动输入 9 | - 配套浏览器扩展实现自动弹出验证码 10 | - 支持多站点验证码管理 11 | - 支持站点图标显示 12 | - 验证码30秒自动刷新 13 | - 支持一键复制验证码 14 | 15 | ### 飞牛论坛签到插件 (fnossign) 16 | - 支持飞牛论坛每日自动签到 17 | - 支持手动触发签到 18 | - 签到状态显示和历史记录 19 | - 签到结果通知 20 | - 定时签到功能 21 | - 签到失败自动重试 22 | - 积分信息自动获取 23 | 24 | ### 柠檬站点神游插件 (lemonshengyou) 25 | - 支持柠檬站点每日自动神游 26 | - 支持手动触发神游 27 | - 自动识别用户奖励记录 28 | - 神游结果通知 29 | - 定时神游功能 30 | - 神游失败自动重试 31 | - 奖励信息自动获取 32 | 33 | ### 后宫管理系统 (nexusinvitee) 34 | - 支持多站点后宫(邀请系统)集中管理 35 | - 自动获取邀请名额和已邀请用户状态 36 | - 监控用户分享率健康状况 37 | - 检测禁用账号和低分享率用户 38 | - 定时自动刷新数据,支持手动刷新 39 | - 美观的数据展示界面 40 | - 适配多种NexusPHP站点结构 41 | 42 | ### NodeSeek论坛签到插件 (nodeseeksign) 43 | - 支持NodeSeek论坛每日自动签到 44 | - 支持选择随机奖励或固定奖励 45 | - 自动给热门帖子加鸡腿(可配置) 46 | - 签到状态显示和历史记录 47 | - 签到结果通知 48 | - 定时签到功能 49 | - 支持绕过CloudFlare防护 50 | 51 | ### 蜂巢论坛签到插件(fengchaosignin) 52 | - 自动完成蜂巢论坛签到,支持历史记录 53 | 54 | ## 安装说明 55 | 56 | **本仓库为第三方插件库,需在MoviePilot中添加仓库地址使用** 57 | 58 | 1. 在MoviePilot的插件商店页面,点击"添加第三方仓库" 59 | 2. 添加本仓库地址:`https://github.com/madrays/MoviePilot-Plugins` 60 | 3. 添加成功后,在插件列表中找到需要的插件 61 | 4. 安装并启用插件 62 | 5. 根据下方说明配置插件参数 63 | 64 | ## 使用说明 65 | 66 | ### 两步验证助手 67 | 1. 安装MP插件后,下载并安装浏览器扩展 68 | 2. 浏览器扩展用于添加和管理TOTP站点配置 69 | 3. MP插件负责生成验证码,浏览器扩展负责显示和填写 70 | 4. 无需手动输入API或其他复杂配置 71 | 5. 详细说明请查看[TOTP浏览器扩展说明](#totp浏览器扩展说明) 72 | 73 | ### 飞牛论坛签到插件 74 | 1. 获取Cookie:登录飞牛论坛后,按F12打开开发者工具,在网络或应用程序选项卡中复制Cookie 75 | 2. 在插件设置中填入Cookie 76 | 3. 设置签到时间(推荐早上8点,cron表达式:`0 8 * * *`) 77 | 4. 启用插件并保存 78 | 79 | ### 柠檬站点神游插件 80 | 1. 确保已在MoviePilot中添加并配置好柠檬站点 81 | 2. 在插件设置中选择要进行神游的柠檬站点 82 | 3. 设置神游时间(推荐早上8点,cron表达式:`0 8 * * *`) 83 | 4. 可选择开启通知,在神游后收到结果通知 84 | 5. 启用插件并保存 85 | 86 | ### 后宫管理系统 87 | 1. 确保已在MoviePilot中添加并配置好需要管理的NexusPHP站点 88 | 2. 在插件设置中选择要管理的站点(可多选) 89 | 3. 设置数据刷新频率(推荐早上8点,cron表达式:`0 8 * * *`) 90 | 4. 可选择是否在启动时立即刷新数据 91 | 5. 启用插件并保存 92 | 6. 在插件页面查看后宫数据统计和详情 93 | 94 | ### NodeSeek论坛签到插件 95 | 1. 获取Cookie:登录NodeSeek论坛后,按F12打开开发者工具,在网络或应用程序选项卡中复制Cookie 96 | 2. 在插件设置中填入Cookie 97 | 3. 配置签到选项: 98 | - 随机奖励:开启则使用随机奖励,关闭则使用固定奖励 99 | - 自动加鸡腿:自动给热门帖子加鸡腿 100 | - 使用代理:如果需要通过代理访问NodeSeek,请开启此选项 101 | 4. 设置签到时间(推荐早上8点,cron表达式:`0 8 * * *`) 102 | 5. 启用插件并保存 103 | 6. 在插件页面可查看签到历史记录 104 | 105 | ### 蜂巢论坛签到插件 106 | 1. 获取Cookie:登录蜂巢论坛后,按F12打开开发者工具,在网络或应用程序选项卡中复制Cookie 107 | 2. 在插件设置中填入Cookie 108 | 3. 设置签到时间(推荐早上8点,cron表达式:`0 8 * * *`) 109 | 4. 启用插件并保存 110 | 111 | ## TOTP浏览器扩展说明 112 | 113 | TOTP两步验证助手需要配合浏览器扩展使用: 114 | 115 | 1. 下载浏览器扩展:[下载链接](https://github.com/madrays/MoviePilot-Plugins/raw/main/TOTP-Extension.zip) 116 | 2. 解压下载的文件 117 | 3. 在浏览器的扩展管理页面中选择"加载已解压的扩展程序" 118 | 4. 选择解压后的文件夹 119 | 5. 扩展安装完成后,点击浏览器扩展图标进入设置 120 | 6. 添加站点和密钥信息 121 | 7. 浏览扩展会自动从MoviePilot获取验证码并在需要时弹出 122 | 123 | ## 许可证 124 | 125 | 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 -------------------------------------------------------------------------------- /TOTP-Extension-v1.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/TOTP-Extension-v1.1.zip -------------------------------------------------------------------------------- /TOTP-Extension-v1.2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/TOTP-Extension-v1.2.zip -------------------------------------------------------------------------------- /TOTP/background.js: -------------------------------------------------------------------------------- 1 | // 简化版background.js - 只保留核心功能,移除所有Service Worker和缓存机制 2 | 3 | // 监听来自插件页面和content script的消息 4 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 5 | console.log('收到消息:', message); 6 | 7 | // 处理对象类型的消息 8 | if (typeof message === 'object') { 9 | switch(message.action) { 10 | case 'testConnection': 11 | testConnection(message.baseUrl, message.apiKey) 12 | .then(success => { 13 | sendResponse({ success }); 14 | }) 15 | .catch(error => { 16 | sendResponse({ success: false, error: error.message }); 17 | }); 18 | break; 19 | case 'fetchCodes': 20 | fetchCodes(message.baseUrl, message.apiKey) 21 | .then(data => { 22 | sendResponse({ success: true, data }); 23 | }) 24 | .catch(error => { 25 | sendResponse({ success: false, error: error.message }); 26 | }); 27 | break; 28 | case 'updateConfig': 29 | // 处理配置更新请求 30 | if (message.config) { 31 | // 直接返回成功,因为我们只需在前端保存配置 32 | sendResponse({ success: true, message: '配置已更新' }); 33 | } else { 34 | sendResponse({ success: false, message: '无效的配置数据' }); 35 | } 36 | break; 37 | default: 38 | console.log('未知消息类型:', message.action); 39 | sendResponse({ success: false, message: '未知操作' }); 40 | } 41 | } 42 | 43 | return true; // 保持消息通道开放以进行异步响应 44 | }); 45 | 46 | /** 47 | * 测试连接并验证API Key 48 | * @param {string} baseUrl 49 | * @param {string} apiKey 50 | * @returns {Promise} 51 | */ 52 | async function testConnection(baseUrl, apiKey) { 53 | try { 54 | // 使用get_codes接口进行连接测试 55 | const response = await fetch(`${baseUrl}/api/v1/plugin/twofahelper/get_codes?apikey=${apiKey}`); 56 | if (!response.ok) { 57 | console.error(`API连接测试失败: ${response.status} ${response.statusText}`); 58 | return false; 59 | } 60 | 61 | const data = await response.json(); 62 | // 检查返回的数据结构是否符合预期 63 | if (data.code === 0 || data.code === undefined) { 64 | console.log('API连接测试成功'); 65 | return true; 66 | } else { 67 | console.error(`API连接测试返回错误: ${data.message || '未知错误'}`); 68 | return false; 69 | } 70 | } catch (error) { 71 | console.error(`API连接测试异常: ${error.message}`); 72 | return false; 73 | } 74 | } 75 | 76 | /** 77 | * 从API获取验证码 78 | * @param {string} baseUrl 79 | * @param {string} apiKey 80 | * @returns {Promise} 81 | */ 82 | async function fetchCodes(baseUrl, apiKey) { 83 | try { 84 | if (!baseUrl || !apiKey) { 85 | throw new Error('未设置API连接信息'); 86 | } 87 | 88 | const response = await fetch(`${baseUrl}/api/v1/plugin/twofahelper/get_codes?apikey=${apiKey}`); 89 | if (!response.ok) { 90 | if (response.status === 401 || response.status === 403) { 91 | throw new Error('授权失败,请重新配置'); 92 | } 93 | throw new Error(`服务器错误: ${response.status} ${response.statusText}`); 94 | } 95 | 96 | const data = await response.json(); 97 | return data.data || data; 98 | } catch (error) { 99 | console.error('获取验证码失败:', error); 100 | throw error; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /TOTP/generate_icons.js: -------------------------------------------------------------------------------- 1 | // 此脚本用于生成TOTP助手浏览器扩展所需的图标 2 | // 使用方法: 在浏览器中打开此文件,然后点击生成按钮 3 | // 图标生成后会自动下载 4 | 5 | document.write(` 6 | 7 | 8 | 9 | 10 | 生成TOTP图标 11 | 44 | 45 | 46 |

TOTP助手图标生成器

47 | 48 |
49 |

使用说明:

50 |
    51 |
  1. 点击下方"生成图标"按钮
  2. 52 |
  3. 图标将自动下载到您的下载文件夹
  4. 53 |
  5. 将下载的图标文件移动到TOTP/icons目录中
  6. 54 |
55 |
56 | 57 |
58 | 59 | 16x16 图标 60 |
61 | 62 |
63 | 64 | 48x48 图标 65 |
66 | 67 |
68 | 69 | 128x128 图标 70 |
71 | 72 | 73 | 74 | 147 | 148 | 149 | `); -------------------------------------------------------------------------------- /TOTP/icon_generator.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 生成TOTP图标 6 | 39 | 40 | 41 |

TOTP助手图标生成器

42 | 43 |
44 |

使用说明:

45 |
    46 |
  1. 点击下方"生成图标"按钮
  2. 47 |
  3. 图标将自动下载到您的下载文件夹
  4. 48 |
  5. 将下载的图标文件移动到TOTP/icons目录中
  6. 49 |
50 |
51 | 52 |
53 | 54 | 16x16 图标 55 |
56 | 57 |
58 | 59 | 48x48 图标 60 |
61 | 62 |
63 | 64 | 128x128 图标 65 |
66 | 67 | 68 | 69 | 142 | 143 | -------------------------------------------------------------------------------- /TOTP/icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/TOTP/icons/icon128.png -------------------------------------------------------------------------------- /TOTP/icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/TOTP/icons/icon16.png -------------------------------------------------------------------------------- /TOTP/icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/TOTP/icons/icon48.png -------------------------------------------------------------------------------- /TOTP/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "MP TOTP 验证码助手", 4 | "version": "1.1", 5 | "description": "MP 二步验证助手插件,可直接获取和复制TOTP验证码", 6 | "author": "madrays", 7 | "homepage_url": "https://cocohe.cn", 8 | "icons": { 9 | "16": "icons/icon16.png", 10 | "48": "icons/icon48.png", 11 | "128": "icons/icon128.png" 12 | }, 13 | "action": { 14 | "default_popup": "popup.html", 15 | "default_icon": { 16 | "16": "icons/icon16.png", 17 | "48": "icons/icon48.png", 18 | "128": "icons/icon128.png" 19 | } 20 | }, 21 | "options_page": "options.html", 22 | "background": { 23 | "scripts": ["background.js"], 24 | "type": "module", 25 | "persistent": true 26 | }, 27 | "content_scripts": [ 28 | { 29 | "matches": [""], 30 | "js": ["content.js"] 31 | } 32 | ], 33 | "permissions": [ 34 | "storage", 35 | "tabs", 36 | "clipboardWrite", 37 | "idle" 38 | ], 39 | "host_permissions": [ 40 | "http://*/*", 41 | "https://*/*" 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /TOTP/options.css: -------------------------------------------------------------------------------- 1 | #currentVersion { 2 | display: inline-block; 3 | padding: 2px 6px; 4 | border-radius: 4px; 5 | font-size: 12px; 6 | cursor: pointer; 7 | transition: all 0.3s ease; 8 | } 9 | 10 | #currentVersion.latest { 11 | background-color: #4CAF50; 12 | color: white; 13 | } 14 | 15 | #currentVersion.update_available { 16 | background-color: #FF9800; 17 | color: white; 18 | } 19 | 20 | #currentVersion.offline { 21 | background-color: #9E9E9E; 22 | color: white; 23 | } 24 | 25 | #currentVersion.error { 26 | background-color: #F44336; 27 | color: white; 28 | } 29 | 30 | #updateNotice { 31 | display: none; 32 | margin-left: 8px; 33 | padding: 2px 6px; 34 | background-color: #FF9800; 35 | color: white; 36 | border-radius: 4px; 37 | font-size: 12px; 38 | cursor: pointer; 39 | transition: all 0.3s ease; 40 | } 41 | 42 | #updateNotice:hover { 43 | background-color: #F57C00; 44 | } 45 | 46 | .button-group.icon-row { 47 | display: flex; 48 | flex-wrap: wrap; 49 | gap: 8px; 50 | margin-top: 10px; 51 | margin-bottom: 10px; 52 | } 53 | 54 | .button-group.icon-row button { 55 | flex: 1; 56 | min-width: 110px; 57 | padding: 6px 10px; 58 | font-size: 12px; 59 | text-align: center; 60 | } 61 | 62 | .icon-source-label { 63 | font-size: 10px; 64 | color: #666; 65 | background-color: #f0f0f0; 66 | border-radius: 10px; 67 | padding: 2px 6px; 68 | display: inline-block; 69 | margin-top: 5px; 70 | } 71 | 72 | .icon-source-info { 73 | margin: 8px 0; 74 | font-size: 12px; 75 | color: #666; 76 | } 77 | 78 | .icon-preview { 79 | width: 48px; 80 | height: 48px; 81 | margin-top: 10px; 82 | border-radius: 6px; 83 | overflow: hidden; 84 | background-color: #f5f5f5; 85 | display: flex; 86 | flex-direction: column; 87 | align-items: center; 88 | justify-content: center; 89 | border: 1px dashed #ddd; 90 | } 91 | 92 | .icon-preview img { 93 | width: 100%; 94 | height: 100%; 95 | object-fit: contain; 96 | } 97 | 98 | /* 图标选择面板样式 */ 99 | .icon-selection-container { 100 | display: flex; 101 | gap: 20px; 102 | margin-top: 15px; 103 | margin-bottom: 15px; 104 | } 105 | 106 | .icon-preview-panel { 107 | flex: 0 0 150px; 108 | display: flex; 109 | flex-direction: column; 110 | align-items: center; 111 | padding: 15px; 112 | background-color: #f8f9fa; 113 | border-radius: 8px; 114 | box-shadow: 0 1px 3px rgba(0,0,0,0.1); 115 | } 116 | 117 | .icon-options-panel { 118 | flex: 1; 119 | border-radius: 8px; 120 | overflow: hidden; 121 | background-color: #fff; 122 | box-shadow: 0 1px 3px rgba(0,0,0,0.1); 123 | } 124 | 125 | .icon-tabs { 126 | display: flex; 127 | background-color: #f2f2f2; 128 | overflow-x: auto; 129 | } 130 | 131 | .icon-tab { 132 | flex: 1; 133 | padding: 10px; 134 | min-width: 80px; 135 | text-align: center; 136 | background: transparent; 137 | border: none; 138 | cursor: pointer; 139 | transition: all 0.2s ease; 140 | font-size: 13px; 141 | border-bottom: 2px solid transparent; 142 | } 143 | 144 | .icon-tab.active { 145 | background-color: #fff; 146 | border-bottom: 2px solid #1976d2; 147 | font-weight: 500; 148 | color: #1976d2; 149 | } 150 | 151 | .icon-panel-container { 152 | position: relative; 153 | min-height: 150px; 154 | padding: 20px; 155 | } 156 | 157 | .icon-panel { 158 | display: none; 159 | flex-direction: column; 160 | gap: 10px; 161 | } 162 | 163 | .icon-panel.active { 164 | display: flex; 165 | } 166 | 167 | .panel-desc { 168 | margin: 0 0 15px 0; 169 | font-size: 13px; 170 | color: #666; 171 | } 172 | 173 | .url-input-group { 174 | display: flex; 175 | gap: 10px; 176 | width: 100%; 177 | } 178 | 179 | .url-input-group input { 180 | flex: 1; 181 | } 182 | 183 | .primary-btn { 184 | background-color: #1976d2; 185 | color: white; 186 | border: none; 187 | padding: 8px 16px; 188 | border-radius: 4px; 189 | cursor: pointer; 190 | transition: background-color 0.2s; 191 | } 192 | 193 | .primary-btn:hover { 194 | background-color: #1565c0; 195 | } 196 | 197 | .danger-btn { 198 | background-color: #f44336; 199 | color: white; 200 | border: none; 201 | padding: 6px 12px; 202 | border-radius: 4px; 203 | margin-top: 10px; 204 | cursor: pointer; 205 | font-size: 12px; 206 | transition: background-color 0.2s; 207 | } 208 | 209 | .danger-btn:hover { 210 | background-color: #d32f2f; 211 | } 212 | 213 | .icon-preview { 214 | width: 64px; 215 | height: 64px; 216 | margin-bottom: 15px; 217 | border-radius: 8px; 218 | overflow: hidden; 219 | background-color: #f5f5f5; 220 | display: flex; 221 | flex-direction: column; 222 | align-items: center; 223 | justify-content: center; 224 | border: 1px dashed #ddd; 225 | } 226 | 227 | .icon-preview img { 228 | width: 100%; 229 | height: 100%; 230 | object-fit: contain; 231 | } 232 | 233 | .icon-source-info { 234 | font-size: 12px; 235 | color: #666; 236 | margin-bottom: 10px; 237 | text-align: center; 238 | } -------------------------------------------------------------------------------- /TOTP/popup.css: -------------------------------------------------------------------------------- 1 | /* 重置默认样式 */ 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; 7 | } 8 | 9 | body { 10 | width: 320px; 11 | min-height: 240px; 12 | max-height: 600px; 13 | overflow-y: auto; 14 | background-color: #f8f9fa; 15 | color: #333; 16 | padding: 16px; 17 | } 18 | 19 | /* 标题样式 */ 20 | .header { 21 | display: flex; 22 | align-items: center; 23 | justify-content: space-between; 24 | margin-bottom: 16px; 25 | padding-bottom: 12px; 26 | border-bottom: 1px solid #eaeaea; 27 | } 28 | 29 | .header h1 { 30 | font-size: 18px; 31 | font-weight: 500; 32 | color: #1a73e8; 33 | } 34 | 35 | .header-actions { 36 | display: flex; 37 | gap: 8px; 38 | } 39 | 40 | /* 按钮样式 */ 41 | button { 42 | background-color: #1a73e8; 43 | color: white; 44 | border: none; 45 | border-radius: 4px; 46 | padding: 8px 12px; 47 | font-size: 14px; 48 | cursor: pointer; 49 | transition: background-color 0.2s ease; 50 | } 51 | 52 | button:hover { 53 | background-color: #0d47a1; 54 | } 55 | 56 | button.secondary { 57 | background-color: #f1f3f4; 58 | color: #1a73e8; 59 | border: 1px solid #dadce0; 60 | } 61 | 62 | button.secondary:hover { 63 | background-color: #e8eaed; 64 | } 65 | 66 | button:disabled { 67 | background-color: #dadce0; 68 | color: #5f6368; 69 | cursor: not-allowed; 70 | } 71 | 72 | button.icon-button { 73 | padding: 4px 8px; 74 | display: flex; 75 | align-items: center; 76 | gap: 4px; 77 | } 78 | 79 | button.copy-button { 80 | padding: 6px 10px; 81 | background-color: #f1f3f4; 82 | color: #1a73e8; 83 | font-size: 13px; 84 | border-radius: 4px; 85 | display: flex; 86 | align-items: center; 87 | gap: 5px; 88 | } 89 | 90 | button.copy-button:hover { 91 | background-color: #e8eaed; 92 | } 93 | 94 | button.settings-button { 95 | background-color: transparent; 96 | color: #5f6368; 97 | padding: 4px; 98 | } 99 | 100 | button.settings-button:hover { 101 | background-color: #f1f3f4; 102 | } 103 | 104 | /* 消息和提示样式 */ 105 | .message { 106 | padding: 12px; 107 | border-radius: 8px; 108 | margin-bottom: 16px; 109 | font-size: 14px; 110 | } 111 | 112 | .error { 113 | background-color: #fdeded; 114 | color: #b71c1c; 115 | border: 1px solid #f5c2c7; 116 | } 117 | 118 | .warning { 119 | background-color: #fff3cd; 120 | color: #856404; 121 | border: 1px solid #ffeeba; 122 | } 123 | 124 | .info { 125 | background-color: #cfe2ff; 126 | color: #084298; 127 | border: 1px solid #b6d4fe; 128 | } 129 | 130 | /* 加载指示器 */ 131 | .loading { 132 | display: flex; 133 | flex-direction: column; 134 | align-items: center; 135 | justify-content: center; 136 | padding: 20px 0; 137 | } 138 | 139 | .spinner { 140 | border: 4px solid rgba(0, 0, 0, 0.1); 141 | width: 36px; 142 | height: 36px; 143 | border-radius: 50%; 144 | border-left-color: #1a73e8; 145 | animation: spin 1s linear infinite; 146 | margin-bottom: 12px; 147 | } 148 | 149 | @keyframes spin { 150 | 0% { transform: rotate(0deg); } 151 | 100% { transform: rotate(360deg); } 152 | } 153 | 154 | /* 卡片样式 */ 155 | .codes-container { 156 | display: flex; 157 | flex-direction: column; 158 | gap: 12px; 159 | margin-bottom: 16px; 160 | } 161 | 162 | .code-card { 163 | background-color: white; 164 | border-radius: 8px; 165 | padding: 12px; 166 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); 167 | transition: transform 0.2s ease, box-shadow 0.2s ease; 168 | border: 1px solid #dadce0; 169 | } 170 | 171 | .code-card:hover { 172 | transform: translateY(-2px); 173 | box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15); 174 | } 175 | 176 | /* 卡片头部样式 - 包含图标和站点名称 */ 177 | .card-header { 178 | display: flex; 179 | align-items: center; 180 | gap: 10px; 181 | margin-bottom: 10px; 182 | } 183 | 184 | /* 站点行样式 */ 185 | .site-row { 186 | display: flex; 187 | align-items: center; 188 | margin-bottom: 8px; 189 | } 190 | 191 | /* 站点图标样式 */ 192 | .site-icon { 193 | width: 20px; 194 | height: 20px; 195 | border-radius: 4px; 196 | background-color: #ffffff; 197 | display: flex; 198 | align-items: center; 199 | justify-content: center; 200 | font-weight: bold; 201 | color: #757575; 202 | font-size: 12px; 203 | flex-shrink: 0; 204 | overflow: hidden; 205 | border: 1px solid #e0e0e0; 206 | } 207 | 208 | .site-icon img { 209 | width: 100%; 210 | height: 100%; 211 | object-fit: cover; 212 | } 213 | 214 | .site-name { 215 | font-size: 14px; 216 | font-weight: 500; 217 | color: #202124; 218 | margin-left: 8px; 219 | } 220 | 221 | .site-name a { 222 | color: #202124; 223 | text-decoration: none; 224 | } 225 | 226 | .site-name a:hover { 227 | text-decoration: underline; 228 | color: #1a73e8; 229 | } 230 | 231 | .code-display { 232 | display: flex; 233 | align-items: center; 234 | justify-content: space-between; 235 | margin-bottom: 12px; 236 | background-color: #f8f9fa; 237 | padding: 8px 12px; 238 | border-radius: 6px; 239 | } 240 | 241 | .totp-code { 242 | font-family: 'Courier New', monospace; 243 | font-size: 22px; 244 | font-weight: bold; 245 | letter-spacing: 2px; 246 | color: #1a73e8; 247 | } 248 | 249 | /* 进度条样式 */ 250 | .progress-container { 251 | margin-top: 5px; 252 | position: relative; 253 | } 254 | 255 | .progress-bar { 256 | height: 4px; 257 | background-color: #4caf50; 258 | border-radius: 2px; 259 | transition: width 1s linear, background-color 0.5s ease; 260 | } 261 | 262 | .time-text { 263 | font-size: 12px; 264 | color: #5f6368; 265 | text-align: right; 266 | margin-bottom: 4px; 267 | } 268 | 269 | /* 空状态样式 */ 270 | .empty-state { 271 | display: flex; 272 | flex-direction: column; 273 | align-items: center; 274 | justify-content: center; 275 | padding: 32px 16px; 276 | text-align: center; 277 | } 278 | 279 | .empty-state p { 280 | color: #5f6368; 281 | font-size: 14px; 282 | margin-bottom: 16px; 283 | } 284 | 285 | /* 通知样式 */ 286 | .notification { 287 | position: fixed; 288 | bottom: 16px; 289 | left: 50%; 290 | transform: translateX(-50%); 291 | background-color: #323232; 292 | color: white; 293 | padding: 10px 16px; 294 | border-radius: 4px; 295 | font-size: 14px; 296 | box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); 297 | opacity: 0; 298 | transition: opacity 0.3s ease; 299 | z-index: 1000; 300 | } 301 | 302 | .notification.show { 303 | opacity: 1; 304 | } 305 | 306 | /* 复制按钮美化 */ 307 | .copy-button { 308 | background-color: #1a73e8; 309 | color: white; 310 | border-radius: 4px; 311 | padding: 6px 12px; 312 | font-size: 13px; 313 | display: inline-flex; 314 | align-items: center; 315 | justify-content: center; 316 | transition: all 0.2s ease; 317 | } 318 | 319 | .copy-button:hover { 320 | background-color: #0d47a1; 321 | } 322 | 323 | /* 自定义滚动条 */ 324 | ::-webkit-scrollbar { 325 | width: 8px; 326 | } 327 | 328 | ::-webkit-scrollbar-track { 329 | background: #f1f1f1; 330 | } 331 | 332 | ::-webkit-scrollbar-thumb { 333 | background: #c1c1c1; 334 | border-radius: 4px; 335 | } 336 | 337 | ::-webkit-scrollbar-thumb:hover { 338 | background: #a1a1a1; 339 | } 340 | 341 | /* 响应式调整 */ 342 | @media (max-width: 340px) { 343 | body { 344 | width: 280px; 345 | padding: 12px; 346 | } 347 | 348 | .header h1 { 349 | font-size: 16px; 350 | } 351 | 352 | button { 353 | padding: 6px 10px; 354 | font-size: 13px; 355 | } 356 | } -------------------------------------------------------------------------------- /TOTP/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MP TOTP 6 | 7 | 126 | 127 | 128 |
129 |

TOTP验证码

130 |
131 | 132 |
133 |
134 | 135 | 136 | 137 | 138 | 139 |
140 | 141 | 142 | 146 | 147 | 148 | 149 | 150 | 151 |
152 | 153 | 154 | 157 | 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /icons/1hardlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/1hardlink.png -------------------------------------------------------------------------------- /icons/2fa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/2fa.png -------------------------------------------------------------------------------- /icons/GroupChat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/GroupChat.png -------------------------------------------------------------------------------- /icons/clean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/clean.png -------------------------------------------------------------------------------- /icons/clean1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/clean1.png -------------------------------------------------------------------------------- /icons/fengchao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/fengchao.png -------------------------------------------------------------------------------- /icons/fnos.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/fnos.ico -------------------------------------------------------------------------------- /icons/hardlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/hardlink.png -------------------------------------------------------------------------------- /icons/lemon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/lemon.ico -------------------------------------------------------------------------------- /icons/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/manager.png -------------------------------------------------------------------------------- /icons/nexusinvitee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/nexusinvitee.png -------------------------------------------------------------------------------- /icons/nodeseeksign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/icons/nodeseeksign.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "twofahelper": { 3 | "name": "两步验证助手", 4 | "description": "懒人板2FA,配合浏览器扩展使用,支持自动弹出验证码一键复制", 5 | "labels": "TOTP,验证码,扩展", 6 | "version": "1.2.7", 7 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/2fa.png", 8 | "author": "madrays", 9 | "level": 1, 10 | "v2": true, 11 | "history": { 12 | "v1.2.7": "满屏面板" 13 | } 14 | }, 15 | "fnossign": { 16 | "name": "飞牛论坛签到", 17 | "description": "自动完成飞牛论坛每日签到,支持失败重试和历史记录", 18 | "labels": "签到", 19 | "version": "2.5.4", 20 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/fnos.ico", 21 | "author": "madrays", 22 | "level": 2, 23 | "v2": true, 24 | "history": { 25 | "v2.5.4": "尝试解决0点签到卡住(尽量还是别设置0点签到,暂时无法验证是否解决)", 26 | "v2.5.3": "增强重试机制,解决定时任务卡住问题,超出重试次数后自动安排延迟重试", 27 | "v2.5.2": "修复手动签到时会产生重复记录的问题", 28 | "v2.5.1": "修复签到成功后,未能正确获取签到状态的bug。" 29 | } 30 | }, 31 | "lemonshengyou": { 32 | "name": "柠檬站点神游", 33 | "description": "自动完成柠檬站点每日免费神游三清天,获取奖励", 34 | "labels": "神游,站点,柠檬", 35 | "version": "1.0.5", 36 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/lemon.ico", 37 | "author": "madrays", 38 | "level": 2, 39 | "v2": true, 40 | "history": { 41 | "v1.0.5": "修复神游成功后,未能正确获取神游状态的bug。" 42 | } 43 | }, 44 | "nexusinvitee": { 45 | "name": "后宫管理系统", 46 | "description": "管理添加到MP站点的邀请系统,包括邀请名额、已邀请用户状态等", 47 | "labels": "PT,后宫,邀请", 48 | "version": "1.2.6", 49 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/nexusinvitee.png", 50 | "author": "madrays", 51 | "level": 2, 52 | "v2": true, 53 | "history": { 54 | "v1.2.6": "尝试修复hh后宫", 55 | "v1.2.5": "适配麒麟", 56 | "v1.2.4": "修复通用翻页逻辑", 57 | "v1.2.3": "修复蝶粉翻页逻辑", 58 | "v1.2.2": "新增失败站点通知功能,by@JhouXerox;修复插件无法正确更新的问题;修复各项bug;尝试修复无限翻页问题,修复1.2.1" 59 | } 60 | }, 61 | "nodeseeksign": { 62 | "name": "NodeSeek论坛签到", 63 | "description": "懒羊羊定制:自动完成NodeSeek论坛每日签到,支持随机奖励和自动重试功能", 64 | "labels": "签到,NodeSeek,论坛", 65 | "version": "1.1.0", 66 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/nodeseeksign.png", 67 | "author": "madrays", 68 | "level": 2, 69 | "v2": true, 70 | "history": { 71 | "v1.2.0": "尝试优化成功率,未测试", 72 | "v1.0.0": "支持API方式签到,绕过CloudFlare防护,支持随机奖励和自动加鸡腿" 73 | } 74 | }, 75 | "FengchaoSignin": { 76 | "name": "蜂巢论坛签到", 77 | "description": "自动完成蜂巢论坛每日签到,支持历史记录", 78 | "labels": "签到,蜂巢,论坛", 79 | "version": "1.0.8", 80 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/fengchao.png", 81 | "author": "madrays", 82 | "level": 2, 83 | "v2": true, 84 | "history": { 85 | "v1.0.8": "解除最多50个站点的限制" 86 | } 87 | }, 88 | "FengchaoInvite": { 89 | "name": "蜂巢论坛邀请监控", 90 | "description": "蜂巢论坛管理组定制专用", 91 | "labels": "邀请,蜂巢,论坛", 92 | "version": "1.1.4", 93 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/fengchao.png", 94 | "author": "madrays", 95 | "level": 2, 96 | "v2": true, 97 | "history": { 98 | "v1.1.4": "补充未定义变量" 99 | } 100 | }, 101 | "smarthardlink": { 102 | "name": "智能硬链接", 103 | "description": "通过计算文件SHA1,将指定目录中相同SHA1的文件只保留一个,其他的用硬链接替换,用来清理重复占用的磁盘空间", 104 | "labels": "硬链接,SHA1,磁盘空间,重复文件", 105 | "version": "1.0.5", 106 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/hardlink.png", 107 | "author": "madrays", 108 | "level": 2, 109 | "v2": true, 110 | "history": { 111 | "v1.0.5": "首次发布,支持SHA1重复文件识别,硬链接替换,保持种子文件名" 112 | } 113 | }, 114 | "LogsClean": { 115 | "name": "日志清理VUE", 116 | "description": "定时清理插件产生的日志", 117 | "labels": "日志,清理,工具", 118 | "version": "2.0", 119 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/clean.png", 120 | "author": "madrays", 121 | "level": 1, 122 | "v2": true, 123 | "history": { 124 | "v2.0": "联邦插件重制版,仅支持MPv2.4.5版本以上,低版本请勿更新,更新后请重置插件", 125 | "v1.0": "首次发布重制版,修复插件列表错误,增加页面和通知" 126 | } 127 | }, 128 | "TrashClean": { 129 | "name": "垃圾文件清理", 130 | "description": "自动清理监控目录内的垃圾文件", 131 | "labels": "清理,垃圾文件,监控", 132 | "version": "1.0", 133 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/clean1.png", 134 | "author": "madrays", 135 | "level": 1, 136 | "v2": true, 137 | "history": { 138 | "v1.1": "优化性能及体验", 139 | "v1.0": "首次发布" 140 | } 141 | }, 142 | "P1115StrmHelper": { 143 | "name": "VUE-115网盘STRM助手", 144 | "description": "测试版仅供测试", 145 | "labels": "STRM,115,网盘", 146 | "version": "100000.1.1", 147 | "icon": "https://raw.githubusercontent.com/jxxghp/MoviePilot-Frontend/refs/heads/v2/src/assets/images/misc/u115.png", 148 | "author": "VUE测试版", 149 | "level": 1, 150 | "v2": true, 151 | "history": { 152 | "v100000.1.1": "集成MediaWarp" 153 | } 154 | }, 155 | "PluginManagerVue": { 156 | "name": "插件管理中心", 157 | "description": "集成插件热重载、彻底卸载、重装等功能,支持本地和在线插件管理。", 158 | "labels": "插件,管理,工具", 159 | "version": "1.0.2", 160 | "icon": "https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/main/icons/manager.png", 161 | "author": "madrays", 162 | "level": 1, 163 | "v2": true, 164 | "history": { 165 | "v1.0.2": "新增重装功能,修复图标路径" 166 | } 167 | } 168 | 169 | } -------------------------------------------------------------------------------- /plugins/fnossign/README.md: -------------------------------------------------------------------------------- 1 | # 飞牛论坛签到插件 2 | 3 | MoviePilot第三方插件,用于自动完成飞牛论坛(fnNAS)每日签到,支持失败重试、积分统计和历史记录查看。 4 | 5 | ## 功能特点 6 | 7 | - 自动/手动完成飞牛论坛每日签到 8 | - 智能判断今日是否已签到,避免重复签到 9 | - 获取并展示签到后的积分变化(飞牛币、牛值、积分、登录天数) 10 | - 支持签到失败自动重试,可配置重试次数和间隔 11 | - 完整的历史记录页面,直观展示签到情况 12 | - 签到结果通知(成功/失败原因) 13 | - 特殊情况处理(深夜签到后次日仍可正常签到) 14 | 15 | ## 安装方法 16 | 17 | 1. 在MoviePilot插件商店中添加第三方仓库:`https://github.com/madrays/MoviePilot-Plugins` 18 | 2. 在第三方插件列表中找到并安装"飞牛论坛签到" 19 | 3. 进入插件设置页面完成配置 20 | 21 | ## 配置说明 22 | 23 | - **站点Cookie**: 飞牛论坛的登录Cookie(必填) 24 | - **签到周期**: Cron表达式,默认"0 8 * * *"(每天8点) 25 | - **启用插件**: 开启后将按设定的周期自动签到 26 | - **开启通知**: 签到完成后发送通知消息 27 | - **立即运行一次**: 保存配置后立即执行一次签到(无视是否已签到) 28 | - **最大重试次数**: 签到失败时的重试次数 29 | - **重试间隔(秒)**: 每次重试的等待时间 30 | - **历史保留天数**: 签到历史记录的保留时间 31 | 32 | ## Cookie获取方法 33 | 34 | 1. 使用浏览器访问并登录飞牛论坛 https://club.fnnas.com 35 | 2. 按F12打开开发者工具 36 | 3. 切换到"网络/Network"选项卡 37 | 4. 刷新页面,选择任意一个请求(如club.fnnas.com) 38 | 5. 在右侧Headers中找到"Cookie:"开头的部分 39 | 6. 复制完整Cookie值粘贴到插件设置中 40 | 41 | ## 注意事项 42 | 43 | - Cookie通常存在有效期,过期后需要重新获取 44 | - 如签到失败,请检查Cookie是否有效,可尝试重新获取 45 | - 插件会记录每次签到结果,可在插件详情页查看历史记录 46 | - 签到过程中如遇验证码,需要手动登录站点处理后再使用插件 -------------------------------------------------------------------------------- /plugins/fnossign/requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.0.0 2 | pytz>=2021.1 3 | python-dateutil>=2.8.2 -------------------------------------------------------------------------------- /plugins/lemonshengyou/README.md: -------------------------------------------------------------------------------- 1 | # 柠檬站点神游插件 2 | 3 | MoviePilot第三方插件,用于自动完成柠檬站点每日免费神游三清天,获取奖励。 4 | 5 | ## 功能特点 6 | 7 | - 自动/手动完成柠檬站点每日免费神游 8 | - 智能判断今日是否已神游,避免重复操作 9 | - 获取并展示神游后的奖励内容 10 | - 支持神游失败自动重试,可配置重试次数和间隔 11 | - 完整的历史记录页面,直观展示神游情况 12 | - 神游结果通知(获得的奖励/失败原因) 13 | 14 | ## 安装方法 15 | 16 | 1. 在MoviePilot插件商店中添加第三方仓库:`https://github.com/madrays/MoviePilot-Plugins` 17 | 2. 在第三方插件列表中找到并安装"柠檬站点神游" 18 | 3. 进入插件设置页面完成配置 19 | 20 | ## 配置说明 21 | 22 | - **选择站点**: 从已添加的站点中选择柠檬站点 23 | - **神游周期**: Cron表达式,默认"0 8 * * *"(每天8点) 24 | - **启用插件**: 开启后将按设定的周期自动神游 25 | - **开启通知**: 神游完成后发送通知消息 26 | - **立即运行一次**: 保存配置后立即执行一次神游(无视是否已神游) 27 | - **最大重试次数**: 神游失败时的重试次数 28 | - **重试间隔(秒)**: 每次重试的等待时间 29 | - **历史保留天数**: 神游历史记录的保留时间 30 | 31 | ## 使用前提 32 | 33 | 1. 请确保已在MoviePilot的站点管理中添加并配置好柠檬站点 34 | 2. 站点配置需要正确填写站点地址、用户名密码或Cookie信息 35 | 3. 如果站点需要代理访问,请在站点配置中设置好代理 36 | 37 | ## 注意事项 38 | 39 | - 如神游失败,请检查站点配置是否正确,站点是否能正常访问 40 | - 插件会记录每次神游结果,可在插件详情页查看历史记录 41 | - 每天只有一次免费神游机会,插件会自动使用这次机会 42 | - 如遇到问题,可以检查MoviePilot的日志获取详细信息 -------------------------------------------------------------------------------- /plugins/lemonshengyou/requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.0.0 2 | pytz>=2021.1 3 | python-dateutil>=2.8.2 4 | beautifulsoup4>=4.9.0 -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/__federation_expose_Config-Cz4Zx2k7.css: -------------------------------------------------------------------------------- 1 | 2 | .plugin-config[data-v-11b01562] { 3 | max-width: 80rem; 4 | margin: 0 auto; 5 | padding: 0.5rem; 6 | } 7 | .bg-primary-lighten-5[data-v-11b01562] { 8 | background-color: rgba(var(--v-theme-primary), 0.07); 9 | } 10 | .border[data-v-11b01562] { 11 | border: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); 12 | } 13 | .config-card[data-v-11b01562] { 14 | background-image: linear-gradient(to right, rgba(var(--v-theme-surface), 0.98), rgba(var(--v-theme-surface), 0.95)), 15 | repeating-linear-gradient(45deg, rgba(var(--v-theme-primary), 0.03), rgba(var(--v-theme-primary), 0.03) 10px, transparent 10px, transparent 20px); 16 | background-attachment: fixed; 17 | box-shadow: 0 1px 2px rgba(var(--v-border-color), 0.05) !important; 18 | transition: all 0.3s ease; 19 | } 20 | .config-card[data-v-11b01562]:hover { 21 | box-shadow: 0 3px 6px rgba(var(--v-border-color), 0.1) !important; 22 | } 23 | .setting-item[data-v-11b01562] { 24 | border-radius: 8px; 25 | transition: all 0.2s ease; 26 | padding: 0.5rem; 27 | margin-bottom: 4px; 28 | } 29 | .setting-item[data-v-11b01562]:hover { 30 | background-color: rgba(var(--v-theme-primary), 0.03); 31 | } 32 | .small-switch[data-v-11b01562] { 33 | transform: scale(0.8); 34 | margin-right: -8px; 35 | } 36 | .text-subtitle-2[data-v-11b01562] { 37 | font-size: 14px !important; 38 | font-weight: 500; 39 | margin-bottom: 2px; 40 | } 41 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/__federation_expose_Dashboard-DzY_5vpv.css: -------------------------------------------------------------------------------- 1 | 2 | .dashboard-widget[data-v-6a0ff1b0] { 3 | height: 100%; 4 | width: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/__federation_expose_Page-CameGtjZ.css: -------------------------------------------------------------------------------- 1 | 2 | .plugin-page[data-v-df56df77] { 3 | max-width: 80rem; 4 | margin: 0 auto; 5 | padding: 0.5rem; 6 | } 7 | .max-width-120[data-v-df56df77] { 8 | max-width: 120px; 9 | } 10 | .bg-primary-lighten-5[data-v-df56df77] { 11 | background-color: rgba(var(--v-theme-primary), 0.07); 12 | } 13 | .border[data-v-df56df77] { 14 | border: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); 15 | } 16 | .search-field[data-v-df56df77] { 17 | max-width: 140px; 18 | } 19 | .plugin-avatar[data-v-df56df77] { 20 | width: 28px; 21 | height: 28px; 22 | border-radius: 50%; 23 | display: flex; 24 | align-items: center; 25 | justify-content: center; 26 | font-size: 14px; 27 | font-weight: bold; 28 | color: white; 29 | text-align: center; 30 | box-shadow: 0 2px 4px rgba(0,0,0,0.1); 31 | } 32 | .plugin-name[data-v-df56df77] { 33 | font-size: 14px; 34 | } 35 | .text-body-2[data-v-df56df77] { 36 | font-size: 14px !important; 37 | } 38 | .plugin-list-container[data-v-df56df77], .result-list-container[data-v-df56df77] { 39 | max-height: 200px; 40 | overflow-y: auto; 41 | } 42 | 43 | /* 统一滚动条样式 */ 44 | .plugin-list-container[data-v-df56df77]::-webkit-scrollbar, 45 | .result-list-container[data-v-df56df77]::-webkit-scrollbar { 46 | width: 8px; 47 | height: 8px; 48 | } 49 | .plugin-list-container[data-v-df56df77]::-webkit-scrollbar-track, 50 | .result-list-container[data-v-df56df77]::-webkit-scrollbar-track { 51 | background: transparent; 52 | } 53 | .plugin-list-container[data-v-df56df77]::-webkit-scrollbar-thumb, 54 | .result-list-container[data-v-df56df77]::-webkit-scrollbar-thumb { 55 | background-color: rgba(var(--v-theme-on-surface), 0.1); 56 | border-radius: 4px; 57 | } 58 | .plugin-list-container[data-v-df56df77]::-webkit-scrollbar-thumb:hover, 59 | .result-list-container[data-v-df56df77]::-webkit-scrollbar-thumb:hover { 60 | background-color: rgba(var(--v-theme-on-surface), 0.2); 61 | } 62 | 63 | /* 优化的颜色类 */ 64 | .special-log[data-v-df56df77] { 65 | background-color: #9e9e9e; 66 | } 67 | .deleted-log[data-v-df56df77] { 68 | background-color: #ef5350; 69 | } 70 | .color-primary[data-v-df56df77] { 71 | background-color: #1976d2; 72 | } 73 | .color-success[data-v-df56df77] { 74 | background-color: #4caf50; 75 | } 76 | .color-info[data-v-df56df77] { 77 | background-color: #2196f3; 78 | } 79 | .color-warning[data-v-df56df77] { 80 | background-color: #ff9800; 81 | } 82 | .color-error[data-v-df56df77] { 83 | background-color: #f44336; 84 | } 85 | .color-grey[data-v-df56df77] { 86 | background-color: #9e9e9e; 87 | } 88 | .config-card[data-v-df56df77] { 89 | background-image: linear-gradient(to right, rgba(var(--v-theme-surface), 0.98), rgba(var(--v-theme-surface), 0.95)), 90 | repeating-linear-gradient(45deg, rgba(var(--v-theme-primary), 0.03), rgba(var(--v-theme-primary), 0.03) 10px, transparent 10px, transparent 20px); 91 | background-attachment: fixed; 92 | box-shadow: 0 1px 2px rgba(var(--v-border-color), 0.05) !important; 93 | transition: all 0.3s ease; 94 | } 95 | .config-card[data-v-df56df77]:hover { 96 | box-shadow: 0 3px 6px rgba(var(--v-border-color), 0.1) !important; 97 | } 98 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/__federation_fn_import-JrT3xvdd.js: -------------------------------------------------------------------------------- 1 | const buildIdentifier = "[0-9A-Za-z-]+"; 2 | const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`; 3 | const numericIdentifier = "0|[1-9]\\d*"; 4 | const numericIdentifierLoose = "[0-9]+"; 5 | const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*"; 6 | const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`; 7 | const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`; 8 | const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`; 9 | const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`; 10 | const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`; 11 | const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`; 12 | const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`; 13 | const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`; 14 | const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`; 15 | const gtlt = "((?:<|>)?=?)"; 16 | const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`; 17 | const loneTilde = "(?:~>?)"; 18 | const tildeTrim = `(\\s*)${loneTilde}\\s+`; 19 | const loneCaret = "(?:\\^)"; 20 | const caretTrim = `(\\s*)${loneCaret}\\s+`; 21 | const star = "(<|>)?=?\\s*\\*"; 22 | const caret = `^${loneCaret}${xRangePlain}$`; 23 | const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`; 24 | const fullPlain = `v?${mainVersion}${preRelease}?${build}?`; 25 | const tilde = `^${loneTilde}${xRangePlain}$`; 26 | const xRange = `^${gtlt}\\s*${xRangePlain}$`; 27 | const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`; 28 | const gte0 = "^\\s*>=\\s*0.0.0\\s*$"; 29 | function parseRegex(source) { 30 | return new RegExp(source); 31 | } 32 | function isXVersion(version) { 33 | return !version || version.toLowerCase() === "x" || version === "*"; 34 | } 35 | function pipe(...fns) { 36 | return (x) => { 37 | return fns.reduce((v, f) => f(v), x); 38 | }; 39 | } 40 | function extractComparator(comparatorString) { 41 | return comparatorString.match(parseRegex(comparator)); 42 | } 43 | function combineVersion(major, minor, patch, preRelease2) { 44 | const mainVersion2 = `${major}.${minor}.${patch}`; 45 | if (preRelease2) { 46 | return `${mainVersion2}-${preRelease2}`; 47 | } 48 | return mainVersion2; 49 | } 50 | function parseHyphen(range) { 51 | return range.replace( 52 | parseRegex(hyphenRange), 53 | (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => { 54 | if (isXVersion(fromMajor)) { 55 | from = ""; 56 | } else if (isXVersion(fromMinor)) { 57 | from = `>=${fromMajor}.0.0`; 58 | } else if (isXVersion(fromPatch)) { 59 | from = `>=${fromMajor}.${fromMinor}.0`; 60 | } else { 61 | from = `>=${from}`; 62 | } 63 | if (isXVersion(toMajor)) { 64 | to = ""; 65 | } else if (isXVersion(toMinor)) { 66 | to = `<${+toMajor + 1}.0.0-0`; 67 | } else if (isXVersion(toPatch)) { 68 | to = `<${toMajor}.${+toMinor + 1}.0-0`; 69 | } else if (toPreRelease) { 70 | to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`; 71 | } else { 72 | to = `<=${to}`; 73 | } 74 | return `${from} ${to}`.trim(); 75 | } 76 | ); 77 | } 78 | function parseComparatorTrim(range) { 79 | return range.replace(parseRegex(comparatorTrim), "$1$2$3"); 80 | } 81 | function parseTildeTrim(range) { 82 | return range.replace(parseRegex(tildeTrim), "$1~"); 83 | } 84 | function parseCaretTrim(range) { 85 | return range.replace(parseRegex(caretTrim), "$1^"); 86 | } 87 | function parseCarets(range) { 88 | return range.trim().split(/\s+/).map((rangeVersion) => { 89 | return rangeVersion.replace( 90 | parseRegex(caret), 91 | (_, major, minor, patch, preRelease2) => { 92 | if (isXVersion(major)) { 93 | return ""; 94 | } else if (isXVersion(minor)) { 95 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 96 | } else if (isXVersion(patch)) { 97 | if (major === "0") { 98 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 99 | } else { 100 | return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`; 101 | } 102 | } else if (preRelease2) { 103 | if (major === "0") { 104 | if (minor === "0") { 105 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`; 106 | } else { 107 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 108 | } 109 | } else { 110 | return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`; 111 | } 112 | } else { 113 | if (major === "0") { 114 | if (minor === "0") { 115 | return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`; 116 | } else { 117 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 118 | } 119 | } 120 | return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`; 121 | } 122 | } 123 | ); 124 | }).join(" "); 125 | } 126 | function parseTildes(range) { 127 | return range.trim().split(/\s+/).map((rangeVersion) => { 128 | return rangeVersion.replace( 129 | parseRegex(tilde), 130 | (_, major, minor, patch, preRelease2) => { 131 | if (isXVersion(major)) { 132 | return ""; 133 | } else if (isXVersion(minor)) { 134 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 135 | } else if (isXVersion(patch)) { 136 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 137 | } else if (preRelease2) { 138 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 139 | } 140 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 141 | } 142 | ); 143 | }).join(" "); 144 | } 145 | function parseXRanges(range) { 146 | return range.split(/\s+/).map((rangeVersion) => { 147 | return rangeVersion.trim().replace( 148 | parseRegex(xRange), 149 | (ret, gtlt2, major, minor, patch, preRelease2) => { 150 | const isXMajor = isXVersion(major); 151 | const isXMinor = isXMajor || isXVersion(minor); 152 | const isXPatch = isXMinor || isXVersion(patch); 153 | if (gtlt2 === "=" && isXPatch) { 154 | gtlt2 = ""; 155 | } 156 | preRelease2 = ""; 157 | if (isXMajor) { 158 | if (gtlt2 === ">" || gtlt2 === "<") { 159 | return "<0.0.0-0"; 160 | } else { 161 | return "*"; 162 | } 163 | } else if (gtlt2 && isXPatch) { 164 | if (isXMinor) { 165 | minor = 0; 166 | } 167 | patch = 0; 168 | if (gtlt2 === ">") { 169 | gtlt2 = ">="; 170 | if (isXMinor) { 171 | major = +major + 1; 172 | minor = 0; 173 | patch = 0; 174 | } else { 175 | minor = +minor + 1; 176 | patch = 0; 177 | } 178 | } else if (gtlt2 === "<=") { 179 | gtlt2 = "<"; 180 | if (isXMinor) { 181 | major = +major + 1; 182 | } else { 183 | minor = +minor + 1; 184 | } 185 | } 186 | if (gtlt2 === "<") { 187 | preRelease2 = "-0"; 188 | } 189 | return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`; 190 | } else if (isXMinor) { 191 | return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`; 192 | } else if (isXPatch) { 193 | return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`; 194 | } 195 | return ret; 196 | } 197 | ); 198 | }).join(" "); 199 | } 200 | function parseStar(range) { 201 | return range.trim().replace(parseRegex(star), ""); 202 | } 203 | function parseGTE0(comparatorString) { 204 | return comparatorString.trim().replace(parseRegex(gte0), ""); 205 | } 206 | function compareAtom(rangeAtom, versionAtom) { 207 | rangeAtom = +rangeAtom || rangeAtom; 208 | versionAtom = +versionAtom || versionAtom; 209 | if (rangeAtom > versionAtom) { 210 | return 1; 211 | } 212 | if (rangeAtom === versionAtom) { 213 | return 0; 214 | } 215 | return -1; 216 | } 217 | function comparePreRelease(rangeAtom, versionAtom) { 218 | const { preRelease: rangePreRelease } = rangeAtom; 219 | const { preRelease: versionPreRelease } = versionAtom; 220 | if (rangePreRelease === void 0 && !!versionPreRelease) { 221 | return 1; 222 | } 223 | if (!!rangePreRelease && versionPreRelease === void 0) { 224 | return -1; 225 | } 226 | if (rangePreRelease === void 0 && versionPreRelease === void 0) { 227 | return 0; 228 | } 229 | for (let i = 0, n = rangePreRelease.length; i <= n; i++) { 230 | const rangeElement = rangePreRelease[i]; 231 | const versionElement = versionPreRelease[i]; 232 | if (rangeElement === versionElement) { 233 | continue; 234 | } 235 | if (rangeElement === void 0 && versionElement === void 0) { 236 | return 0; 237 | } 238 | if (!rangeElement) { 239 | return 1; 240 | } 241 | if (!versionElement) { 242 | return -1; 243 | } 244 | return compareAtom(rangeElement, versionElement); 245 | } 246 | return 0; 247 | } 248 | function compareVersion(rangeAtom, versionAtom) { 249 | return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom); 250 | } 251 | function eq(rangeAtom, versionAtom) { 252 | return rangeAtom.version === versionAtom.version; 253 | } 254 | function compare(rangeAtom, versionAtom) { 255 | switch (rangeAtom.operator) { 256 | case "": 257 | case "=": 258 | return eq(rangeAtom, versionAtom); 259 | case ">": 260 | return compareVersion(rangeAtom, versionAtom) < 0; 261 | case ">=": 262 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0; 263 | case "<": 264 | return compareVersion(rangeAtom, versionAtom) > 0; 265 | case "<=": 266 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0; 267 | case void 0: { 268 | return true; 269 | } 270 | default: 271 | return false; 272 | } 273 | } 274 | function parseComparatorString(range) { 275 | return pipe( 276 | parseCarets, 277 | parseTildes, 278 | parseXRanges, 279 | parseStar 280 | )(range); 281 | } 282 | function parseRange(range) { 283 | return pipe( 284 | parseHyphen, 285 | parseComparatorTrim, 286 | parseTildeTrim, 287 | parseCaretTrim 288 | )(range.trim()).split(/\s+/).join(" "); 289 | } 290 | function satisfy(version, range) { 291 | if (!version) { 292 | return false; 293 | } 294 | const parsedRange = parseRange(range); 295 | const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" "); 296 | const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2)); 297 | const extractedVersion = extractComparator(version); 298 | if (!extractedVersion) { 299 | return false; 300 | } 301 | const [ 302 | , 303 | versionOperator, 304 | , 305 | versionMajor, 306 | versionMinor, 307 | versionPatch, 308 | versionPreRelease 309 | ] = extractedVersion; 310 | const versionAtom = { 311 | version: combineVersion( 312 | versionMajor, 313 | versionMinor, 314 | versionPatch, 315 | versionPreRelease 316 | ), 317 | major: versionMajor, 318 | minor: versionMinor, 319 | patch: versionPatch, 320 | preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".") 321 | }; 322 | for (const comparator2 of comparators) { 323 | const extractedComparator = extractComparator(comparator2); 324 | if (!extractedComparator) { 325 | return false; 326 | } 327 | const [ 328 | , 329 | rangeOperator, 330 | , 331 | rangeMajor, 332 | rangeMinor, 333 | rangePatch, 334 | rangePreRelease 335 | ] = extractedComparator; 336 | const rangeAtom = { 337 | operator: rangeOperator, 338 | version: combineVersion( 339 | rangeMajor, 340 | rangeMinor, 341 | rangePatch, 342 | rangePreRelease 343 | ), 344 | major: rangeMajor, 345 | minor: rangeMinor, 346 | patch: rangePatch, 347 | preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".") 348 | }; 349 | if (!compare(rangeAtom, versionAtom)) { 350 | return false; 351 | } 352 | } 353 | return true; 354 | } 355 | 356 | // eslint-disable-next-line no-undef 357 | const moduleMap = {}; 358 | const moduleCache = Object.create(null); 359 | async function importShared(name, shareScope = 'default') { 360 | return moduleCache[name] 361 | ? new Promise((r) => r(moduleCache[name])) 362 | : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name) 363 | } 364 | async function getSharedFromRuntime(name, shareScope) { 365 | let module = null; 366 | if (globalThis?.__federation_shared__?.[shareScope]?.[name]) { 367 | const versionObj = globalThis.__federation_shared__[shareScope][name]; 368 | const requiredVersion = moduleMap[name]?.requiredVersion; 369 | const hasRequiredVersion = !!requiredVersion; 370 | if (hasRequiredVersion) { 371 | const versionKey = Object.keys(versionObj).find((version) => 372 | satisfy(version, requiredVersion) 373 | ); 374 | if (versionKey) { 375 | const versionValue = versionObj[versionKey]; 376 | module = await (await versionValue.get())(); 377 | } else { 378 | console.log( 379 | `provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})` 380 | ); 381 | } 382 | } else { 383 | const versionKey = Object.keys(versionObj)[0]; 384 | const versionValue = versionObj[versionKey]; 385 | module = await (await versionValue.get())(); 386 | } 387 | } 388 | if (module) { 389 | return flattenModule(module, name) 390 | } 391 | } 392 | async function getSharedFromLocal(name) { 393 | if (moduleMap[name]?.import) { 394 | let module = await (await moduleMap[name].get())(); 395 | return flattenModule(module, name) 396 | } else { 397 | console.error( 398 | `consumer config import=false,so cant use callback shared module` 399 | ); 400 | } 401 | } 402 | function flattenModule(module, name) { 403 | // use a shared module which export default a function will getting error 'TypeError: xxx is not a function' 404 | if (typeof module.default === 'function') { 405 | Object.keys(module).forEach((key) => { 406 | if (key !== 'default') { 407 | module.default[key] = module[key]; 408 | } 409 | }); 410 | moduleCache[name] = module.default; 411 | return module.default 412 | } 413 | if (module.default) module = Object.assign({}, module.default, module); 414 | moduleCache[name] = module; 415 | return module 416 | } 417 | 418 | export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime }; 419 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js: -------------------------------------------------------------------------------- 1 | const _export_sfc = (sfc, props) => { 2 | const target = sfc.__vccOpts || sfc; 3 | for (const [key, val] of props) { 4 | target[key] = val; 5 | } 6 | return target; 7 | }; 8 | 9 | export { _export_sfc as _ }; 10 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/index-B4QZ3I7V.css: -------------------------------------------------------------------------------- 1 | 2 | .app-container[data-v-d55c8c94] { 3 | } 4 | .component-preview[data-v-d55c8c94] { 5 | overflow: hidden; 6 | border: 1px solid #e0e0e0; 7 | border-radius: 8px; 8 | padding: 16px; 9 | background-color: #f9f9f9; 10 | } 11 | @supports not selector(:focus-visible) { 12 | } 13 | @supports not selector(:focus-visible) { 14 | } 15 | @supports selector(:focus-visible) { 16 | }@supports not selector(:focus-visible) { 17 | }@keyframes progress-circular-dash { 18 | 0% { 19 | stroke-dasharray: 1, 200; 20 | stroke-dashoffset: 0px; 21 | } 22 | 50% { 23 | stroke-dasharray: 100, 200; 24 | stroke-dashoffset: -15px; 25 | } 26 | 100% { 27 | stroke-dasharray: 100, 200; 28 | stroke-dashoffset: -124px; 29 | } 30 | } 31 | @keyframes progress-circular-rotate { 32 | 100% { 33 | transform: rotate(270deg); 34 | } 35 | }@media (forced-colors: active) { 36 | } 37 | 38 | @media (forced-colors: active) { 39 | } 40 | @media (forced-colors: active) { 41 | } 42 | 43 | @keyframes indeterminate-ltr { 44 | 0% { 45 | left: -90%; 46 | right: 100%; 47 | } 48 | 60% { 49 | left: -90%; 50 | right: 100%; 51 | } 52 | 100% { 53 | left: 100%; 54 | right: -35%; 55 | } 56 | } 57 | @keyframes indeterminate-rtl { 58 | 0% { 59 | left: 100%; 60 | right: -90%; 61 | } 62 | 60% { 63 | left: 100%; 64 | right: -90%; 65 | } 66 | 100% { 67 | left: -35%; 68 | right: 100%; 69 | } 70 | } 71 | @keyframes indeterminate-short-ltr { 72 | 0% { 73 | left: -200%; 74 | right: 100%; 75 | } 76 | 60% { 77 | left: 107%; 78 | right: -8%; 79 | } 80 | 100% { 81 | left: 107%; 82 | right: -8%; 83 | } 84 | } 85 | @keyframes indeterminate-short-rtl { 86 | 0% { 87 | left: 100%; 88 | right: -200%; 89 | } 90 | 60% { 91 | left: -8%; 92 | right: 107%; 93 | } 94 | 100% { 95 | left: -8%; 96 | right: 107%; 97 | } 98 | } 99 | @keyframes stream { 100 | to { 101 | transform: translateX(var(--v-progress-linear-stream-to)); 102 | } 103 | } 104 | @keyframes progress-linear-stripes { 105 | 0% { 106 | background-position-x: var(--v-progress-linear-height); 107 | } 108 | }@supports not selector(:focus-visible) { 109 | } 110 | @supports not selector(:focus-visible) { 111 | }@supports not selector(:focus-visible) { 112 | } 113 | @supports not selector(:focus-visible) { 114 | } 115 | @supports selector(:focus-visible) { 116 | }/* region BLOCK */ 117 | 118 | /* endregion */ 119 | /* region ELEMENTS */ 120 | 121 | /* endregion *//* region INPUT */ 122 | 123 | /* endregion */ 124 | /* region MODIFIERS */ 125 | 126 | /* endregion */ 127 | /* region ELEMENTS */ 128 | 129 | /* endregion */ 130 | /* region AFFIXES */ 131 | @media (hover: hover) { 132 | } 133 | @media (hover: none) { 134 | } 135 | 136 | /* endregion */ 137 | /* region LABEL */ 138 | 139 | /* endregion */ 140 | /* region OUTLINE */ 141 | @media (hover: hover) { 142 | } 143 | 144 | /* endregion */ 145 | /* region LOADER */ 146 | 147 | /* endregion */ 148 | /* region OVERLAY */ 149 | @media (hover: hover) { 150 | } 151 | @media (hover: hover) { 152 | } 153 | @media (hover: hover) { 154 | } 155 | 156 | /* endregion */ 157 | /* region MODIFIERS */ 158 | 159 | /* endregion */.bottom-sheet-transition-enter-from { 160 | transform: translateY(100%); 161 | } 162 | .bottom-sheet-transition-leave-to { 163 | transform: translateY(100%); 164 | } 165 | @media (min-width: 600px) { 166 | }@supports not selector(:focus-visible) { 167 | } 168 | @supports not selector(:focus-visible) { 169 | }@media (forced-colors: active) { 170 | } 171 | 172 | @media (hover: hover) { 173 | }@media (forced-colors: active) { 174 | } 175 | @media (forced-colors: active) { 176 | } 177 | @media (forced-colors: active) { 178 | }@media (min-width: 960px) { 179 | } 180 | @media (min-width: 1280px) { 181 | } 182 | @media (min-width: 1920px) { 183 | } 184 | @media (min-width: 2560px) { 185 | } 186 | 187 | .offset-1 { 188 | margin-inline-start: 8.3333333333%; 189 | } 190 | 191 | .offset-2 { 192 | margin-inline-start: 16.6666666667%; 193 | } 194 | 195 | .offset-3 { 196 | margin-inline-start: 25%; 197 | } 198 | 199 | .offset-4 { 200 | margin-inline-start: 33.3333333333%; 201 | } 202 | 203 | .offset-5 { 204 | margin-inline-start: 41.6666666667%; 205 | } 206 | 207 | .offset-6 { 208 | margin-inline-start: 50%; 209 | } 210 | 211 | .offset-7 { 212 | margin-inline-start: 58.3333333333%; 213 | } 214 | 215 | .offset-8 { 216 | margin-inline-start: 66.6666666667%; 217 | } 218 | 219 | .offset-9 { 220 | margin-inline-start: 75%; 221 | } 222 | 223 | .offset-10 { 224 | margin-inline-start: 83.3333333333%; 225 | } 226 | 227 | .offset-11 { 228 | margin-inline-start: 91.6666666667%; 229 | } 230 | 231 | @media (min-width: 600px) { 232 | .offset-sm-0 { 233 | margin-inline-start: 0; 234 | } 235 | .offset-sm-1 { 236 | margin-inline-start: 8.3333333333%; 237 | } 238 | .offset-sm-2 { 239 | margin-inline-start: 16.6666666667%; 240 | } 241 | .offset-sm-3 { 242 | margin-inline-start: 25%; 243 | } 244 | .offset-sm-4 { 245 | margin-inline-start: 33.3333333333%; 246 | } 247 | .offset-sm-5 { 248 | margin-inline-start: 41.6666666667%; 249 | } 250 | .offset-sm-6 { 251 | margin-inline-start: 50%; 252 | } 253 | .offset-sm-7 { 254 | margin-inline-start: 58.3333333333%; 255 | } 256 | .offset-sm-8 { 257 | margin-inline-start: 66.6666666667%; 258 | } 259 | .offset-sm-9 { 260 | margin-inline-start: 75%; 261 | } 262 | .offset-sm-10 { 263 | margin-inline-start: 83.3333333333%; 264 | } 265 | .offset-sm-11 { 266 | margin-inline-start: 91.6666666667%; 267 | } 268 | } 269 | @media (min-width: 960px) { 270 | .offset-md-0 { 271 | margin-inline-start: 0; 272 | } 273 | .offset-md-1 { 274 | margin-inline-start: 8.3333333333%; 275 | } 276 | .offset-md-2 { 277 | margin-inline-start: 16.6666666667%; 278 | } 279 | .offset-md-3 { 280 | margin-inline-start: 25%; 281 | } 282 | .offset-md-4 { 283 | margin-inline-start: 33.3333333333%; 284 | } 285 | .offset-md-5 { 286 | margin-inline-start: 41.6666666667%; 287 | } 288 | .offset-md-6 { 289 | margin-inline-start: 50%; 290 | } 291 | .offset-md-7 { 292 | margin-inline-start: 58.3333333333%; 293 | } 294 | .offset-md-8 { 295 | margin-inline-start: 66.6666666667%; 296 | } 297 | .offset-md-9 { 298 | margin-inline-start: 75%; 299 | } 300 | .offset-md-10 { 301 | margin-inline-start: 83.3333333333%; 302 | } 303 | .offset-md-11 { 304 | margin-inline-start: 91.6666666667%; 305 | } 306 | } 307 | @media (min-width: 1280px) { 308 | .offset-lg-0 { 309 | margin-inline-start: 0; 310 | } 311 | .offset-lg-1 { 312 | margin-inline-start: 8.3333333333%; 313 | } 314 | .offset-lg-2 { 315 | margin-inline-start: 16.6666666667%; 316 | } 317 | .offset-lg-3 { 318 | margin-inline-start: 25%; 319 | } 320 | .offset-lg-4 { 321 | margin-inline-start: 33.3333333333%; 322 | } 323 | .offset-lg-5 { 324 | margin-inline-start: 41.6666666667%; 325 | } 326 | .offset-lg-6 { 327 | margin-inline-start: 50%; 328 | } 329 | .offset-lg-7 { 330 | margin-inline-start: 58.3333333333%; 331 | } 332 | .offset-lg-8 { 333 | margin-inline-start: 66.6666666667%; 334 | } 335 | .offset-lg-9 { 336 | margin-inline-start: 75%; 337 | } 338 | .offset-lg-10 { 339 | margin-inline-start: 83.3333333333%; 340 | } 341 | .offset-lg-11 { 342 | margin-inline-start: 91.6666666667%; 343 | } 344 | } 345 | @media (min-width: 1920px) { 346 | .offset-xl-0 { 347 | margin-inline-start: 0; 348 | } 349 | .offset-xl-1 { 350 | margin-inline-start: 8.3333333333%; 351 | } 352 | .offset-xl-2 { 353 | margin-inline-start: 16.6666666667%; 354 | } 355 | .offset-xl-3 { 356 | margin-inline-start: 25%; 357 | } 358 | .offset-xl-4 { 359 | margin-inline-start: 33.3333333333%; 360 | } 361 | .offset-xl-5 { 362 | margin-inline-start: 41.6666666667%; 363 | } 364 | .offset-xl-6 { 365 | margin-inline-start: 50%; 366 | } 367 | .offset-xl-7 { 368 | margin-inline-start: 58.3333333333%; 369 | } 370 | .offset-xl-8 { 371 | margin-inline-start: 66.6666666667%; 372 | } 373 | .offset-xl-9 { 374 | margin-inline-start: 75%; 375 | } 376 | .offset-xl-10 { 377 | margin-inline-start: 83.3333333333%; 378 | } 379 | .offset-xl-11 { 380 | margin-inline-start: 91.6666666667%; 381 | } 382 | } 383 | @media (min-width: 2560px) { 384 | .offset-xxl-0 { 385 | margin-inline-start: 0; 386 | } 387 | .offset-xxl-1 { 388 | margin-inline-start: 8.3333333333%; 389 | } 390 | .offset-xxl-2 { 391 | margin-inline-start: 16.6666666667%; 392 | } 393 | .offset-xxl-3 { 394 | margin-inline-start: 25%; 395 | } 396 | .offset-xxl-4 { 397 | margin-inline-start: 33.3333333333%; 398 | } 399 | .offset-xxl-5 { 400 | margin-inline-start: 41.6666666667%; 401 | } 402 | .offset-xxl-6 { 403 | margin-inline-start: 50%; 404 | } 405 | .offset-xxl-7 { 406 | margin-inline-start: 58.3333333333%; 407 | } 408 | .offset-xxl-8 { 409 | margin-inline-start: 66.6666666667%; 410 | } 411 | .offset-xxl-9 { 412 | margin-inline-start: 75%; 413 | } 414 | .offset-xxl-10 { 415 | margin-inline-start: 83.3333333333%; 416 | } 417 | .offset-xxl-11 { 418 | margin-inline-start: 91.6666666667%; 419 | } 420 | }.date-picker-header-transition-enter-active, 421 | .date-picker-header-reverse-transition-enter-active { 422 | transition-duration: 0.3s; 423 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 424 | } 425 | .date-picker-header-transition-leave-active, 426 | .date-picker-header-reverse-transition-leave-active { 427 | transition-duration: 0.3s; 428 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 429 | } 430 | 431 | .date-picker-header-transition-enter-from { 432 | transform: translate(0, 100%); 433 | } 434 | .date-picker-header-transition-leave-to { 435 | opacity: 0; 436 | transform: translate(0, -100%); 437 | } 438 | 439 | .date-picker-header-reverse-transition-enter-from { 440 | transform: translate(0, -100%); 441 | } 442 | .date-picker-header-reverse-transition-leave-to { 443 | opacity: 0; 444 | transform: translate(0, 100%); 445 | }@supports not selector(:focus-visible) { 446 | } 447 | @supports not selector(:focus-visible) { 448 | }@keyframes loading { 449 | 100% { 450 | transform: translateX(100%); 451 | } 452 | }@supports not selector(:focus-visible) { 453 | } 454 | @supports not selector(:focus-visible) { 455 | }@media (forced-colors: active) { 456 | }@media (max-width: 1279.98px) { 457 | }/** Modifiers **/ -------------------------------------------------------------------------------- /plugins/logsclean/dist/assets/remoteEntry.js: -------------------------------------------------------------------------------- 1 | const currentImports = {}; 2 | const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); 3 | let moduleMap = { 4 | "./Page":()=>{ 5 | dynamicLoadingCss(["__federation_expose_Page-CameGtjZ.css"], false, './Page'); 6 | return __federation_import('./__federation_expose_Page-CFAOoSNg.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 7 | "./Config":()=>{ 8 | dynamicLoadingCss(["__federation_expose_Config-Cz4Zx2k7.css"], false, './Config'); 9 | return __federation_import('./__federation_expose_Config-DEahhRyd.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 10 | "./Dashboard":()=>{ 11 | dynamicLoadingCss(["__federation_expose_Dashboard-DzY_5vpv.css"], false, './Dashboard'); 12 | return __federation_import('./__federation_expose_Dashboard-iJL_Safg.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; 13 | const seen = {}; 14 | const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { 15 | const metaUrl = import.meta.url; 16 | if (typeof metaUrl === 'undefined') { 17 | console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".'); 18 | return; 19 | } 20 | 21 | const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js')); 22 | const base = '/'; 23 | 'assets'; 24 | 25 | cssFilePaths.forEach(cssPath => { 26 | let href = ''; 27 | const baseUrl = base || curUrl; 28 | if (baseUrl) { 29 | const trimmer = { 30 | trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path), 31 | leading: (path) => (path.startsWith('/') ? path.slice(1) : path) 32 | }; 33 | const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//'); 34 | 35 | const cleanBaseUrl = trimmer.trailing(baseUrl); 36 | const cleanCssPath = trimmer.leading(cssPath); 37 | const cleanCurUrl = trimmer.trailing(curUrl); 38 | 39 | if (isAbsoluteUrl(baseUrl)) { 40 | href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 41 | } else { 42 | if (cleanCurUrl.includes(cleanBaseUrl)) { 43 | href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/'); 44 | } else { 45 | href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 46 | } 47 | } 48 | } else { 49 | href = cssPath; 50 | } 51 | 52 | if (dontAppendStylesToHead) { 53 | const key = 'css__Logsclean__' + exposeItemName; 54 | window[key] = window[key] || []; 55 | window[key].push(href); 56 | return; 57 | } 58 | 59 | if (href in seen) return; 60 | seen[href] = true; 61 | 62 | const element = document.createElement('link'); 63 | element.rel = 'stylesheet'; 64 | element.href = href; 65 | document.head.appendChild(element); 66 | }); 67 | }; 68 | async function __federation_import(name) { 69 | currentImports[name] ??= import(name); 70 | return currentImports[name] 71 | } const get =(module) => { 72 | if(!moduleMap[module]) throw new Error('Can not find remote module ' + module) 73 | return moduleMap[module](); 74 | }; 75 | const init =(shareScope) => { 76 | globalThis.__federation_shared__= globalThis.__federation_shared__|| {}; 77 | Object.entries(shareScope).forEach(([key, value]) => { 78 | for (const [versionKey, versionValue] of Object.entries(value)) { 79 | const scope = versionValue.scope || 'default'; 80 | globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {}; 81 | const shared= globalThis.__federation_shared__[scope]; 82 | (shared[key] = shared[key]||{})[versionKey] = versionValue; 83 | } 84 | }); 85 | }; 86 | 87 | export { dynamicLoadingCss, get, init }; 88 | -------------------------------------------------------------------------------- /plugins/logsclean/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MoviePilot插件组件示例 8 | 9 | 10 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /plugins/nexusinvitee/README.md: -------------------------------------------------------------------------------- 1 | # 后宫管理系统 2 | 3 | ![版本](https://img.shields.io/badge/版本-1.0.0-blue) 4 | ![支持的站点](https://img.shields.io/badge/支持站点-NexusPHP-yellow) 5 | 6 | ## 简介 7 | 8 | 一款专为PT站点设计的后宫(邀请系统)管理工具,可以帮助您管理多个NexusPHP站点的邀请系统,包括邀请名额、已邀请用户状态等信息。 9 | 10 | ## 功能特点 11 | 12 | - 支持多站点同时管理,集中展示所有站点的后宫数据 13 | - 自动识别各站点邀请权限状态 14 | - 跟踪已邀请用户的状态(启用/禁用) 15 | - 监控用户分享率健康状况 16 | - 定时自动刷新数据,支持手动强制刷新 17 | - 美观的数据展示界面,方便查看和管理 18 | 19 | ## 使用方法 20 | 21 | 1. 在插件市场安装本插件 22 | 2. 在插件设置中选择需要管理的NexusPHP站点 23 | 3. 设置刷新频率(默认为4小时) 24 | 4. 保存设置后,系统将自动获取站点数据 25 | 26 | ## 适配状态 27 | 28 | ⚠️ **当前处于适配中**,可能无法完美支持所有NexusPHP站点。不同站点的邀请系统页面结构可能存在差异,我们正在努力增加更多站点的兼容性。 29 | 30 | ## 已知支持的站点类型 31 | 32 | - 标准NexusPHP站点 33 | - M-Team特殊结构 34 | - 多种定制版NexusPHP站点 35 | 36 | ## 帮助完善插件 37 | 38 | 如果插件在某些站点运行出错,请提交以下信息帮助我们改进: 39 | 40 | 1. 出错站点的名称 41 | 2. 出错站点的邀请页面HTML结构(请将敏感信息如Cookie、账号等隐去) 42 | 3. 出错站点的发送邀请页面HTML结构(同样隐去敏感信息) 43 | 4. 错误日志或截图 44 | 45 | 提交方式: 46 | - GitHub Issues: [https://github.com/madrays/MoviePilot-Plugins/issues](https://github.com/madrays/MoviePilot-Plugins/issues) 47 | - 通过MoviePilot内置反馈功能 48 | 49 | ## 注意事项 50 | 51 | - 本插件仅获取数据用于展示,不会自动发送邀请 52 | - 请合理使用站点邀请功能,遵守站点规则 53 | - 建议不要设置过高的刷新频率,以免增加站点负担 54 | 55 | ## 隐私声明 56 | 57 | 本插件仅在本地处理数据,不会将您的站点账号信息或邀请数据上传至任何第三方服务器。 58 | 59 | ## 未来计划 60 | 61 | 我们正在规划以下功能的开发: 62 | 63 | 1. **配套浏览器插件** 64 | - 更加丰富详细的后宫管理界面 65 | - 实时提醒新用户注册和状态变化 66 | - 一键发送邀请功能 67 | - 自定义用户标签和备注功能 68 | - 多站点数据实时同步与比对 69 | - 智能邀请名额分配建议 70 | - 用户状态变更历史记录 71 | - 站点特殊公告和规则提醒 72 | 73 | 2. **功能扩展** 74 | - 用户行为分析和统计 75 | - 批量操作功能 76 | - 邀请记录导出功能 77 | - 用户分类和筛选功能 78 | - 风险用户预警系统 79 | - 用户质量评分系统 80 | - 邀请策略优化建议 81 | - 自定义数据看板 82 | 83 | 3. **更多站点支持** 84 | - 持续添加对更多非标准NexusPHP站点的支持 85 | - 优化适配各站点特殊结构 86 | - 支持非NexusPHP体系的PT站点 87 | - 适配更多特殊用户组和权限系统 88 | 89 | 4. **高级数据分析** 90 | - 用户活跃度趋势分析 91 | - 站点邀请名额变化趋势 92 | - 用户行为模式识别 93 | - 邀请效果评估报告 94 | 95 | 敬请期待后续版本更新! 96 | 97 | ## 更新日志 98 | 99 | ### v1.0.0 100 | - 初始版本发布 101 | - 支持基础的后宫数据获取和展示 102 | - 适配多种NexusPHP站点结构 -------------------------------------------------------------------------------- /plugins/nexusinvitee/data.py: -------------------------------------------------------------------------------- 1 | """ 2 | 数据管理模块 3 | """ 4 | import os 5 | import json 6 | import time 7 | from typing import Dict, Any, List, Optional 8 | 9 | from app.log import logger 10 | 11 | 12 | class DataManager: 13 | """ 14 | 数据管理类 15 | """ 16 | 17 | def __init__(self, data_path: str): 18 | """ 19 | 初始化数据管理 20 | :param data_path: 数据目录路径 21 | """ 22 | self.data_path = data_path 23 | self.data_file = os.path.join(data_path, "site_data.json") 24 | 25 | def load_data(self) -> Dict[str, Any]: 26 | """ 27 | 从文件加载数据 28 | :return: 数据字典 29 | """ 30 | if not os.path.exists(self.data_file): 31 | return {} 32 | 33 | try: 34 | with open(self.data_file, 'r', encoding='utf-8') as f: 35 | return json.load(f) 36 | except Exception as e: 37 | logger.error(f"读取站点数据文件失败: {str(e)}") 38 | return {} 39 | 40 | def save_data(self, data: Dict[str, Any]) -> bool: 41 | """ 42 | 保存数据到文件 43 | :param data: 数据字典 44 | :return: 是否成功 45 | """ 46 | try: 47 | # 确保目录存在 48 | os.makedirs(os.path.dirname(self.data_file), exist_ok=True) 49 | 50 | with open(self.data_file, 'w', encoding='utf-8') as f: 51 | json.dump(data, f, ensure_ascii=False, indent=2) 52 | return True 53 | except Exception as e: 54 | logger.error(f"保存站点数据到文件失败: {str(e)}") 55 | return False 56 | 57 | def update_site_data(self, site_name: str, site_data: Dict[str, Any]) -> bool: 58 | """ 59 | 更新指定站点的数据 60 | :param site_name: 站点名称 61 | :param site_data: 站点数据 62 | :return: 是否成功 63 | """ 64 | all_data = self.load_data() 65 | 66 | # 更新站点数据并添加时间戳 67 | all_data[site_name] = { 68 | "data": site_data, 69 | "last_update": int(time.time()) 70 | } 71 | 72 | return self.save_data(all_data) 73 | 74 | def get_site_data(self, site_name: Optional[str] = None) -> Dict[str, Any]: 75 | """ 76 | 获取站点数据 77 | :param site_name: 站点名称,如果为None则返回所有站点数据 78 | :return: 站点数据 79 | """ 80 | all_data = self.load_data() 81 | 82 | if site_name: 83 | return all_data.get(site_name, {}) 84 | return all_data 85 | 86 | def get_last_update_time(self) -> int: 87 | """ 88 | 获取最后更新时间 89 | :return: 时间戳 90 | """ 91 | all_data = self.load_data() 92 | 93 | update_times = [] 94 | for site_data in all_data.values(): 95 | if "last_update" in site_data: 96 | update_times.append(site_data["last_update"]) 97 | 98 | return max(update_times) if update_times else 0 99 | 100 | def clear_all_site_data(self) -> bool: 101 | """ 102 | 清空所有站点数据 103 | :return: 是否成功 104 | """ 105 | try: 106 | if os.path.exists(self.data_file): 107 | # 直接清空为空字典 108 | return self.save_data({}) 109 | return True 110 | except Exception as e: 111 | logger.error(f"清空站点数据失败: {str(e)}") 112 | return False -------------------------------------------------------------------------------- /plugins/nexusinvitee/module_loader.py: -------------------------------------------------------------------------------- 1 | """ 2 | 模块加载器模块 3 | """ 4 | import os 5 | import importlib 6 | import inspect 7 | from typing import List, Type, Dict, Any 8 | 9 | from app.log import logger 10 | from plugins.nexusinvitee.sites import _ISiteHandler 11 | 12 | 13 | class ModuleLoader: 14 | """ 15 | 模块加载器类 16 | """ 17 | 18 | @staticmethod 19 | def load_site_handlers() -> List[Type[_ISiteHandler]]: 20 | """ 21 | 加载所有站点处理器类 22 | :return: 站点处理器类列表 23 | """ 24 | handlers = [] 25 | sites_dir = os.path.join(os.path.dirname(__file__), "sites") 26 | 27 | if not os.path.exists(sites_dir): 28 | logger.error("站点处理器目录不存在") 29 | return [] 30 | 31 | # 遍历sites目录下的所有py文件 32 | for filename in os.listdir(sites_dir): 33 | if not filename.endswith(".py") or filename == "__init__.py": 34 | continue 35 | 36 | module_name = filename[:-3] # 去掉.py后缀 37 | 38 | try: 39 | # 动态导入模块 40 | module = importlib.import_module(f"plugins.nexusinvitee.sites.{module_name}") 41 | 42 | # 查找模块中继承了_ISiteHandler的类 43 | for name, obj in inspect.getmembers(module): 44 | if (inspect.isclass(obj) and 45 | issubclass(obj, _ISiteHandler) and 46 | obj != _ISiteHandler): 47 | handlers.append(obj) 48 | logger.info(f"加载站点处理器: {obj.__name__}") 49 | 50 | except Exception as e: 51 | logger.error(f"加载站点处理器模块 {module_name} 失败: {str(e)}") 52 | 53 | return handlers 54 | 55 | @staticmethod 56 | def get_handler_for_site(site_url: str, handlers: List[Type[_ISiteHandler]]) -> _ISiteHandler: 57 | """ 58 | 获取匹配站点的处理器实例 59 | :param site_url: 站点URL 60 | :param handlers: 处理器类列表 61 | :return: 处理器实例 62 | """ 63 | for handler_class in handlers: 64 | if handler_class.match(site_url): 65 | return handler_class() 66 | 67 | # 如果没有找到匹配的处理器,返回None 68 | return None -------------------------------------------------------------------------------- /plugins/nexusinvitee/sites/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | NexusPHP站点邀请系统解析器基类 3 | """ 4 | import re 5 | from abc import ABCMeta, abstractmethod 6 | from typing import Dict, Optional, Any 7 | 8 | import requests 9 | from bs4 import BeautifulSoup 10 | from urllib.parse import urljoin 11 | 12 | from app.log import logger 13 | 14 | 15 | class _ISiteHandler(metaclass=ABCMeta): 16 | """ 17 | 站点邀请系统处理的基类,所有站点处理类都需要继承此类 18 | """ 19 | # 站点类型标识 20 | site_schema = "" 21 | 22 | @classmethod 23 | @abstractmethod 24 | def match(cls, site_url: str) -> bool: 25 | """ 26 | 判断是否匹配该站点处理类 27 | :param site_url: 站点URL 28 | :return: 是否匹配 29 | """ 30 | pass 31 | 32 | @abstractmethod 33 | def parse_invite_page(self, site_info: Dict[str, Any], session: requests.Session) -> Dict[str, Any]: 34 | """ 35 | 解析站点邀请页面 36 | :param site_info: 站点信息 37 | :param session: 已配置好的请求会话 38 | :return: 解析结果 39 | """ 40 | pass 41 | 42 | @staticmethod 43 | def _get_user_id(session: requests.Session, site_url: str) -> Optional[str]: 44 | """ 45 | 获取用户ID 46 | :param session: 请求会话 47 | :param site_url: 站点URL 48 | :return: 用户ID 49 | """ 50 | try: 51 | # 访问个人信息页面 52 | usercp_url = urljoin(site_url, "usercp.php") 53 | response = session.get(usercp_url, timeout=(5, 15)) 54 | response.raise_for_status() 55 | 56 | # 解析页面获取用户ID 57 | soup = BeautifulSoup(response.text, 'html.parser') 58 | 59 | # 方法1: 从个人信息链接获取 60 | user_link = soup.select_one('a[href*="userdetails.php"]') 61 | if user_link and 'href' in user_link.attrs: 62 | user_id_match = re.search(r'id=(\d+)', user_link['href']) 63 | if user_id_match: 64 | return user_id_match.group(1) 65 | 66 | # 方法2: 从其他链接获取 67 | invite_link = soup.select_one('a[href*="invite.php"]') 68 | if invite_link and 'href' in invite_link.attrs: 69 | user_id_match = re.search(r'id=(\d+)', invite_link['href']) 70 | if user_id_match: 71 | return user_id_match.group(1) 72 | 73 | return None 74 | except Exception as e: 75 | logger.error(f"获取用户ID失败: {str(e)}") 76 | return None 77 | 78 | @staticmethod 79 | def _convert_size_to_bytes(size_str: str) -> float: 80 | """ 81 | 将大小字符串转换为字节数 82 | :param size_str: 大小字符串 83 | :return: 字节数 84 | """ 85 | if not size_str or size_str.strip() == '': 86 | logger.warning(f"空的大小字符串") 87 | return 0 88 | 89 | # 处理特殊情况 90 | if size_str.lower() == 'inf.' or size_str.lower() == 'inf' or size_str == '∞': 91 | logger.info(f"识别到无限大值: {size_str}") 92 | return 1e20 # 使用一个非常大的数值代替无穷大 93 | 94 | try: 95 | # 标准化字符串,替换逗号为点 96 | size_str = size_str.replace(',', '.') 97 | 98 | # 分离数字和单位 99 | # 正则表达式匹配数字部分和单位部分 100 | matches = re.match( 101 | r'([\d.]+)\s*([KMGTPEZY]?i?B)', size_str, re.IGNORECASE) 102 | 103 | if not matches: 104 | # 尝试匹配仅有数字的情况 105 | try: 106 | return float(size_str) 107 | except ValueError: 108 | logger.warning(f"无法解析大小字符串: {size_str}") 109 | return 0 110 | 111 | size_num, unit = matches.groups() 112 | 113 | # 尝试转换数字 114 | try: 115 | size_value = float(size_num) 116 | except ValueError: 117 | logger.warning(f"无法转换大小值为浮点数: {size_num}") 118 | return 0 119 | 120 | # 单位转换 121 | unit = unit.upper() 122 | 123 | units = { 124 | 'B': 1, 125 | 'KB': 1024, 126 | 'KIB': 1024, 127 | 'MB': 1024 ** 2, 128 | 'MIB': 1024 ** 2, 129 | 'GB': 1024 ** 3, 130 | 'GIB': 1024 ** 3, 131 | 'TB': 1024 ** 4, 132 | 'TIB': 1024 ** 4, 133 | 'PB': 1024 ** 5, 134 | 'PIB': 1024 ** 5, 135 | 'EB': 1024 ** 6, 136 | 'EIB': 1024 ** 6, 137 | 'ZB': 1024 ** 7, 138 | 'ZIB': 1024 ** 7, 139 | 'YB': 1024 ** 8, 140 | 'YIB': 1024 ** 8 141 | } 142 | 143 | # 处理简写单位 144 | if unit in ['K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']: 145 | unit = unit + 'B' 146 | 147 | if unit not in units: 148 | logger.warning(f"未知的大小单位: {unit}") 149 | return size_value # 假设是字节 150 | 151 | return size_value * units[unit] 152 | 153 | except Exception as e: 154 | logger.warning(f"转换大小字符串到字节时出错 '{size_str}': {str(e)}") 155 | return 0 156 | 157 | @staticmethod 158 | def _calculate_ratio(uploaded: str, downloaded: str) -> str: 159 | """ 160 | 计算分享率 161 | :param uploaded: 上传量 162 | :param downloaded: 下载量 163 | :return: 分享率字符串 164 | """ 165 | try: 166 | up_bytes = _ISiteHandler._convert_size_to_bytes(uploaded) 167 | down_bytes = _ISiteHandler._convert_size_to_bytes(downloaded) 168 | 169 | if down_bytes == 0: 170 | return "∞" if up_bytes > 0 else "0" 171 | 172 | ratio = up_bytes / down_bytes 173 | return f"{ratio:.3f}" 174 | except Exception as e: 175 | logger.error(f"计算分享率失败: {str(e)}") 176 | return "0" -------------------------------------------------------------------------------- /plugins/nexusinvitee/utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | 工具类模块 3 | """ 4 | import time 5 | from datetime import datetime 6 | from typing import Optional, Any 7 | 8 | from app.core.event import eventmanager 9 | from app.schemas.types import NotificationType, EventType 10 | from app.log import logger 11 | 12 | 13 | class NotificationHelper: 14 | """ 15 | 通知助手类 16 | """ 17 | 18 | def __init__(self, plugin): 19 | """ 20 | 初始化通知助手 21 | :param plugin: 插件实例 22 | """ 23 | self.plugin = plugin 24 | 25 | def send_notification(self, title: str, text: str, notify_switch: bool = True, 26 | channel: str = None, image: str = None, force: bool = False): 27 | """ 28 | 发送通知 29 | :param title: 通知标题 30 | :param text: 通知内容 31 | :param notify_switch: 通知开关 32 | :param channel: 通知渠道 33 | :param image: 图片URL 34 | :param force: 是否强制发送(忽略通知开关) 35 | """ 36 | # 如果通知开关关闭且不是强制发送,则不发送通知 37 | if not notify_switch and not force: 38 | return 39 | 40 | try: 41 | # 记录到日志 42 | logger.info(f"发送通知: {title}") 43 | 44 | # 仅使用事件管理器发送通知,不再使用plugin.post_message 45 | # 因为plugin.post_message会在refresh_all_sites中直接调用,这里只需记录日志 46 | # 避免在多处发送导致重复通知 47 | logger.debug(f"通知内容: {text}") 48 | except Exception as e: 49 | logger.error(f"发送通知失败: {str(e)}") 50 | 51 | 52 | class SiteHelper: 53 | """ 54 | 站点助手类 55 | """ 56 | 57 | @staticmethod 58 | def format_timestamp(timestamp: int) -> str: 59 | """ 60 | 格式化时间戳为可读字符串 61 | :param timestamp: 时间戳 62 | :return: 格式化后的时间字符串 63 | """ 64 | if not timestamp: 65 | return "" 66 | 67 | try: 68 | return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') 69 | except Exception as e: 70 | logger.error(f"格式化时间戳失败: {str(e)}") 71 | return str(timestamp) 72 | 73 | @staticmethod 74 | def is_cache_valid(last_update: int, cache_ttl: int = 21600) -> bool: 75 | """ 76 | 检查缓存是否有效 77 | :param last_update: 最后更新时间 78 | :param cache_ttl: 缓存有效期(秒),默认6小时 79 | :return: 是否有效 80 | """ 81 | if not last_update: 82 | return False 83 | 84 | current_time = int(time.time()) 85 | return (current_time - last_update) < cache_ttl 86 | 87 | @staticmethod 88 | def format_size(size_bytes: int) -> str: 89 | """ 90 | 格式化文件大小 91 | :param size_bytes: 字节数 92 | :return: 格式化后的大小字符串 93 | """ 94 | try: 95 | for unit in ['B', 'KB', 'MB', 'GB', 'TB']: 96 | if size_bytes < 1024.0: 97 | return f"{size_bytes:.2f} {unit}" 98 | size_bytes /= 1024.0 99 | return f"{size_bytes:.2f} PB" 100 | except: 101 | return "0 B" 102 | 103 | @staticmethod 104 | def is_nexusphp(site_url: str) -> bool: 105 | """ 106 | 判断是否为NexusPHP站点 107 | :param site_url: 站点URL 108 | :return: 是否为NexusPHP站点 109 | """ 110 | return "php" in site_url.lower() -------------------------------------------------------------------------------- /plugins/nodeseeksign/requirements.txt: -------------------------------------------------------------------------------- 1 | curl_cffi>=0.5.9 -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/__federation_expose_Config-Bs1x_wA9.css: -------------------------------------------------------------------------------- 1 | 2 | /* 统一字体 - Inspired by Page.vue */ 3 | 4 | /* 文字大小 - Unified with Page.vue */ 5 | [data-v-97d6e856] .text-caption { 6 | font-size: 0.8rem !important; 7 | } 8 | [data-v-97d6e856] .text-body-2 { 9 | font-size: 0.85rem !important; 10 | } 11 | [data-v-97d6e856] .text-subtitle-2 { /* Added for consistency with Page.vue inner card titles */ 12 | font-size: 0.875rem !important; 13 | font-weight: 500 !important; 14 | line-height: 1.25rem !important; 15 | } 16 | 17 | /* 基本配置卡片样式 */ 18 | .config-card[data-v-97d6e856] { 19 | border-radius: 8px !important; 20 | border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)) !important; 21 | overflow: hidden; /* 确保内部元素不会超出圆角 */ 22 | } 23 | .bg-primary-gradient[data-v-97d6e856] { 24 | background: linear-gradient(to right, rgba(var(--v-theme-primary), 0.1), rgba(var(--v-theme-primary), 0.03)) !important; 25 | /* border-bottom: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)); */ 26 | } 27 | .config-title[data-v-97d6e856] { 28 | font-weight: 500; 29 | color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); 30 | } 31 | 32 | /* 路径输入框组 */ 33 | .path-group[data-v-97d6e856] { 34 | padding: 8px; 35 | border: 1px solid rgba(var(--v-border-color), 0.3); 36 | border-radius: 6px; 37 | background-color: rgba(var(--v-theme-surface-variant), 0.3); 38 | } 39 | .path-input-row[data-v-97d6e856] { 40 | display: flex; 41 | align-items: center; 42 | } 43 | .path-input-field[data-v-97d6e856] { 44 | flex-grow: 1; 45 | } 46 | .path-input-action[data-v-97d6e856] { 47 | margin-left: 8px; 48 | } 49 | 50 | /* Cookie 输入框样式 */ 51 | 52 | /* Tab 样式调整 */ 53 | 54 | /* Switch 样式调整 */ 55 | 56 | /* 调整字体大小 */ 57 | 58 | /* Reduce vertical padding for columns within rows */ 59 | 60 | /* 更鲜艳的 Tab 颜色 (示例) */ 61 | 62 | /* Colorful Switches */ 63 | 64 | /* Primary Color Switch */ 65 | 66 | /* Success Color Switch */ 67 | 68 | /* Info Color Switch */ 69 | 70 | /* Warning Color Switch */ 71 | 72 | /* Error Color Switch */ 73 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/__federation_expose_Dashboard-BUpqH6KU.js: -------------------------------------------------------------------------------- 1 | import { importShared } from './__federation_fn_import-JrT3xvdd.js'; 2 | import { _ as _export_sfc } from './_plugin-vue_export-helper-pcqpp-6-.js'; 3 | 4 | const {toDisplayString:_toDisplayString,createTextVNode:_createTextVNode,resolveComponent:_resolveComponent,withCtx:_withCtx,createVNode:_createVNode,openBlock:_openBlock,createBlock:_createBlock,createCommentVNode:_createCommentVNode,createElementBlock:_createElementBlock,normalizeClass:_normalizeClass,createElementVNode:_createElementVNode} = await importShared('vue'); 5 | 6 | 7 | const _hoisted_1 = { class: "dashboard-widget" }; 8 | const _hoisted_2 = { 9 | key: 0, 10 | class: "text-center py-2" 11 | }; 12 | const _hoisted_3 = { 13 | key: 1, 14 | class: "text-error text-caption d-flex align-center" 15 | }; 16 | const _hoisted_4 = { key: 2 }; 17 | const _hoisted_5 = { 18 | key: 3, 19 | class: "text-caption text-disabled text-center py-2" 20 | }; 21 | const _hoisted_6 = { class: "text-caption text-disabled" }; 22 | 23 | const {ref,reactive,onMounted,onUnmounted,computed} = await importShared('vue'); 24 | 25 | 26 | // 接收props 27 | 28 | const _sfc_main = { 29 | __name: 'Dashboard', 30 | props: { 31 | // API对象,用于调用插件API 32 | api: { 33 | type: [Object, Function], 34 | required: true, 35 | }, 36 | // 配置参数,来自get_dashboard方法的第二个返回值 37 | config: { 38 | type: Object, 39 | default: () => ({ attrs: {} }), 40 | }, 41 | // 是否允许手动刷新 42 | allowRefresh: { 43 | type: Boolean, 44 | default: false, 45 | }, 46 | // 自动刷新间隔(秒) 47 | refreshInterval: { 48 | type: Number, 49 | default: 0, // 0表示不自动刷新 50 | }, 51 | }, 52 | setup(__props) { 53 | 54 | const props = __props; 55 | 56 | // 状态变量 57 | const loading = ref(false); 58 | const error = ref(null); 59 | const initialDataLoaded = ref(false); 60 | const lastRefreshedTimestamp = ref(null); 61 | 62 | // 状态数据 63 | const status = reactive({ 64 | enabled: false, 65 | has_client: false, 66 | running: false, 67 | }); 68 | 69 | // 刷新计时器 70 | let refreshTimer = null; 71 | 72 | // 获取插件ID函数 - 返回固定的插件类名 73 | const getPluginId = () => { 74 | return "P1115StrmHelper"; // 必须与后端插件类名完全匹配 75 | }; 76 | 77 | // 获取数据的函数 78 | async function fetchData() { 79 | loading.value = true; 80 | error.value = null; 81 | 82 | try { 83 | // 获取插件ID 84 | const pluginId = getPluginId(); 85 | 86 | // 调用API获取状态信息 87 | const result = await props.api.get(`plugin/${pluginId}/get_status`); 88 | 89 | if (result && result.code === 0 && result.data) { 90 | // 更新状态数据 91 | status.enabled = result.data.enabled; 92 | status.has_client = result.data.has_client; 93 | status.running = result.data.running; 94 | 95 | initialDataLoaded.value = true; 96 | lastRefreshedTimestamp.value = Date.now(); 97 | } else { 98 | throw new Error(result?.msg || '获取状态失败'); 99 | } 100 | } catch (err) { 101 | console.error('获取仪表盘数据失败:', err); 102 | error.value = err.message || '获取数据失败'; 103 | } finally { 104 | loading.value = false; 105 | } 106 | } 107 | 108 | // 最后刷新时间显示 109 | const lastRefreshedTimeDisplay = computed(() => { 110 | if (!lastRefreshedTimestamp.value) return ''; 111 | 112 | const date = new Date(lastRefreshedTimestamp.value); 113 | return `更新于: ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`; 114 | }); 115 | 116 | // 组件挂载时获取数据 117 | onMounted(() => { 118 | fetchData(); 119 | 120 | // 设置自动刷新 121 | if (props.refreshInterval > 0) { 122 | refreshTimer = setInterval(fetchData, props.refreshInterval * 1000); 123 | } 124 | }); 125 | 126 | // 组件卸载时清除计时器 127 | onUnmounted(() => { 128 | if (refreshTimer) { 129 | clearInterval(refreshTimer); 130 | refreshTimer = null; 131 | } 132 | }); 133 | 134 | return (_ctx, _cache) => { 135 | const _component_v_card_title = _resolveComponent("v-card-title"); 136 | const _component_v_card_subtitle = _resolveComponent("v-card-subtitle"); 137 | const _component_v_card_item = _resolveComponent("v-card-item"); 138 | const _component_v_progress_circular = _resolveComponent("v-progress-circular"); 139 | const _component_v_icon = _resolveComponent("v-icon"); 140 | const _component_v_list_item_title = _resolveComponent("v-list-item-title"); 141 | const _component_v_list_item = _resolveComponent("v-list-item"); 142 | const _component_v_list = _resolveComponent("v-list"); 143 | const _component_v_card_text = _resolveComponent("v-card-text"); 144 | const _component_v_divider = _resolveComponent("v-divider"); 145 | const _component_v_spacer = _resolveComponent("v-spacer"); 146 | const _component_v_btn = _resolveComponent("v-btn"); 147 | const _component_v_card_actions = _resolveComponent("v-card-actions"); 148 | const _component_v_card = _resolveComponent("v-card"); 149 | 150 | return (_openBlock(), _createElementBlock("div", _hoisted_1, [ 151 | _createVNode(_component_v_card, { 152 | flat: !props.config?.attrs?.border, 153 | loading: loading.value, 154 | class: "fill-height d-flex flex-column" 155 | }, { 156 | default: _withCtx(() => [ 157 | (props.config?.attrs?.title || props.config?.attrs?.subtitle) 158 | ? (_openBlock(), _createBlock(_component_v_card_item, { key: 0 }, { 159 | default: _withCtx(() => [ 160 | _createVNode(_component_v_card_title, null, { 161 | default: _withCtx(() => [ 162 | _createTextVNode(_toDisplayString(props.config?.attrs?.title || '115网盘STRM助手'), 1) 163 | ]), 164 | _: 1 165 | }), 166 | (props.config?.attrs?.subtitle) 167 | ? (_openBlock(), _createBlock(_component_v_card_subtitle, { key: 0 }, { 168 | default: _withCtx(() => [ 169 | _createTextVNode(_toDisplayString(props.config.attrs.subtitle), 1) 170 | ]), 171 | _: 1 172 | })) 173 | : _createCommentVNode("", true) 174 | ]), 175 | _: 1 176 | })) 177 | : _createCommentVNode("", true), 178 | _createVNode(_component_v_card_text, { class: "flex-grow-1 pa-3" }, { 179 | default: _withCtx(() => [ 180 | (loading.value && !initialDataLoaded.value) 181 | ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ 182 | _createVNode(_component_v_progress_circular, { 183 | indeterminate: "", 184 | color: "primary", 185 | size: "small" 186 | }) 187 | ])) 188 | : (error.value) 189 | ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ 190 | _createVNode(_component_v_icon, { 191 | size: "small", 192 | color: "error", 193 | class: "mr-1" 194 | }, { 195 | default: _withCtx(() => _cache[0] || (_cache[0] = [ 196 | _createTextVNode("mdi-alert-circle-outline") 197 | ])), 198 | _: 1 199 | }), 200 | _createTextVNode(" " + _toDisplayString(error.value || '数据加载失败'), 1) 201 | ])) 202 | : (initialDataLoaded.value) 203 | ? (_openBlock(), _createElementBlock("div", _hoisted_4, [ 204 | _createVNode(_component_v_list, { 205 | density: "compact", 206 | class: "py-0" 207 | }, { 208 | default: _withCtx(() => [ 209 | _createVNode(_component_v_list_item, { class: "pa-0" }, { 210 | prepend: _withCtx(() => [ 211 | _createVNode(_component_v_icon, { 212 | size: "small", 213 | color: status.enabled ? 'success' : 'grey', 214 | class: "mr-2" 215 | }, { 216 | default: _withCtx(() => [ 217 | _createTextVNode(_toDisplayString(status.enabled ? 'mdi-check-circle' : 'mdi-close-circle'), 1) 218 | ]), 219 | _: 1 220 | }, 8, ["color"]) 221 | ]), 222 | default: _withCtx(() => [ 223 | _createVNode(_component_v_list_item_title, { class: "text-caption" }, { 224 | default: _withCtx(() => [ 225 | _cache[1] || (_cache[1] = _createTextVNode(" 插件状态: ")), 226 | _createElementVNode("span", { 227 | class: _normalizeClass(status.enabled ? 'text-success' : 'text-grey') 228 | }, _toDisplayString(status.enabled ? '已启用' : '已禁用'), 3) 229 | ]), 230 | _: 1 231 | }) 232 | ]), 233 | _: 1 234 | }), 235 | _createVNode(_component_v_list_item, { class: "pa-0" }, { 236 | prepend: _withCtx(() => [ 237 | _createVNode(_component_v_icon, { 238 | size: "small", 239 | color: status.has_client ? 'success' : 'error', 240 | class: "mr-2" 241 | }, { 242 | default: _withCtx(() => [ 243 | _createTextVNode(_toDisplayString(status.has_client ? 'mdi-account-check' : 'mdi-account-off'), 1) 244 | ]), 245 | _: 1 246 | }, 8, ["color"]) 247 | ]), 248 | default: _withCtx(() => [ 249 | _createVNode(_component_v_list_item_title, { class: "text-caption" }, { 250 | default: _withCtx(() => [ 251 | _cache[2] || (_cache[2] = _createTextVNode(" 115客户端: ")), 252 | _createElementVNode("span", { 253 | class: _normalizeClass(status.has_client ? 'text-success' : 'text-error') 254 | }, _toDisplayString(status.has_client ? '已连接' : '未连接'), 3) 255 | ]), 256 | _: 1 257 | }) 258 | ]), 259 | _: 1 260 | }), 261 | _createVNode(_component_v_list_item, { class: "pa-0" }, { 262 | prepend: _withCtx(() => [ 263 | _createVNode(_component_v_icon, { 264 | size: "small", 265 | color: status.running ? 'success' : 'grey', 266 | class: "mr-2" 267 | }, { 268 | default: _withCtx(() => [ 269 | _createTextVNode(_toDisplayString(status.running ? 'mdi-play-circle' : 'mdi-pause-circle'), 1) 270 | ]), 271 | _: 1 272 | }, 8, ["color"]) 273 | ]), 274 | default: _withCtx(() => [ 275 | _createVNode(_component_v_list_item_title, { class: "text-caption" }, { 276 | default: _withCtx(() => [ 277 | _cache[3] || (_cache[3] = _createTextVNode(" 任务状态: ")), 278 | _createElementVNode("span", { 279 | class: _normalizeClass(status.running ? 'text-success' : 'text-grey') 280 | }, _toDisplayString(status.running ? '运行中' : '空闲'), 3) 281 | ]), 282 | _: 1 283 | }) 284 | ]), 285 | _: 1 286 | }) 287 | ]), 288 | _: 1 289 | }) 290 | ])) 291 | : (_openBlock(), _createElementBlock("div", _hoisted_5, " 暂无数据 ")) 292 | ]), 293 | _: 1 294 | }), 295 | (props.allowRefresh) 296 | ? (_openBlock(), _createBlock(_component_v_divider, { key: 1 })) 297 | : _createCommentVNode("", true), 298 | (props.allowRefresh) 299 | ? (_openBlock(), _createBlock(_component_v_card_actions, { 300 | key: 2, 301 | class: "px-3 py-1" 302 | }, { 303 | default: _withCtx(() => [ 304 | _createElementVNode("span", _hoisted_6, _toDisplayString(lastRefreshedTimeDisplay.value), 1), 305 | _createVNode(_component_v_spacer), 306 | _createVNode(_component_v_btn, { 307 | icon: "", 308 | variant: "text", 309 | size: "small", 310 | onClick: fetchData, 311 | loading: loading.value 312 | }, { 313 | default: _withCtx(() => [ 314 | _createVNode(_component_v_icon, { size: "small" }, { 315 | default: _withCtx(() => _cache[4] || (_cache[4] = [ 316 | _createTextVNode("mdi-refresh") 317 | ])), 318 | _: 1 319 | }) 320 | ]), 321 | _: 1 322 | }, 8, ["loading"]) 323 | ]), 324 | _: 1 325 | })) 326 | : _createCommentVNode("", true) 327 | ]), 328 | _: 1 329 | }, 8, ["flat", "loading"]) 330 | ])) 331 | } 332 | } 333 | 334 | }; 335 | const Dashboard = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-1add808e"]]); 336 | 337 | export { Dashboard as default }; 338 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/__federation_expose_Dashboard-C73T-doO.css: -------------------------------------------------------------------------------- 1 | 2 | .dashboard-widget[data-v-1add808e] { 3 | height: 100%; 4 | width: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/__federation_expose_Page-O0BRGvQ0.css: -------------------------------------------------------------------------------- 1 | 2 | .config-card[data-v-46f3b2f3] { 3 | box-shadow: none !important; 4 | transition: all 0.2s ease; 5 | margin-bottom: 10px !important; 6 | } 7 | .config-card[data-v-46f3b2f3]:hover { 8 | transform: translateY(-2px); 9 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05) !important; 10 | } 11 | 12 | /* 统一字体 */ 13 | 14 | /* 文字大小 */ 15 | [data-v-46f3b2f3] .text-caption { 16 | font-size: 0.8rem !important; 17 | } 18 | [data-v-46f3b2f3] .text-body-2 { 19 | font-size: 0.85rem !important; 20 | } 21 | 22 | /* 美化卡片标题 */ 23 | .bg-primary-gradient[data-v-46f3b2f3] { 24 | background: linear-gradient(135deg, rgba(var(--v-theme-primary), 0.1), rgba(var(--v-theme-primary), 0.05)) !important; 25 | } 26 | 27 | /* 美化芯片 */ 28 | 29 | /* Ensure py-0 on list items takes effect with Vuetify's defaults if used specifically */ 30 | .py-0[data-v-46f3b2f3] { 31 | padding-top: 0 !important; 32 | padding-bottom: 0 !important; 33 | } 34 | .my-0[data-v-46f3b2f3] { 35 | margin-top: 0 !important; 36 | margin-bottom: 0 !important; 37 | } 38 | 39 | /* Reduce margin for subtitles in path display if they have mt-1 */ 40 | .mt-1[data-v-46f3b2f3] { 41 | margin-top: 2px !important; /* Reduced from default 4px of Vuetify's mt-1 */ 42 | } 43 | 44 | /* Reduce margin for subtitles in path display if they have mb-1 */ 45 | .mb-1[data-v-46f3b2f3] { 46 | margin-bottom: 2px !important; /* Reduced from default 4px of Vuetify's mb-1 */ 47 | } 48 | .sticky-actions[data-v-46f3b2f3] { 49 | position: sticky; 50 | bottom: 0; 51 | background-color: var(--v-theme-surface, white); /* Match card background */ 52 | z-index: 2; 53 | border-top: 1px solid rgba(var(--v-border-color, black), var(--v-border-opacity, 0.12)); 54 | } 55 | 56 | /* Colorful Switches */ 57 | 58 | /* Primary Color Switch */ 59 | 60 | /* Success Color Switch */ 61 | 62 | /* Info Color Switch */ 63 | 64 | /* Warning Color Switch */ 65 | 66 | /* Error Color Switch */ 67 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/__federation_fn_import-JrT3xvdd.js: -------------------------------------------------------------------------------- 1 | const buildIdentifier = "[0-9A-Za-z-]+"; 2 | const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`; 3 | const numericIdentifier = "0|[1-9]\\d*"; 4 | const numericIdentifierLoose = "[0-9]+"; 5 | const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*"; 6 | const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`; 7 | const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`; 8 | const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`; 9 | const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`; 10 | const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`; 11 | const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`; 12 | const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`; 13 | const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`; 14 | const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`; 15 | const gtlt = "((?:<|>)?=?)"; 16 | const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`; 17 | const loneTilde = "(?:~>?)"; 18 | const tildeTrim = `(\\s*)${loneTilde}\\s+`; 19 | const loneCaret = "(?:\\^)"; 20 | const caretTrim = `(\\s*)${loneCaret}\\s+`; 21 | const star = "(<|>)?=?\\s*\\*"; 22 | const caret = `^${loneCaret}${xRangePlain}$`; 23 | const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`; 24 | const fullPlain = `v?${mainVersion}${preRelease}?${build}?`; 25 | const tilde = `^${loneTilde}${xRangePlain}$`; 26 | const xRange = `^${gtlt}\\s*${xRangePlain}$`; 27 | const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`; 28 | const gte0 = "^\\s*>=\\s*0.0.0\\s*$"; 29 | function parseRegex(source) { 30 | return new RegExp(source); 31 | } 32 | function isXVersion(version) { 33 | return !version || version.toLowerCase() === "x" || version === "*"; 34 | } 35 | function pipe(...fns) { 36 | return (x) => { 37 | return fns.reduce((v, f) => f(v), x); 38 | }; 39 | } 40 | function extractComparator(comparatorString) { 41 | return comparatorString.match(parseRegex(comparator)); 42 | } 43 | function combineVersion(major, minor, patch, preRelease2) { 44 | const mainVersion2 = `${major}.${minor}.${patch}`; 45 | if (preRelease2) { 46 | return `${mainVersion2}-${preRelease2}`; 47 | } 48 | return mainVersion2; 49 | } 50 | function parseHyphen(range) { 51 | return range.replace( 52 | parseRegex(hyphenRange), 53 | (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => { 54 | if (isXVersion(fromMajor)) { 55 | from = ""; 56 | } else if (isXVersion(fromMinor)) { 57 | from = `>=${fromMajor}.0.0`; 58 | } else if (isXVersion(fromPatch)) { 59 | from = `>=${fromMajor}.${fromMinor}.0`; 60 | } else { 61 | from = `>=${from}`; 62 | } 63 | if (isXVersion(toMajor)) { 64 | to = ""; 65 | } else if (isXVersion(toMinor)) { 66 | to = `<${+toMajor + 1}.0.0-0`; 67 | } else if (isXVersion(toPatch)) { 68 | to = `<${toMajor}.${+toMinor + 1}.0-0`; 69 | } else if (toPreRelease) { 70 | to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`; 71 | } else { 72 | to = `<=${to}`; 73 | } 74 | return `${from} ${to}`.trim(); 75 | } 76 | ); 77 | } 78 | function parseComparatorTrim(range) { 79 | return range.replace(parseRegex(comparatorTrim), "$1$2$3"); 80 | } 81 | function parseTildeTrim(range) { 82 | return range.replace(parseRegex(tildeTrim), "$1~"); 83 | } 84 | function parseCaretTrim(range) { 85 | return range.replace(parseRegex(caretTrim), "$1^"); 86 | } 87 | function parseCarets(range) { 88 | return range.trim().split(/\s+/).map((rangeVersion) => { 89 | return rangeVersion.replace( 90 | parseRegex(caret), 91 | (_, major, minor, patch, preRelease2) => { 92 | if (isXVersion(major)) { 93 | return ""; 94 | } else if (isXVersion(minor)) { 95 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 96 | } else if (isXVersion(patch)) { 97 | if (major === "0") { 98 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 99 | } else { 100 | return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`; 101 | } 102 | } else if (preRelease2) { 103 | if (major === "0") { 104 | if (minor === "0") { 105 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`; 106 | } else { 107 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 108 | } 109 | } else { 110 | return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`; 111 | } 112 | } else { 113 | if (major === "0") { 114 | if (minor === "0") { 115 | return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`; 116 | } else { 117 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 118 | } 119 | } 120 | return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`; 121 | } 122 | } 123 | ); 124 | }).join(" "); 125 | } 126 | function parseTildes(range) { 127 | return range.trim().split(/\s+/).map((rangeVersion) => { 128 | return rangeVersion.replace( 129 | parseRegex(tilde), 130 | (_, major, minor, patch, preRelease2) => { 131 | if (isXVersion(major)) { 132 | return ""; 133 | } else if (isXVersion(minor)) { 134 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 135 | } else if (isXVersion(patch)) { 136 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 137 | } else if (preRelease2) { 138 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 139 | } 140 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 141 | } 142 | ); 143 | }).join(" "); 144 | } 145 | function parseXRanges(range) { 146 | return range.split(/\s+/).map((rangeVersion) => { 147 | return rangeVersion.trim().replace( 148 | parseRegex(xRange), 149 | (ret, gtlt2, major, minor, patch, preRelease2) => { 150 | const isXMajor = isXVersion(major); 151 | const isXMinor = isXMajor || isXVersion(minor); 152 | const isXPatch = isXMinor || isXVersion(patch); 153 | if (gtlt2 === "=" && isXPatch) { 154 | gtlt2 = ""; 155 | } 156 | preRelease2 = ""; 157 | if (isXMajor) { 158 | if (gtlt2 === ">" || gtlt2 === "<") { 159 | return "<0.0.0-0"; 160 | } else { 161 | return "*"; 162 | } 163 | } else if (gtlt2 && isXPatch) { 164 | if (isXMinor) { 165 | minor = 0; 166 | } 167 | patch = 0; 168 | if (gtlt2 === ">") { 169 | gtlt2 = ">="; 170 | if (isXMinor) { 171 | major = +major + 1; 172 | minor = 0; 173 | patch = 0; 174 | } else { 175 | minor = +minor + 1; 176 | patch = 0; 177 | } 178 | } else if (gtlt2 === "<=") { 179 | gtlt2 = "<"; 180 | if (isXMinor) { 181 | major = +major + 1; 182 | } else { 183 | minor = +minor + 1; 184 | } 185 | } 186 | if (gtlt2 === "<") { 187 | preRelease2 = "-0"; 188 | } 189 | return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`; 190 | } else if (isXMinor) { 191 | return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`; 192 | } else if (isXPatch) { 193 | return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`; 194 | } 195 | return ret; 196 | } 197 | ); 198 | }).join(" "); 199 | } 200 | function parseStar(range) { 201 | return range.trim().replace(parseRegex(star), ""); 202 | } 203 | function parseGTE0(comparatorString) { 204 | return comparatorString.trim().replace(parseRegex(gte0), ""); 205 | } 206 | function compareAtom(rangeAtom, versionAtom) { 207 | rangeAtom = +rangeAtom || rangeAtom; 208 | versionAtom = +versionAtom || versionAtom; 209 | if (rangeAtom > versionAtom) { 210 | return 1; 211 | } 212 | if (rangeAtom === versionAtom) { 213 | return 0; 214 | } 215 | return -1; 216 | } 217 | function comparePreRelease(rangeAtom, versionAtom) { 218 | const { preRelease: rangePreRelease } = rangeAtom; 219 | const { preRelease: versionPreRelease } = versionAtom; 220 | if (rangePreRelease === void 0 && !!versionPreRelease) { 221 | return 1; 222 | } 223 | if (!!rangePreRelease && versionPreRelease === void 0) { 224 | return -1; 225 | } 226 | if (rangePreRelease === void 0 && versionPreRelease === void 0) { 227 | return 0; 228 | } 229 | for (let i = 0, n = rangePreRelease.length; i <= n; i++) { 230 | const rangeElement = rangePreRelease[i]; 231 | const versionElement = versionPreRelease[i]; 232 | if (rangeElement === versionElement) { 233 | continue; 234 | } 235 | if (rangeElement === void 0 && versionElement === void 0) { 236 | return 0; 237 | } 238 | if (!rangeElement) { 239 | return 1; 240 | } 241 | if (!versionElement) { 242 | return -1; 243 | } 244 | return compareAtom(rangeElement, versionElement); 245 | } 246 | return 0; 247 | } 248 | function compareVersion(rangeAtom, versionAtom) { 249 | return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom); 250 | } 251 | function eq(rangeAtom, versionAtom) { 252 | return rangeAtom.version === versionAtom.version; 253 | } 254 | function compare(rangeAtom, versionAtom) { 255 | switch (rangeAtom.operator) { 256 | case "": 257 | case "=": 258 | return eq(rangeAtom, versionAtom); 259 | case ">": 260 | return compareVersion(rangeAtom, versionAtom) < 0; 261 | case ">=": 262 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0; 263 | case "<": 264 | return compareVersion(rangeAtom, versionAtom) > 0; 265 | case "<=": 266 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0; 267 | case void 0: { 268 | return true; 269 | } 270 | default: 271 | return false; 272 | } 273 | } 274 | function parseComparatorString(range) { 275 | return pipe( 276 | parseCarets, 277 | parseTildes, 278 | parseXRanges, 279 | parseStar 280 | )(range); 281 | } 282 | function parseRange(range) { 283 | return pipe( 284 | parseHyphen, 285 | parseComparatorTrim, 286 | parseTildeTrim, 287 | parseCaretTrim 288 | )(range.trim()).split(/\s+/).join(" "); 289 | } 290 | function satisfy(version, range) { 291 | if (!version) { 292 | return false; 293 | } 294 | const parsedRange = parseRange(range); 295 | const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" "); 296 | const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2)); 297 | const extractedVersion = extractComparator(version); 298 | if (!extractedVersion) { 299 | return false; 300 | } 301 | const [ 302 | , 303 | versionOperator, 304 | , 305 | versionMajor, 306 | versionMinor, 307 | versionPatch, 308 | versionPreRelease 309 | ] = extractedVersion; 310 | const versionAtom = { 311 | version: combineVersion( 312 | versionMajor, 313 | versionMinor, 314 | versionPatch, 315 | versionPreRelease 316 | ), 317 | major: versionMajor, 318 | minor: versionMinor, 319 | patch: versionPatch, 320 | preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".") 321 | }; 322 | for (const comparator2 of comparators) { 323 | const extractedComparator = extractComparator(comparator2); 324 | if (!extractedComparator) { 325 | return false; 326 | } 327 | const [ 328 | , 329 | rangeOperator, 330 | , 331 | rangeMajor, 332 | rangeMinor, 333 | rangePatch, 334 | rangePreRelease 335 | ] = extractedComparator; 336 | const rangeAtom = { 337 | operator: rangeOperator, 338 | version: combineVersion( 339 | rangeMajor, 340 | rangeMinor, 341 | rangePatch, 342 | rangePreRelease 343 | ), 344 | major: rangeMajor, 345 | minor: rangeMinor, 346 | patch: rangePatch, 347 | preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".") 348 | }; 349 | if (!compare(rangeAtom, versionAtom)) { 350 | return false; 351 | } 352 | } 353 | return true; 354 | } 355 | 356 | // eslint-disable-next-line no-undef 357 | const moduleMap = {}; 358 | const moduleCache = Object.create(null); 359 | async function importShared(name, shareScope = 'default') { 360 | return moduleCache[name] 361 | ? new Promise((r) => r(moduleCache[name])) 362 | : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name) 363 | } 364 | async function getSharedFromRuntime(name, shareScope) { 365 | let module = null; 366 | if (globalThis?.__federation_shared__?.[shareScope]?.[name]) { 367 | const versionObj = globalThis.__federation_shared__[shareScope][name]; 368 | const requiredVersion = moduleMap[name]?.requiredVersion; 369 | const hasRequiredVersion = !!requiredVersion; 370 | if (hasRequiredVersion) { 371 | const versionKey = Object.keys(versionObj).find((version) => 372 | satisfy(version, requiredVersion) 373 | ); 374 | if (versionKey) { 375 | const versionValue = versionObj[versionKey]; 376 | module = await (await versionValue.get())(); 377 | } else { 378 | console.log( 379 | `provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})` 380 | ); 381 | } 382 | } else { 383 | const versionKey = Object.keys(versionObj)[0]; 384 | const versionValue = versionObj[versionKey]; 385 | module = await (await versionValue.get())(); 386 | } 387 | } 388 | if (module) { 389 | return flattenModule(module, name) 390 | } 391 | } 392 | async function getSharedFromLocal(name) { 393 | if (moduleMap[name]?.import) { 394 | let module = await (await moduleMap[name].get())(); 395 | return flattenModule(module, name) 396 | } else { 397 | console.error( 398 | `consumer config import=false,so cant use callback shared module` 399 | ); 400 | } 401 | } 402 | function flattenModule(module, name) { 403 | // use a shared module which export default a function will getting error 'TypeError: xxx is not a function' 404 | if (typeof module.default === 'function') { 405 | Object.keys(module).forEach((key) => { 406 | if (key !== 'default') { 407 | module.default[key] = module[key]; 408 | } 409 | }); 410 | moduleCache[name] = module.default; 411 | return module.default 412 | } 413 | if (module.default) module = Object.assign({}, module.default, module); 414 | moduleCache[name] = module; 415 | return module 416 | } 417 | 418 | export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime }; 419 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/_plugin-vue_export-helper-pcqpp-6-.js: -------------------------------------------------------------------------------- 1 | const _export_sfc = (sfc, props) => { 2 | const target = sfc.__vccOpts || sfc; 3 | for (const [key, val] of props) { 4 | target[key] = val; 5 | } 6 | return target; 7 | }; 8 | 9 | export { _export_sfc as _ }; 10 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/index-B35ggjA6.css: -------------------------------------------------------------------------------- 1 | @supports not selector(:focus-visible) { 2 | } 3 | @supports not selector(:focus-visible) { 4 | } 5 | @supports selector(:focus-visible) { 6 | }@supports not selector(:focus-visible) { 7 | }@keyframes progress-circular-dash { 8 | 0% { 9 | stroke-dasharray: 1, 200; 10 | stroke-dashoffset: 0px; 11 | } 12 | 50% { 13 | stroke-dasharray: 100, 200; 14 | stroke-dashoffset: -15px; 15 | } 16 | 100% { 17 | stroke-dasharray: 100, 200; 18 | stroke-dashoffset: -124px; 19 | } 20 | } 21 | @keyframes progress-circular-rotate { 22 | 100% { 23 | transform: rotate(270deg); 24 | } 25 | }@media (forced-colors: active) { 26 | } 27 | 28 | @media (forced-colors: active) { 29 | } 30 | @media (forced-colors: active) { 31 | } 32 | 33 | @keyframes indeterminate-ltr { 34 | 0% { 35 | left: -90%; 36 | right: 100%; 37 | } 38 | 60% { 39 | left: -90%; 40 | right: 100%; 41 | } 42 | 100% { 43 | left: 100%; 44 | right: -35%; 45 | } 46 | } 47 | @keyframes indeterminate-rtl { 48 | 0% { 49 | left: 100%; 50 | right: -90%; 51 | } 52 | 60% { 53 | left: 100%; 54 | right: -90%; 55 | } 56 | 100% { 57 | left: -35%; 58 | right: 100%; 59 | } 60 | } 61 | @keyframes indeterminate-short-ltr { 62 | 0% { 63 | left: -200%; 64 | right: 100%; 65 | } 66 | 60% { 67 | left: 107%; 68 | right: -8%; 69 | } 70 | 100% { 71 | left: 107%; 72 | right: -8%; 73 | } 74 | } 75 | @keyframes indeterminate-short-rtl { 76 | 0% { 77 | left: 100%; 78 | right: -200%; 79 | } 80 | 60% { 81 | left: -8%; 82 | right: 107%; 83 | } 84 | 100% { 85 | left: -8%; 86 | right: 107%; 87 | } 88 | } 89 | @keyframes stream { 90 | to { 91 | transform: translateX(var(--v-progress-linear-stream-to)); 92 | } 93 | } 94 | @keyframes progress-linear-stripes { 95 | 0% { 96 | background-position-x: var(--v-progress-linear-height); 97 | } 98 | }@supports not selector(:focus-visible) { 99 | } 100 | @supports not selector(:focus-visible) { 101 | }@supports not selector(:focus-visible) { 102 | } 103 | @supports not selector(:focus-visible) { 104 | } 105 | @supports selector(:focus-visible) { 106 | }/* region BLOCK */ 107 | 108 | /* endregion */ 109 | /* region ELEMENTS */ 110 | 111 | /* endregion *//* region INPUT */ 112 | 113 | /* endregion */ 114 | /* region MODIFIERS */ 115 | 116 | /* endregion */ 117 | /* region ELEMENTS */ 118 | 119 | /* endregion */ 120 | /* region AFFIXES */ 121 | @media (hover: hover) { 122 | } 123 | @media (hover: none) { 124 | } 125 | 126 | /* endregion */ 127 | /* region LABEL */ 128 | 129 | /* endregion */ 130 | /* region OUTLINE */ 131 | @media (hover: hover) { 132 | } 133 | 134 | /* endregion */ 135 | /* region LOADER */ 136 | 137 | /* endregion */ 138 | /* region OVERLAY */ 139 | @media (hover: hover) { 140 | } 141 | @media (hover: hover) { 142 | } 143 | @media (hover: hover) { 144 | } 145 | 146 | /* endregion */ 147 | /* region MODIFIERS */ 148 | 149 | /* endregion */.bottom-sheet-transition-enter-from { 150 | transform: translateY(100%); 151 | } 152 | .bottom-sheet-transition-leave-to { 153 | transform: translateY(100%); 154 | } 155 | @media (min-width: 600px) { 156 | }@supports not selector(:focus-visible) { 157 | } 158 | @supports not selector(:focus-visible) { 159 | }@media (forced-colors: active) { 160 | } 161 | 162 | @media (hover: hover) { 163 | }@media (forced-colors: active) { 164 | } 165 | @media (forced-colors: active) { 166 | } 167 | @media (forced-colors: active) { 168 | }@media (min-width: 960px) { 169 | } 170 | @media (min-width: 1280px) { 171 | } 172 | @media (min-width: 1920px) { 173 | } 174 | @media (min-width: 2560px) { 175 | } 176 | 177 | .offset-1 { 178 | margin-inline-start: 8.3333333333%; 179 | } 180 | 181 | .offset-2 { 182 | margin-inline-start: 16.6666666667%; 183 | } 184 | 185 | .offset-3 { 186 | margin-inline-start: 25%; 187 | } 188 | 189 | .offset-4 { 190 | margin-inline-start: 33.3333333333%; 191 | } 192 | 193 | .offset-5 { 194 | margin-inline-start: 41.6666666667%; 195 | } 196 | 197 | .offset-6 { 198 | margin-inline-start: 50%; 199 | } 200 | 201 | .offset-7 { 202 | margin-inline-start: 58.3333333333%; 203 | } 204 | 205 | .offset-8 { 206 | margin-inline-start: 66.6666666667%; 207 | } 208 | 209 | .offset-9 { 210 | margin-inline-start: 75%; 211 | } 212 | 213 | .offset-10 { 214 | margin-inline-start: 83.3333333333%; 215 | } 216 | 217 | .offset-11 { 218 | margin-inline-start: 91.6666666667%; 219 | } 220 | 221 | @media (min-width: 600px) { 222 | .offset-sm-0 { 223 | margin-inline-start: 0; 224 | } 225 | .offset-sm-1 { 226 | margin-inline-start: 8.3333333333%; 227 | } 228 | .offset-sm-2 { 229 | margin-inline-start: 16.6666666667%; 230 | } 231 | .offset-sm-3 { 232 | margin-inline-start: 25%; 233 | } 234 | .offset-sm-4 { 235 | margin-inline-start: 33.3333333333%; 236 | } 237 | .offset-sm-5 { 238 | margin-inline-start: 41.6666666667%; 239 | } 240 | .offset-sm-6 { 241 | margin-inline-start: 50%; 242 | } 243 | .offset-sm-7 { 244 | margin-inline-start: 58.3333333333%; 245 | } 246 | .offset-sm-8 { 247 | margin-inline-start: 66.6666666667%; 248 | } 249 | .offset-sm-9 { 250 | margin-inline-start: 75%; 251 | } 252 | .offset-sm-10 { 253 | margin-inline-start: 83.3333333333%; 254 | } 255 | .offset-sm-11 { 256 | margin-inline-start: 91.6666666667%; 257 | } 258 | } 259 | @media (min-width: 960px) { 260 | .offset-md-0 { 261 | margin-inline-start: 0; 262 | } 263 | .offset-md-1 { 264 | margin-inline-start: 8.3333333333%; 265 | } 266 | .offset-md-2 { 267 | margin-inline-start: 16.6666666667%; 268 | } 269 | .offset-md-3 { 270 | margin-inline-start: 25%; 271 | } 272 | .offset-md-4 { 273 | margin-inline-start: 33.3333333333%; 274 | } 275 | .offset-md-5 { 276 | margin-inline-start: 41.6666666667%; 277 | } 278 | .offset-md-6 { 279 | margin-inline-start: 50%; 280 | } 281 | .offset-md-7 { 282 | margin-inline-start: 58.3333333333%; 283 | } 284 | .offset-md-8 { 285 | margin-inline-start: 66.6666666667%; 286 | } 287 | .offset-md-9 { 288 | margin-inline-start: 75%; 289 | } 290 | .offset-md-10 { 291 | margin-inline-start: 83.3333333333%; 292 | } 293 | .offset-md-11 { 294 | margin-inline-start: 91.6666666667%; 295 | } 296 | } 297 | @media (min-width: 1280px) { 298 | .offset-lg-0 { 299 | margin-inline-start: 0; 300 | } 301 | .offset-lg-1 { 302 | margin-inline-start: 8.3333333333%; 303 | } 304 | .offset-lg-2 { 305 | margin-inline-start: 16.6666666667%; 306 | } 307 | .offset-lg-3 { 308 | margin-inline-start: 25%; 309 | } 310 | .offset-lg-4 { 311 | margin-inline-start: 33.3333333333%; 312 | } 313 | .offset-lg-5 { 314 | margin-inline-start: 41.6666666667%; 315 | } 316 | .offset-lg-6 { 317 | margin-inline-start: 50%; 318 | } 319 | .offset-lg-7 { 320 | margin-inline-start: 58.3333333333%; 321 | } 322 | .offset-lg-8 { 323 | margin-inline-start: 66.6666666667%; 324 | } 325 | .offset-lg-9 { 326 | margin-inline-start: 75%; 327 | } 328 | .offset-lg-10 { 329 | margin-inline-start: 83.3333333333%; 330 | } 331 | .offset-lg-11 { 332 | margin-inline-start: 91.6666666667%; 333 | } 334 | } 335 | @media (min-width: 1920px) { 336 | .offset-xl-0 { 337 | margin-inline-start: 0; 338 | } 339 | .offset-xl-1 { 340 | margin-inline-start: 8.3333333333%; 341 | } 342 | .offset-xl-2 { 343 | margin-inline-start: 16.6666666667%; 344 | } 345 | .offset-xl-3 { 346 | margin-inline-start: 25%; 347 | } 348 | .offset-xl-4 { 349 | margin-inline-start: 33.3333333333%; 350 | } 351 | .offset-xl-5 { 352 | margin-inline-start: 41.6666666667%; 353 | } 354 | .offset-xl-6 { 355 | margin-inline-start: 50%; 356 | } 357 | .offset-xl-7 { 358 | margin-inline-start: 58.3333333333%; 359 | } 360 | .offset-xl-8 { 361 | margin-inline-start: 66.6666666667%; 362 | } 363 | .offset-xl-9 { 364 | margin-inline-start: 75%; 365 | } 366 | .offset-xl-10 { 367 | margin-inline-start: 83.3333333333%; 368 | } 369 | .offset-xl-11 { 370 | margin-inline-start: 91.6666666667%; 371 | } 372 | } 373 | @media (min-width: 2560px) { 374 | .offset-xxl-0 { 375 | margin-inline-start: 0; 376 | } 377 | .offset-xxl-1 { 378 | margin-inline-start: 8.3333333333%; 379 | } 380 | .offset-xxl-2 { 381 | margin-inline-start: 16.6666666667%; 382 | } 383 | .offset-xxl-3 { 384 | margin-inline-start: 25%; 385 | } 386 | .offset-xxl-4 { 387 | margin-inline-start: 33.3333333333%; 388 | } 389 | .offset-xxl-5 { 390 | margin-inline-start: 41.6666666667%; 391 | } 392 | .offset-xxl-6 { 393 | margin-inline-start: 50%; 394 | } 395 | .offset-xxl-7 { 396 | margin-inline-start: 58.3333333333%; 397 | } 398 | .offset-xxl-8 { 399 | margin-inline-start: 66.6666666667%; 400 | } 401 | .offset-xxl-9 { 402 | margin-inline-start: 75%; 403 | } 404 | .offset-xxl-10 { 405 | margin-inline-start: 83.3333333333%; 406 | } 407 | .offset-xxl-11 { 408 | margin-inline-start: 91.6666666667%; 409 | } 410 | }.date-picker-header-transition-enter-active, 411 | .date-picker-header-reverse-transition-enter-active { 412 | transition-duration: 0.3s; 413 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 414 | } 415 | .date-picker-header-transition-leave-active, 416 | .date-picker-header-reverse-transition-leave-active { 417 | transition-duration: 0.3s; 418 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 419 | } 420 | 421 | .date-picker-header-transition-enter-from { 422 | transform: translate(0, 100%); 423 | } 424 | .date-picker-header-transition-leave-to { 425 | opacity: 0; 426 | transform: translate(0, -100%); 427 | } 428 | 429 | .date-picker-header-reverse-transition-enter-from { 430 | transform: translate(0, -100%); 431 | } 432 | .date-picker-header-reverse-transition-leave-to { 433 | opacity: 0; 434 | transform: translate(0, 100%); 435 | }@supports not selector(:focus-visible) { 436 | } 437 | @supports not selector(:focus-visible) { 438 | }@keyframes loading { 439 | 100% { 440 | transform: translateX(100%); 441 | } 442 | }@supports not selector(:focus-visible) { 443 | } 444 | @supports not selector(:focus-visible) { 445 | }@media (forced-colors: active) { 446 | }@media (max-width: 1279.98px) { 447 | }/** Modifiers **/ 448 | .plugin-app { 449 | width: 100%; 450 | height: 100%; 451 | display: flex; 452 | flex-direction: column; 453 | } 454 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/assets/remoteEntry.js: -------------------------------------------------------------------------------- 1 | const currentImports = {}; 2 | const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); 3 | let moduleMap = { 4 | "./Page":()=>{ 5 | dynamicLoadingCss(["__federation_expose_Page-O0BRGvQ0.css"], false, './Page'); 6 | return __federation_import('./__federation_expose_Page-DOiUhroR.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 7 | "./Config":()=>{ 8 | dynamicLoadingCss(["__federation_expose_Config-Bs1x_wA9.css"], false, './Config'); 9 | return __federation_import('./__federation_expose_Config-Cw1HugOP.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 10 | "./Dashboard":()=>{ 11 | dynamicLoadingCss(["__federation_expose_Dashboard-C73T-doO.css"], false, './Dashboard'); 12 | return __federation_import('./__federation_expose_Dashboard-BUpqH6KU.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; 13 | const seen = {}; 14 | const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { 15 | const metaUrl = import.meta.url; 16 | if (typeof metaUrl === 'undefined') { 17 | console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".'); 18 | return; 19 | } 20 | 21 | const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js')); 22 | const base = '/'; 23 | 'assets'; 24 | 25 | cssFilePaths.forEach(cssPath => { 26 | let href = ''; 27 | const baseUrl = base || curUrl; 28 | if (baseUrl) { 29 | const trimmer = { 30 | trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path), 31 | leading: (path) => (path.startsWith('/') ? path.slice(1) : path) 32 | }; 33 | const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//'); 34 | 35 | const cleanBaseUrl = trimmer.trailing(baseUrl); 36 | const cleanCssPath = trimmer.leading(cssPath); 37 | const cleanCurUrl = trimmer.trailing(curUrl); 38 | 39 | if (isAbsoluteUrl(baseUrl)) { 40 | href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 41 | } else { 42 | if (cleanCurUrl.includes(cleanBaseUrl)) { 43 | href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/'); 44 | } else { 45 | href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 46 | } 47 | } 48 | } else { 49 | href = cssPath; 50 | } 51 | 52 | if (dontAppendStylesToHead) { 53 | const key = 'css__115strmhelper__' + exposeItemName; 54 | window[key] = window[key] || []; 55 | window[key].push(href); 56 | return; 57 | } 58 | 59 | if (href in seen) return; 60 | seen[href] = true; 61 | 62 | const element = document.createElement('link'); 63 | element.rel = 'stylesheet'; 64 | element.href = href; 65 | document.head.appendChild(element); 66 | }); 67 | }; 68 | async function __federation_import(name) { 69 | currentImports[name] ??= import(name); 70 | return currentImports[name] 71 | } const get =(module) => { 72 | if(!moduleMap[module]) throw new Error('Can not find remote module ' + module) 73 | return moduleMap[module](); 74 | }; 75 | const init =(shareScope) => { 76 | globalThis.__federation_shared__= globalThis.__federation_shared__|| {}; 77 | Object.entries(shareScope).forEach(([key, value]) => { 78 | for (const [versionKey, versionValue] of Object.entries(value)) { 79 | const scope = versionValue.scope || 'default'; 80 | globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {}; 81 | const shared= globalThis.__federation_shared__[scope]; 82 | (shared[key] = shared[key]||{})[versionKey] = versionValue; 83 | } 84 | }); 85 | }; 86 | 87 | export { dynamicLoadingCss, get, init }; 88 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MoviePilot插件组件示例 8 | 9 | 10 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /plugins/p1115strmhelper/requirements.txt: -------------------------------------------------------------------------------- 1 | orjson==3.10.16 2 | p115client==0.0.5.11.6 3 | p115rsacipher==0.0.1 4 | ruamel.yaml 5 | psutil -------------------------------------------------------------------------------- /plugins/pluginmanagervue/dist/assets/__federation_fn_import-JrT3xvdd.js: -------------------------------------------------------------------------------- 1 | const buildIdentifier = "[0-9A-Za-z-]+"; 2 | const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`; 3 | const numericIdentifier = "0|[1-9]\\d*"; 4 | const numericIdentifierLoose = "[0-9]+"; 5 | const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*"; 6 | const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`; 7 | const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`; 8 | const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`; 9 | const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`; 10 | const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`; 11 | const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`; 12 | const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`; 13 | const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`; 14 | const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`; 15 | const gtlt = "((?:<|>)?=?)"; 16 | const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`; 17 | const loneTilde = "(?:~>?)"; 18 | const tildeTrim = `(\\s*)${loneTilde}\\s+`; 19 | const loneCaret = "(?:\\^)"; 20 | const caretTrim = `(\\s*)${loneCaret}\\s+`; 21 | const star = "(<|>)?=?\\s*\\*"; 22 | const caret = `^${loneCaret}${xRangePlain}$`; 23 | const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`; 24 | const fullPlain = `v?${mainVersion}${preRelease}?${build}?`; 25 | const tilde = `^${loneTilde}${xRangePlain}$`; 26 | const xRange = `^${gtlt}\\s*${xRangePlain}$`; 27 | const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`; 28 | const gte0 = "^\\s*>=\\s*0.0.0\\s*$"; 29 | function parseRegex(source) { 30 | return new RegExp(source); 31 | } 32 | function isXVersion(version) { 33 | return !version || version.toLowerCase() === "x" || version === "*"; 34 | } 35 | function pipe(...fns) { 36 | return (x) => { 37 | return fns.reduce((v, f) => f(v), x); 38 | }; 39 | } 40 | function extractComparator(comparatorString) { 41 | return comparatorString.match(parseRegex(comparator)); 42 | } 43 | function combineVersion(major, minor, patch, preRelease2) { 44 | const mainVersion2 = `${major}.${minor}.${patch}`; 45 | if (preRelease2) { 46 | return `${mainVersion2}-${preRelease2}`; 47 | } 48 | return mainVersion2; 49 | } 50 | function parseHyphen(range) { 51 | return range.replace( 52 | parseRegex(hyphenRange), 53 | (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => { 54 | if (isXVersion(fromMajor)) { 55 | from = ""; 56 | } else if (isXVersion(fromMinor)) { 57 | from = `>=${fromMajor}.0.0`; 58 | } else if (isXVersion(fromPatch)) { 59 | from = `>=${fromMajor}.${fromMinor}.0`; 60 | } else { 61 | from = `>=${from}`; 62 | } 63 | if (isXVersion(toMajor)) { 64 | to = ""; 65 | } else if (isXVersion(toMinor)) { 66 | to = `<${+toMajor + 1}.0.0-0`; 67 | } else if (isXVersion(toPatch)) { 68 | to = `<${toMajor}.${+toMinor + 1}.0-0`; 69 | } else if (toPreRelease) { 70 | to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`; 71 | } else { 72 | to = `<=${to}`; 73 | } 74 | return `${from} ${to}`.trim(); 75 | } 76 | ); 77 | } 78 | function parseComparatorTrim(range) { 79 | return range.replace(parseRegex(comparatorTrim), "$1$2$3"); 80 | } 81 | function parseTildeTrim(range) { 82 | return range.replace(parseRegex(tildeTrim), "$1~"); 83 | } 84 | function parseCaretTrim(range) { 85 | return range.replace(parseRegex(caretTrim), "$1^"); 86 | } 87 | function parseCarets(range) { 88 | return range.trim().split(/\s+/).map((rangeVersion) => { 89 | return rangeVersion.replace( 90 | parseRegex(caret), 91 | (_, major, minor, patch, preRelease2) => { 92 | if (isXVersion(major)) { 93 | return ""; 94 | } else if (isXVersion(minor)) { 95 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 96 | } else if (isXVersion(patch)) { 97 | if (major === "0") { 98 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 99 | } else { 100 | return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`; 101 | } 102 | } else if (preRelease2) { 103 | if (major === "0") { 104 | if (minor === "0") { 105 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`; 106 | } else { 107 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 108 | } 109 | } else { 110 | return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`; 111 | } 112 | } else { 113 | if (major === "0") { 114 | if (minor === "0") { 115 | return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`; 116 | } else { 117 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 118 | } 119 | } 120 | return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`; 121 | } 122 | } 123 | ); 124 | }).join(" "); 125 | } 126 | function parseTildes(range) { 127 | return range.trim().split(/\s+/).map((rangeVersion) => { 128 | return rangeVersion.replace( 129 | parseRegex(tilde), 130 | (_, major, minor, patch, preRelease2) => { 131 | if (isXVersion(major)) { 132 | return ""; 133 | } else if (isXVersion(minor)) { 134 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 135 | } else if (isXVersion(patch)) { 136 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 137 | } else if (preRelease2) { 138 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 139 | } 140 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 141 | } 142 | ); 143 | }).join(" "); 144 | } 145 | function parseXRanges(range) { 146 | return range.split(/\s+/).map((rangeVersion) => { 147 | return rangeVersion.trim().replace( 148 | parseRegex(xRange), 149 | (ret, gtlt2, major, minor, patch, preRelease2) => { 150 | const isXMajor = isXVersion(major); 151 | const isXMinor = isXMajor || isXVersion(minor); 152 | const isXPatch = isXMinor || isXVersion(patch); 153 | if (gtlt2 === "=" && isXPatch) { 154 | gtlt2 = ""; 155 | } 156 | preRelease2 = ""; 157 | if (isXMajor) { 158 | if (gtlt2 === ">" || gtlt2 === "<") { 159 | return "<0.0.0-0"; 160 | } else { 161 | return "*"; 162 | } 163 | } else if (gtlt2 && isXPatch) { 164 | if (isXMinor) { 165 | minor = 0; 166 | } 167 | patch = 0; 168 | if (gtlt2 === ">") { 169 | gtlt2 = ">="; 170 | if (isXMinor) { 171 | major = +major + 1; 172 | minor = 0; 173 | patch = 0; 174 | } else { 175 | minor = +minor + 1; 176 | patch = 0; 177 | } 178 | } else if (gtlt2 === "<=") { 179 | gtlt2 = "<"; 180 | if (isXMinor) { 181 | major = +major + 1; 182 | } else { 183 | minor = +minor + 1; 184 | } 185 | } 186 | if (gtlt2 === "<") { 187 | preRelease2 = "-0"; 188 | } 189 | return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`; 190 | } else if (isXMinor) { 191 | return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`; 192 | } else if (isXPatch) { 193 | return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`; 194 | } 195 | return ret; 196 | } 197 | ); 198 | }).join(" "); 199 | } 200 | function parseStar(range) { 201 | return range.trim().replace(parseRegex(star), ""); 202 | } 203 | function parseGTE0(comparatorString) { 204 | return comparatorString.trim().replace(parseRegex(gte0), ""); 205 | } 206 | function compareAtom(rangeAtom, versionAtom) { 207 | rangeAtom = +rangeAtom || rangeAtom; 208 | versionAtom = +versionAtom || versionAtom; 209 | if (rangeAtom > versionAtom) { 210 | return 1; 211 | } 212 | if (rangeAtom === versionAtom) { 213 | return 0; 214 | } 215 | return -1; 216 | } 217 | function comparePreRelease(rangeAtom, versionAtom) { 218 | const { preRelease: rangePreRelease } = rangeAtom; 219 | const { preRelease: versionPreRelease } = versionAtom; 220 | if (rangePreRelease === void 0 && !!versionPreRelease) { 221 | return 1; 222 | } 223 | if (!!rangePreRelease && versionPreRelease === void 0) { 224 | return -1; 225 | } 226 | if (rangePreRelease === void 0 && versionPreRelease === void 0) { 227 | return 0; 228 | } 229 | for (let i = 0, n = rangePreRelease.length; i <= n; i++) { 230 | const rangeElement = rangePreRelease[i]; 231 | const versionElement = versionPreRelease[i]; 232 | if (rangeElement === versionElement) { 233 | continue; 234 | } 235 | if (rangeElement === void 0 && versionElement === void 0) { 236 | return 0; 237 | } 238 | if (!rangeElement) { 239 | return 1; 240 | } 241 | if (!versionElement) { 242 | return -1; 243 | } 244 | return compareAtom(rangeElement, versionElement); 245 | } 246 | return 0; 247 | } 248 | function compareVersion(rangeAtom, versionAtom) { 249 | return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom); 250 | } 251 | function eq(rangeAtom, versionAtom) { 252 | return rangeAtom.version === versionAtom.version; 253 | } 254 | function compare(rangeAtom, versionAtom) { 255 | switch (rangeAtom.operator) { 256 | case "": 257 | case "=": 258 | return eq(rangeAtom, versionAtom); 259 | case ">": 260 | return compareVersion(rangeAtom, versionAtom) < 0; 261 | case ">=": 262 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0; 263 | case "<": 264 | return compareVersion(rangeAtom, versionAtom) > 0; 265 | case "<=": 266 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0; 267 | case void 0: { 268 | return true; 269 | } 270 | default: 271 | return false; 272 | } 273 | } 274 | function parseComparatorString(range) { 275 | return pipe( 276 | parseCarets, 277 | parseTildes, 278 | parseXRanges, 279 | parseStar 280 | )(range); 281 | } 282 | function parseRange(range) { 283 | return pipe( 284 | parseHyphen, 285 | parseComparatorTrim, 286 | parseTildeTrim, 287 | parseCaretTrim 288 | )(range.trim()).split(/\s+/).join(" "); 289 | } 290 | function satisfy(version, range) { 291 | if (!version) { 292 | return false; 293 | } 294 | const parsedRange = parseRange(range); 295 | const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" "); 296 | const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2)); 297 | const extractedVersion = extractComparator(version); 298 | if (!extractedVersion) { 299 | return false; 300 | } 301 | const [ 302 | , 303 | versionOperator, 304 | , 305 | versionMajor, 306 | versionMinor, 307 | versionPatch, 308 | versionPreRelease 309 | ] = extractedVersion; 310 | const versionAtom = { 311 | version: combineVersion( 312 | versionMajor, 313 | versionMinor, 314 | versionPatch, 315 | versionPreRelease 316 | ), 317 | major: versionMajor, 318 | minor: versionMinor, 319 | patch: versionPatch, 320 | preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".") 321 | }; 322 | for (const comparator2 of comparators) { 323 | const extractedComparator = extractComparator(comparator2); 324 | if (!extractedComparator) { 325 | return false; 326 | } 327 | const [ 328 | , 329 | rangeOperator, 330 | , 331 | rangeMajor, 332 | rangeMinor, 333 | rangePatch, 334 | rangePreRelease 335 | ] = extractedComparator; 336 | const rangeAtom = { 337 | operator: rangeOperator, 338 | version: combineVersion( 339 | rangeMajor, 340 | rangeMinor, 341 | rangePatch, 342 | rangePreRelease 343 | ), 344 | major: rangeMajor, 345 | minor: rangeMinor, 346 | patch: rangePatch, 347 | preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".") 348 | }; 349 | if (!compare(rangeAtom, versionAtom)) { 350 | return false; 351 | } 352 | } 353 | return true; 354 | } 355 | 356 | // eslint-disable-next-line no-undef 357 | const moduleMap = {}; 358 | const moduleCache = Object.create(null); 359 | async function importShared(name, shareScope = 'default') { 360 | return moduleCache[name] 361 | ? new Promise((r) => r(moduleCache[name])) 362 | : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name) 363 | } 364 | async function getSharedFromRuntime(name, shareScope) { 365 | let module = null; 366 | if (globalThis?.__federation_shared__?.[shareScope]?.[name]) { 367 | const versionObj = globalThis.__federation_shared__[shareScope][name]; 368 | const requiredVersion = moduleMap[name]?.requiredVersion; 369 | const hasRequiredVersion = !!requiredVersion; 370 | if (hasRequiredVersion) { 371 | const versionKey = Object.keys(versionObj).find((version) => 372 | satisfy(version, requiredVersion) 373 | ); 374 | if (versionKey) { 375 | const versionValue = versionObj[versionKey]; 376 | module = await (await versionValue.get())(); 377 | } else { 378 | console.log( 379 | `provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})` 380 | ); 381 | } 382 | } else { 383 | const versionKey = Object.keys(versionObj)[0]; 384 | const versionValue = versionObj[versionKey]; 385 | module = await (await versionValue.get())(); 386 | } 387 | } 388 | if (module) { 389 | return flattenModule(module, name) 390 | } 391 | } 392 | async function getSharedFromLocal(name) { 393 | if (moduleMap[name]?.import) { 394 | let module = await (await moduleMap[name].get())(); 395 | return flattenModule(module, name) 396 | } else { 397 | console.error( 398 | `consumer config import=false,so cant use callback shared module` 399 | ); 400 | } 401 | } 402 | function flattenModule(module, name) { 403 | // use a shared module which export default a function will getting error 'TypeError: xxx is not a function' 404 | if (typeof module.default === 'function') { 405 | Object.keys(module).forEach((key) => { 406 | if (key !== 'default') { 407 | module.default[key] = module[key]; 408 | } 409 | }); 410 | moduleCache[name] = module.default; 411 | return module.default 412 | } 413 | if (module.default) module = Object.assign({}, module.default, module); 414 | moduleCache[name] = module; 415 | return module 416 | } 417 | 418 | export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime }; 419 | -------------------------------------------------------------------------------- /plugins/pluginmanagervue/dist/assets/index-C9FZDa_5.css: -------------------------------------------------------------------------------- 1 | 2 | .app-container[data-v-2debe563] { 3 | } 4 | .component-preview[data-v-2debe563] { 5 | overflow: hidden; 6 | border: 1px solid #e0e0e0; 7 | border-radius: 8px; 8 | padding: 16px; 9 | background-color: #f9f9f9; 10 | } 11 | @supports not selector(:focus-visible) { 12 | } 13 | @supports not selector(:focus-visible) { 14 | } 15 | @supports selector(:focus-visible) { 16 | }@supports not selector(:focus-visible) { 17 | }@keyframes progress-circular-dash { 18 | 0% { 19 | stroke-dasharray: 1, 200; 20 | stroke-dashoffset: 0px; 21 | } 22 | 50% { 23 | stroke-dasharray: 100, 200; 24 | stroke-dashoffset: -15px; 25 | } 26 | 100% { 27 | stroke-dasharray: 100, 200; 28 | stroke-dashoffset: -124px; 29 | } 30 | } 31 | @keyframes progress-circular-rotate { 32 | 100% { 33 | transform: rotate(270deg); 34 | } 35 | }@media (forced-colors: active) { 36 | } 37 | 38 | @media (forced-colors: active) { 39 | } 40 | @media (forced-colors: active) { 41 | } 42 | 43 | @keyframes indeterminate-ltr { 44 | 0% { 45 | left: -90%; 46 | right: 100%; 47 | } 48 | 60% { 49 | left: -90%; 50 | right: 100%; 51 | } 52 | 100% { 53 | left: 100%; 54 | right: -35%; 55 | } 56 | } 57 | @keyframes indeterminate-rtl { 58 | 0% { 59 | left: 100%; 60 | right: -90%; 61 | } 62 | 60% { 63 | left: 100%; 64 | right: -90%; 65 | } 66 | 100% { 67 | left: -35%; 68 | right: 100%; 69 | } 70 | } 71 | @keyframes indeterminate-short-ltr { 72 | 0% { 73 | left: -200%; 74 | right: 100%; 75 | } 76 | 60% { 77 | left: 107%; 78 | right: -8%; 79 | } 80 | 100% { 81 | left: 107%; 82 | right: -8%; 83 | } 84 | } 85 | @keyframes indeterminate-short-rtl { 86 | 0% { 87 | left: 100%; 88 | right: -200%; 89 | } 90 | 60% { 91 | left: -8%; 92 | right: 107%; 93 | } 94 | 100% { 95 | left: -8%; 96 | right: 107%; 97 | } 98 | } 99 | @keyframes stream { 100 | to { 101 | transform: translateX(var(--v-progress-linear-stream-to)); 102 | } 103 | } 104 | @keyframes progress-linear-stripes { 105 | 0% { 106 | background-position-x: var(--v-progress-linear-height); 107 | } 108 | }@supports not selector(:focus-visible) { 109 | } 110 | @supports not selector(:focus-visible) { 111 | }@supports not selector(:focus-visible) { 112 | } 113 | @supports not selector(:focus-visible) { 114 | } 115 | @supports selector(:focus-visible) { 116 | }/* region BLOCK */ 117 | 118 | /* endregion */ 119 | /* region ELEMENTS */ 120 | 121 | /* endregion *//* region INPUT */ 122 | 123 | /* endregion */ 124 | /* region MODIFIERS */ 125 | 126 | /* endregion */ 127 | /* region ELEMENTS */ 128 | 129 | /* endregion */ 130 | /* region AFFIXES */ 131 | @media (hover: hover) { 132 | } 133 | @media (hover: none) { 134 | } 135 | 136 | /* endregion */ 137 | /* region LABEL */ 138 | 139 | /* endregion */ 140 | /* region OUTLINE */ 141 | @media (hover: hover) { 142 | } 143 | 144 | /* endregion */ 145 | /* region LOADER */ 146 | 147 | /* endregion */ 148 | /* region OVERLAY */ 149 | @media (hover: hover) { 150 | } 151 | @media (hover: hover) { 152 | } 153 | @media (hover: hover) { 154 | } 155 | 156 | /* endregion */ 157 | /* region MODIFIERS */ 158 | 159 | /* endregion */.bottom-sheet-transition-enter-from { 160 | transform: translateY(100%); 161 | } 162 | .bottom-sheet-transition-leave-to { 163 | transform: translateY(100%); 164 | } 165 | @media (min-width: 600px) { 166 | }@supports not selector(:focus-visible) { 167 | } 168 | @supports not selector(:focus-visible) { 169 | }@media (forced-colors: active) { 170 | } 171 | 172 | @media (hover: hover) { 173 | }@media (forced-colors: active) { 174 | } 175 | @media (forced-colors: active) { 176 | } 177 | @media (forced-colors: active) { 178 | }@media (min-width: 960px) { 179 | } 180 | @media (min-width: 1280px) { 181 | } 182 | @media (min-width: 1920px) { 183 | } 184 | @media (min-width: 2560px) { 185 | } 186 | 187 | .offset-1 { 188 | margin-inline-start: 8.3333333333%; 189 | } 190 | 191 | .offset-2 { 192 | margin-inline-start: 16.6666666667%; 193 | } 194 | 195 | .offset-3 { 196 | margin-inline-start: 25%; 197 | } 198 | 199 | .offset-4 { 200 | margin-inline-start: 33.3333333333%; 201 | } 202 | 203 | .offset-5 { 204 | margin-inline-start: 41.6666666667%; 205 | } 206 | 207 | .offset-6 { 208 | margin-inline-start: 50%; 209 | } 210 | 211 | .offset-7 { 212 | margin-inline-start: 58.3333333333%; 213 | } 214 | 215 | .offset-8 { 216 | margin-inline-start: 66.6666666667%; 217 | } 218 | 219 | .offset-9 { 220 | margin-inline-start: 75%; 221 | } 222 | 223 | .offset-10 { 224 | margin-inline-start: 83.3333333333%; 225 | } 226 | 227 | .offset-11 { 228 | margin-inline-start: 91.6666666667%; 229 | } 230 | 231 | @media (min-width: 600px) { 232 | .offset-sm-0 { 233 | margin-inline-start: 0; 234 | } 235 | .offset-sm-1 { 236 | margin-inline-start: 8.3333333333%; 237 | } 238 | .offset-sm-2 { 239 | margin-inline-start: 16.6666666667%; 240 | } 241 | .offset-sm-3 { 242 | margin-inline-start: 25%; 243 | } 244 | .offset-sm-4 { 245 | margin-inline-start: 33.3333333333%; 246 | } 247 | .offset-sm-5 { 248 | margin-inline-start: 41.6666666667%; 249 | } 250 | .offset-sm-6 { 251 | margin-inline-start: 50%; 252 | } 253 | .offset-sm-7 { 254 | margin-inline-start: 58.3333333333%; 255 | } 256 | .offset-sm-8 { 257 | margin-inline-start: 66.6666666667%; 258 | } 259 | .offset-sm-9 { 260 | margin-inline-start: 75%; 261 | } 262 | .offset-sm-10 { 263 | margin-inline-start: 83.3333333333%; 264 | } 265 | .offset-sm-11 { 266 | margin-inline-start: 91.6666666667%; 267 | } 268 | } 269 | @media (min-width: 960px) { 270 | .offset-md-0 { 271 | margin-inline-start: 0; 272 | } 273 | .offset-md-1 { 274 | margin-inline-start: 8.3333333333%; 275 | } 276 | .offset-md-2 { 277 | margin-inline-start: 16.6666666667%; 278 | } 279 | .offset-md-3 { 280 | margin-inline-start: 25%; 281 | } 282 | .offset-md-4 { 283 | margin-inline-start: 33.3333333333%; 284 | } 285 | .offset-md-5 { 286 | margin-inline-start: 41.6666666667%; 287 | } 288 | .offset-md-6 { 289 | margin-inline-start: 50%; 290 | } 291 | .offset-md-7 { 292 | margin-inline-start: 58.3333333333%; 293 | } 294 | .offset-md-8 { 295 | margin-inline-start: 66.6666666667%; 296 | } 297 | .offset-md-9 { 298 | margin-inline-start: 75%; 299 | } 300 | .offset-md-10 { 301 | margin-inline-start: 83.3333333333%; 302 | } 303 | .offset-md-11 { 304 | margin-inline-start: 91.6666666667%; 305 | } 306 | } 307 | @media (min-width: 1280px) { 308 | .offset-lg-0 { 309 | margin-inline-start: 0; 310 | } 311 | .offset-lg-1 { 312 | margin-inline-start: 8.3333333333%; 313 | } 314 | .offset-lg-2 { 315 | margin-inline-start: 16.6666666667%; 316 | } 317 | .offset-lg-3 { 318 | margin-inline-start: 25%; 319 | } 320 | .offset-lg-4 { 321 | margin-inline-start: 33.3333333333%; 322 | } 323 | .offset-lg-5 { 324 | margin-inline-start: 41.6666666667%; 325 | } 326 | .offset-lg-6 { 327 | margin-inline-start: 50%; 328 | } 329 | .offset-lg-7 { 330 | margin-inline-start: 58.3333333333%; 331 | } 332 | .offset-lg-8 { 333 | margin-inline-start: 66.6666666667%; 334 | } 335 | .offset-lg-9 { 336 | margin-inline-start: 75%; 337 | } 338 | .offset-lg-10 { 339 | margin-inline-start: 83.3333333333%; 340 | } 341 | .offset-lg-11 { 342 | margin-inline-start: 91.6666666667%; 343 | } 344 | } 345 | @media (min-width: 1920px) { 346 | .offset-xl-0 { 347 | margin-inline-start: 0; 348 | } 349 | .offset-xl-1 { 350 | margin-inline-start: 8.3333333333%; 351 | } 352 | .offset-xl-2 { 353 | margin-inline-start: 16.6666666667%; 354 | } 355 | .offset-xl-3 { 356 | margin-inline-start: 25%; 357 | } 358 | .offset-xl-4 { 359 | margin-inline-start: 33.3333333333%; 360 | } 361 | .offset-xl-5 { 362 | margin-inline-start: 41.6666666667%; 363 | } 364 | .offset-xl-6 { 365 | margin-inline-start: 50%; 366 | } 367 | .offset-xl-7 { 368 | margin-inline-start: 58.3333333333%; 369 | } 370 | .offset-xl-8 { 371 | margin-inline-start: 66.6666666667%; 372 | } 373 | .offset-xl-9 { 374 | margin-inline-start: 75%; 375 | } 376 | .offset-xl-10 { 377 | margin-inline-start: 83.3333333333%; 378 | } 379 | .offset-xl-11 { 380 | margin-inline-start: 91.6666666667%; 381 | } 382 | } 383 | @media (min-width: 2560px) { 384 | .offset-xxl-0 { 385 | margin-inline-start: 0; 386 | } 387 | .offset-xxl-1 { 388 | margin-inline-start: 8.3333333333%; 389 | } 390 | .offset-xxl-2 { 391 | margin-inline-start: 16.6666666667%; 392 | } 393 | .offset-xxl-3 { 394 | margin-inline-start: 25%; 395 | } 396 | .offset-xxl-4 { 397 | margin-inline-start: 33.3333333333%; 398 | } 399 | .offset-xxl-5 { 400 | margin-inline-start: 41.6666666667%; 401 | } 402 | .offset-xxl-6 { 403 | margin-inline-start: 50%; 404 | } 405 | .offset-xxl-7 { 406 | margin-inline-start: 58.3333333333%; 407 | } 408 | .offset-xxl-8 { 409 | margin-inline-start: 66.6666666667%; 410 | } 411 | .offset-xxl-9 { 412 | margin-inline-start: 75%; 413 | } 414 | .offset-xxl-10 { 415 | margin-inline-start: 83.3333333333%; 416 | } 417 | .offset-xxl-11 { 418 | margin-inline-start: 91.6666666667%; 419 | } 420 | }.date-picker-header-transition-enter-active, 421 | .date-picker-header-reverse-transition-enter-active { 422 | transition-duration: 0.3s; 423 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 424 | } 425 | .date-picker-header-transition-leave-active, 426 | .date-picker-header-reverse-transition-leave-active { 427 | transition-duration: 0.3s; 428 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 429 | } 430 | 431 | .date-picker-header-transition-enter-from { 432 | transform: translate(0, 100%); 433 | } 434 | .date-picker-header-transition-leave-to { 435 | opacity: 0; 436 | transform: translate(0, -100%); 437 | } 438 | 439 | .date-picker-header-reverse-transition-enter-from { 440 | transform: translate(0, -100%); 441 | } 442 | .date-picker-header-reverse-transition-leave-to { 443 | opacity: 0; 444 | transform: translate(0, 100%); 445 | }@supports not selector(:focus-visible) { 446 | } 447 | @supports not selector(:focus-visible) { 448 | }@keyframes loading { 449 | 100% { 450 | transform: translateX(100%); 451 | } 452 | }@supports not selector(:focus-visible) { 453 | } 454 | @supports not selector(:focus-visible) { 455 | }@media (forced-colors: active) { 456 | }@media (max-width: 1279.98px) { 457 | }/** Modifiers **/ -------------------------------------------------------------------------------- /plugins/pluginmanagervue/dist/assets/remoteEntry.js: -------------------------------------------------------------------------------- 1 | const currentImports = {}; 2 | const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); 3 | let moduleMap = { 4 | "./Page":()=>{ 5 | dynamicLoadingCss(["__federation_expose_Page-GreQ8Kl5.css"], false, './Page'); 6 | return __federation_import('./__federation_expose_Page-CEUe4Ddt.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; 7 | const seen = {}; 8 | const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { 9 | const metaUrl = import.meta.url; 10 | if (typeof metaUrl === 'undefined') { 11 | console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".'); 12 | return; 13 | } 14 | 15 | const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js')); 16 | const base = '/'; 17 | 'assets'; 18 | 19 | cssFilePaths.forEach(cssPath => { 20 | let href = ''; 21 | const baseUrl = base || curUrl; 22 | if (baseUrl) { 23 | const trimmer = { 24 | trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path), 25 | leading: (path) => (path.startsWith('/') ? path.slice(1) : path) 26 | }; 27 | const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//'); 28 | 29 | const cleanBaseUrl = trimmer.trailing(baseUrl); 30 | const cleanCssPath = trimmer.leading(cssPath); 31 | const cleanCurUrl = trimmer.trailing(curUrl); 32 | 33 | if (isAbsoluteUrl(baseUrl)) { 34 | href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 35 | } else { 36 | if (cleanCurUrl.includes(cleanBaseUrl)) { 37 | href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/'); 38 | } else { 39 | href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 40 | } 41 | } 42 | } else { 43 | href = cssPath; 44 | } 45 | 46 | if (dontAppendStylesToHead) { 47 | const key = 'css__PluginManagerVue__' + exposeItemName; 48 | window[key] = window[key] || []; 49 | window[key].push(href); 50 | return; 51 | } 52 | 53 | if (href in seen) return; 54 | seen[href] = true; 55 | 56 | const element = document.createElement('link'); 57 | element.rel = 'stylesheet'; 58 | element.href = href; 59 | document.head.appendChild(element); 60 | }); 61 | }; 62 | async function __federation_import(name) { 63 | currentImports[name] ??= import(name); 64 | return currentImports[name] 65 | } const get =(module) => { 66 | if(!moduleMap[module]) throw new Error('Can not find remote module ' + module) 67 | return moduleMap[module](); 68 | }; 69 | const init =(shareScope) => { 70 | globalThis.__federation_shared__= globalThis.__federation_shared__|| {}; 71 | Object.entries(shareScope).forEach(([key, value]) => { 72 | for (const [versionKey, versionValue] of Object.entries(value)) { 73 | const scope = versionValue.scope || 'default'; 74 | globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {}; 75 | const shared= globalThis.__federation_shared__[scope]; 76 | (shared[key] = shared[key]||{})[versionKey] = versionValue; 77 | } 78 | }); 79 | }; 80 | 81 | export { dynamicLoadingCss, get, init }; 82 | -------------------------------------------------------------------------------- /plugins/pluginmanagervue/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MoviePilot插件组件示例 8 | 9 | 10 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/Config-9f79c6ea.css: -------------------------------------------------------------------------------- 1 | 2 | .config-card[data-v-f579374d] { 3 | box-shadow: none !important; 4 | } 5 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/Dashboard-a2f1da0f.css: -------------------------------------------------------------------------------- 1 | 2 | .dashboard-widget[data-v-92bb95fe] { 3 | height: 100%; 4 | width: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/Page-0402d23b.css: -------------------------------------------------------------------------------- 1 | 2 | .config-card { 3 | box-shadow: none !important; 4 | } 5 | .downloaders-grid { 6 | display: grid; 7 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); 8 | gap: 12px; 9 | } 10 | .downloader-card { 11 | border: 1px solid rgba(0, 0, 0, 0.05); 12 | transition: all 0.2s ease; 13 | border-radius: 8px; 14 | overflow: hidden; 15 | } 16 | .downloader-card:hover { 17 | transform: translateY(-2px); 18 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important; 19 | } 20 | .clean-history-item { 21 | border-bottom: 1px solid rgba(0, 0, 0, 0.05); 22 | transition: background-color 0.2s ease; 23 | } 24 | .clean-history-item:hover { 25 | background-color: rgba(0, 0, 0, 0.03); 26 | } 27 | .clean-dir-path { 28 | white-space: nowrap; 29 | overflow: hidden; 30 | text-overflow: ellipsis; 31 | } 32 | .clean-type-chip { 33 | font-weight: 500; 34 | } 35 | .history-row:hover { 36 | background-color: rgba(0, 0, 0, 0.03); 37 | } 38 | .directory-path { 39 | max-width: 350px; 40 | overflow: hidden; 41 | text-overflow: ellipsis; 42 | white-space: nowrap; 43 | display: inline-block; 44 | } 45 | .time-highlight { 46 | color: #1976d2; 47 | } 48 | .downloader-item { 49 | transition: background-color 0.2s ease; 50 | } 51 | .downloader-item.has-tasks { 52 | background-color: rgba(255, 193, 7, 0.05); 53 | } 54 | .downloader-item:hover { 55 | background-color: rgba(0, 0, 0, 0.03); 56 | } 57 | .status-chip { 58 | font-weight: 500; 59 | } 60 | .history-table th, .history-table td { 61 | padding: 8px 16px !important; 62 | } 63 | .active-task-item { 64 | border-bottom: 1px solid rgba(0, 0, 0, 0.05); 65 | transition: background-color 0.2s ease; 66 | } 67 | .active-task-item:hover { 68 | background-color: rgba(0, 0, 0, 0.03); 69 | } 70 | .task-downloading { 71 | background-color: rgba(255, 193, 7, 0.1); 72 | } 73 | .torrent-name { 74 | font-weight: 500; 75 | max-width: 100%; 76 | overflow: hidden; 77 | text-overflow: ellipsis; 78 | white-space: nowrap; 79 | } 80 | .progress-text { 81 | min-width: 45px; 82 | text-align: right; 83 | } 84 | .tasks-container { 85 | max-height: 300px; 86 | overflow-y: auto; 87 | background-color: rgba(0, 0, 0, 0.02); 88 | } 89 | .task-item { 90 | border-bottom: 1px solid rgba(0, 0, 0, 0.06); 91 | } 92 | .task-item:last-child { 93 | border-bottom: none; 94 | } 95 | .info-chip { 96 | display: inline-flex; 97 | align-items: center; 98 | padding: 2px 6px; 99 | background-color: rgba(0, 0, 0, 0.03); 100 | border-radius: 4px; 101 | font-size: 0.75rem; 102 | color: rgba(0, 0, 0, 0.7); 103 | margin-right: 4px; 104 | } 105 | .progress-value { 106 | min-width: 40px; 107 | text-align: right; 108 | } 109 | .progress-details { 110 | border: 1px solid rgba(0, 0, 0, 0.05); 111 | } 112 | .progress-stat-item { 113 | display: flex; 114 | align-items: center; 115 | margin-right: 16px; 116 | margin-bottom: 8px; 117 | font-size: 0.875rem; 118 | } 119 | .removed-dirs-container { 120 | max-height: 200px; 121 | overflow-y: auto; 122 | border: 1px solid rgba(0, 0, 0, 0.05); 123 | } 124 | .removed-dir-item { 125 | border-bottom: 1px solid rgba(0, 0, 0, 0.05); 126 | } 127 | .removed-dir-item:last-child { 128 | border-bottom: none; 129 | } 130 | .stats-update-btn { 131 | font-weight: 500; 132 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 133 | transition: all 0.2s ease; 134 | } 135 | .stats-update-btn:hover { 136 | transform: translateY(-2px); 137 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); 138 | } 139 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/__federation_fn_import-054b33c3.js: -------------------------------------------------------------------------------- 1 | const buildIdentifier = "[0-9A-Za-z-]+"; 2 | const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`; 3 | const numericIdentifier = "0|[1-9]\\d*"; 4 | const numericIdentifierLoose = "[0-9]+"; 5 | const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*"; 6 | const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`; 7 | const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`; 8 | const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`; 9 | const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`; 10 | const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`; 11 | const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`; 12 | const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`; 13 | const mainVersionLoose = `(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`; 14 | const loosePlain = `[v=\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`; 15 | const gtlt = "((?:<|>)?=?)"; 16 | const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`; 17 | const loneTilde = "(?:~>?)"; 18 | const tildeTrim = `(\\s*)${loneTilde}\\s+`; 19 | const loneCaret = "(?:\\^)"; 20 | const caretTrim = `(\\s*)${loneCaret}\\s+`; 21 | const star = "(<|>)?=?\\s*\\*"; 22 | const caret = `^${loneCaret}${xRangePlain}$`; 23 | const mainVersion = `(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`; 24 | const fullPlain = `v?${mainVersion}${preRelease}?${build}?`; 25 | const tilde = `^${loneTilde}${xRangePlain}$`; 26 | const xRange = `^${gtlt}\\s*${xRangePlain}$`; 27 | const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`; 28 | const gte0 = "^\\s*>=\\s*0.0.0\\s*$"; 29 | function parseRegex(source) { 30 | return new RegExp(source); 31 | } 32 | function isXVersion(version) { 33 | return !version || version.toLowerCase() === "x" || version === "*"; 34 | } 35 | function pipe(...fns) { 36 | return (x) => { 37 | return fns.reduce((v, f) => f(v), x); 38 | }; 39 | } 40 | function extractComparator(comparatorString) { 41 | return comparatorString.match(parseRegex(comparator)); 42 | } 43 | function combineVersion(major, minor, patch, preRelease2) { 44 | const mainVersion2 = `${major}.${minor}.${patch}`; 45 | if (preRelease2) { 46 | return `${mainVersion2}-${preRelease2}`; 47 | } 48 | return mainVersion2; 49 | } 50 | function parseHyphen(range) { 51 | return range.replace( 52 | parseRegex(hyphenRange), 53 | (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => { 54 | if (isXVersion(fromMajor)) { 55 | from = ""; 56 | } else if (isXVersion(fromMinor)) { 57 | from = `>=${fromMajor}.0.0`; 58 | } else if (isXVersion(fromPatch)) { 59 | from = `>=${fromMajor}.${fromMinor}.0`; 60 | } else { 61 | from = `>=${from}`; 62 | } 63 | if (isXVersion(toMajor)) { 64 | to = ""; 65 | } else if (isXVersion(toMinor)) { 66 | to = `<${+toMajor + 1}.0.0-0`; 67 | } else if (isXVersion(toPatch)) { 68 | to = `<${toMajor}.${+toMinor + 1}.0-0`; 69 | } else if (toPreRelease) { 70 | to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`; 71 | } else { 72 | to = `<=${to}`; 73 | } 74 | return `${from} ${to}`.trim(); 75 | } 76 | ); 77 | } 78 | function parseComparatorTrim(range) { 79 | return range.replace(parseRegex(comparatorTrim), "$1$2$3"); 80 | } 81 | function parseTildeTrim(range) { 82 | return range.replace(parseRegex(tildeTrim), "$1~"); 83 | } 84 | function parseCaretTrim(range) { 85 | return range.replace(parseRegex(caretTrim), "$1^"); 86 | } 87 | function parseCarets(range) { 88 | return range.trim().split(/\s+/).map((rangeVersion) => { 89 | return rangeVersion.replace( 90 | parseRegex(caret), 91 | (_, major, minor, patch, preRelease2) => { 92 | if (isXVersion(major)) { 93 | return ""; 94 | } else if (isXVersion(minor)) { 95 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 96 | } else if (isXVersion(patch)) { 97 | if (major === "0") { 98 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 99 | } else { 100 | return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`; 101 | } 102 | } else if (preRelease2) { 103 | if (major === "0") { 104 | if (minor === "0") { 105 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`; 106 | } else { 107 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 108 | } 109 | } else { 110 | return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`; 111 | } 112 | } else { 113 | if (major === "0") { 114 | if (minor === "0") { 115 | return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`; 116 | } else { 117 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 118 | } 119 | } 120 | return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`; 121 | } 122 | } 123 | ); 124 | }).join(" "); 125 | } 126 | function parseTildes(range) { 127 | return range.trim().split(/\s+/).map((rangeVersion) => { 128 | return rangeVersion.replace( 129 | parseRegex(tilde), 130 | (_, major, minor, patch, preRelease2) => { 131 | if (isXVersion(major)) { 132 | return ""; 133 | } else if (isXVersion(minor)) { 134 | return `>=${major}.0.0 <${+major + 1}.0.0-0`; 135 | } else if (isXVersion(patch)) { 136 | return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`; 137 | } else if (preRelease2) { 138 | return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`; 139 | } 140 | return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`; 141 | } 142 | ); 143 | }).join(" "); 144 | } 145 | function parseXRanges(range) { 146 | return range.split(/\s+/).map((rangeVersion) => { 147 | return rangeVersion.trim().replace( 148 | parseRegex(xRange), 149 | (ret, gtlt2, major, minor, patch, preRelease2) => { 150 | const isXMajor = isXVersion(major); 151 | const isXMinor = isXMajor || isXVersion(minor); 152 | const isXPatch = isXMinor || isXVersion(patch); 153 | if (gtlt2 === "=" && isXPatch) { 154 | gtlt2 = ""; 155 | } 156 | preRelease2 = ""; 157 | if (isXMajor) { 158 | if (gtlt2 === ">" || gtlt2 === "<") { 159 | return "<0.0.0-0"; 160 | } else { 161 | return "*"; 162 | } 163 | } else if (gtlt2 && isXPatch) { 164 | if (isXMinor) { 165 | minor = 0; 166 | } 167 | patch = 0; 168 | if (gtlt2 === ">") { 169 | gtlt2 = ">="; 170 | if (isXMinor) { 171 | major = +major + 1; 172 | minor = 0; 173 | patch = 0; 174 | } else { 175 | minor = +minor + 1; 176 | patch = 0; 177 | } 178 | } else if (gtlt2 === "<=") { 179 | gtlt2 = "<"; 180 | if (isXMinor) { 181 | major = +major + 1; 182 | } else { 183 | minor = +minor + 1; 184 | } 185 | } 186 | if (gtlt2 === "<") { 187 | preRelease2 = "-0"; 188 | } 189 | return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`; 190 | } else if (isXMinor) { 191 | return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`; 192 | } else if (isXPatch) { 193 | return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`; 194 | } 195 | return ret; 196 | } 197 | ); 198 | }).join(" "); 199 | } 200 | function parseStar(range) { 201 | return range.trim().replace(parseRegex(star), ""); 202 | } 203 | function parseGTE0(comparatorString) { 204 | return comparatorString.trim().replace(parseRegex(gte0), ""); 205 | } 206 | function compareAtom(rangeAtom, versionAtom) { 207 | rangeAtom = +rangeAtom || rangeAtom; 208 | versionAtom = +versionAtom || versionAtom; 209 | if (rangeAtom > versionAtom) { 210 | return 1; 211 | } 212 | if (rangeAtom === versionAtom) { 213 | return 0; 214 | } 215 | return -1; 216 | } 217 | function comparePreRelease(rangeAtom, versionAtom) { 218 | const { preRelease: rangePreRelease } = rangeAtom; 219 | const { preRelease: versionPreRelease } = versionAtom; 220 | if (rangePreRelease === void 0 && !!versionPreRelease) { 221 | return 1; 222 | } 223 | if (!!rangePreRelease && versionPreRelease === void 0) { 224 | return -1; 225 | } 226 | if (rangePreRelease === void 0 && versionPreRelease === void 0) { 227 | return 0; 228 | } 229 | for (let i = 0, n = rangePreRelease.length; i <= n; i++) { 230 | const rangeElement = rangePreRelease[i]; 231 | const versionElement = versionPreRelease[i]; 232 | if (rangeElement === versionElement) { 233 | continue; 234 | } 235 | if (rangeElement === void 0 && versionElement === void 0) { 236 | return 0; 237 | } 238 | if (!rangeElement) { 239 | return 1; 240 | } 241 | if (!versionElement) { 242 | return -1; 243 | } 244 | return compareAtom(rangeElement, versionElement); 245 | } 246 | return 0; 247 | } 248 | function compareVersion(rangeAtom, versionAtom) { 249 | return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom); 250 | } 251 | function eq(rangeAtom, versionAtom) { 252 | return rangeAtom.version === versionAtom.version; 253 | } 254 | function compare(rangeAtom, versionAtom) { 255 | switch (rangeAtom.operator) { 256 | case "": 257 | case "=": 258 | return eq(rangeAtom, versionAtom); 259 | case ">": 260 | return compareVersion(rangeAtom, versionAtom) < 0; 261 | case ">=": 262 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0; 263 | case "<": 264 | return compareVersion(rangeAtom, versionAtom) > 0; 265 | case "<=": 266 | return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0; 267 | case void 0: { 268 | return true; 269 | } 270 | default: 271 | return false; 272 | } 273 | } 274 | function parseComparatorString(range) { 275 | return pipe( 276 | parseCarets, 277 | parseTildes, 278 | parseXRanges, 279 | parseStar 280 | )(range); 281 | } 282 | function parseRange(range) { 283 | return pipe( 284 | parseHyphen, 285 | parseComparatorTrim, 286 | parseTildeTrim, 287 | parseCaretTrim 288 | )(range.trim()).split(/\s+/).join(" "); 289 | } 290 | function satisfy(version, range) { 291 | if (!version) { 292 | return false; 293 | } 294 | const parsedRange = parseRange(range); 295 | const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" "); 296 | const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2)); 297 | const extractedVersion = extractComparator(version); 298 | if (!extractedVersion) { 299 | return false; 300 | } 301 | const [ 302 | , 303 | versionOperator, 304 | , 305 | versionMajor, 306 | versionMinor, 307 | versionPatch, 308 | versionPreRelease 309 | ] = extractedVersion; 310 | const versionAtom = { 311 | operator: versionOperator, 312 | version: combineVersion( 313 | versionMajor, 314 | versionMinor, 315 | versionPatch, 316 | versionPreRelease 317 | ), 318 | major: versionMajor, 319 | minor: versionMinor, 320 | patch: versionPatch, 321 | preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".") 322 | }; 323 | for (const comparator2 of comparators) { 324 | const extractedComparator = extractComparator(comparator2); 325 | if (!extractedComparator) { 326 | return false; 327 | } 328 | const [ 329 | , 330 | rangeOperator, 331 | , 332 | rangeMajor, 333 | rangeMinor, 334 | rangePatch, 335 | rangePreRelease 336 | ] = extractedComparator; 337 | const rangeAtom = { 338 | operator: rangeOperator, 339 | version: combineVersion( 340 | rangeMajor, 341 | rangeMinor, 342 | rangePatch, 343 | rangePreRelease 344 | ), 345 | major: rangeMajor, 346 | minor: rangeMinor, 347 | patch: rangePatch, 348 | preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".") 349 | }; 350 | if (!compare(rangeAtom, versionAtom)) { 351 | return false; 352 | } 353 | } 354 | return true; 355 | } 356 | 357 | // eslint-disable-next-line no-undef 358 | const moduleMap = {}; 359 | const moduleCache = Object.create(null); 360 | async function importShared(name, shareScope = 'default') { 361 | return moduleCache[name] 362 | ? new Promise((r) => r(moduleCache[name])) 363 | : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name) 364 | } 365 | async function getSharedFromRuntime(name, shareScope) { 366 | let module = null; 367 | if (globalThis?.__federation_shared__?.[shareScope]?.[name]) { 368 | const versionObj = globalThis.__federation_shared__[shareScope][name]; 369 | const requiredVersion = moduleMap[name]?.requiredVersion; 370 | const hasRequiredVersion = !!requiredVersion; 371 | if (hasRequiredVersion) { 372 | const versionKey = Object.keys(versionObj).find((version) => 373 | satisfy(version, requiredVersion) 374 | ); 375 | if (versionKey) { 376 | const versionValue = versionObj[versionKey]; 377 | module = await (await versionValue.get())(); 378 | } else { 379 | console.log( 380 | `provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})` 381 | ); 382 | } 383 | } else { 384 | const versionKey = Object.keys(versionObj)[0]; 385 | const versionValue = versionObj[versionKey]; 386 | module = await (await versionValue.get())(); 387 | } 388 | } 389 | if (module) { 390 | return flattenModule(module, name) 391 | } 392 | } 393 | async function getSharedFromLocal(name) { 394 | if (moduleMap[name]?.import) { 395 | let module = await (await moduleMap[name].get())(); 396 | return flattenModule(module, name) 397 | } else { 398 | console.error( 399 | `consumer config import=false,so cant use callback shared module` 400 | ); 401 | } 402 | } 403 | function flattenModule(module, name) { 404 | // use a shared module which export default a function will getting error 'TypeError: xxx is not a function' 405 | if (typeof module.default === 'function') { 406 | Object.keys(module).forEach((key) => { 407 | if (key !== 'default') { 408 | module.default[key] = module[key]; 409 | } 410 | }); 411 | moduleCache[name] = module.default; 412 | return module.default 413 | } 414 | if (module.default) module = Object.assign({}, module.default, module); 415 | moduleCache[name] = module; 416 | return module 417 | } 418 | 419 | export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime }; 420 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/_plugin-vue_export-helper-c4c0bc37.js: -------------------------------------------------------------------------------- 1 | const _export_sfc = (sfc, props) => { 2 | const target = sfc.__vccOpts || sfc; 3 | for (const [key, val] of props) { 4 | target[key] = val; 5 | } 6 | return target; 7 | }; 8 | 9 | export { _export_sfc as _ }; 10 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/index-7a81b9ad.css: -------------------------------------------------------------------------------- 1 | 2 | .plugin-app { 3 | width: 100%; 4 | height: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | } 8 | @supports not selector(:focus-visible) { 9 | } 10 | @supports not selector(:focus-visible) { 11 | } 12 | @supports selector(:focus-visible) { 13 | }@supports not selector(:focus-visible) { 14 | }@keyframes progress-circular-dash { 15 | 0% { 16 | stroke-dasharray: 1, 200; 17 | stroke-dashoffset: 0px; 18 | } 19 | 50% { 20 | stroke-dasharray: 100, 200; 21 | stroke-dashoffset: -15px; 22 | } 23 | 100% { 24 | stroke-dasharray: 100, 200; 25 | stroke-dashoffset: -124px; 26 | } 27 | } 28 | @keyframes progress-circular-rotate { 29 | 100% { 30 | transform: rotate(270deg); 31 | } 32 | }@media (forced-colors: active) { 33 | } 34 | 35 | @media (forced-colors: active) { 36 | } 37 | @media (forced-colors: active) { 38 | } 39 | 40 | @keyframes indeterminate-ltr { 41 | 0% { 42 | left: -90%; 43 | right: 100%; 44 | } 45 | 60% { 46 | left: -90%; 47 | right: 100%; 48 | } 49 | 100% { 50 | left: 100%; 51 | right: -35%; 52 | } 53 | } 54 | @keyframes indeterminate-rtl { 55 | 0% { 56 | left: 100%; 57 | right: -90%; 58 | } 59 | 60% { 60 | left: 100%; 61 | right: -90%; 62 | } 63 | 100% { 64 | left: -35%; 65 | right: 100%; 66 | } 67 | } 68 | @keyframes indeterminate-short-ltr { 69 | 0% { 70 | left: -200%; 71 | right: 100%; 72 | } 73 | 60% { 74 | left: 107%; 75 | right: -8%; 76 | } 77 | 100% { 78 | left: 107%; 79 | right: -8%; 80 | } 81 | } 82 | @keyframes indeterminate-short-rtl { 83 | 0% { 84 | left: 100%; 85 | right: -200%; 86 | } 87 | 60% { 88 | left: -8%; 89 | right: 107%; 90 | } 91 | 100% { 92 | left: -8%; 93 | right: 107%; 94 | } 95 | } 96 | @keyframes stream { 97 | to { 98 | transform: translateX(var(--v-progress-linear-stream-to)); 99 | } 100 | } 101 | @keyframes progress-linear-stripes { 102 | 0% { 103 | background-position-x: var(--v-progress-linear-height); 104 | } 105 | }@supports not selector(:focus-visible) { 106 | } 107 | @supports not selector(:focus-visible) { 108 | }@supports not selector(:focus-visible) { 109 | } 110 | @supports not selector(:focus-visible) { 111 | } 112 | @supports selector(:focus-visible) { 113 | }/* region BLOCK */ 114 | 115 | /* endregion */ 116 | /* region ELEMENTS */ 117 | 118 | /* endregion *//* region INPUT */ 119 | 120 | /* endregion */ 121 | /* region MODIFIERS */ 122 | 123 | /* endregion */ 124 | /* region ELEMENTS */ 125 | 126 | /* endregion */ 127 | /* region AFFIXES */ 128 | @media (hover: hover) { 129 | } 130 | @media (hover: none) { 131 | } 132 | 133 | /* endregion */ 134 | /* region LABEL */ 135 | 136 | /* endregion */ 137 | /* region OUTLINE */ 138 | @media (hover: hover) { 139 | } 140 | 141 | /* endregion */ 142 | /* region LOADER */ 143 | 144 | /* endregion */ 145 | /* region OVERLAY */ 146 | @media (hover: hover) { 147 | } 148 | @media (hover: hover) { 149 | } 150 | @media (hover: hover) { 151 | } 152 | 153 | /* endregion */ 154 | /* region MODIFIERS */ 155 | 156 | /* endregion */.bottom-sheet-transition-enter-from { 157 | transform: translateY(100%); 158 | } 159 | .bottom-sheet-transition-leave-to { 160 | transform: translateY(100%); 161 | } 162 | @media (min-width: 600px) { 163 | }@supports not selector(:focus-visible) { 164 | } 165 | @supports not selector(:focus-visible) { 166 | }@media (forced-colors: active) { 167 | } 168 | 169 | @media (hover: hover) { 170 | }@media (forced-colors: active) { 171 | } 172 | @media (forced-colors: active) { 173 | } 174 | @media (forced-colors: active) { 175 | }@media (min-width: 960px) { 176 | } 177 | @media (min-width: 1280px) { 178 | } 179 | @media (min-width: 1920px) { 180 | } 181 | @media (min-width: 2560px) { 182 | } 183 | 184 | .offset-1 { 185 | margin-inline-start: 8.3333333333%; 186 | } 187 | 188 | .offset-2 { 189 | margin-inline-start: 16.6666666667%; 190 | } 191 | 192 | .offset-3 { 193 | margin-inline-start: 25%; 194 | } 195 | 196 | .offset-4 { 197 | margin-inline-start: 33.3333333333%; 198 | } 199 | 200 | .offset-5 { 201 | margin-inline-start: 41.6666666667%; 202 | } 203 | 204 | .offset-6 { 205 | margin-inline-start: 50%; 206 | } 207 | 208 | .offset-7 { 209 | margin-inline-start: 58.3333333333%; 210 | } 211 | 212 | .offset-8 { 213 | margin-inline-start: 66.6666666667%; 214 | } 215 | 216 | .offset-9 { 217 | margin-inline-start: 75%; 218 | } 219 | 220 | .offset-10 { 221 | margin-inline-start: 83.3333333333%; 222 | } 223 | 224 | .offset-11 { 225 | margin-inline-start: 91.6666666667%; 226 | } 227 | 228 | @media (min-width: 600px) { 229 | .offset-sm-0 { 230 | margin-inline-start: 0; 231 | } 232 | .offset-sm-1 { 233 | margin-inline-start: 8.3333333333%; 234 | } 235 | .offset-sm-2 { 236 | margin-inline-start: 16.6666666667%; 237 | } 238 | .offset-sm-3 { 239 | margin-inline-start: 25%; 240 | } 241 | .offset-sm-4 { 242 | margin-inline-start: 33.3333333333%; 243 | } 244 | .offset-sm-5 { 245 | margin-inline-start: 41.6666666667%; 246 | } 247 | .offset-sm-6 { 248 | margin-inline-start: 50%; 249 | } 250 | .offset-sm-7 { 251 | margin-inline-start: 58.3333333333%; 252 | } 253 | .offset-sm-8 { 254 | margin-inline-start: 66.6666666667%; 255 | } 256 | .offset-sm-9 { 257 | margin-inline-start: 75%; 258 | } 259 | .offset-sm-10 { 260 | margin-inline-start: 83.3333333333%; 261 | } 262 | .offset-sm-11 { 263 | margin-inline-start: 91.6666666667%; 264 | } 265 | } 266 | @media (min-width: 960px) { 267 | .offset-md-0 { 268 | margin-inline-start: 0; 269 | } 270 | .offset-md-1 { 271 | margin-inline-start: 8.3333333333%; 272 | } 273 | .offset-md-2 { 274 | margin-inline-start: 16.6666666667%; 275 | } 276 | .offset-md-3 { 277 | margin-inline-start: 25%; 278 | } 279 | .offset-md-4 { 280 | margin-inline-start: 33.3333333333%; 281 | } 282 | .offset-md-5 { 283 | margin-inline-start: 41.6666666667%; 284 | } 285 | .offset-md-6 { 286 | margin-inline-start: 50%; 287 | } 288 | .offset-md-7 { 289 | margin-inline-start: 58.3333333333%; 290 | } 291 | .offset-md-8 { 292 | margin-inline-start: 66.6666666667%; 293 | } 294 | .offset-md-9 { 295 | margin-inline-start: 75%; 296 | } 297 | .offset-md-10 { 298 | margin-inline-start: 83.3333333333%; 299 | } 300 | .offset-md-11 { 301 | margin-inline-start: 91.6666666667%; 302 | } 303 | } 304 | @media (min-width: 1280px) { 305 | .offset-lg-0 { 306 | margin-inline-start: 0; 307 | } 308 | .offset-lg-1 { 309 | margin-inline-start: 8.3333333333%; 310 | } 311 | .offset-lg-2 { 312 | margin-inline-start: 16.6666666667%; 313 | } 314 | .offset-lg-3 { 315 | margin-inline-start: 25%; 316 | } 317 | .offset-lg-4 { 318 | margin-inline-start: 33.3333333333%; 319 | } 320 | .offset-lg-5 { 321 | margin-inline-start: 41.6666666667%; 322 | } 323 | .offset-lg-6 { 324 | margin-inline-start: 50%; 325 | } 326 | .offset-lg-7 { 327 | margin-inline-start: 58.3333333333%; 328 | } 329 | .offset-lg-8 { 330 | margin-inline-start: 66.6666666667%; 331 | } 332 | .offset-lg-9 { 333 | margin-inline-start: 75%; 334 | } 335 | .offset-lg-10 { 336 | margin-inline-start: 83.3333333333%; 337 | } 338 | .offset-lg-11 { 339 | margin-inline-start: 91.6666666667%; 340 | } 341 | } 342 | @media (min-width: 1920px) { 343 | .offset-xl-0 { 344 | margin-inline-start: 0; 345 | } 346 | .offset-xl-1 { 347 | margin-inline-start: 8.3333333333%; 348 | } 349 | .offset-xl-2 { 350 | margin-inline-start: 16.6666666667%; 351 | } 352 | .offset-xl-3 { 353 | margin-inline-start: 25%; 354 | } 355 | .offset-xl-4 { 356 | margin-inline-start: 33.3333333333%; 357 | } 358 | .offset-xl-5 { 359 | margin-inline-start: 41.6666666667%; 360 | } 361 | .offset-xl-6 { 362 | margin-inline-start: 50%; 363 | } 364 | .offset-xl-7 { 365 | margin-inline-start: 58.3333333333%; 366 | } 367 | .offset-xl-8 { 368 | margin-inline-start: 66.6666666667%; 369 | } 370 | .offset-xl-9 { 371 | margin-inline-start: 75%; 372 | } 373 | .offset-xl-10 { 374 | margin-inline-start: 83.3333333333%; 375 | } 376 | .offset-xl-11 { 377 | margin-inline-start: 91.6666666667%; 378 | } 379 | } 380 | @media (min-width: 2560px) { 381 | .offset-xxl-0 { 382 | margin-inline-start: 0; 383 | } 384 | .offset-xxl-1 { 385 | margin-inline-start: 8.3333333333%; 386 | } 387 | .offset-xxl-2 { 388 | margin-inline-start: 16.6666666667%; 389 | } 390 | .offset-xxl-3 { 391 | margin-inline-start: 25%; 392 | } 393 | .offset-xxl-4 { 394 | margin-inline-start: 33.3333333333%; 395 | } 396 | .offset-xxl-5 { 397 | margin-inline-start: 41.6666666667%; 398 | } 399 | .offset-xxl-6 { 400 | margin-inline-start: 50%; 401 | } 402 | .offset-xxl-7 { 403 | margin-inline-start: 58.3333333333%; 404 | } 405 | .offset-xxl-8 { 406 | margin-inline-start: 66.6666666667%; 407 | } 408 | .offset-xxl-9 { 409 | margin-inline-start: 75%; 410 | } 411 | .offset-xxl-10 { 412 | margin-inline-start: 83.3333333333%; 413 | } 414 | .offset-xxl-11 { 415 | margin-inline-start: 91.6666666667%; 416 | } 417 | }.date-picker-header-transition-enter-active, 418 | .date-picker-header-reverse-transition-enter-active { 419 | transition-duration: 0.3s; 420 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 421 | } 422 | .date-picker-header-transition-leave-active, 423 | .date-picker-header-reverse-transition-leave-active { 424 | transition-duration: 0.3s; 425 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 426 | } 427 | 428 | .date-picker-header-transition-enter-from { 429 | transform: translate(0, 100%); 430 | } 431 | .date-picker-header-transition-leave-to { 432 | opacity: 0; 433 | transform: translate(0, -100%); 434 | } 435 | 436 | .date-picker-header-reverse-transition-enter-from { 437 | transform: translate(0, -100%); 438 | } 439 | .date-picker-header-reverse-transition-leave-to { 440 | opacity: 0; 441 | transform: translate(0, 100%); 442 | }@supports not selector(:focus-visible) { 443 | } 444 | @supports not selector(:focus-visible) { 445 | }@keyframes loading { 446 | 100% { 447 | transform: translateX(100%); 448 | } 449 | }@supports not selector(:focus-visible) { 450 | } 451 | @supports not selector(:focus-visible) { 452 | }@media (forced-colors: active) { 453 | }@media (max-width: 1279.98px) { 454 | }/** Modifiers **//* MaterialDesignIcons.com */ 455 | @font-face { 456 | font-family: "Material Design Icons"; 457 | src: url("/assets/materialdesignicons-webfont-0b183104.eot?v=7.4.47"); 458 | src: url("/assets/materialdesignicons-webfont-0b183104.eot?#iefix&v=7.4.47") format("embedded-opentype"), url("/assets/materialdesignicons-webfont-662fefa8.woff2?v=7.4.47") format("woff2"), url("/assets/materialdesignicons-webfont-a5928a0d.woff?v=7.4.47") format("woff"), url("/assets/materialdesignicons-webfont-61e8aba5.ttf?v=7.4.47") format("truetype"); 459 | font-weight: normal; 460 | font-style: normal; 461 | } 462 | 463 | @-webkit-keyframes mdi-spin { 464 | 0% { 465 | -webkit-transform: rotate(0deg); 466 | transform: rotate(0deg); 467 | } 468 | 100% { 469 | -webkit-transform: rotate(359deg); 470 | transform: rotate(359deg); 471 | } 472 | } 473 | 474 | @keyframes mdi-spin { 475 | 0% { 476 | -webkit-transform: rotate(0deg); 477 | transform: rotate(0deg); 478 | } 479 | 100% { 480 | -webkit-transform: rotate(359deg); 481 | transform: rotate(359deg); 482 | } 483 | } 484 | /*# sourceMappingURL=materialdesignicons.css.map */ -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/materialdesignicons-webfont-0b183104.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/plugins/trashclean/dist/assets/materialdesignicons-webfont-0b183104.eot -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/materialdesignicons-webfont-61e8aba5.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/plugins/trashclean/dist/assets/materialdesignicons-webfont-61e8aba5.ttf -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/materialdesignicons-webfont-662fefa8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/plugins/trashclean/dist/assets/materialdesignicons-webfont-662fefa8.woff2 -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/materialdesignicons-webfont-a5928a0d.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madrays/MoviePilot-Plugins/9041fe934049f06ad87f8476554b50eddb88e161/plugins/trashclean/dist/assets/materialdesignicons-webfont-a5928a0d.woff -------------------------------------------------------------------------------- /plugins/trashclean/dist/assets/remoteEntry.js: -------------------------------------------------------------------------------- 1 | const scriptRel = 'modulepreload';const assetsURL = function(dep) { return "/"+dep };const seen$1 = {};const __vitePreload = function preload(baseModule, deps, importerUrl) { 2 | // @ts-expect-error true will be replaced with boolean later 3 | if (!true || !deps || deps.length === 0) { 4 | return baseModule(); 5 | } 6 | const links = document.getElementsByTagName('link'); 7 | return Promise.all(deps.map((dep) => { 8 | // @ts-expect-error assetsURL is declared before preload.toString() 9 | dep = assetsURL(dep); 10 | if (dep in seen$1) 11 | return; 12 | seen$1[dep] = true; 13 | const isCss = dep.endsWith('.css'); 14 | const cssSelector = isCss ? '[rel="stylesheet"]' : ''; 15 | const isBaseRelative = !!importerUrl; 16 | // check if the file is already preloaded by SSR markup 17 | if (isBaseRelative) { 18 | // When isBaseRelative is true then we have `importerUrl` and `dep` is 19 | // already converted to an absolute URL by the `assetsURL` function 20 | for (let i = links.length - 1; i >= 0; i--) { 21 | const link = links[i]; 22 | // The `links[i].href` is an absolute URL thanks to browser doing the work 23 | // for us. See https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:idl-domstring-5 24 | if (link.href === dep && (!isCss || link.rel === 'stylesheet')) { 25 | return; 26 | } 27 | } 28 | } 29 | else if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { 30 | return; 31 | } 32 | const link = document.createElement('link'); 33 | link.rel = isCss ? 'stylesheet' : scriptRel; 34 | if (!isCss) { 35 | link.as = 'script'; 36 | link.crossOrigin = ''; 37 | } 38 | link.href = dep; 39 | document.head.appendChild(link); 40 | if (isCss) { 41 | return new Promise((res, rej) => { 42 | link.addEventListener('load', res); 43 | link.addEventListener('error', () => rej(new Error(`Unable to preload CSS for ${dep}`))); 44 | }); 45 | } 46 | })) 47 | .then(() => baseModule()) 48 | .catch((err) => { 49 | const e = new Event('vite:preloadError', { cancelable: true }); 50 | // @ts-expect-error custom payload 51 | e.payload = err; 52 | window.dispatchEvent(e); 53 | if (!e.defaultPrevented) { 54 | throw err; 55 | } 56 | }); 57 | }; 58 | 59 | const currentImports = {}; 60 | const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); 61 | let moduleMap = { 62 | "./Page":()=>{ 63 | dynamicLoadingCss(["Page-0402d23b.css"], false, './Page'); 64 | return __federation_import('./__federation_expose_Page-59789d8c.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 65 | "./Config":()=>{ 66 | dynamicLoadingCss(["Config-9f79c6ea.css"], false, './Config'); 67 | return __federation_import('./__federation_expose_Config-f5e3c41a.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)}, 68 | "./Dashboard":()=>{ 69 | dynamicLoadingCss(["Dashboard-a2f1da0f.css"], false, './Dashboard'); 70 | return __federation_import('./__federation_expose_Dashboard-e8365cec.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; 71 | const seen = {}; 72 | const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { 73 | const metaUrl = import.meta.url; 74 | if (typeof metaUrl === 'undefined') { 75 | console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".'); 76 | return; 77 | } 78 | 79 | const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js')); 80 | const base = '/'; 81 | 'assets'; 82 | 83 | cssFilePaths.forEach(cssPath => { 84 | let href = ''; 85 | const baseUrl = base || curUrl; 86 | if (baseUrl) { 87 | const trimmer = { 88 | trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path), 89 | leading: (path) => (path.startsWith('/') ? path.slice(1) : path) 90 | }; 91 | const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//'); 92 | 93 | const cleanBaseUrl = trimmer.trailing(baseUrl); 94 | const cleanCssPath = trimmer.leading(cssPath); 95 | const cleanCurUrl = trimmer.trailing(curUrl); 96 | 97 | if (isAbsoluteUrl(baseUrl)) { 98 | href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 99 | } else { 100 | if (cleanCurUrl.includes(cleanBaseUrl)) { 101 | href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/'); 102 | } else { 103 | href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/'); 104 | } 105 | } 106 | } else { 107 | href = cssPath; 108 | } 109 | 110 | if (dontAppendStylesToHead) { 111 | const key = 'css__Trashclean__' + exposeItemName; 112 | window[key] = window[key] || []; 113 | window[key].push(href); 114 | return; 115 | } 116 | 117 | if (href in seen) return; 118 | seen[href] = true; 119 | 120 | const element = document.createElement('link'); 121 | element.rel = 'stylesheet'; 122 | element.href = href; 123 | document.head.appendChild(element); 124 | }); 125 | }; 126 | async function __federation_import(name) { 127 | currentImports[name] ??= __vitePreload(() => import(name),true?[]:void 0); 128 | return currentImports[name] 129 | } const get =(module) => { 130 | if(!moduleMap[module]) throw new Error('Can not find remote module ' + module) 131 | return moduleMap[module](); 132 | }; 133 | const init =(shareScope) => { 134 | globalThis.__federation_shared__= globalThis.__federation_shared__|| {}; 135 | Object.entries(shareScope).forEach(([key, value]) => { 136 | for (const [versionKey, versionValue] of Object.entries(value)) { 137 | const scope = versionValue.scope || 'default'; 138 | globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {}; 139 | const shared= globalThis.__federation_shared__[scope]; 140 | (shared[key] = shared[key]||{})[versionKey] = versionValue; 141 | } 142 | }); 143 | }; 144 | 145 | export { dynamicLoadingCss, get, init }; 146 | -------------------------------------------------------------------------------- /plugins/trashclean/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 垃圾文件清理 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /plugins/twofahelper/README.md: -------------------------------------------------------------------------------- 1 | # MoviePilot 两步验证助手插件 2 | 3 | 这是一个 MoviePilot 的两步验证码(TOTP)生成插件,配合浏览器扩展使用,方便用户管理和使用两步验证码。 4 | 5 | ## 插件信息 6 | 7 | - 插件名称:两步验证助手 8 | - 插件描述:生成TOTP验证码并通过浏览器扩展使用 9 | - 插件版本:1.0 10 | - 插件作者:madrays 11 | - 作者主页:https://github.com/madrays 12 | - 认证级别:1 13 | 14 | ## 主要功能 15 | 16 | 1. **验证码生成** 17 | - 自动生成30秒刷新的动态验证码 18 | - 支持多站点验证码同时管理 19 | - 彩色卡片界面,直观易用 20 | 21 | 2. **浏览器集成** 22 | - 配套浏览器扩展自动获取验证码 23 | - 扩展弹窗显示验证码,无需手动输入 24 | - 支持一键复制功能 25 | 26 | 3. **站点管理** 27 | - 通过浏览器扩展添加和管理站点 28 | - 支持站点图标自动获取 29 | - 实时同步验证码数据 30 | 31 | ## 使用方法 32 | 33 | 1. 安装本MoviePilot插件 34 | 2. 下载并安装浏览器扩展 35 | 3. 使用浏览器扩展添加站点和密钥 36 | 4. 访问需要验证的网站时,扩展会自动弹出对应验证码 37 | 38 | ## 浏览器扩展 39 | 40 | 浏览器扩展是本插件的重要组成部分: 41 | 42 | - 在插件配置页面可直接下载浏览器扩展 43 | - 扩展支持Chrome、Edge等主流浏览器 44 | - 只需加载解压后的文件夹即可使用 45 | - 扩展会自动连接到MoviePilot获取验证码 46 | 47 | ## 优势特点 48 | 49 | - **简单易用**:无需手动输入复杂配置 50 | - **自动管理**:验证码自动刷新和同步 51 | - **安全可靠**:数据存储在本地,不经过第三方服务器 52 | - **界面美观**:精美卡片设计,站点图标支持 53 | - **低耦合**:站点管理与验证码生成分离,更加灵活 54 | 55 | ## 更新日志 56 | 57 | ### v1.0 58 | - 首次发布 59 | - 支持TOTP验证码生成 60 | - 集成浏览器扩展下载 61 | - 支持多站点管理 62 | - 优化UI界面设计 --------------------------------------------------------------------------------