]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/feeds.ts
add client overrides to nginx configuration (#3297)
[github/Chocobozzz/PeerTube.git] / server / controllers / feeds.ts
index 72628dffb94bc3d26a919a2971e44e3bc3d46965..f14c0d316af5412fd55613259c6bc80e3d115dda 100644 (file)
@@ -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,