mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Refactor RssFeedManager to use new model when closing feeds, fix close series feed when series is removed, update RssFeedManager to singleton
This commit is contained in:
		
							parent
							
								
									e50bd93958
								
							
						
					
					
						commit
						4c68ad46f4
					
				| @ -71,7 +71,6 @@ class Server { | |||||||
|     this.playbackSessionManager = new PlaybackSessionManager() |     this.playbackSessionManager = new PlaybackSessionManager() | ||||||
|     this.podcastManager = new PodcastManager() |     this.podcastManager = new PodcastManager() | ||||||
|     this.audioMetadataManager = new AudioMetadataMangaer() |     this.audioMetadataManager = new AudioMetadataMangaer() | ||||||
|     this.rssFeedManager = new RssFeedManager() |  | ||||||
|     this.cronManager = new CronManager(this.podcastManager, this.playbackSessionManager) |     this.cronManager = new CronManager(this.podcastManager, this.playbackSessionManager) | ||||||
|     this.apiCacheManager = new ApiCacheManager() |     this.apiCacheManager = new ApiCacheManager() | ||||||
|     this.binaryManager = new BinaryManager() |     this.binaryManager = new BinaryManager() | ||||||
| @ -137,7 +136,7 @@ class Server { | |||||||
| 
 | 
 | ||||||
|     await ShareManager.init() |     await ShareManager.init() | ||||||
|     await this.backupManager.init() |     await this.backupManager.init() | ||||||
|     await this.rssFeedManager.init() |     await RssFeedManager.init() | ||||||
| 
 | 
 | ||||||
|     const libraries = await Database.libraryModel.getAllWithFolders() |     const libraries = await Database.libraryModel.getAllWithFolders() | ||||||
|     await this.cronManager.init(libraries) |     await this.cronManager.init(libraries) | ||||||
| @ -291,14 +290,14 @@ class Server { | |||||||
|     // RSS Feed temp route
 |     // RSS Feed temp route
 | ||||||
|     router.get('/feed/:slug', (req, res) => { |     router.get('/feed/:slug', (req, res) => { | ||||||
|       Logger.info(`[Server] Requesting rss feed ${req.params.slug}`) |       Logger.info(`[Server] Requesting rss feed ${req.params.slug}`) | ||||||
|       this.rssFeedManager.getFeed(req, res) |       RssFeedManager.getFeed(req, res) | ||||||
|     }) |     }) | ||||||
|     router.get('/feed/:slug/cover*', (req, res) => { |     router.get('/feed/:slug/cover*', (req, res) => { | ||||||
|       this.rssFeedManager.getFeedCover(req, res) |       RssFeedManager.getFeedCover(req, res) | ||||||
|     }) |     }) | ||||||
|     router.get('/feed/:slug/item/:episodeId/*', (req, res) => { |     router.get('/feed/:slug/item/:episodeId/*', (req, res) => { | ||||||
|       Logger.debug(`[Server] Requesting rss feed episode ${req.params.slug}/${req.params.episodeId}`) |       Logger.debug(`[Server] Requesting rss feed episode ${req.params.slug}/${req.params.episodeId}`) | ||||||
|       this.rssFeedManager.getFeedItem(req, res) |       RssFeedManager.getFeedItem(req, res) | ||||||
|     }) |     }) | ||||||
| 
 | 
 | ||||||
|     // Auth routes
 |     // Auth routes
 | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ const Logger = require('../Logger') | |||||||
| const SocketAuthority = require('../SocketAuthority') | const SocketAuthority = require('../SocketAuthority') | ||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
| 
 | 
 | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
| const Collection = require('../objects/Collection') | const Collection = require('../objects/Collection') | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -148,6 +149,8 @@ class CollectionController { | |||||||
|   /** |   /** | ||||||
|    * DELETE: /api/collections/:id |    * DELETE: /api/collections/:id | ||||||
|    * |    * | ||||||
|  |    * @this {import('../routers/ApiRouter')} | ||||||
|  |    * | ||||||
|    * @param {RequestWithUser} req |    * @param {RequestWithUser} req | ||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
| @ -155,7 +158,7 @@ class CollectionController { | |||||||
|     const jsonExpanded = await req.collection.getOldJsonExpanded() |     const jsonExpanded = await req.collection.getOldJsonExpanded() | ||||||
| 
 | 
 | ||||||
|     // Close rss feed - remove from db and emit socket event
 |     // Close rss feed - remove from db and emit socket event
 | ||||||
|     await this.rssFeedManager.closeFeedForEntityId(req.collection.id) |     await RssFeedManager.closeFeedForEntityId(req.collection.id) | ||||||
| 
 | 
 | ||||||
|     await req.collection.destroy() |     await req.collection.destroy() | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,6 +18,8 @@ const LibraryScanner = require('../scanner/LibraryScanner') | |||||||
| const Scanner = require('../scanner/Scanner') | const Scanner = require('../scanner/Scanner') | ||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
| const Watcher = require('../Watcher') | const Watcher = require('../Watcher') | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
|  | 
 | ||||||
| const libraryFilters = require('../utils/queries/libraryFilters') | const libraryFilters = require('../utils/queries/libraryFilters') | ||||||
| const libraryItemsPodcastFilters = require('../utils/queries/libraryItemsPodcastFilters') | const libraryItemsPodcastFilters = require('../utils/queries/libraryItemsPodcastFilters') | ||||||
| const authorFilters = require('../utils/queries/authorFilters') | const authorFilters = require('../utils/queries/authorFilters') | ||||||
| @ -759,7 +761,7 @@ class LibraryController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (include.includes('rssfeed')) { |     if (include.includes('rssfeed')) { | ||||||
|       const feedObj = await this.rssFeedManager.findFeedForEntityId(seriesJson.id) |       const feedObj = await RssFeedManager.findFeedForEntityId(seriesJson.id) | ||||||
|       seriesJson.rssFeed = feedObj?.toJSONMinified() || null |       seriesJson.rssFeed = feedObj?.toJSONMinified() || null | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -13,6 +13,8 @@ const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUti | |||||||
| const LibraryItemScanner = require('../scanner/LibraryItemScanner') | const LibraryItemScanner = require('../scanner/LibraryItemScanner') | ||||||
| const AudioFileScanner = require('../scanner/AudioFileScanner') | const AudioFileScanner = require('../scanner/AudioFileScanner') | ||||||
| const Scanner = require('../scanner/Scanner') | const Scanner = require('../scanner/Scanner') | ||||||
|  | 
 | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
| const CacheManager = require('../managers/CacheManager') | const CacheManager = require('../managers/CacheManager') | ||||||
| const CoverManager = require('../managers/CoverManager') | const CoverManager = require('../managers/CoverManager') | ||||||
| const ShareManager = require('../managers/ShareManager') | const ShareManager = require('../managers/ShareManager') | ||||||
| @ -48,7 +50,7 @@ class LibraryItemController { | |||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       if (includeEntities.includes('rssfeed')) { |       if (includeEntities.includes('rssfeed')) { | ||||||
|         const feedData = await this.rssFeedManager.findFeedForEntityId(item.id) |         const feedData = await RssFeedManager.findFeedForEntityId(item.id) | ||||||
|         item.rssFeed = feedData?.toJSONMinified() || null |         item.rssFeed = feedData?.toJSONMinified() || null | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| const { Request, Response, NextFunction } = require('express') | const { Request, Response, NextFunction } = require('express') | ||||||
| const Logger = require('../Logger') | const Logger = require('../Logger') | ||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
| const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | 
 | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * @typedef RequestUserObject |  * @typedef RequestUserObject | ||||||
| @ -22,7 +23,7 @@ class RSSFeedController { | |||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   async getAll(req, res) { |   async getAll(req, res) { | ||||||
|     const feeds = await this.rssFeedManager.getFeeds() |     const feeds = await RssFeedManager.getFeeds() | ||||||
|     res.json({ |     res.json({ | ||||||
|       feeds: feeds.map((f) => f.toJSON()), |       feeds: feeds.map((f) => f.toJSON()), | ||||||
|       minified: feeds.map((f) => f.toJSONMinified()) |       minified: feeds.map((f) => f.toJSONMinified()) | ||||||
| @ -62,12 +63,12 @@ class RSSFeedController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 |     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 | ||||||
|     if (await this.rssFeedManager.findFeedBySlug(reqBody.slug)) { |     if (await RssFeedManager.findFeedBySlug(reqBody.slug)) { | ||||||
|       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) |       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) | ||||||
|       return res.status(400).send('Slug already in use') |       return res.status(400).send('Slug already in use') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const feed = await this.rssFeedManager.openFeedForItem(req.user.id, itemExpanded, reqBody) |     const feed = await RssFeedManager.openFeedForItem(req.user.id, itemExpanded, reqBody) | ||||||
|     if (!feed) { |     if (!feed) { | ||||||
|       Logger.error(`[RSSFeedController] Failed to open RSS feed for item "${itemExpanded.media.title}"`) |       Logger.error(`[RSSFeedController] Failed to open RSS feed for item "${itemExpanded.media.title}"`) | ||||||
|       return res.status(500).send('Failed to open RSS feed') |       return res.status(500).send('Failed to open RSS feed') | ||||||
| @ -99,7 +100,7 @@ class RSSFeedController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 |     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 | ||||||
|     if (await this.rssFeedManager.findFeedBySlug(reqBody.slug)) { |     if (await RssFeedManager.findFeedBySlug(reqBody.slug)) { | ||||||
|       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) |       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) | ||||||
|       return res.status(400).send('Slug already in use') |       return res.status(400).send('Slug already in use') | ||||||
|     } |     } | ||||||
| @ -112,7 +113,7 @@ class RSSFeedController { | |||||||
|       return res.status(400).send('Collection has no audio tracks') |       return res.status(400).send('Collection has no audio tracks') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const feed = await this.rssFeedManager.openFeedForCollection(req.user.id, collection, reqBody) |     const feed = await RssFeedManager.openFeedForCollection(req.user.id, collection, reqBody) | ||||||
|     if (!feed) { |     if (!feed) { | ||||||
|       Logger.error(`[RSSFeedController] Failed to open RSS feed for collection "${collection.name}"`) |       Logger.error(`[RSSFeedController] Failed to open RSS feed for collection "${collection.name}"`) | ||||||
|       return res.status(500).send('Failed to open RSS feed') |       return res.status(500).send('Failed to open RSS feed') | ||||||
| @ -144,7 +145,7 @@ class RSSFeedController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 |     // Check that this slug is not being used for another feed (slug will also be the Feed id)
 | ||||||
|     if (await this.rssFeedManager.findFeedBySlug(reqBody.slug)) { |     if (await RssFeedManager.findFeedBySlug(reqBody.slug)) { | ||||||
|       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) |       Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${reqBody.slug}" is already in use`) | ||||||
|       return res.status(400).send('Slug already in use') |       return res.status(400).send('Slug already in use') | ||||||
|     } |     } | ||||||
| @ -157,7 +158,7 @@ class RSSFeedController { | |||||||
|       return res.status(400).send('Series has no audio tracks') |       return res.status(400).send('Series has no audio tracks') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const feed = await this.rssFeedManager.openFeedForSeries(req.user.id, series, req.body) |     const feed = await RssFeedManager.openFeedForSeries(req.user.id, series, req.body) | ||||||
|     if (!feed) { |     if (!feed) { | ||||||
|       Logger.error(`[RSSFeedController] Failed to open RSS feed for series "${series.name}"`) |       Logger.error(`[RSSFeedController] Failed to open RSS feed for series "${series.name}"`) | ||||||
|       return res.status(500).send('Failed to open RSS feed') |       return res.status(500).send('Failed to open RSS feed') | ||||||
| @ -176,8 +177,16 @@ class RSSFeedController { | |||||||
|    * @param {RequestWithUser} req |    * @param {RequestWithUser} req | ||||||
|    * @param {Response} res |    * @param {Response} res | ||||||
|    */ |    */ | ||||||
|   closeRSSFeed(req, res) { |   async closeRSSFeed(req, res) { | ||||||
|     this.rssFeedManager.closeRssFeed(req, res) |     const feed = await Database.feedModel.findByPk(req.params.id) | ||||||
|  |     if (!feed) { | ||||||
|  |       Logger.error(`[RSSFeedController] Cannot close RSS feed because feed "${req.params.id}" does not exist`) | ||||||
|  |       return res.sendStatus(404) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     await RssFeedManager.handleCloseFeed(feed) | ||||||
|  | 
 | ||||||
|  |     res.sendStatus(200) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | |||||||
| @ -2,6 +2,9 @@ const { Request, Response, NextFunction } = require('express') | |||||||
| const Logger = require('../Logger') | const Logger = require('../Logger') | ||||||
| const SocketAuthority = require('../SocketAuthority') | const SocketAuthority = require('../SocketAuthority') | ||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
|  | 
 | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
|  | 
 | ||||||
| const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -51,7 +54,7 @@ class SeriesController { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (include.includes('rssfeed')) { |     if (include.includes('rssfeed')) { | ||||||
|       const feedObj = await this.rssFeedManager.findFeedForEntityId(seriesJson.id) |       const feedObj = await RssFeedManager.findFeedForEntityId(seriesJson.id) | ||||||
|       seriesJson.rssFeed = feedObj?.toJSONMinified() || null |       seriesJson.rssFeed = feedObj?.toJSONMinified() || null | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,7 +6,6 @@ const SocketAuthority = require('../SocketAuthority') | |||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
| 
 | 
 | ||||||
| const fs = require('../libs/fsExtra') | const fs = require('../libs/fsExtra') | ||||||
| const Feed = require('../objects/Feed') |  | ||||||
| const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters') | ||||||
| 
 | 
 | ||||||
| class RssFeedManager { | class RssFeedManager { | ||||||
| @ -69,15 +68,6 @@ class RssFeedManager { | |||||||
|     return Database.feedModel.findOneOld({ slug }) |     return Database.feedModel.findOneOld({ slug }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |  | ||||||
|    * Find open feed for a slug |  | ||||||
|    * @param {string} slug |  | ||||||
|    * @returns {Promise<objects.Feed>} oldFeed |  | ||||||
|    */ |  | ||||||
|   findFeed(id) { |  | ||||||
|     return Database.feedModel.findByPkOld(id) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |   /** | ||||||
|    * GET: /feed/:slug |    * GET: /feed/:slug | ||||||
|    * |    * | ||||||
| @ -303,33 +293,57 @@ class RssFeedManager { | |||||||
|     return feedExpanded |     return feedExpanded | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * Close Feed and emit Socket event | ||||||
|  |    * | ||||||
|  |    * @param {import('../models/Feed')} feed | ||||||
|  |    * @returns {Promise<boolean>} - true if feed was closed | ||||||
|  |    */ | ||||||
|   async handleCloseFeed(feed) { |   async handleCloseFeed(feed) { | ||||||
|     if (!feed) return |     if (!feed) return false | ||||||
|     await Database.removeFeed(feed.id) |     const wasRemoved = await Database.feedModel.removeById(feed.id) | ||||||
|     SocketAuthority.emitter('rss_feed_closed', feed.toJSONMinified()) |     SocketAuthority.emitter('rss_feed_closed', feed.toOldJSONMinified()) | ||||||
|     Logger.info(`[RssFeedManager] Closed RSS feed "${feed.feedUrl}"`) |     Logger.info(`[RssFeedManager] Closed RSS feed "${feed.feedURL}"`) | ||||||
|   } |     return wasRemoved | ||||||
| 
 |  | ||||||
|   async closeRssFeed(req, res) { |  | ||||||
|     const feed = await this.findFeed(req.params.id) |  | ||||||
|     if (!feed) { |  | ||||||
|       Logger.error(`[RssFeedManager] RSS feed not found with id "${req.params.id}"`) |  | ||||||
|       return res.sendStatus(404) |  | ||||||
|     } |  | ||||||
|     await this.handleCloseFeed(feed) |  | ||||||
|     res.sendStatus(200) |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {string} entityId | ||||||
|  |    * @returns {Promise<boolean>} - true if feed was closed | ||||||
|  |    */ | ||||||
|   async closeFeedForEntityId(entityId) { |   async closeFeedForEntityId(entityId) { | ||||||
|     const feed = await this.findFeedForEntityId(entityId) |     const feed = await Database.feedModel.findOne({ | ||||||
|     if (!feed) return |       where: { | ||||||
|  |         entityId | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     if (!feed) { | ||||||
|  |       Logger.warn(`[RssFeedManager] closeFeedForEntityId: Feed not found for entity id ${entityId}`) | ||||||
|  |       return false | ||||||
|  |     } | ||||||
|     return this.handleCloseFeed(feed) |     return this.handleCloseFeed(feed) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * @param {string[]} entityIds | ||||||
|  |    */ | ||||||
|  |   async closeFeedsForEntityIds(entityIds) { | ||||||
|  |     const feeds = await Database.feedModel.findAll({ | ||||||
|  |       where: { | ||||||
|  |         entityId: entityIds | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     for (const feed of feeds) { | ||||||
|  |       await this.handleCloseFeed(feed) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   async getFeeds() { |   async getFeeds() { | ||||||
|     const feeds = await Database.models.feed.getOldFeeds() |     const feeds = await Database.models.feed.getOldFeeds() | ||||||
|     Logger.info(`[RssFeedManager] Fetched all feeds`) |     Logger.info(`[RssFeedManager] Fetched all feeds`) | ||||||
|     return feeds |     return feeds | ||||||
|   } |   } | ||||||
| } | } | ||||||
| module.exports = RssFeedManager | module.exports = new RssFeedManager() | ||||||
|  | |||||||
| @ -124,12 +124,18 @@ class Feed extends Model { | |||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static removeById(feedId) { |   /** | ||||||
|     return this.destroy({ |    * @param {string} feedId | ||||||
|  |    * @returns {Promise<boolean>} - true if feed was removed | ||||||
|  |    */ | ||||||
|  |   static async removeById(feedId) { | ||||||
|  |     return ( | ||||||
|  |       (await this.destroy({ | ||||||
|         where: { |         where: { | ||||||
|           id: feedId |           id: feedId | ||||||
|         } |         } | ||||||
|     }) |       })) > 0 | ||||||
|  |     ) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -163,22 +169,6 @@ class Feed extends Model { | |||||||
|     return this.getOldFeed(feedExpanded) |     return this.getOldFeed(feedExpanded) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |  | ||||||
|    * Find feed and return oldFeed |  | ||||||
|    * @param {string} id |  | ||||||
|    * @returns {Promise<oldFeed>} oldFeed |  | ||||||
|    */ |  | ||||||
|   static async findByPkOld(id) { |  | ||||||
|     if (!id) return null |  | ||||||
|     const feedExpanded = await this.findByPk(id, { |  | ||||||
|       include: { |  | ||||||
|         model: this.sequelize.models.feedEpisode |  | ||||||
|       } |  | ||||||
|     }) |  | ||||||
|     if (!feedExpanded) return null |  | ||||||
|     return this.getOldFeed(feedExpanded) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   static async fullCreateFromOld(oldFeed) { |   static async fullCreateFromOld(oldFeed) { | ||||||
|     const feedObj = this.getFromOld(oldFeed) |     const feedObj = this.getFromOld(oldFeed) | ||||||
|     const newFeed = await this.create(feedObj) |     const newFeed = await this.create(feedObj) | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ const fs = require('../libs/fsExtra') | |||||||
| const date = require('../libs/dateAndTime') | const date = require('../libs/dateAndTime') | ||||||
| 
 | 
 | ||||||
| const CacheManager = require('../managers/CacheManager') | const CacheManager = require('../managers/CacheManager') | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
| 
 | 
 | ||||||
| const LibraryController = require('../controllers/LibraryController') | const LibraryController = require('../controllers/LibraryController') | ||||||
| const UserController = require('../controllers/UserController') | const UserController = require('../controllers/UserController') | ||||||
| @ -49,8 +50,6 @@ class ApiRouter { | |||||||
|     this.podcastManager = Server.podcastManager |     this.podcastManager = Server.podcastManager | ||||||
|     /** @type {import('../managers/AudioMetadataManager')} */ |     /** @type {import('../managers/AudioMetadataManager')} */ | ||||||
|     this.audioMetadataManager = Server.audioMetadataManager |     this.audioMetadataManager = Server.audioMetadataManager | ||||||
|     /** @type {import('../managers/RssFeedManager')} */ |  | ||||||
|     this.rssFeedManager = Server.rssFeedManager |  | ||||||
|     /** @type {import('../managers/CronManager')} */ |     /** @type {import('../managers/CronManager')} */ | ||||||
|     this.cronManager = Server.cronManager |     this.cronManager = Server.cronManager | ||||||
|     /** @type {import('../managers/EmailManager')} */ |     /** @type {import('../managers/EmailManager')} */ | ||||||
| @ -394,7 +393,7 @@ class ApiRouter { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Close rss feed - remove from db and emit socket event
 |     // Close rss feed - remove from db and emit socket event
 | ||||||
|     await this.rssFeedManager.closeFeedForEntityId(libraryItemId) |     await RssFeedManager.closeFeedForEntityId(libraryItemId) | ||||||
| 
 | 
 | ||||||
|     // purge cover cache
 |     // purge cover cache
 | ||||||
|     await CacheManager.purgeCoverCache(libraryItemId) |     await CacheManager.purgeCoverCache(libraryItemId) | ||||||
| @ -493,7 +492,7 @@ class ApiRouter { | |||||||
|    * @param {import('../models/Series')} series |    * @param {import('../models/Series')} series | ||||||
|    */ |    */ | ||||||
|   async removeEmptySeries(series) { |   async removeEmptySeries(series) { | ||||||
|     await this.rssFeedManager.closeFeedForEntityId(series.id) |     await RssFeedManager.closeFeedForEntityId(series.id) | ||||||
|     Logger.info(`[ApiRouter] Series "${series.name}" is now empty. Removing series`) |     Logger.info(`[ApiRouter] Series "${series.name}" is now empty. Removing series`) | ||||||
| 
 | 
 | ||||||
|     // Remove series from library filter data
 |     // Remove series from library filter data
 | ||||||
|  | |||||||
| @ -6,21 +6,24 @@ const { getTitleIgnorePrefix, areEquivalent } = require('../utils/index') | |||||||
| const parseNameString = require('../utils/parsers/parseNameString') | const parseNameString = require('../utils/parsers/parseNameString') | ||||||
| const parseEbookMetadata = require('../utils/parsers/parseEbookMetadata') | const parseEbookMetadata = require('../utils/parsers/parseEbookMetadata') | ||||||
| const globals = require('../utils/globals') | const globals = require('../utils/globals') | ||||||
|  | const { readTextFile, filePathToPOSIX, getFileTimestampsWithIno } = require('../utils/fileUtils') | ||||||
|  | 
 | ||||||
| const AudioFileScanner = require('./AudioFileScanner') | const AudioFileScanner = require('./AudioFileScanner') | ||||||
| const Database = require('../Database') | const Database = require('../Database') | ||||||
| const { readTextFile, filePathToPOSIX, getFileTimestampsWithIno } = require('../utils/fileUtils') |  | ||||||
| const AudioFile = require('../objects/files/AudioFile') |  | ||||||
| const CoverManager = require('../managers/CoverManager') |  | ||||||
| const LibraryFile = require('../objects/files/LibraryFile') |  | ||||||
| const SocketAuthority = require('../SocketAuthority') | const SocketAuthority = require('../SocketAuthority') | ||||||
| const fsExtra = require('../libs/fsExtra') |  | ||||||
| const BookFinder = require('../finders/BookFinder') | const BookFinder = require('../finders/BookFinder') | ||||||
|  | const fsExtra = require('../libs/fsExtra') | ||||||
|  | const EBookFile = require('../objects/files/EBookFile') | ||||||
|  | const AudioFile = require('../objects/files/AudioFile') | ||||||
|  | const LibraryFile = require('../objects/files/LibraryFile') | ||||||
|  | 
 | ||||||
|  | const RssFeedManager = require('../managers/RssFeedManager') | ||||||
|  | const CoverManager = require('../managers/CoverManager') | ||||||
| 
 | 
 | ||||||
| const LibraryScan = require('./LibraryScan') | const LibraryScan = require('./LibraryScan') | ||||||
| const OpfFileScanner = require('./OpfFileScanner') | const OpfFileScanner = require('./OpfFileScanner') | ||||||
| const NfoFileScanner = require('./NfoFileScanner') | const NfoFileScanner = require('./NfoFileScanner') | ||||||
| const AbsMetadataFileScanner = require('./AbsMetadataFileScanner') | const AbsMetadataFileScanner = require('./AbsMetadataFileScanner') | ||||||
| const EBookFile = require('../objects/files/EBookFile') |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Metadata for books pulled from files |  * Metadata for books pulled from files | ||||||
| @ -941,6 +944,9 @@ class BookScanner { | |||||||
|           id: bookSeriesToRemove |           id: bookSeriesToRemove | ||||||
|         } |         } | ||||||
|       }) |       }) | ||||||
|  |       // Close any open feeds for series
 | ||||||
|  |       await RssFeedManager.closeFeedsForEntityIds(bookSeriesToRemove) | ||||||
|  | 
 | ||||||
|       bookSeriesToRemove.forEach((seriesId) => { |       bookSeriesToRemove.forEach((seriesId) => { | ||||||
|         Database.removeSeriesFromFilterData(libraryId, seriesId) |         Database.removeSeriesFromFilterData(libraryId, seriesId) | ||||||
|         SocketAuthority.emitter('series_removed', { id: seriesId, libraryId }) |         SocketAuthority.emitter('series_removed', { id: seriesId, libraryId }) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user