X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fbots.ts;h=2b825a73093e7e0b88d21472ca10134b967ac8dd;hb=cffef25313bdf7a6c435f56ac6715fdd91acf7b3;hp=e25d9c21b01c8a8dd48b10d6dcdcfb63aa43766e;hpb=97567dd81f508dd6295ac4d73d849aa2ce0a6549;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/bots.ts b/server/controllers/bots.ts index e25d9c21b..2b825a730 100644 --- a/server/controllers/bots.ts +++ b/server/controllers/bots.ts @@ -1,21 +1,22 @@ -import * as express from 'express' -import { asyncMiddleware } from '../middlewares' +import express from 'express' +import { truncate } from 'lodash' +import { ErrorLevel, SitemapStream, streamToPromise } from 'sitemap' +import { logger } from '@server/helpers/logger' +import { getServerActor } from '@server/models/application/application' +import { buildNSFWFilter } from '../helpers/express-utils' import { ROUTE_CACHE_LIFETIME, WEBSERVER } from '../initializers/constants' -import * as sitemapModule from 'sitemap' -import { logger } from '../helpers/logger' +import { asyncMiddleware } from '../middlewares' +import { cacheRoute } from '../middlewares/cache/cache' +import { AccountModel } from '../models/account/account' import { VideoModel } from '../models/video/video' import { VideoChannelModel } from '../models/video/video-channel' -import { AccountModel } from '../models/account/account' -import { cacheRoute } from '../middlewares/cache' -import { buildNSFWFilter } from '../helpers/express-utils' -import { truncate } from 'lodash' const botsRouter = express.Router() // Special route that add OpenGraph and oEmbed tags // Do not use a template engine for a so little thing botsRouter.use('/sitemap.xml', - asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.SITEMAP)), + cacheRoute(ROUTE_CACHE_LIFETIME.SITEMAP), asyncMiddleware(getSitemap) ) @@ -34,20 +35,28 @@ async function getSitemap (req: express.Request, res: express.Response) { urls = urls.concat(await getSitemapVideoChannelUrls()) urls = urls.concat(await getSitemapAccountUrls()) - const sitemap = sitemapModule.createSitemap({ + const sitemapStream = new SitemapStream({ hostname: WEBSERVER.URL, - urls: urls - }) + errorHandler: (err: Error, level: ErrorLevel) => { + if (level === 'warn') { + logger.warn('Warning in sitemap generation.', { err }) + } else if (level === 'throw') { + logger.error('Error in sitemap generation.', { err }) - sitemap.toXML((err, xml) => { - if (err) { - logger.error('Cannot generate sitemap.', { err }) - return res.sendStatus(500) + throw err + } } - - res.header('Content-Type', 'application/xml') - res.send(xml) }) + + for (const urlObj of urls) { + sitemapStream.write(urlObj) + } + sitemapStream.end() + + const xml = await streamToPromise(sitemapStream) + + res.header('Content-Type', 'application/xml') + res.send(xml) } async function getSitemapVideoChannelUrls () { @@ -67,24 +76,30 @@ async function getSitemapAccountUrls () { } async function getSitemapLocalVideoUrls () { - const resultList = await VideoModel.listForApi({ + const serverActor = await getServerActor() + + const { data } = await VideoModel.listForApi({ start: 0, count: undefined, sort: 'createdAt', - includeLocalVideos: true, + displayOnlyForFollower: { + actorId: serverActor.id, + orLocalVideos: true + }, + isLocal: true, nsfw: buildNSFWFilter(), - filter: 'local', - withFiles: false + countVideos: false }) - return resultList.data.map(v => ({ - url: WEBSERVER.URL + '/videos/watch/' + v.uuid, + return data.map(v => ({ + url: WEBSERVER.URL + v.getWatchStaticPath(), video: [ { - title: v.name, + // Sitemap title should be < 100 characters + title: truncate(v.name, { length: 100, omission: '...' }), // Sitemap description should be < 2000 characters description: truncate(v.description || v.name, { length: 2000, omission: '...' }), - player_loc: WEBSERVER.URL + '/videos/embed/' + v.uuid, + player_loc: WEBSERVER.URL + v.getEmbedStaticPath(), thumbnail_loc: WEBSERVER.URL + v.getMiniatureStaticPath() } ]