Fix RSS feeds to use slug instead of id

This commit is contained in:
advplyr 2023-07-06 17:07:10 -05:00
parent a0bc959850
commit b5d4c11f6f
4 changed files with 37 additions and 54 deletions

View File

@ -157,15 +157,15 @@ class Server {
router.use('/hls', this.authMiddleware.bind(this), this.hlsRouter.router) router.use('/hls', this.authMiddleware.bind(this), this.hlsRouter.router)
// RSS Feed temp route // RSS Feed temp route
router.get('/feed/:id', (req, res) => { router.get('/feed/:slug', (req, res) => {
Logger.info(`[Server] Requesting rss feed ${req.params.id}`) Logger.info(`[Server] Requesting rss feed ${req.params.slug}`)
this.rssFeedManager.getFeed(req, res) this.rssFeedManager.getFeed(req, res)
}) })
router.get('/feed/:id/cover', (req, res) => { router.get('/feed/:slug/cover', (req, res) => {
this.rssFeedManager.getFeedCover(req, res) this.rssFeedManager.getFeedCover(req, res)
}) })
router.get('/feed/:id/item/:episodeId/*', (req, res) => { router.get('/feed/:slug/item/:episodeId/*', (req, res) => {
Logger.debug(`[Server] Requesting rss feed episode ${req.params.id}/${req.params.episodeId}`) Logger.debug(`[Server] Requesting rss feed episode ${req.params.slug}/${req.params.episodeId}`)
this.rssFeedManager.getFeedItem(req, res) this.rssFeedManager.getFeedItem(req, res)
}) })

View File

@ -201,7 +201,7 @@ class LibraryController {
// Step 1 - Filter the retrieved library items // Step 1 - Filter the retrieved library items
let filterSeries = null let filterSeries = null
if (payload.filterBy) { if (payload.filterBy) {
libraryItems = libraryHelpers.getFilteredLibraryItems(libraryItems, payload.filterBy, req.user, this.rssFeedManager.feedsArray) libraryItems = libraryHelpers.getFilteredLibraryItems(libraryItems, payload.filterBy, req.user, Database.feeds)
payload.total = libraryItems.length payload.total = libraryItems.length
// Determining if we are filtering titles by a series, and if so, which series // Determining if we are filtering titles by a series, and if so, which series

View File

@ -30,7 +30,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 (this.rssFeedManager.feeds[options.slug]) { if (this.rssFeedManager.findFeedBySlug(options.slug)) {
Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`)
return res.status(400).send('Slug already in use') return res.status(400).send('Slug already in use')
} }
@ -55,7 +55,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 (this.rssFeedManager.feeds[options.slug]) { if (this.rssFeedManager.findFeedBySlug(options.slug)) {
Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`)
return res.status(400).send('Slug already in use') return res.status(400).send('Slug already in use')
} }
@ -89,7 +89,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 (this.rssFeedManager.feeds[options.slug]) { if (this.rssFeedManager.findFeedBySlug(options.slug)) {
Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`)
return res.status(400).send('Slug already in use') return res.status(400).send('Slug already in use')
} }
@ -111,10 +111,8 @@ class RSSFeedController {
} }
// POST: api/feeds/:id/close // POST: api/feeds/:id/close
async closeRSSFeed(req, res) { closeRSSFeed(req, res) {
await this.rssFeedManager.closeRssFeed(req.params.id) this.rssFeedManager.closeRssFeed(req, res)
res.sendStatus(200)
} }
middleware(req, res, next) { middleware(req, res, next) {
@ -123,14 +121,6 @@ class RSSFeedController {
return res.sendStatus(403) return res.sendStatus(403)
} }
if (req.params.id) {
const feed = this.rssFeedManager.findFeed(req.params.id)
if (!feed) {
Logger.error(`[RSSFeedController] RSS feed not found with id "${req.params.id}"`)
return res.sendStatus(404)
}
}
next() next()
} }
} }

View File

@ -8,13 +8,7 @@ const fs = require('../libs/fsExtra')
const Feed = require('../objects/Feed') const Feed = require('../objects/Feed')
class RssFeedManager { class RssFeedManager {
constructor() { constructor() { }
this.feeds = {}
}
get feedsArray() {
return Object.values(this.feeds)
}
validateFeedEntity(feedObj) { validateFeedEntity(feedObj) {
if (feedObj.entityType === 'collection') { if (feedObj.entityType === 'collection') {
@ -42,32 +36,30 @@ class RssFeedManager {
} }
async init() { async init() {
const feeds = Database.feeds for (const feed of Database.feeds) {
if (!feeds?.length) return
for (const feed of feeds) {
// Remove invalid feeds // Remove invalid feeds
if (!this.validateFeedEntity(feed)) { if (!this.validateFeedEntity(feed)) {
await Database.removeFeed(feed.id) await Database.removeFeed(feed.id)
} }
this.feeds[feed.id] = feed
Logger.info(`[RssFeedManager] Opened rss feed ${feed.feedUrl}`)
} }
} }
findFeedForEntityId(entityId) { findFeedForEntityId(entityId) {
return Object.values(this.feeds).find(feed => feed.entityId === entityId) return Database.feeds.find(feed => feed.entityId === entityId)
} }
findFeed(feedId) { findFeedBySlug(slug) {
return this.feeds[feedId] || null return Database.feeds.find(feed => feed.slug === slug)
}
findFeed(id) {
return Database.feeds.find(feed => feed.id === id)
} }
async getFeed(req, res) { async getFeed(req, res) {
const feed = this.feeds[req.params.id] const feed = this.findFeedBySlug(req.params.slug)
if (!feed) { if (!feed) {
Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) Logger.warn(`[RssFeedManager] Feed not found ${req.params.slug}`)
res.sendStatus(404) res.sendStatus(404)
return return
} }
@ -143,9 +135,9 @@ class RssFeedManager {
} }
getFeedItem(req, res) { getFeedItem(req, res) {
const feed = this.feeds[req.params.id] const feed = this.findFeedBySlug(req.params.slug)
if (!feed) { if (!feed) {
Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) Logger.debug(`[RssFeedManager] Feed not found ${req.params.slug}`)
res.sendStatus(404) res.sendStatus(404)
return return
} }
@ -159,9 +151,9 @@ class RssFeedManager {
} }
getFeedCover(req, res) { getFeedCover(req, res) {
const feed = this.feeds[req.params.id] const feed = this.findFeedBySlug(req.params.slug)
if (!feed) { if (!feed) {
Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) Logger.debug(`[RssFeedManager] Feed not found ${req.params.slug}`)
res.sendStatus(404) res.sendStatus(404)
return return
} }
@ -186,9 +178,8 @@ class RssFeedManager {
const feed = new Feed() const feed = new Feed()
feed.setFromItem(user.id, slug, libraryItem, serverAddress, preventIndexing, ownerName, ownerEmail) feed.setFromItem(user.id, slug, libraryItem, serverAddress, preventIndexing, ownerName, ownerEmail)
this.feeds[feed.id] = feed
Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`)
await Database.createFeed(feed) await Database.createFeed(feed)
SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified())
return feed return feed
@ -203,9 +194,8 @@ class RssFeedManager {
const feed = new Feed() const feed = new Feed()
feed.setFromCollection(user.id, slug, collectionExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) feed.setFromCollection(user.id, slug, collectionExpanded, serverAddress, preventIndexing, ownerName, ownerEmail)
this.feeds[feed.id] = feed
Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`)
await Database.createFeed(feed) await Database.createFeed(feed)
SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified())
return feed return feed
@ -220,9 +210,8 @@ class RssFeedManager {
const feed = new Feed() const feed = new Feed()
feed.setFromSeries(user.id, slug, seriesExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) feed.setFromSeries(user.id, slug, seriesExpanded, serverAddress, preventIndexing, ownerName, ownerEmail)
this.feeds[feed.id] = feed
Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`)
await Database.createFeed(feed) await Database.createFeed(feed)
SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified())
return feed return feed
@ -232,13 +221,17 @@ class RssFeedManager {
if (!feed) return if (!feed) return
await Database.removeFeed(feed.id) await Database.removeFeed(feed.id)
SocketAuthority.emitter('rss_feed_closed', feed.toJSONMinified()) SocketAuthority.emitter('rss_feed_closed', feed.toJSONMinified())
delete this.feeds[feed.id]
Logger.info(`[RssFeedManager] Closed RSS feed "${feed.feedUrl}"`) Logger.info(`[RssFeedManager] Closed RSS feed "${feed.feedUrl}"`)
} }
closeRssFeed(id) { async closeRssFeed(req, res) {
if (!this.feeds[id]) return const feed = this.findFeed(req.params.id)
return this.handleCloseFeed(this.feeds[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)
} }
closeFeedForEntityId(entityId) { closeFeedForEntityId(entityId) {