X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Ffeeds.ts;h=1773fc71e2a38eed02a72d5d2fc4314e8819eb36;hb=b81eb8fdc6fabbe517d5731c26da773206ebba62;hp=4a4dc3820a81b2ec480c03de67ff0f9fc751dc43;hpb=9309c3df8fffe5f307e48a35484d752440cf852d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts index 4a4dc3820..1773fc71e 100644 --- a/server/controllers/feeds.ts +++ b/server/controllers/feeds.ts @@ -1,21 +1,28 @@ import * as express from 'express' -import { CONFIG, FEEDS } from '../initializers/constants' -import { asyncMiddleware, feedsValidator, setDefaultSort, videosSortValidator } from '../middlewares' +import { CONFIG, FEEDS, ROUTE_CACHE_LIFETIME } from '../initializers/constants' +import { THUMBNAILS_SIZE } from '../initializers' +import { asyncMiddleware, setDefaultSort, videoCommentsFeedsValidator, videoFeedsValidator, videosSortValidator } from '../middlewares' import { VideoModel } from '../models/video/video' import * as Feed from 'pfeed' -import { ResultList } from '../../shared/models' import { AccountModel } from '../models/account/account' import { cacheRoute } from '../middlewares/cache' -import { VideoSortField } from '../../client/src/app/shared/video/sort-field.type' +import { VideoChannelModel } from '../models/video/video-channel' +import { VideoCommentModel } from '../models/video/video-comment' const feedsRouter = express.Router() +feedsRouter.get('/feeds/video-comments.:format', + asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)), + asyncMiddleware(videoCommentsFeedsValidator), + asyncMiddleware(generateVideoCommentsFeed) +) + feedsRouter.get('/feeds/videos.:format', videosSortValidator, setDefaultSort, - asyncMiddleware(feedsValidator), - asyncMiddleware(cacheRoute), - asyncMiddleware(generateFeed) + asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)), + asyncMiddleware(videoFeedsValidator), + asyncMiddleware(generateVideoFeed) ) // --------------------------------------------------------------------------- @@ -26,34 +33,75 @@ export { // --------------------------------------------------------------------------- -async function generateFeed (req: express.Request, res: express.Response, next: express.NextFunction) { - let feed = initFeed() +async function generateVideoCommentsFeed (req: express.Request, res: express.Response, next: express.NextFunction) { + const start = 0 + + const video = res.locals.video as VideoModel + const videoId: number = video ? video.id : undefined + + const comments = await VideoCommentModel.listForFeed(start, FEEDS.COUNT, videoId) + + const name = video ? video.name : CONFIG.INSTANCE.NAME + const description = video ? video.description : CONFIG.INSTANCE.DESCRIPTION + const feed = initFeed(name, description) + + // Adding video items to the feed, one at a time + comments.forEach(comment => { + const link = CONFIG.WEBSERVER.URL + '/videos/watch/' + comment.Video.uuid + ';threadId=' + comment.getThreadId() + + feed.addItem({ + title: `${comment.Video.name} - ${comment.Account.getDisplayName()}`, + id: comment.url, + link, + content: comment.text, + author: [ + { + name: comment.Account.getDisplayName(), + link: comment.Account.Actor.url + } + ], + date: comment.createdAt + }) + }) + + // Now the feed generation is done, let's send it! + return sendFeed(feed, req, res) +} + +async function generateVideoFeed (req: express.Request, res: express.Response, next: express.NextFunction) { const start = 0 - let resultList: ResultList const account: AccountModel = res.locals.account + const videoChannel: VideoChannelModel = res.locals.videoChannel const hideNSFW = CONFIG.INSTANCE.DEFAULT_NSFW_POLICY === 'do_not_list' - if (account) { - resultList = await VideoModel.listAccountVideosForApi( - account.id, - start, - FEEDS.COUNT, - req.query.sort as VideoSortField, - hideNSFW, - true - ) + let name: string + let description: string + + if (videoChannel) { + name = videoChannel.getDisplayName() + description = videoChannel.description + } else if (account) { + name = account.getDisplayName() + description = account.description } else { - resultList = await VideoModel.listForApi( - start, - FEEDS.COUNT, - req.query.sort as VideoSortField, - hideNSFW, - req.query.filter, - true - ) + name = CONFIG.INSTANCE.NAME + description = CONFIG.INSTANCE.DESCRIPTION } + const feed = initFeed(name, description) + + const resultList = await VideoModel.listForApi({ + start, + count: FEEDS.COUNT, + sort: req.query.sort, + hideNSFW, + filter: req.query.filter, + withFiles: true, + accountId: account ? account.id : null, + videoChannelId: videoChannel ? videoChannel.id : null + }) + // Adding video items to the feed, one at a time resultList.data.forEach(video => { const formattedVideoFiles = video.getFormattedVideoFilesJSON() @@ -66,7 +114,7 @@ async function generateFeed (req: express.Request, res: express.Response, next: feed.addItem({ title: video.name, id: video.url, - link: video.url, + link: CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid, description: video.getTruncatedDescription(), content: video.description, author: [ @@ -78,7 +126,14 @@ async function generateFeed (req: express.Request, res: express.Response, next: date: video.publishedAt, language: video.language, nsfw: video.nsfw, - torrent: torrents + torrent: torrents, + thumbnail: [ + { + url: CONFIG.WEBSERVER.URL + video.getThumbnailPath(), + height: THUMBNAILS_SIZE.height, + width: THUMBNAILS_SIZE.width + } + ] }) }) @@ -86,12 +141,12 @@ async function generateFeed (req: express.Request, res: express.Response, next: return sendFeed(feed, req, res) } -function initFeed () { +function initFeed (name: string, description: string) { const webserverUrl = CONFIG.WEBSERVER.URL return new Feed({ - title: CONFIG.INSTANCE.NAME, - description: CONFIG.INSTANCE.SHORT_DESCRIPTION, + title: name, + description, // updated: TODO: somehowGetLatestUpdate, // optional, default = today id: webserverUrl, link: webserverUrl,