X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Ffeeds.ts;h=241715fb90858d4c8bfff900e0fc9669ec92ceb0;hb=8d33235de737e18eabb0816a950ba89f4a807e70;hp=1f6aebac3b8a53d57572030fefa1f7cae2bb5510;hpb=2760b454a761f6af3138b2fb5f34340772ab0d1e;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts index 1f6aebac3..241715fb9 100644 --- a/server/controllers/feeds.ts +++ b/server/controllers/feeds.ts @@ -1,10 +1,13 @@ import express from 'express' -import Feed from 'pfeed' +import { extname } from 'path' +import { Feed } from '@peertube/feed' +import { mdToOneLinePlainText, toSafeHtml } from '@server/helpers/markdown' import { getServerActor } from '@server/models/application/application' import { getCategoryLabel } from '@server/models/video/formatter/video-format-utils' +import { VideoInclude } from '@shared/models' import { buildNSFWFilter } from '../helpers/express-utils' import { CONFIG } from '../initializers/config' -import { FEEDS, PREVIEWS_SIZE, ROUTE_CACHE_LIFETIME, WEBSERVER } from '../initializers/constants' +import { MIMETYPES, PREVIEWS_SIZE, ROUTE_CACHE_LIFETIME, WEBSERVER } from '../initializers/constants' import { asyncMiddleware, commonVideosFiltersValidator, @@ -73,7 +76,7 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res const comments = await VideoCommentModel.listForFeed({ start, - count: FEEDS.COUNT, + count: CONFIG.FEEDS.COMMENTS.COUNT, videoId: video ? video.id : undefined, accountId: account ? account.id : undefined, videoChannelId: videoChannel ? videoChannel.id : undefined @@ -101,7 +104,7 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res // Adding video items to the feed, one at a time for (const comment of comments) { - const link = WEBSERVER.URL + comment.getCommentStaticPath() + const localLink = WEBSERVER.URL + comment.getCommentStaticPath() let title = comment.Video.name const author: { name: string, link: string }[] = [] @@ -116,9 +119,9 @@ async function generateVideoCommentsFeed (req: express.Request, res: express.Res feed.addItem({ title, - id: comment.url, - link, - content: comment.text, + id: localLink, + link: localLink, + content: toSafeHtml(comment.text), author, date: comment.createdAt }) @@ -163,7 +166,7 @@ async function generateVideoFeed (req: express.Request, res: express.Response) { const server = await getServerActor() const { data } = await VideoModel.listForApi({ start, - count: FEEDS.COUNT, + count: CONFIG.FEEDS.VIDEOS.COUNT, sort: req.query.sort, displayOnlyForFollower: { actorId: server.id, @@ -171,8 +174,8 @@ async function generateVideoFeed (req: express.Request, res: express.Response) { }, nsfw, isLocal: req.query.isLocal, - include: req.query.include, - withFiles: true, + include: req.query.include | VideoInclude.FILES, + hasFiles: true, countVideos: false, ...options }) @@ -199,14 +202,15 @@ async function generateVideoFeedForSubscriptions (req: express.Request, res: exp const { data } = await VideoModel.listForApi({ start, - count: FEEDS.COUNT, + count: CONFIG.FEEDS.VIDEOS.COUNT, sort: req.query.sort, nsfw, isLocal: req.query.isLocal, - include: req.query.include, - withFiles: true, + hasFiles: true, + include: req.query.include | VideoInclude.FILES, + countVideos: false, displayOnlyForFollower: { @@ -233,7 +237,7 @@ function initFeed (parameters: { return new Feed({ title: name, - description, + description: mdToOneLinePlainText(description), // updated: TODO: somehowGetLatestUpdate, // optional, default = today id: webserverUrl, link: webserverUrl, @@ -255,10 +259,7 @@ function initFeed (parameters: { }) } -function addVideosToFeed (feed, videos: VideoModel[]) { - /** - * Adding video items to the feed object, one at a time - */ +function addVideosToFeed (feed: Feed, videos: VideoModel[]) { for (const video of videos) { const formattedVideoFiles = video.getFormattedVideoFilesJSON(false) @@ -268,11 +269,11 @@ function addVideosToFeed (feed, videos: VideoModel[]) { size_in_bytes: videoFile.size })) - const videos = formattedVideoFiles.map(videoFile => { + const videoFiles = formattedVideoFiles.map(videoFile => { const result = { - type: 'video/mp4', + type: MIMETYPES.VIDEO.EXT_MIMETYPE[extname(videoFile.fileUrl)], medium: 'video', - height: videoFile.resolution.label.replace('p', ''), + height: videoFile.resolution.id, fileSize: videoFile.size, url: videoFile.fileUrl, framerate: videoFile.fps, @@ -292,12 +293,14 @@ function addVideosToFeed (feed, videos: VideoModel[]) { }) } + const localLink = WEBSERVER.URL + video.getWatchStaticPath() + feed.addItem({ title: video.name, - id: video.url, - link: WEBSERVER.URL + video.getWatchStaticPath(), - description: video.getTruncatedDescription(), - content: video.description, + id: localLink, + link: localLink, + description: mdToOneLinePlainText(video.getTruncatedDescription()), + content: toSafeHtml(video.description), author: [ { name: video.VideoChannel.Account.getDisplayName(), @@ -306,14 +309,26 @@ function addVideosToFeed (feed, videos: VideoModel[]) { ], date: video.publishedAt, nsfw: video.nsfw, - torrent: torrents, - videos, + torrents, + + // Enclosure + video: videoFiles.length !== 0 + ? { + url: videoFiles[0].url, + length: videoFiles[0].fileSize, + type: videoFiles[0].type + } + : undefined, + + // Media RSS + videos: videoFiles, + embed: { - url: video.getEmbedStaticPath(), + url: WEBSERVER.URL + video.getEmbedStaticPath(), allowFullscreen: true }, player: { - url: video.getWatchStaticPath() + url: WEBSERVER.URL + video.getWatchStaticPath() }, categories, community: { @@ -321,7 +336,7 @@ function addVideosToFeed (feed, videos: VideoModel[]) { views: video.views } }, - thumbnail: [ + thumbnails: [ { url: WEBSERVER.URL + video.getPreviewStaticPath(), height: PREVIEWS_SIZE.height, @@ -332,7 +347,7 @@ function addVideosToFeed (feed, videos: VideoModel[]) { } } -function sendFeed (feed, req: express.Request, res: express.Response) { +function sendFeed (feed: Feed, req: express.Request, res: express.Response) { const format = req.params.format if (format === 'atom' || format === 'atom1') {