97 lines
2.6 KiB
JavaScript
97 lines
2.6 KiB
JavaScript
import fs from 'fs/promises'
|
|
import path from 'path'
|
|
import { randomUUID } from 'crypto'
|
|
|
|
const allowed = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'])
|
|
|
|
const getDataPath = (filename) => {
|
|
const cwd = process.cwd()
|
|
if (cwd.endsWith('.output')) return path.join(cwd, '../server/data', filename)
|
|
return path.join(cwd, 'server/data', filename)
|
|
}
|
|
|
|
const GALERIE_DIR = getDataPath('galerie')
|
|
const GALERIE_METADATA = getDataPath('galerie-metadata.json')
|
|
const PUBLIC_GALERIE_DIR = path.join(process.cwd(), 'public', 'galerie')
|
|
|
|
function titleFromFilename(filename) {
|
|
const nameWithoutExt = path.parse(filename).name
|
|
return nameWithoutExt.replace(/[-_]/g, ' ').replace(/\b\w/g, l => l.toUpperCase())
|
|
}
|
|
|
|
async function readJsonArray(file) {
|
|
try {
|
|
const data = await fs.readFile(file, 'utf-8')
|
|
const parsed = JSON.parse(data)
|
|
return Array.isArray(parsed) ? parsed : []
|
|
} catch (e) {
|
|
if (e.code === 'ENOENT') return []
|
|
throw e
|
|
}
|
|
}
|
|
|
|
async function ensureDirs() {
|
|
await fs.mkdir(path.join(GALERIE_DIR, 'originals'), { recursive: true })
|
|
await fs.mkdir(path.join(GALERIE_DIR, 'previews'), { recursive: true })
|
|
}
|
|
|
|
async function main() {
|
|
await ensureDirs()
|
|
|
|
const entries = await readJsonArray(GALERIE_METADATA)
|
|
const existingByName = new Map(entries.map(e => [e.filename, e]))
|
|
|
|
let files = []
|
|
try {
|
|
files = await fs.readdir(PUBLIC_GALERIE_DIR)
|
|
} catch (e) {
|
|
console.error('public/galerie nicht gefunden:', PUBLIC_GALERIE_DIR)
|
|
process.exit(1)
|
|
}
|
|
|
|
const candidates = files.filter(f => allowed.has(path.extname(f).toLowerCase()))
|
|
let migrated = 0
|
|
let skipped = 0
|
|
|
|
for (const filename of candidates) {
|
|
if (existingByName.has(filename)) {
|
|
skipped++
|
|
continue
|
|
}
|
|
|
|
const id = randomUUID()
|
|
const title = titleFromFilename(filename)
|
|
|
|
const src = path.join(PUBLIC_GALERIE_DIR, filename)
|
|
const dest = path.join(GALERIE_DIR, 'originals', filename)
|
|
|
|
await fs.rename(src, dest)
|
|
|
|
const meta = {
|
|
id,
|
|
filename,
|
|
previewFilename: `preview_${filename}`,
|
|
title,
|
|
description: '',
|
|
isPublic: true,
|
|
uploadedBy: 'migration',
|
|
uploadedAt: new Date().toISOString(),
|
|
originalName: filename
|
|
}
|
|
|
|
entries.push(meta)
|
|
existingByName.set(filename, meta)
|
|
migrated++
|
|
}
|
|
|
|
await fs.writeFile(GALERIE_METADATA, JSON.stringify(entries, null, 2), 'utf-8')
|
|
|
|
console.log(`Fertig. Migriert: ${migrated}, übersprungen: ${skipped}`)
|
|
console.log('Hinweis: previews werden nicht automatisch erzeugt. Für echte previews bitte neu hochladen oder ein separates preview-generator script verwenden.')
|
|
}
|
|
|
|
main().catch(e => {
|
|
console.error(e)
|
|
process.exit(1)
|
|
})
|