mirror of
https://github.com/bookorbit/bookorbit.git
synced 2026-11-03 00:11:37 -06:00
97cd03325f
Scanned books are commonly distributed as DjVu, which the scanner only stored as a supplement. Decode pages on the server with DjVuLibre so DjVu imports with a cover and page count, opens in the image reader with its embedded OCR text, and can be the preferred format of an ordinary email recipient. Migration 0113 widens the recipient format check to allow it. Decoding runs on validated private snapshots behind a bounded, reader-first queue, and revalidation and cached pages are answered without a decoder. Released iOS builds cannot open DjVu, so series continuation offers it only to callers sending includeDjvu=true, and the dashboard and notebook read file never name it. The first full scan after upgrading promotes stored .djvu supplements to content.
209 lines
8.3 KiB
TypeScript
209 lines
8.3 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,
|
|
authConfig,
|
|
bookRequestConfig,
|
|
coverSlotsConfig,
|
|
dbConfig,
|
|
djvuConfig,
|
|
emailConfig,
|
|
fileWriteConfig,
|
|
migrationConfig,
|
|
oidcRuntimeConfig,
|
|
podcastConfig,
|
|
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 { 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 { 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 { 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';
|
|
|
|
@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,
|
|
],
|
|
}),
|
|
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,
|
|
CatalogModule,
|
|
CoverModule,
|
|
CollectionModule,
|
|
SmartScopeModule,
|
|
ScannerModule,
|
|
MetadataModule,
|
|
NarratorModule,
|
|
UploadModule,
|
|
MetadataFetchModule,
|
|
MetadataPreferencesModule,
|
|
CustomMetadataModule,
|
|
CustomIconModule,
|
|
RecommendationModule,
|
|
KoboModule,
|
|
OpdsModule,
|
|
BookmarkModule,
|
|
BookJournalModule,
|
|
AnnotationModule,
|
|
NotebookModule,
|
|
DashboardModule,
|
|
HealthModule,
|
|
CbzModule,
|
|
DjvuModule,
|
|
ReaderPreferencesModule,
|
|
UserPreferencesModule,
|
|
EpubModule,
|
|
BookDockModule,
|
|
BookRequestModule,
|
|
EmailModule,
|
|
MetadataScoreModule,
|
|
StatisticsModule,
|
|
UserStatisticsModule,
|
|
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,
|
|
],
|
|
providers: [{ provide: APP_INTERCEPTOR, useClass: AuditInterceptor }, ...GLOBAL_GUARDS.map((useClass) => ({ provide: APP_GUARD, useClass }))],
|
|
})
|
|
export class AppModule {}
|