Files
bookorbit/server/src/app.module.ts
T
neon b50b8da56c feat(metadata): add external HTTP metadata providers
Register book-metadata-provider services by address, with no code change per
provider; Settings lists ready-made ones to install. Ranking prefers a record of
the book's own medium. LubimyCzytac moves out to its own provider and Aladin,
whose API closes, is retired; their ids stay. Adds migrations 0129 and 0130.
See docs/METADATA_PROVIDERS.md.

Ref #1405
2026-10-23 06:11:04 +00:00

223 lines
9.0 KiB
TypeScript

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { ScheduleModule } from '@nestjs/schedule';
import { ThrottlerModule } from '@nestjs/throttler';
import { LoggerModule } from 'nestjs-pino';
import {
appConfig,
audiolessEpubConfig,
audioToolsConfig,
authConfig,
bookRequestConfig,
coverSlotsConfig,
dbConfig,
djvuConfig,
emailConfig,
fileWriteConfig,
migrationConfig,
oidcRuntimeConfig,
podcastConfig,
readAloudConfig,
storageConfig,
} from './config/config';
import { validateEnv } from './config/env.validation';
import { loggerConfig } from './common/logger.config';
import { CommonModule } from './common/common.module';
import { SeriesIdentityModule } from './common/series-identity.module';
import { AuditInterceptor } from './common/interceptors/audit.interceptor';
import { GLOBAL_GUARDS } from './common/guards/global-guards';
import { DbModule } from './db/db.module';
import { AnnotationModule } from './modules/annotation/annotation.module';
import { DashboardModule } from './modules/dashboard/dashboard.module';
import { HealthModule } from './modules/health/health.module';
import { AppSettingsModule } from './modules/app-settings/app-settings.module';
import { CollectionModule } from './modules/collection/collection.module';
import { AuthModule } from './modules/auth/auth.module';
import { CbzModule } from './modules/reader/cbz/cbz.module';
import { DjvuModule } from './modules/reader/djvu/djvu.module';
import { BookmarkModule } from './modules/bookmark/bookmark.module';
import { BookJournalModule } from './modules/book-journal/book-journal.module';
import { NotebookModule } from './modules/notebook/notebook.module';
import { BookModule } from './modules/book/book.module';
import { CatalogModule } from './modules/catalog/catalog.module';
import { CoverModule } from './modules/cover/cover.module';
import { KoboModule } from './modules/kobo/kobo.module';
import { LibraryModule } from './modules/library/library.module';
import { SmartScopeModule } from './modules/smart-scope/smart-scope.module';
import { OpdsModule } from './modules/opds/opds.module';
import { PathModule } from './modules/path/path.module';
import { MetadataFetchModule } from './modules/metadata-fetch/metadata-fetch.module';
import { MetadataPreferencesModule } from './modules/metadata-preferences/metadata-preferences.module';
import { MetadataHttpProviderModule } from './modules/metadata-http-provider/metadata-http-provider.module';
import { MetadataModule } from './modules/metadata/metadata.module';
import { NarratorModule } from './modules/narrator/narrator.module';
import { ReaderPreferencesModule } from './modules/reader-preferences/reader-preferences.module';
import { RecommendationModule } from './modules/recommendation/recommendation.module';
import { UserPreferencesModule } from './modules/user-preferences/user-preferences.module';
import { ScannerModule } from './modules/scanner/scanner.module';
import { SeedModule } from './modules/seed/seed.module';
import { EmailModule } from './modules/email/email.module';
import { EpubModule } from './modules/reader/epub/epub.module';
import { BookDockModule } from './modules/book-dock/book-dock.module';
import { BookRequestModule } from './modules/book-request/book-request.module';
import { BrowseCountsModule } from './modules/browse-counts/browse-counts.module';
import { UploadModule } from './modules/upload/upload.module';
import { UserModule } from './modules/user/user.module';
import { AuthorsModule } from './modules/authors/authors.module';
import { BookMetadataFetchModule } from './modules/book-metadata-fetch/book-metadata-fetch.module';
import { MetadataScoreModule } from './modules/metadata-score/metadata-score.module';
import { StatisticsModule } from './modules/statistics/statistics.module';
import { UserStatisticsModule } from './modules/user-statistics/user-statistics.module';
import { ReadingHistoryModule } from './modules/reading-history/reading-history.module';
import { ReadingSessionModule } from './modules/reading-session/reading-session.module';
import { ReadingStateModule } from './modules/reading-state/reading-state.module';
import { UserBookStatusModule } from './modules/user-book-status/user-book-status.module';
import { AuditModule } from './modules/audit/audit.module';
import { MigrationModule } from './modules/migration/migration.module';
import { NotificationModule } from './modules/notification/notification.module';
import { SeriesModule } from './modules/series/series.module';
import { EntityManagerModule } from './modules/entity-manager/entity-manager.module';
import { FontModule } from './modules/font/font.module';
import { ServerFontModule } from './modules/server-font/server-font.module';
import { KoreaderModule } from './modules/koreader/koreader.module';
import { AppInfoModule } from './modules/app-info/app-info.module';
import { ReleaseNotesModule } from './modules/release-notes/release-notes.module';
import { AchievementModule } from './modules/achievement/achievement.module';
import { HardcoverModule } from './modules/hardcover/hardcover.module';
import { ReadwiseModule } from './modules/readwise/readwise.module';
import { StorygraphModule } from './modules/storygraph/storygraph.module';
import { CustomMetadataModule } from './modules/custom-metadata/custom-metadata.module';
import { CustomIconModule } from './modules/custom-icon/custom-icon.module';
import { AccountActivityModule } from './modules/account-activity/account-activity.module';
import { SharedReadingInsightsModule } from './modules/shared-reading-insights/shared-reading-insights.module';
import { BookDuplicatesModule } from './modules/book-duplicates/book-duplicates.module';
import { MaintenanceModule } from './modules/maintenance/maintenance.module';
import { BookMoveModule } from './modules/book-move/book-move.module';
import { AudiobookModule } from './modules/audiobook/audiobook.module';
import { ChapterEditorModule } from './modules/chapter-editor/chapter-editor.module';
import { ChapterHealthModule } from './modules/chapter-health/chapter-health.module';
import { TtsModule } from './modules/tts/tts.module';
import { SearchModule } from './modules/search/search.module';
import { WatchDownloadModule } from './modules/watch-download/watch-download.module';
import { PodcastModule } from './modules/podcast/podcast.module';
import { ReadAloudModule } from './modules/read-aloud/read-aloud.module';
@Module({
imports: [
LoggerModule.forRoot(loggerConfig),
ConfigModule.forRoot({
isGlobal: true,
validate: validateEnv,
load: [
appConfig,
dbConfig,
authConfig,
storageConfig,
coverSlotsConfig,
fileWriteConfig,
emailConfig,
migrationConfig,
bookRequestConfig,
oidcRuntimeConfig,
podcastConfig,
audiolessEpubConfig,
djvuConfig,
readAloudConfig,
audioToolsConfig,
],
}),
ScheduleModule.forRoot(),
ThrottlerModule.forRoot({
skipIf: () => process.env.NODE_ENV === 'test',
throttlers: [
{
name: 'default',
ttl: 60_000,
limit: 120,
},
],
}),
DbModule,
SeriesIdentityModule,
CommonModule,
SeedModule,
AuthModule,
AppSettingsModule,
UserModule,
AuthorsModule,
BookMetadataFetchModule,
LibraryModule,
PathModule,
BookModule,
AudiobookModule,
ChapterEditorModule,
ChapterHealthModule,
CatalogModule,
CoverModule,
CollectionModule,
SmartScopeModule,
ScannerModule,
MetadataModule,
NarratorModule,
UploadModule,
MetadataFetchModule,
MetadataPreferencesModule,
MetadataHttpProviderModule,
CustomMetadataModule,
CustomIconModule,
RecommendationModule,
KoboModule,
OpdsModule,
BookmarkModule,
BookJournalModule,
AnnotationModule,
NotebookModule,
DashboardModule,
HealthModule,
CbzModule,
DjvuModule,
ReaderPreferencesModule,
UserPreferencesModule,
EpubModule,
BookDockModule,
BookRequestModule,
EmailModule,
MetadataScoreModule,
StatisticsModule,
UserStatisticsModule,
ReadingHistoryModule,
ReadingSessionModule,
ReadingStateModule,
UserBookStatusModule,
AuditModule,
MigrationModule,
NotificationModule,
SeriesModule,
EntityManagerModule,
FontModule,
ServerFontModule,
KoreaderModule,
AppInfoModule,
ReleaseNotesModule,
AchievementModule,
HardcoverModule,
ReadwiseModule,
StorygraphModule,
AccountActivityModule,
SharedReadingInsightsModule,
BookDuplicatesModule,
MaintenanceModule,
BookMoveModule,
BrowseCountsModule,
TtsModule,
SearchModule,
WatchDownloadModule,
PodcastModule,
ReadAloudModule,
],
providers: [{ provide: APP_INTERCEPTOR, useClass: AuditInterceptor }, ...GLOBAL_GUARDS.map((useClass) => ({ provide: APP_GUARD, useClass }))],
})
export class AppModule {}