fix: 图标文件名按「整条网址」命名,同域名不同路径不再互相覆盖
https://nas.yangyq.net/calendar 与 https://nas.yangyq.net/ 这类「同域名、 不同路径」的条目,图标文件名原先只由域名决定(md5(域名)),两条记录指向 同一个文件:改其中一个的自定义图标,另一个跟着变;保存时还会 unlink / 覆盖掉对方的文件,直接把对方搞成破图。 - 新增 icon_key($url):按整条网址取键(协议与主机名转小写、空路径补 /、 查询串与锚点保留),语义是「不同网址 → 不同图标文件」。 - 4 处调用点全部改用它:site_save(上传图标 / 自定义地址)、fetch_meta、 update_all;键一律取自「记录里存的那条 URL」,不用跳转后的 final_url, 保证同一个网站每次算出来的键都一样(否则每次重下 + 留下孤儿文件)。 - download_best_icon() / save_custom_icon() 增加空键保护,避免键为空时 所有图标都落到同一个文件名上。 - README 新增「图标文件的命名规则」一节。 - .gitattributes 统一按 LF 存放,防止 Windows 的 core.autocrlf 在下次 checkout 时把 PHP/JS/CSS 换成 CRLF。 - e2e 新增「同域名不同路径」回归场景:用三张颜色不同的图,比对两条记录 落盘图标的内容,验证改 A 不会波及 B;并已做反向验证(把 icon_key 改回 按域名取键后,这些断言确实失败)。
This commit is contained in:
+4
-3
@@ -59,7 +59,8 @@ try {
|
||||
break;
|
||||
}
|
||||
|
||||
$domain = domain_of($url);
|
||||
// 图标文件的命名键:按整条网址算(同域名不同路径必须互不覆盖,见 icon_key())
|
||||
$iconKey = icon_key($url);
|
||||
|
||||
// ---- 图标 ----
|
||||
// icon_auto 勾选 = 允许「全部更新」自动刷新图标(icon_custom=0)
|
||||
@@ -74,7 +75,7 @@ try {
|
||||
if ($bin === '' || strlen($bin) > 2 * 1024 * 1024) {
|
||||
flash('图标文件过大或为空(限 2MB)', 'err');
|
||||
} else {
|
||||
$new = save_custom_icon($bin, $domain);
|
||||
$new = save_custom_icon($bin, $iconKey);
|
||||
if ($new !== '') {
|
||||
$iconFile = $new;
|
||||
$custom = 1;
|
||||
@@ -85,7 +86,7 @@ try {
|
||||
} else {
|
||||
$iconUrl = trim((string)($_POST['icon_url'] ?? ''));
|
||||
if ($iconUrl !== '') {
|
||||
$new = download_best_icon([norm_url($iconUrl)], $domain, 1);
|
||||
$new = download_best_icon([norm_url($iconUrl)], $iconKey, 1);
|
||||
if ($new !== '') {
|
||||
$iconFile = $new;
|
||||
$custom = 1;
|
||||
|
||||
@@ -19,7 +19,9 @@ if ($url === '') {
|
||||
|
||||
$meta = fetch_site_meta($url);
|
||||
$domain = domain_of($meta['final_url'] ?: $url);
|
||||
$iconFile = download_best_icon($meta['icons'], $domain);
|
||||
// 图标文件名按「用户填的那条网址」算,不用 final_url —— 否则站点日后每次抓取
|
||||
// (或跳转变化)都会算出不同的键,重复下载、留下孤儿文件。
|
||||
$iconFile = download_best_icon($meta['icons'], icon_key($url));
|
||||
|
||||
$name = $meta['name'] !== '' ? $meta['name'] : ($meta['title'] !== '' ? $meta['title'] : $domain);
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ foreach ($rows as $row) {
|
||||
$custom = (int)$row['icon_custom'] === 1;
|
||||
|
||||
$meta = fetch_site_meta($url);
|
||||
$domain = domain_of($meta['final_url'] ?: $url);
|
||||
$name = $meta['name'] !== '' ? $meta['name'] : $meta['title'];
|
||||
|
||||
$sets = ['updated_at=?'];
|
||||
@@ -43,7 +42,8 @@ foreach ($rows as $row) {
|
||||
// 用户自定义图标:绝不覆盖
|
||||
$skipped++;
|
||||
} else {
|
||||
$iconFile = download_best_icon($meta['icons'], $domain);
|
||||
// 键取自记录里存的那条 URL(不用 final_url),保证每次算出来都一样
|
||||
$iconFile = download_best_icon($meta['icons'], icon_key($url));
|
||||
if ($iconFile !== '') { $sets[] = 'icon=?'; $args[] = $iconFile; }
|
||||
if ($iconFile !== '' || $name !== '') { $updated++; } else { $failed++; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user