diff --git a/app/locales/en-US.json b/app/locales/en-US.json index 875a818f..f328187a 100644 --- a/app/locales/en-US.json +++ b/app/locales/en-US.json @@ -122,6 +122,8 @@ "刮削路径不存在": "Scraping path does not exist", "保存成功": "Saved successfully", "保存失败": "Failed to save", + "保存MCP配置成功": "MCP configuration saved successfully", + "保存MCP配置失败": "Failed to save MCP configuration", "参数错误": "Invalid parameters", "未配置媒体服务器": "Media server is not configured", "未找到播放地址": "Playback URL not found", @@ -402,6 +404,10 @@ "source": "获取工具Schema失败: {reason}", "target": "Failed to get tool schema: {reason}" }, + { + "source": "测试MCP服务器失败: {reason}", + "target": "Failed to test MCP server: {reason}" + }, { "source": "插件 {plugin} 不存在或未安装", "target": "Plugin {plugin} does not exist or is not installed" diff --git a/app/locales/zh-CN.json b/app/locales/zh-CN.json index 5976952a..00b1dc3d 100644 --- a/app/locales/zh-CN.json +++ b/app/locales/zh-CN.json @@ -102,6 +102,8 @@ "豆瓣网络连接失败": "豆瓣网络连接失败", "Bangumi网络连接失败": "Bangumi网络连接失败", "fanart网络连接失败": "fanart网络连接失败", + "保存MCP配置成功": "保存MCP配置成功", + "保存MCP配置失败": "保存MCP配置失败", "未配置站点或未通过用户认证": "未配置站点或未通过用户认证", "Redis连接失败,请检查配置": "Redis连接失败,请检查配置" }, @@ -181,6 +183,10 @@ { "source": "{domain} 网络连接失败", "target": "{domain} 网络连接失败" + }, + { + "source": "测试MCP服务器失败: {reason}", + "target": "测试MCP服务器失败: {reason}" } ] } diff --git a/app/locales/zh-TW.json b/app/locales/zh-TW.json index 5dad4d6a..8fc8b9c3 100644 --- a/app/locales/zh-TW.json +++ b/app/locales/zh-TW.json @@ -122,6 +122,8 @@ "刮削路径不存在": "刮削路徑不存在", "保存成功": "儲存成功", "保存失败": "儲存失敗", + "保存MCP配置成功": "MCP 設定儲存成功", + "保存MCP配置失败": "MCP 設定儲存失敗", "参数错误": "參數錯誤", "未配置媒体服务器": "未設定媒體伺服器", "未找到播放地址": "未找到播放位址", @@ -402,6 +404,10 @@ "source": "获取工具Schema失败: {reason}", "target": "取得工具 Schema 失敗: {reason}" }, + { + "source": "测试MCP服务器失败: {reason}", + "target": "測試 MCP 伺服器失敗: {reason}" + }, { "source": "插件 {plugin} 不存在或未安装", "target": "插件 {plugin} 不存在或未安裝" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 75ab323d..5398c76a 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -20,6 +20,16 @@ function WARN() { echo -e "${WARN} ${1}" } +function normalize_env_value() { + printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]' +} + +function is_truthy_value() { + local value + value="$(normalize_env_value "${1:-}")" + [ "${value}" = "true" ] || [ "${value}" = "1" ] || [ "${value}" = "yes" ] +} + # 设置虚拟环境路径(兼容群晖等系统必须这样配置) VENV_PATH="${VENV_PATH:-/opt/venv}" export PATH="${VENV_PATH}/bin:$PATH" @@ -262,8 +272,8 @@ function graceful_exit() { # 后端异常退出时默认保留容器,避免无法 docker exec 进入容器运行 doctor。 function diagnostic_keepalive() { local exit_code=${1:-1} - local keepalive="${MOVIEPILOT_DOCKER_KEEPALIVE_ON_FAILURE:-true}" - keepalive="${keepalive,,}" + local keepalive + keepalive="$(normalize_env_value "${MOVIEPILOT_DOCKER_KEEPALIVE_ON_FAILURE:-true}")" if [ "${keepalive}" = "false" ] || [ "${keepalive}" = "0" ] || [ "${keepalive}" = "no" ]; then graceful_exit "$exit_code" "python_exit" @@ -316,11 +326,14 @@ function ensure_backend_runtime_dependencies() { INFO "→ 已自动恢复主程序依赖,继续启动后端。" } -function force_chown_image_paths_if_requested() { - local force="${MOVIEPILOT_FORCE_CHOWN:-false}" - force="${force,,}" +function path_owner_id() { + local target="${1:-}" + [ -n "${target}" ] || return 0 + stat -c '%u:%g' "${target}" 2>/dev/null || stat -f '%u:%g' "${target}" 2>/dev/null || true +} - if [ "${force}" != "true" ] && [ "${force}" != "1" ] && [ "${force}" != "yes" ]; then +function force_chown_image_paths_if_requested() { + if ! is_truthy_value "${MOVIEPILOT_FORCE_CHOWN:-false}"; then return 0 fi @@ -336,13 +349,10 @@ function force_chown_image_paths_if_requested() { function correct_home_permissions() { [ -e "${HOME}" ] || return 0 - local force="${MOVIEPILOT_FORCE_CHOWN:-false}" - force="${force,,}" - chown moviepilot:moviepilot "${HOME}" [ -e "${HOME}/.cloakbrowser" ] && chown -h moviepilot:moviepilot "${HOME}/.cloakbrowser" - if [ "${force}" = "true" ] || [ "${force}" = "1" ] || [ "${force}" = "yes" ]; then + if is_truthy_value "${MOVIEPILOT_FORCE_CHOWN:-false}"; then [ -e "${HOME}/.cloakbrowser" ] && chown -R moviepilot:moviepilot "${HOME}/.cloakbrowser" elif [ -e "${HOME}/.cloakbrowser" ]; then INFO "→ 默认跳过 ${HOME}/.cloakbrowser 递归权限校正,如遇浏览器缓存权限错误可设置 MOVIEPILOT_FORCE_CHOWN=true 后重启一次。" @@ -356,7 +366,7 @@ function chown_plugin_runtime_path() { [ -n "${plugin_path}" ] || return 0 [ -e "${plugin_path}" ] || return 0 local current_owner - current_owner="$(stat -c '%u:%g' "${plugin_path}" 2>/dev/null || true)" + current_owner="$(path_owner_id "${plugin_path}")" [ "${current_owner}" = "${PUID}:${PGID}" ] && return 0 chown -h moviepilot:moviepilot "${plugin_path}" } @@ -427,7 +437,7 @@ ensure_backend_runtime_dependencies # 下载浏览器内核 function install_browser_kernel() { local emulation="${BROWSER_EMULATION:-cloakbrowser}" - emulation="${emulation,,}" + emulation="$(normalize_env_value "${emulation}")" local proxy="${HTTPS_PROXY:-${https_proxy:-$PROXY_HOST}}" if [ "${emulation}" != "cloakbrowser" ] && [ "${emulation}" != "flaresolverr" ] && [ -n "${emulation}" ]; then