X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Ffeeds.ts;h=f14c0d316af5412fd55613259c6bc80e3d115dda;hb=af4ae64f6faf38f8179f2e07d3cd4ad60006be92;hp=72628dffb94bc3d26a919a2971e44e3bc3d46965;hpb=f2f0eda543ab54eec0f6bcdd8ccf6e382d5cafb6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts index 72628dffb..f14c0d316 100644 --- a/server/controllers/feeds.ts +++ b/server/controllers/feeds.ts @@ -1,21 +1,21 @@ import * as express from 'express' +import * as Feed from 'pfeed' +import { buildNSFWFilter } from '../helpers/express-utils' +import { CONFIG } from '../initializers/config' import { FEEDS, ROUTE_CACHE_LIFETIME, THUMBNAILS_SIZE, WEBSERVER } from '../initializers/constants' import { asyncMiddleware, commonVideosFiltersValidator, - setDefaultSort, + feedsFormatValidator, + setDefaultVideosSort, + setFeedFormatContentType, videoCommentsFeedsValidator, videoFeedsValidator, - videosSortValidator, - feedsFormatValidator, - setFeedFormatContentType + videosSortValidator } from '../middlewares' -import { VideoModel } from '../models/video/video' -import * as Feed from 'pfeed' import { cacheRoute } from '../middlewares/cache' +import { VideoModel } from '../models/video/video' import { VideoCommentModel } from '../models/video/video-comment' -import { buildNSFWFilter } from '../helpers/express-utils' -import { CONFIG } from '../initializers/config' const feedsRouter = express.Router() @@ -27,13 +27,14 @@ feedsRouter.get('/feeds/video-comments.:format', 'Content-Type' ] })(ROUTE_CACHE_LIFETIME.FEEDS)), + asyncMiddleware(videoFeedsValidator), asyncMiddleware(videoCommentsFeedsValidator), asyncMiddleware(generateVideoCommentsFeed) ) feedsRouter.get('/feeds/videos.:format', videosSortValidator, - setDefaultSort, + setDefaultVideosSort, feedsFormatValidator, setFeedFormatContentType, asyncMiddleware(cacheRoute({ @@ -58,16 +59,39 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res const start = 0 const video = res.locals.videoAll - const videoId: number = video ? video.id : undefined + const account = res.locals.account + const videoChannel = res.locals.videoChannel - const comments = await VideoCommentModel.listForFeed(start, FEEDS.COUNT, videoId) + const comments = await VideoCommentModel.listForFeed({ + start, + count: FEEDS.COUNT, + videoId: video ? video.id : undefined, + accountId: account ? account.id : undefined, + videoChannelId: videoChannel ? videoChannel.id : undefined + }) - const name = video ? video.name : CONFIG.INSTANCE.NAME - const description = video ? video.description : CONFIG.INSTANCE.DESCRIPTION - const feed = initFeed(name, description) + let name: string + let description: string + + if (videoChannel) { + name = videoChannel.getDisplayName() + description = videoChannel.description + } else if (account) { + name = account.getDisplayName() + description = account.description + } else { + name = video ? video.name : CONFIG.INSTANCE.NAME + description = video ? video.description : CONFIG.INSTANCE.DESCRIPTION + } + const feed = initFeed({ + name, + description, + resourceType: 'video-comments', + queryString: new URL(WEBSERVER.URL + req.originalUrl).search + }) // Adding video items to the feed, one at a time - comments.forEach(comment => { + for (const comment of comments) { const link = WEBSERVER.URL + comment.getCommentStaticPath() let title = comment.Video.name @@ -89,7 +113,7 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res author, date: comment.createdAt }) - }) + } // Now the feed generation is done, let's send it! return sendFeed(feed, req, res) @@ -116,7 +140,12 @@ async function generateVideoFeed (req: express.Request, res: express.Response) { description = CONFIG.INSTANCE.DESCRIPTION } - const feed = initFeed(name, description) + const feed = initFeed({ + name, + description, + resourceType: 'videos', + queryString: new URL(WEBSERVER.URL + req.url).search + }) const resultList = await VideoModel.listForApi({ start, @@ -207,8 +236,14 @@ async function generateVideoFeed (req: express.Request, res: express.Response) { return sendFeed(feed, req, res) } -function initFeed (name: string, description: string) { +function initFeed (parameters: { + name: string + description: string + resourceType?: 'videos' | 'video-comments' + queryString?: string +}) { const webserverUrl = WEBSERVER.URL + const { name, description, resourceType, queryString } = parameters return new Feed({ title: name, @@ -222,9 +257,9 @@ function initFeed (name: string, description: string) { ` and potential licenses granted by each content's rightholder.`, generator: `Toraifōsu`, // ^.~ feedLinks: { - json: `${webserverUrl}/feeds/videos.json`, - atom: `${webserverUrl}/feeds/videos.atom`, - rss: `${webserverUrl}/feeds/videos.xml` + json: `${webserverUrl}/feeds/${resourceType}.json${queryString}`, + atom: `${webserverUrl}/feeds/${resourceType}.atom${queryString}`, + rss: `${webserverUrl}/feeds/${resourceType}.xml${queryString}` }, author: { name: 'Instance admin of ' + CONFIG.INSTANCE.NAME,