Files
blog/scripts/generate-gallery-index.js
meowrain 7b7e32ddd4
Some checks failed
Clean ESA Versions on Main / clean-esa-versions (push) Has been cancelled
init
2026-01-02 00:03:49 +08:00

82 lines
2.3 KiB
JavaScript

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { glob } from 'glob';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootDir = path.resolve(__dirname, '..');
const IMAGE_DIR = path.join(rootDir, 'public', 'api', 'i');
const OUTPUT_FILE = path.join(IMAGE_DIR, 'images.json');
// 支持的图片扩展名
const IMAGE_EXTENSIONS = new Set([
'.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico', '.avif'
]);
function parseImagePath(relativePath) {
// 路径格式: public/api/i/YYYY/MM/DD/filename.ext
const match = relativePath.match(/(\d{4})\/(\d{1,2})\/(\d{1,2})\/([^/]+)\.(.+)$/);
if (!match) return null;
const [, year, month, day, filename, ext] = match;
return {
url: `/api/i/${year}/${month}/${day}/${filename}.${ext}`,
filename: `${filename}.${ext}`,
year,
month: month.padStart(2, '0'),
day: day.padStart(2, '0'),
date: `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`
};
}
async function generateGalleryIndex() {
console.log('正在扫描图片目录...');
// 扫描所有图片文件
const pattern = path.join(IMAGE_DIR, '**/*.*').replace(/\\/g, '/');
const files = await glob(pattern, {
ignore: [
'**/images.json', // 忽略索引文件本身
'**/cache/**', // 忽略缓存目录
'**/gallery-meow/**', // 忽略其他目录
'**/favicon.ico', // 忽略 favicon
'**/index.html' // 忽略 index.html
]
});
console.log(`找到 ${files.length} 个文件`);
// 解析并过滤图片
const images = [];
for (const file of files) {
// 获取相对路径
const relativePath = path.relative(IMAGE_DIR, file).replace(/\\/g, '/');
// 检查文件扩展名
const ext = path.extname(file).toLowerCase();
if (!IMAGE_EXTENSIONS.has(ext)) {
continue;
}
// 解析路径信息
const parsed = parseImagePath(relativePath);
if (parsed) {
images.push(parsed);
}
}
// 按日期倒序排序
images.sort((a, b) => b.date.localeCompare(a.date));
console.log(`共找到 ${images.length} 张图片`);
// 写入 JSON 文件
fs.writeFileSync(OUTPUT_FILE, JSON.stringify(images, null, 2), 'utf-8');
console.log(`已生成索引文件: ${OUTPUT_FILE}`);
}
generateGalleryIndex().catch(console.error);