/** * 规范化 URL: * - trim()、去掉多余空格 * - 验证必须是 http(s):// 开头 * - 非法 URL 返回 null 并记录 warning log * - 酷狗返回的相对路径 (//xxx) 补全为 https:// 协议头 * * @param rawUrl 原始 URL * @param context 日志上下文(如歌曲名、API名) * @returns 规范化后的 URL,或 null(非法或空) */ export function normalizeCoverUrl(rawUrl: any, context: string = ''): string | null { if (rawUrl === null || rawUrl === undefined) return null let url = String(rawUrl) .trim() .replace(/[\u200B-\u200D\uFEFF]/g, '') // 去除零宽字符 .replace(/\s+/g, '') // 去除所有内部空格 if (!url) return null // 酷狗/部分平台返回的相对协议路径://xxx.xxx.com/... => https://xxx.xxx.com/... if (url.startsWith('//')) { url = 'https:' + url console.warn(`[normalizeCoverUrl] ${context ? context + ' ' : ''}相对协议路径已补全为 https: ${url}`) } // 相对路径 /xxx 或 纯路径不合法,直接 null if (!/^https?:\/\//i.test(url)) { console.warn(`[normalizeCoverUrl] ${context ? context + ' ' : ''}非法封面URL (非http(s)开头),已置为null: raw="${rawUrl}"`) return null } try { new URL(url) return url } catch (e: any) { console.warn(`[normalizeCoverUrl] ${context ? context + ' ' : ''}URL解析失败,已置为null: "${url}" error=${e?.message || e}`) return null } }