mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-29 11:36:36 +08:00
82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
export type OrganizePreviewItem = {
|
|
source: string
|
|
target?: string
|
|
action: string
|
|
reason?: string
|
|
}
|
|
|
|
type OrganizeScanSummary = {
|
|
name: string
|
|
added: number
|
|
updated: number
|
|
visited: number
|
|
error?: string
|
|
}
|
|
|
|
type OrganizeScrapeSummary = {
|
|
name: string
|
|
matched: number
|
|
processed?: number
|
|
skipped?: boolean
|
|
reason?: string
|
|
error?: string
|
|
}
|
|
|
|
type OrganizeDirectoryResult = {
|
|
organized?: number
|
|
replaced?: number
|
|
reclassified?: number
|
|
skipped?: number
|
|
errors?: string[]
|
|
items?: OrganizePreviewItem[]
|
|
scans?: OrganizeScanSummary[]
|
|
scrapes?: OrganizeScrapeSummary[]
|
|
}
|
|
|
|
export function isCloudLibraryPath(value: string): boolean {
|
|
return value.trim().toLowerCase().startsWith('cloud://')
|
|
}
|
|
|
|
export function summarizeOrganizeResults(results: OrganizeDirectoryResult[]) {
|
|
const preview = results.flatMap((result) => result.items ?? [])
|
|
const organized = results.reduce((sum, result) => sum + (result.organized ?? 0), 0)
|
|
const replaced = results.reduce((sum, result) => sum + (result.replaced ?? 0), 0)
|
|
const reclassified = results.reduce((sum, result) => sum + (result.reclassified ?? 0), 0)
|
|
const skipped = results.reduce((sum, result) => sum + (result.skipped ?? 0), 0)
|
|
const errors = results.flatMap((result) => result.errors ?? [])
|
|
const scans = results.flatMap((result) => result.scans ?? [])
|
|
const scrapes = results.flatMap((result) => result.scrapes ?? [])
|
|
const total = organized + replaced + reclassified + skipped + errors.length
|
|
|
|
return {
|
|
preview,
|
|
organized,
|
|
replaced,
|
|
reclassified,
|
|
skipped,
|
|
errors,
|
|
scans,
|
|
scrapes,
|
|
total,
|
|
}
|
|
}
|
|
|
|
export function formatScanSummary(scans: OrganizeScanSummary[]): string {
|
|
if (scans.length === 0) return ' · 未扫描:没有匹配的媒体库'
|
|
const ok = scans.filter((scan) => !scan.error)
|
|
const added = ok.reduce((sum, scan) => sum + (scan.added ?? 0), 0)
|
|
const updated = ok.reduce((sum, scan) => sum + (scan.updated ?? 0), 0)
|
|
const visited = ok.reduce((sum, scan) => sum + (scan.visited ?? 0), 0)
|
|
return ` · 扫描 ${ok.length}/${scans.length} 个库 · 新入库 ${added} · 更新 ${updated} · 访问 ${visited}`
|
|
}
|
|
|
|
export function formatScrapeSummary(scrapes: OrganizeScrapeSummary[]): string {
|
|
if (scrapes.length === 0) return ''
|
|
const ok = scrapes.filter((scrape) => !scrape.error && !scrape.skipped)
|
|
const skipped = scrapes.filter((scrape) => scrape.skipped).length
|
|
const matched = ok.reduce((sum, scrape) => sum + (scrape.matched ?? 0), 0)
|
|
const processed = ok.reduce((sum, scrape) => sum + (scrape.processed ?? 0), 0)
|
|
if (ok.length === 0 && skipped > 0) return ` · 刮削跳过 ${skipped} 个库`
|
|
return ` · 刮削 ${ok.length}/${scrapes.length} 个库 · 处理 ${processed} · 匹配 ${matched}${skipped ? ` · 跳过 ${skipped}` : ''}`
|
|
}
|