setDefaultSort,
videoCommentsFeedsValidator,
videoFeedsValidator,
- videosSortValidator
+ videosSortValidator,
+ feedsFormatValidator,
+ setFeedFormatContentType
} from '../middlewares'
import { VideoModel } from '../models/video/video'
import * as Feed from 'pfeed'
const feedsRouter = express.Router()
feedsRouter.get('/feeds/video-comments.:format',
- asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)),
+ feedsFormatValidator,
+ setFeedFormatContentType,
+ asyncMiddleware(cacheRoute({
+ headerBlacklist: [
+ 'Content-Type'
+ ]
+ })(ROUTE_CACHE_LIFETIME.FEEDS)),
asyncMiddleware(videoCommentsFeedsValidator),
asyncMiddleware(generateVideoCommentsFeed)
)
feedsRouter.get('/feeds/videos.:format',
videosSortValidator,
setDefaultSort,
- asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)),
+ feedsFormatValidator,
+ setFeedFormatContentType,
+ asyncMiddleware(cacheRoute({
+ headerBlacklist: [
+ 'Content-Type'
+ ]
+ })(ROUTE_CACHE_LIFETIME.FEEDS)),
commonVideosFiltersValidator,
asyncMiddleware(videoFeedsValidator),
asyncMiddleware(generateVideoFeed)
comments.forEach(comment => {
const link = WEBSERVER.URL + comment.getCommentStaticPath()
+ let title = comment.Video.name
+ const author: { name: string, link: string }[] = []
+
+ if (comment.Account) {
+ title += ` - ${comment.Account.getDisplayName()}`
+ author.push({
+ name: comment.Account.getDisplayName(),
+ link: comment.Account.Actor.url
+ })
+ }
+
feed.addItem({
- title: `${comment.Video.name} - ${comment.Account.getDisplayName()}`,
+ title,
id: comment.url,
link,
content: comment.text,
- author: [
- {
- name: comment.Account.getDisplayName(),
- link: comment.Account.Actor.url
- }
- ],
+ author,
date: comment.createdAt
})
})
// Adding video items to the feed, one at a time
resultList.data.forEach(video => {
const formattedVideoFiles = video.getFormattedVideoFilesJSON()
+
const torrents = formattedVideoFiles.map(videoFile => ({
title: video.name,
url: videoFile.torrentUrl,
size_in_bytes: videoFile.size
}))
- const videos = formattedVideoFiles.map(videoFile => (Object.assign({
- type: 'video/mp4',
- medium: 'video',
- height: videoFile.resolution.label.replace('p', ''),
- fileSize: videoFile.size,
- url: videoFile.fileUrl,
- framerate: videoFile.fps,
- duration: video.duration
- }, video.language ? {
- lang: video.language
- } : {})))
+
+ const videos = formattedVideoFiles.map(videoFile => {
+ const result = {
+ type: 'video/mp4',
+ medium: 'video',
+ height: videoFile.resolution.label.replace('p', ''),
+ fileSize: videoFile.size,
+ url: videoFile.fileUrl,
+ framerate: videoFile.fps,
+ duration: video.duration
+ }
+
+ if (video.language) Object.assign(result, { lang: video.language })
+
+ return result
+ })
+
+ const categories: { value: number, label: string }[] = []
+ if (video.category) {
+ categories.push({
+ value: video.category,
+ label: VideoModel.getCategoryLabel(video.category)
+ })
+ }
feed.addItem({
title: video.name,
player: {
url: video.getWatchStaticPath()
},
- categories: [video.category ? {
- value: video.category,
- label: VideoModel.getCategoryLabel(video.category)
- } : null],
+ categories,
community: {
statistics: {
views: video.views
const format = req.params.format
if (format === 'atom' || format === 'atom1') {
- res.set('Content-Type', 'application/atom+xml')
return res.send(feed.atom1()).end()
}
if (format === 'json' || format === 'json1') {
- res.set('Content-Type', 'application/json')
return res.send(feed.json1()).end()
}
if (format === 'rss' || format === 'rss2') {
- res.set('Content-Type', 'application/rss+xml')
return res.send(feed.rss2()).end()
}
// We're in the ambiguous '.xml' case and we look at the format query parameter
if (req.query.format === 'atom' || req.query.format === 'atom1') {
- res.set('Content-Type', 'application/atom+xml')
return res.send(feed.atom1()).end()
}
- res.set('Content-Type', 'application/rss+xml')
return res.send(feed.rss2()).end()
}