"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.servicesRouter = void 0;
const tslib_1 = require("tslib");
const express_1 = tslib_1.__importDefault(require("express"));
const renderer_1 = require("../../shared/core-utils/renderer");
const constants_1 = require("../initializers/constants");
const middlewares_1 = require("../middlewares");
const validators_1 = require("../middlewares/validators");
const core_utils_1 = require("../../shared/core-utils");
const servicesRouter = express_1.default.Router();
exports.servicesRouter = servicesRouter;
servicesRouter.use('/oembed', (0, middlewares_1.asyncMiddleware)(middlewares_1.oembedValidator), generateOEmbed);
servicesRouter.use('/redirect/accounts/:accountName', (0, middlewares_1.asyncMiddleware)(validators_1.accountNameWithHostGetValidator), redirectToAccountUrl);
function generateOEmbed(req, res) {
    if (res.locals.videoAll)
        return generateVideoOEmbed(req, res);
    return generatePlaylistOEmbed(req, res);
}
function generatePlaylistOEmbed(req, res) {
    const playlist = res.locals.videoPlaylistSummary;
    const json = buildOEmbed({
        channel: playlist.VideoChannel,
        title: playlist.name,
        embedPath: playlist.getEmbedStaticPath() + buildPlayerURLQuery(req.query.url),
        previewPath: playlist.getThumbnailStaticPath(),
        previewSize: constants_1.THUMBNAILS_SIZE,
        req
    });
    return res.json(json);
}
function generateVideoOEmbed(req, res) {
    const video = res.locals.videoAll;
    const json = buildOEmbed({
        channel: video.VideoChannel,
        title: video.name,
        embedPath: video.getEmbedStaticPath() + buildPlayerURLQuery(req.query.url),
        previewPath: video.getPreviewStaticPath(),
        previewSize: constants_1.PREVIEWS_SIZE,
        req
    });
    return res.json(json);
}
function buildPlayerURLQuery(inputQueryUrl) {
    const allowedParameters = new Set([
        'start',
        'stop',
        'loop',
        'autoplay',
        'muted',
        'controls',
        'controlBar',
        'title',
        'api',
        'warningTitle',
        'peertubeLink',
        'p2p',
        'subtitle',
        'bigPlayBackgroundColor',
        'mode',
        'foregroundColor'
    ]);
    const params = new URLSearchParams();
    new URL(inputQueryUrl).searchParams.forEach((v, k) => {
        if (allowedParameters.has(k)) {
            params.append(k, v);
        }
    });
    const stringQuery = params.toString();
    if (!stringQuery)
        return '';
    return '?' + stringQuery;
}
function buildOEmbed(options) {
    const { req, previewSize, previewPath, title, channel, embedPath } = options;
    const webserverUrl = constants_1.WEBSERVER.URL;
    const maxHeight = (0, core_utils_1.forceNumber)(req.query.maxheight);
    const maxWidth = (0, core_utils_1.forceNumber)(req.query.maxwidth);
    const embedUrl = webserverUrl + embedPath;
    const embedTitle = (0, renderer_1.escapeHTML)(title);
    let thumbnailUrl = previewPath
        ? webserverUrl + previewPath
        : undefined;
    let embedWidth = constants_1.EMBED_SIZE.width;
    if (maxWidth < embedWidth)
        embedWidth = maxWidth;
    let embedHeight = constants_1.EMBED_SIZE.height;
    if (maxHeight < embedHeight)
        embedHeight = maxHeight;
    if ((maxHeight !== undefined && maxHeight < previewSize.height) ||
        (maxWidth !== undefined && maxWidth < previewSize.width)) {
        thumbnailUrl = undefined;
    }
    const html = `<iframe width="${embedWidth}" height="${embedHeight}" sandbox="allow-same-origin allow-scripts allow-popups" ` +
        `title="${embedTitle}" src="${embedUrl}" frameborder="0" allowfullscreen></iframe>`;
    const json = {
        type: 'video',
        version: '1.0',
        html,
        width: embedWidth,
        height: embedHeight,
        title,
        author_name: channel.name,
        author_url: channel.Actor.url,
        provider_name: 'PeerTube',
        provider_url: webserverUrl
    };
    if (thumbnailUrl !== undefined) {
        json.thumbnail_url = thumbnailUrl;
        json.thumbnail_width = previewSize.width;
        json.thumbnail_height = previewSize.height;
    }
    return json;
}
function redirectToAccountUrl(req, res, next) {
    return res.redirect(res.locals.account.Actor.url);
}
//# sourceMappingURL=services.js.map