feat: allow projects to have external data path for posts and media

This commit is contained in:
2026-02-12 15:33:45 +01:00
parent 85d196e598
commit e8c05ee8be
10 changed files with 239 additions and 170 deletions

View File

@@ -49,20 +49,28 @@ export interface MediaMetadata {
export class MediaEngine extends EventEmitter {
private currentProjectId: string = 'default';
private projectBaseDir: string | null = null;
private dataDir: string | null = null; // For media files (may be external)
private internalDir: string | null = null; // For thumbnails (always local)
constructor() {
super();
}
private getProjectBaseDir(): string {
if (this.projectBaseDir) return this.projectBaseDir;
private getDefaultBaseDir(): string {
const userDataPath = app.getPath('userData');
return path.join(userDataPath, 'projects', this.currentProjectId);
}
private getDataDir(): string {
return this.dataDir || this.getDefaultBaseDir();
}
private getInternalDir(): string {
return this.internalDir || this.getDefaultBaseDir();
}
private getMediaBaseDir(): string {
return path.join(this.getProjectBaseDir(), 'media');
return path.join(this.getDataDir(), 'media');
}
private getMediaDir(): string {
@@ -91,9 +99,11 @@ export class MediaEngine extends EventEmitter {
return path.join(dir, `${id}${extension}`);
}
setProjectContext(projectId: string, baseDir?: string): void {
setProjectContext(projectId: string, dataDir?: string, internalDir?: string): void {
this.currentProjectId = projectId;
this.projectBaseDir = baseDir || null;
this.dataDir = dataDir || null;
this.internalDir = internalDir || null;
console.log(`[MediaEngine] setProjectContext: projectId=${projectId}, dataDir=${this.dataDir}, internalDir=${this.internalDir}`);
}
getProjectContext(): string {
@@ -108,7 +118,7 @@ export class MediaEngine extends EventEmitter {
* Get the thumbnails directory for the current project
*/
private getThumbnailsDir(): string {
return path.join(this.getProjectBaseDir(), 'thumbnails');
return path.join(this.getInternalDir(), 'thumbnails');
}
/**
@@ -543,6 +553,7 @@ export class MediaEngine extends EventEmitter {
async rebuildDatabaseFromFiles(): Promise<void> {
const mediaBaseDir = this.getMediaBaseDir();
console.log(`[MediaEngine] rebuildDatabaseFromFiles: scanning mediaBaseDir=${mediaBaseDir}`);
const task: Task<void> = {
id: uuidv4(),
name: 'Rebuild database from media files',