50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
import { error } from '@sveltejs/kit';
|
|
import type { PageServerLoad } from './$types';
|
|
import { requireUser } from '#lib/server/auth.js';
|
|
import { getPiece, getTaxonomy } from '#lib/server/content.js';
|
|
import { renderMarkdown } from '#lib/server/markdown.js';
|
|
import { buildEmbedUrl, type PresentationContent } from '#lib/server/presentation.js';
|
|
|
|
export const load: PageServerLoad = ({ locals, params }) => {
|
|
requireUser(locals.user);
|
|
const piece = getPiece(params.id);
|
|
if (!piece) error(404, 'Piece nicht gefunden');
|
|
const source =
|
|
piece.presentationSourcePosition === null
|
|
? null
|
|
: (piece.sources[piece.presentationSourcePosition] ?? null);
|
|
const content: PresentationContent & {
|
|
sources: typeof piece.sources;
|
|
images: { id: string; altText: string }[];
|
|
} = {
|
|
mode: piece.presentationMode,
|
|
topics: getTaxonomy()
|
|
.topics.filter((topic) => piece.topicIds.includes(topic.id))
|
|
.map((topic) => topic.name),
|
|
title: piece.outputTitle || piece.title,
|
|
html: renderMarkdown(piece.presentationText),
|
|
source,
|
|
previewTitle: piece.presentationTitle,
|
|
description: piece.presentationDescription,
|
|
imageUrl: piece.presentationImageUrl,
|
|
siteName: piece.presentationSiteName,
|
|
provider:
|
|
piece.presentationProvider === 'youtube' || piece.presentationProvider === 'tiktok'
|
|
? piece.presentationProvider
|
|
: '',
|
|
providerId: piece.presentationProviderId,
|
|
embedUrl: buildEmbedUrl(
|
|
piece.presentationProvider === 'youtube' || piece.presentationProvider === 'tiktok'
|
|
? piece.presentationProvider
|
|
: '',
|
|
piece.presentationProviderId,
|
|
source?.timecodeSeconds ?? null
|
|
),
|
|
sources: [],
|
|
images: piece.media
|
|
.filter((item) => item.id === piece.presentationMediaId)
|
|
.map((item) => ({ id: item.id, altText: item.altText }))
|
|
};
|
|
return { pieceId: piece.id, content };
|
|
};
|