feat(library): controller, settings, commands, scheduler

This commit is contained in:
afiqzudinhadi 2026-08-03 16:59:47 +08:00
parent 278f009a9b
commit 2cce78d664
4 changed files with 547 additions and 3 deletions

View file

@ -124,6 +124,16 @@ export interface MediaDbPluginSettings {
watchlistSyncIntervalHours: number;
watchlistLastSync: number;
libraryMangaEnabled: boolean;
libraryMangaFolder: string;
libraryBookEnabled: boolean;
libraryBookFolder: string;
libraryGameEnabled: boolean;
libraryGameFolder: string;
libraryComicEnabled: boolean;
libraryComicFolder: string;
libraryLastSync: number;
// DEPRECATED: Use propertyMappingModels instead
moviePropertyConversionRules: string;
seriesPropertyConversionRules: string;
@ -388,6 +398,16 @@ const DEFAULT_SETTINGS: MediaDbPluginSettings = {
watchlistSyncIntervalHours: 24,
watchlistLastSync: 0,
libraryMangaEnabled: false,
libraryMangaFolder: 'Mangas',
libraryBookEnabled: false,
libraryBookFolder: 'Books',
libraryGameEnabled: false,
libraryGameFolder: 'Games',
libraryComicEnabled: false,
libraryComicFolder: 'Comics',
libraryLastSync: 0,
// DEPRECATED
moviePropertyConversionRules: '',
seriesPropertyConversionRules: '',
@ -791,6 +811,54 @@ export class MediaDbSettingTab extends PluginSettingTab {
}),
);
// MARK: Library sync
const libraryGroup = new SettingGroup(containerEl);
libraryGroup.setHeading('Library sync');
const libraryTypeSettings: { label: string; enabledKey: keyof MediaDbPluginSettings; folderKey: keyof MediaDbPluginSettings; desc: string }[] = [
{ label: 'Manga', enabledKey: 'libraryMangaEnabled', folderKey: 'libraryMangaFolder', desc: 'Jikan (MyAnimeList) + MangaDex/RSS chapter tracking.' },
{ label: 'Book', enabledKey: 'libraryBookEnabled', folderKey: 'libraryBookFolder', desc: 'Open Library enrichment.' },
{ label: 'Game', enabledKey: 'libraryGameEnabled', folderKey: 'libraryGameFolder', desc: 'Steam + RAWG enrichment. Uses the RAWG API key configured above.' },
{ label: 'Comic', enabledKey: 'libraryComicEnabled', folderKey: 'libraryComicFolder', desc: 'Comic Vine enrichment. Uses the Comic Vine API key configured above.' },
];
for (const { label, enabledKey, folderKey, desc } of libraryTypeSettings) {
libraryGroup.addSetting(
setting =>
void setting
.setName(`Enable ${label.toLowerCase()} library sync`)
.setDesc(`Periodically sync ${label.toLowerCase()} notes against their source APIs. ${desc}`)
.addToggle(cb => {
cb.setValue(this.plugin.settings[enabledKey] as boolean).onChange(data => {
(this.plugin.settings[enabledKey] as boolean) = data;
void this.plugin.saveSettings();
});
}),
);
libraryGroup.addSetting(
setting =>
void setting
.setName(`${label} folder`)
.setDesc(`Folder containing ${label.toLowerCase()} notes.`)
.addSearch(cb => {
const suggester = new FolderSuggest(this.app, cb.inputEl);
suggester.onSelect(folder => {
cb.setValue(folder.path);
(this.plugin.settings[folderKey] as string) = folder.path;
void this.plugin.saveSettings();
suggester.close();
});
cb.setPlaceholder(DEFAULT_SETTINGS[folderKey] as string)
.setValue(this.plugin.settings[folderKey] as string)
.onChange(data => {
(this.plugin.settings[folderKey] as string) = data;
void this.plugin.saveSettings();
});
}),
);
}
// MARK: Media type settings
// Create a map to store APIs for each media type