mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Updates to use new Library model
This commit is contained in:
		
							parent
							
								
									8774e6be71
								
							
						
					
					
						commit
						38edcdca4b
					
				| @ -384,11 +384,6 @@ class Database { | |||||||
|     return Promise.all(oldBooks.map((oldBook) => this.models.book.saveFromOld(oldBook))) |     return Promise.all(oldBooks.map((oldBook) => this.models.book.saveFromOld(oldBook))) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   updateLibrary(oldLibrary) { |  | ||||||
|     if (!this.sequelize) return false |  | ||||||
|     return this.models.library.updateFromOld(oldLibrary) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   removeLibrary(libraryId) { |   removeLibrary(libraryId) { | ||||||
|     if (!this.sequelize) return false |     if (!this.sequelize) return false | ||||||
|     return this.models.library.removeById(libraryId) |     return this.models.library.removeById(libraryId) | ||||||
|  | |||||||
| @ -142,7 +142,7 @@ class Server { | |||||||
|     await this.backupManager.init() |     await this.backupManager.init() | ||||||
|     await this.rssFeedManager.init() |     await this.rssFeedManager.init() | ||||||
| 
 | 
 | ||||||
|     const libraries = await Database.libraryModel.getAllOldLibraries() |     const libraries = await Database.libraryModel.getAllWithFolders() | ||||||
|     await this.cronManager.init(libraries) |     await this.cronManager.init(libraries) | ||||||
|     this.apiCacheManager.init() |     this.apiCacheManager.init() | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -45,6 +45,10 @@ class FolderWatcher extends EventEmitter { | |||||||
|     return this.pendingFileUpdates.map((f) => f.path) |     return this.pendingFileUpdates.map((f) => f.path) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {import('./models/Library')} library | ||||||
|  |    */ | ||||||
|   buildLibraryWatcher(library) { |   buildLibraryWatcher(library) { | ||||||
|     if (this.libraryWatchers.find((w) => w.id === library.id)) { |     if (this.libraryWatchers.find((w) => w.id === library.id)) { | ||||||
|       Logger.warn('[Watcher] Already watching library', library.name) |       Logger.warn('[Watcher] Already watching library', library.name) | ||||||
| @ -52,7 +56,7 @@ class FolderWatcher extends EventEmitter { | |||||||
|     } |     } | ||||||
|     Logger.info(`[Watcher] Initializing watcher for "${library.name}".`) |     Logger.info(`[Watcher] Initializing watcher for "${library.name}".`) | ||||||
| 
 | 
 | ||||||
|     const folderPaths = library.folderPaths |     const folderPaths = library.libraryFolders.map((f) => f.path) | ||||||
|     folderPaths.forEach((fp) => { |     folderPaths.forEach((fp) => { | ||||||
|       Logger.debug(`[Watcher] Init watcher for library folder path "${fp}"`) |       Logger.debug(`[Watcher] Init watcher for library folder path "${fp}"`) | ||||||
|     }) |     }) | ||||||
| @ -90,12 +94,16 @@ class FolderWatcher extends EventEmitter { | |||||||
|     this.libraryWatchers.push({ |     this.libraryWatchers.push({ | ||||||
|       id: library.id, |       id: library.id, | ||||||
|       name: library.name, |       name: library.name, | ||||||
|       folders: library.folders, |       libraryFolders: library.libraryFolders, | ||||||
|       paths: library.folderPaths, |       paths: folderPaths, | ||||||
|       watcher |       watcher | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {import('./models/Library')[]} libraries | ||||||
|  |    */ | ||||||
|   initWatcher(libraries) { |   initWatcher(libraries) { | ||||||
|     libraries.forEach((lib) => { |     libraries.forEach((lib) => { | ||||||
|       if (!lib.settings.disableWatcher) { |       if (!lib.settings.disableWatcher) { | ||||||
| @ -104,12 +112,17 @@ class FolderWatcher extends EventEmitter { | |||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {import('./models/Library')} library | ||||||
|  |    */ | ||||||
|   addLibrary(library) { |   addLibrary(library) { | ||||||
|     if (this.disabled || library.settings.disableWatcher) return |     if (this.disabled || library.settings.disableWatcher) return | ||||||
|     this.buildLibraryWatcher(library) |     this.buildLibraryWatcher(library) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  |    * TODO: Update to new library model | ||||||
|    * |    * | ||||||
|    * @param {import('./objects/Library')} library |    * @param {import('./objects/Library')} library | ||||||
|    */ |    */ | ||||||
| @ -129,8 +142,9 @@ class FolderWatcher extends EventEmitter { | |||||||
|       libwatcher.name = library.name |       libwatcher.name = library.name | ||||||
| 
 | 
 | ||||||
|       // If any folder paths were added or removed then re-init watcher
 |       // If any folder paths were added or removed then re-init watcher
 | ||||||
|       const pathsToAdd = library.folderPaths.filter((path) => !libwatcher.paths.includes(path)) |       const folderPaths = library.libraryFolders.map((f) => f.path) | ||||||
|       const pathsRemoved = libwatcher.paths.filter((path) => !library.folderPaths.includes(path)) |       const pathsToAdd = folderPaths.filter((path) => !libwatcher.paths.includes(path)) | ||||||
|  |       const pathsRemoved = libwatcher.paths.filter((path) => !folderPaths.includes(path)) | ||||||
|       if (pathsToAdd.length || pathsRemoved.length) { |       if (pathsToAdd.length || pathsRemoved.length) { | ||||||
|         Logger.info(`[Watcher] Re-Initializing watcher for "${library.name}".`) |         Logger.info(`[Watcher] Re-Initializing watcher for "${library.name}".`) | ||||||
| 
 | 
 | ||||||
| @ -145,6 +159,10 @@ class FolderWatcher extends EventEmitter { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {import('./models/Library')} library | ||||||
|  |    */ | ||||||
|   removeLibrary(library) { |   removeLibrary(library) { | ||||||
|     if (this.disabled) return |     if (this.disabled) return | ||||||
|     var libwatcher = this.libraryWatchers.find((lib) => lib.id === library.id) |     var libwatcher = this.libraryWatchers.find((lib) => lib.id === library.id) | ||||||
| @ -255,15 +273,15 @@ class FolderWatcher extends EventEmitter { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Get file folder
 |     // Get file folder
 | ||||||
|     const folder = libwatcher.folders.find((fold) => isSameOrSubPath(fold.fullPath, path)) |     const folder = libwatcher.libraryFolders.find((fold) => isSameOrSubPath(fold.path, path)) | ||||||
|     if (!folder) { |     if (!folder) { | ||||||
|       Logger.error(`[Watcher] New file folder not found in library "${libwatcher.name}" with path "${path}"`) |       Logger.error(`[Watcher] New file folder not found in library "${libwatcher.name}" with path "${path}"`) | ||||||
|       return |       return | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const folderFullPath = filePathToPOSIX(folder.fullPath) |     const folderPath = filePathToPOSIX(folder.path) | ||||||
| 
 | 
 | ||||||
|     const relPath = path.replace(folderFullPath, '') |     const relPath = path.replace(folderPath, '') | ||||||
| 
 | 
 | ||||||
|     if (Path.extname(relPath).toLowerCase() === '.part') { |     if (Path.extname(relPath).toLowerCase() === '.part') { | ||||||
|       Logger.debug(`[Watcher] Ignoring .part file "${relPath}"`) |       Logger.debug(`[Watcher] Ignoring .part file "${relPath}"`) | ||||||
|  | |||||||
| @ -4,7 +4,6 @@ const Path = require('path') | |||||||
| const fs = require('../libs/fsExtra') | const fs = require('../libs/fsExtra') | ||||||
| const Logger = require('../Logger') | const Logger = require('../Logger') | ||||||
| const SocketAuthority = require('../SocketAuthority') | const SocketAuthority = require('../SocketAuthority') | ||||||
| const Library = require('../objects/Library') |  | ||||||
| const libraryHelpers = require('../utils/libraryHelpers') | const libraryHelpers = require('../utils/libraryHelpers') | ||||||
| const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | ||||||
| const libraryItemFilters = require('../utils/queries/libraryItemFilters') | const libraryItemFilters = require('../utils/queries/libraryItemFilters') | ||||||
| @ -158,7 +157,7 @@ class LibraryController { | |||||||
|     SocketAuthority.emitter('library_added', oldLibrary.toJSON(), userFilter) |     SocketAuthority.emitter('library_added', oldLibrary.toJSON(), userFilter) | ||||||
| 
 | 
 | ||||||
|     // Add library watcher
 |     // Add library watcher
 | ||||||
|     this.watcher.addLibrary(oldLibrary) |     this.watcher.addLibrary(library) | ||||||
| 
 | 
 | ||||||
|     res.json(oldLibrary) |     res.json(oldLibrary) | ||||||
|   } |   } | ||||||
| @ -190,15 +189,16 @@ class LibraryController { | |||||||
|       const filterdata = await libraryFilters.getFilterData(req.library.mediaType, req.library.id) |       const filterdata = await libraryFilters.getFilterData(req.library.mediaType, req.library.id) | ||||||
|       const customMetadataProviders = await Database.customMetadataProviderModel.getForClientByMediaType(req.library.mediaType) |       const customMetadataProviders = await Database.customMetadataProviderModel.getForClientByMediaType(req.library.mediaType) | ||||||
| 
 | 
 | ||||||
|  |       const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|       return res.json({ |       return res.json({ | ||||||
|         filterdata, |         filterdata, | ||||||
|         issues: filterdata.numIssues, |         issues: filterdata.numIssues, | ||||||
|         numUserPlaylists: await Database.playlistModel.getNumPlaylistsForUserAndLibrary(req.user.id, req.library.id), |         numUserPlaylists: await Database.playlistModel.getNumPlaylistsForUserAndLibrary(req.user.id, req.library.id), | ||||||
|         customMetadataProviders, |         customMetadataProviders, | ||||||
|         library: req.library |         library: oldLibrary | ||||||
|       }) |       }) | ||||||
|     } |     } | ||||||
|     res.json(req.library) |     res.json(oldLibrary) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -220,7 +220,7 @@ class LibraryController { | |||||||
|    */ |    */ | ||||||
|   async update(req, res) { |   async update(req, res) { | ||||||
|     /** @type {import('../objects/Library')} */ |     /** @type {import('../objects/Library')} */ | ||||||
|     const library = req.library |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
| 
 | 
 | ||||||
|     // Validate that the custom provider exists if given any
 |     // Validate that the custom provider exists if given any
 | ||||||
|     if (req.body.provider?.startsWith('custom-')) { |     if (req.body.provider?.startsWith('custom-')) { | ||||||
| @ -259,7 +259,7 @@ class LibraryController { | |||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       // Handle removing folders
 |       // Handle removing folders
 | ||||||
|       for (const folder of library.folders) { |       for (const folder of oldLibrary.folders) { | ||||||
|         if (!req.body.folders.some((f) => f.id === folder.id)) { |         if (!req.body.folders.some((f) => f.id === folder.id)) { | ||||||
|           // Remove library items in folder
 |           // Remove library items in folder
 | ||||||
|           const libraryItemsInFolder = await Database.libraryItemModel.findAll({ |           const libraryItemsInFolder = await Database.libraryItemModel.findAll({ | ||||||
| @ -278,10 +278,10 @@ class LibraryController { | |||||||
|               } |               } | ||||||
|             ] |             ] | ||||||
|           }) |           }) | ||||||
|           Logger.info(`[LibraryController] Removed folder "${folder.fullPath}" from library "${library.name}" with ${libraryItemsInFolder.length} library items`) |           Logger.info(`[LibraryController] Removed folder "${folder.fullPath}" from library "${oldLibrary.name}" with ${libraryItemsInFolder.length} library items`) | ||||||
|           for (const libraryItem of libraryItemsInFolder) { |           for (const libraryItem of libraryItemsInFolder) { | ||||||
|             let mediaItemIds = [] |             let mediaItemIds = [] | ||||||
|             if (library.isPodcast) { |             if (oldLibrary.isPodcast) { | ||||||
|               mediaItemIds = libraryItem.media.podcastEpisodes.map((pe) => pe.id) |               mediaItemIds = libraryItem.media.podcastEpisodes.map((pe) => pe.id) | ||||||
|             } else { |             } else { | ||||||
|               mediaItemIds.push(libraryItem.mediaId) |               mediaItemIds.push(libraryItem.mediaId) | ||||||
| @ -293,26 +293,27 @@ class LibraryController { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const hasUpdates = library.update(req.body) |     const hasUpdates = oldLibrary.update(req.body) | ||||||
|     // TODO: Should check if this is an update to folder paths or name only
 |     // TODO: Should check if this is an update to folder paths or name only
 | ||||||
|     if (hasUpdates) { |     if (hasUpdates) { | ||||||
|       // Update watcher
 |  | ||||||
|       this.watcher.updateLibrary(library) |  | ||||||
| 
 |  | ||||||
|       // Update auto scan cron
 |       // Update auto scan cron
 | ||||||
|       this.cronManager.updateLibraryScanCron(library) |       this.cronManager.updateLibraryScanCron(oldLibrary) | ||||||
| 
 | 
 | ||||||
|       await Database.updateLibrary(library) |       const updatedLibrary = await Database.libraryModel.updateFromOld(oldLibrary) | ||||||
|  |       updatedLibrary.libraryFolders = await updatedLibrary.getLibraryFolders() | ||||||
|  | 
 | ||||||
|  |       // Update watcher
 | ||||||
|  |       this.watcher.updateLibrary(updatedLibrary) | ||||||
| 
 | 
 | ||||||
|       // Only emit to users with access to library
 |       // Only emit to users with access to library
 | ||||||
|       const userFilter = (user) => { |       const userFilter = (user) => { | ||||||
|         return user.checkCanAccessLibrary?.(library.id) |         return user.checkCanAccessLibrary?.(oldLibrary.id) | ||||||
|       } |       } | ||||||
|       SocketAuthority.emitter('library_updated', library.toJSON(), userFilter) |       SocketAuthority.emitter('library_updated', oldLibrary.toJSON(), userFilter) | ||||||
| 
 | 
 | ||||||
|       await Database.resetLibraryIssuesFilterData(library.id) |       await Database.resetLibraryIssuesFilterData(oldLibrary.id) | ||||||
|     } |     } | ||||||
|     return res.json(library.toJSON()) |     return res.json(oldLibrary.toJSON()) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -323,10 +324,10 @@ class LibraryController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async delete(req, res) { |   async delete(req, res) { | ||||||
|     const library = req.library |     const library = Database.libraryModel.getOldLibrary(req.library) | ||||||
| 
 | 
 | ||||||
|     // Remove library watcher
 |     // Remove library watcher
 | ||||||
|     this.watcher.removeLibrary(library) |     this.watcher.removeLibrary(req.library) | ||||||
| 
 | 
 | ||||||
|     // Remove collections for library
 |     // Remove collections for library
 | ||||||
|     const numCollectionsRemoved = await Database.collectionModel.removeAllForLibrary(library.id) |     const numCollectionsRemoved = await Database.collectionModel.removeAllForLibrary(library.id) | ||||||
| @ -386,6 +387,8 @@ class LibraryController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async getLibraryItems(req, res) { |   async getLibraryItems(req, res) { | ||||||
|  |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|  | 
 | ||||||
|     const include = (req.query.include || '') |     const include = (req.query.include || '') | ||||||
|       .split(',') |       .split(',') | ||||||
|       .map((v) => v.trim().toLowerCase()) |       .map((v) => v.trim().toLowerCase()) | ||||||
| @ -411,9 +414,9 @@ class LibraryController { | |||||||
|     const filterByValue = filterByGroup ? libraryFilters.decode(payload.filterBy.replace(`${filterByGroup}.`, '')) : null |     const filterByValue = filterByGroup ? libraryFilters.decode(payload.filterBy.replace(`${filterByGroup}.`, '')) : null | ||||||
|     if (filterByGroup === 'series' && filterByValue !== 'no-series' && payload.collapseseries) { |     if (filterByGroup === 'series' && filterByValue !== 'no-series' && payload.collapseseries) { | ||||||
|       const seriesId = libraryFilters.decode(payload.filterBy.split('.')[1]) |       const seriesId = libraryFilters.decode(payload.filterBy.split('.')[1]) | ||||||
|       payload.results = await libraryHelpers.handleCollapseSubseries(payload, seriesId, req.user, req.library) |       payload.results = await libraryHelpers.handleCollapseSubseries(payload, seriesId, req.user, oldLibrary) | ||||||
|     } else { |     } else { | ||||||
|       const { libraryItems, count } = await Database.libraryItemModel.getByFilterAndSort(req.library, req.user, payload) |       const { libraryItems, count } = await Database.libraryItemModel.getByFilterAndSort(oldLibrary, req.user, payload) | ||||||
|       payload.results = libraryItems |       payload.results = libraryItems | ||||||
|       payload.total = count |       payload.total = count | ||||||
|     } |     } | ||||||
| @ -461,7 +464,7 @@ class LibraryController { | |||||||
|     Logger.info(`[LibraryController] Removing ${libraryItemsWithIssues.length} items with issues`) |     Logger.info(`[LibraryController] Removing ${libraryItemsWithIssues.length} items with issues`) | ||||||
|     for (const libraryItem of libraryItemsWithIssues) { |     for (const libraryItem of libraryItemsWithIssues) { | ||||||
|       let mediaItemIds = [] |       let mediaItemIds = [] | ||||||
|       if (req.library.isPodcast) { |       if (req.library.mediaType === 'podcast') { | ||||||
|         mediaItemIds = libraryItem.media.podcastEpisodes.map((pe) => pe.id) |         mediaItemIds = libraryItem.media.podcastEpisodes.map((pe) => pe.id) | ||||||
|       } else { |       } else { | ||||||
|         mediaItemIds.push(libraryItem.mediaId) |         mediaItemIds.push(libraryItem.mediaId) | ||||||
| @ -486,6 +489,8 @@ class LibraryController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async getAllSeriesForLibrary(req, res) { |   async getAllSeriesForLibrary(req, res) { | ||||||
|  |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|  | 
 | ||||||
|     const include = (req.query.include || '') |     const include = (req.query.include || '') | ||||||
|       .split(',') |       .split(',') | ||||||
|       .map((v) => v.trim().toLowerCase()) |       .map((v) => v.trim().toLowerCase()) | ||||||
| @ -504,7 +509,7 @@ class LibraryController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const offset = payload.page * payload.limit |     const offset = payload.page * payload.limit | ||||||
|     const { series, count } = await seriesFilters.getFilteredSeries(req.library, req.user, payload.filterBy, payload.sortBy, payload.sortDesc, include, payload.limit, offset) |     const { series, count } = await seriesFilters.getFilteredSeries(oldLibrary, req.user, payload.filterBy, payload.sortBy, payload.sortDesc, include, payload.limit, offset) | ||||||
| 
 | 
 | ||||||
|     payload.total = count |     payload.total = count | ||||||
|     payload.results = series |     payload.results = series | ||||||
| @ -635,12 +640,13 @@ class LibraryController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async getUserPersonalizedShelves(req, res) { |   async getUserPersonalizedShelves(req, res) { | ||||||
|  |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|     const limitPerShelf = req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) || 10 : 10 |     const limitPerShelf = req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) || 10 : 10 | ||||||
|     const include = (req.query.include || '') |     const include = (req.query.include || '') | ||||||
|       .split(',') |       .split(',') | ||||||
|       .map((v) => v.trim().toLowerCase()) |       .map((v) => v.trim().toLowerCase()) | ||||||
|       .filter((v) => !!v) |       .filter((v) => !!v) | ||||||
|     const shelves = await Database.libraryItemModel.getPersonalizedShelves(req.library, req.user, include, limitPerShelf) |     const shelves = await Database.libraryItemModel.getPersonalizedShelves(oldLibrary, req.user, include, limitPerShelf) | ||||||
|     res.json(shelves) |     res.json(shelves) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -668,7 +674,7 @@ class LibraryController { | |||||||
|       } |       } | ||||||
|       if (library.update({ displayOrder: orderdata[i].newOrder })) { |       if (library.update({ displayOrder: orderdata[i].newOrder })) { | ||||||
|         hasUpdates = true |         hasUpdates = true | ||||||
|         await Database.updateLibrary(library) |         await Database.libraryModel.updateFromOld(library) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -696,10 +702,11 @@ class LibraryController { | |||||||
|     if (!req.query.q || typeof req.query.q !== 'string') { |     if (!req.query.q || typeof req.query.q !== 'string') { | ||||||
|       return res.status(400).send('Invalid request. Query param "q" must be a string') |       return res.status(400).send('Invalid request. Query param "q" must be a string') | ||||||
|     } |     } | ||||||
|  |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|     const limit = req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) : 12 |     const limit = req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) : 12 | ||||||
|     const query = asciiOnlyToLowerCase(req.query.q.trim()) |     const query = asciiOnlyToLowerCase(req.query.q.trim()) | ||||||
| 
 | 
 | ||||||
|     const matches = await libraryItemFilters.search(req.user, req.library, query, limit) |     const matches = await libraryItemFilters.search(req.user, oldLibrary, query, limit) | ||||||
|     res.json(matches) |     res.json(matches) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -715,7 +722,7 @@ class LibraryController { | |||||||
|       largestItems: await libraryItemFilters.getLargestItems(req.library.id, 10) |       largestItems: await libraryItemFilters.getLargestItems(req.library.id, 10) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (req.library.isBook) { |     if (req.library.mediaType === 'book') { | ||||||
|       const authors = await authorFilters.getAuthorsWithCount(req.library.id, 10) |       const authors = await authorFilters.getAuthorsWithCount(req.library.id, 10) | ||||||
|       const genres = await libraryItemsBookFilters.getGenresWithCount(req.library.id) |       const genres = await libraryItemsBookFilters.getGenresWithCount(req.library.id) | ||||||
|       const bookStats = await libraryItemsBookFilters.getBookLibraryStats(req.library.id) |       const bookStats = await libraryItemsBookFilters.getBookLibraryStats(req.library.id) | ||||||
| @ -938,7 +945,8 @@ class LibraryController { | |||||||
|       Logger.error(`[LibraryController] Non-root user "${req.user.username}" attempted to match library items`) |       Logger.error(`[LibraryController] Non-root user "${req.user.username}" attempted to match library items`) | ||||||
|       return res.sendStatus(403) |       return res.sendStatus(403) | ||||||
|     } |     } | ||||||
|     Scanner.matchLibraryItems(req.library) |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|  |     Scanner.matchLibraryItems(oldLibrary) | ||||||
|     res.sendStatus(200) |     res.sendStatus(200) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -956,9 +964,9 @@ class LibraryController { | |||||||
|       return res.sendStatus(403) |       return res.sendStatus(403) | ||||||
|     } |     } | ||||||
|     res.sendStatus(200) |     res.sendStatus(200) | ||||||
| 
 |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|     const forceRescan = req.query.force === '1' |     const forceRescan = req.query.force === '1' | ||||||
|     await LibraryScanner.scan(req.library, forceRescan) |     await LibraryScanner.scan(oldLibrary, forceRescan) | ||||||
| 
 | 
 | ||||||
|     await Database.resetLibraryIssuesFilterData(req.library.id) |     await Database.resetLibraryIssuesFilterData(req.library.id) | ||||||
|     Logger.info('[LibraryController] Scan complete') |     Logger.info('[LibraryController] Scan complete') | ||||||
| @ -972,10 +980,10 @@ class LibraryController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async getRecentEpisodes(req, res) { |   async getRecentEpisodes(req, res) { | ||||||
|     if (!req.library.isPodcast) { |     if (req.library.mediaType !== 'podcast') { | ||||||
|       return res.sendStatus(404) |       return res.sendStatus(404) | ||||||
|     } |     } | ||||||
| 
 |     const oldLibrary = Database.libraryModel.getOldLibrary(req.library) | ||||||
|     const payload = { |     const payload = { | ||||||
|       episodes: [], |       episodes: [], | ||||||
|       limit: req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) : 0, |       limit: req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) : 0, | ||||||
| @ -983,7 +991,7 @@ class LibraryController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const offset = payload.page * payload.limit |     const offset = payload.page * payload.limit | ||||||
|     payload.episodes = await libraryItemsPodcastFilters.getRecentEpisodes(req.user, req.library, payload.limit, offset) |     payload.episodes = await libraryItemsPodcastFilters.getRecentEpisodes(req.user, oldLibrary, payload.limit, offset) | ||||||
|     res.json(payload) |     res.json(payload) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -1076,7 +1084,8 @@ class LibraryController { | |||||||
|       return res.sendStatus(403) |       return res.sendStatus(403) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const library = await Database.libraryModel.getOldById(req.params.id) |     // const library = await Database.libraryModel.getOldById(req.params.id)
 | ||||||
|  |     const library = await Database.libraryModel.findByIdWithFolders(req.params.id) | ||||||
|     if (!library) { |     if (!library) { | ||||||
|       return res.status(404).send('Library not found') |       return res.status(404).send('Library not found') | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -21,7 +21,8 @@ class CronManager { | |||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Initialize library scan crons & podcast download crons |    * Initialize library scan crons & podcast download crons | ||||||
|    * @param {import('../objects/Library')[]} libraries |    * | ||||||
|  |    * @param {import('../models/Library')[]} libraries | ||||||
|    */ |    */ | ||||||
|   async init(libraries) { |   async init(libraries) { | ||||||
|     this.initOpenSessionCleanupCron() |     this.initOpenSessionCleanupCron() | ||||||
| @ -46,7 +47,7 @@ class CronManager { | |||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Initialize library scan crons |    * Initialize library scan crons | ||||||
|    * @param {import('../objects/Library')[]} libraries |    * @param {import('../models/Library')[]} libraries | ||||||
|    */ |    */ | ||||||
|   initLibraryScanCrons(libraries) { |   initLibraryScanCrons(libraries) { | ||||||
|     for (const library of libraries) { |     for (const library of libraries) { | ||||||
| @ -59,17 +60,17 @@ class CronManager { | |||||||
|   /** |   /** | ||||||
|    * Start cron schedule for library |    * Start cron schedule for library | ||||||
|    * |    * | ||||||
|    * @param {import('../objects/Library')} _library |    * @param {import('../models/Library')} _library | ||||||
|    */ |    */ | ||||||
|   startCronForLibrary(_library) { |   startCronForLibrary(_library) { | ||||||
|     Logger.debug(`[CronManager] Init library scan cron for ${_library.name} on schedule ${_library.settings.autoScanCronExpression}`) |     Logger.debug(`[CronManager] Init library scan cron for ${_library.name} on schedule ${_library.settings.autoScanCronExpression}`) | ||||||
|     const libScanCron = cron.schedule(_library.settings.autoScanCronExpression, async () => { |     const libScanCron = cron.schedule(_library.settings.autoScanCronExpression, async () => { | ||||||
|       const library = await Database.libraryModel.getOldById(_library.id) |       const oldLibrary = await Database.libraryModel.getOldById(_library.id) | ||||||
|       if (!library) { |       if (!oldLibrary) { | ||||||
|         Logger.error(`[CronManager] Library not found for scan cron ${_library.id}`) |         Logger.error(`[CronManager] Library not found for scan cron ${_library.id}`) | ||||||
|       } else { |       } else { | ||||||
|         Logger.debug(`[CronManager] Library scan cron executing for ${library.name}`) |         Logger.debug(`[CronManager] Library scan cron executing for ${oldLibrary.name}`) | ||||||
|         LibraryScanner.scan(library) |         LibraryScanner.scan(oldLibrary) | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|     this.libraryScanCrons.push({ |     this.libraryScanCrons.push({ | ||||||
| @ -79,11 +80,21 @@ class CronManager { | |||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * TODO: Update to new library model | ||||||
|  |    * | ||||||
|  |    * @param {*} library | ||||||
|  |    */ | ||||||
|   removeCronForLibrary(library) { |   removeCronForLibrary(library) { | ||||||
|     Logger.debug(`[CronManager] Removing library scan cron for ${library.name}`) |     Logger.debug(`[CronManager] Removing library scan cron for ${library.name}`) | ||||||
|     this.libraryScanCrons = this.libraryScanCrons.filter((lsc) => lsc.libraryId !== library.id) |     this.libraryScanCrons = this.libraryScanCrons.filter((lsc) => lsc.libraryId !== library.id) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * TODO: Update to new library model | ||||||
|  |    * | ||||||
|  |    * @param {*} library | ||||||
|  |    */ | ||||||
|   updateLibraryScanCron(library) { |   updateLibraryScanCron(library) { | ||||||
|     const expression = library.settings.autoScanCronExpression |     const expression = library.settings.autoScanCronExpression | ||||||
|     const existingCron = this.libraryScanCrons.find((lsc) => lsc.libraryId === library.id) |     const existingCron = this.libraryScanCrons.find((lsc) => lsc.libraryId === library.id) | ||||||
|  | |||||||
| @ -43,6 +43,8 @@ class Library extends Model { | |||||||
|     this.createdAt |     this.createdAt | ||||||
|     /** @type {Date} */ |     /** @type {Date} */ | ||||||
|     this.updatedAt |     this.updatedAt | ||||||
|  |     /** @type {import('./LibraryFolder')[]|undefined} */ | ||||||
|  |     this.libraryFolders | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -74,6 +76,28 @@ class Library extends Model { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @returns {Promise<Library[]>} | ||||||
|  |    */ | ||||||
|  |   static getAllWithFolders() { | ||||||
|  |     return this.findAll({ | ||||||
|  |       include: this.sequelize.models.libraryFolder, | ||||||
|  |       order: [['displayOrder', 'ASC']] | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {string} libraryId | ||||||
|  |    * @returns {Promise<Library>} | ||||||
|  |    */ | ||||||
|  |   static findByIdWithFolders(libraryId) { | ||||||
|  |     return this.findByPk(libraryId, { | ||||||
|  |       include: this.sequelize.models.libraryFolder | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Get all old libraries |    * Get all old libraries | ||||||
|    * @returns {Promise<oldLibrary[]>} |    * @returns {Promise<oldLibrary[]>} | ||||||
| @ -121,7 +145,7 @@ class Library extends Model { | |||||||
|   /** |   /** | ||||||
|    * Update library and library folders |    * Update library and library folders | ||||||
|    * @param {object} oldLibrary |    * @param {object} oldLibrary | ||||||
|    * @returns |    * @returns {Promise<Library|null>} | ||||||
|    */ |    */ | ||||||
|   static async updateFromOld(oldLibrary) { |   static async updateFromOld(oldLibrary) { | ||||||
|     const existingLibrary = await this.findByPk(oldLibrary.id, { |     const existingLibrary = await this.findByPk(oldLibrary.id, { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user