Remove Stripe/billing/pricing/marketing, simplify schema and entitlements for unlimited self-host use, and keep auth, encode, and YouTube upload.
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
export type TitleFields = {
|
|
/** YouTube video title */
|
|
title?: string | null;
|
|
/** On-video song / track title (art-track layouts) */
|
|
songTitle?: string | null;
|
|
artist?: string | null;
|
|
};
|
|
|
|
/** Resolve the title sent to YouTube, falling back to artist and song metadata. */
|
|
export function resolveYouTubeTitle(meta: TitleFields): string {
|
|
const videoTitle = meta.title?.trim();
|
|
if (videoTitle) return videoTitle;
|
|
|
|
const artist = meta.artist?.trim();
|
|
const song = meta.songTitle?.trim();
|
|
if (artist && song) return `${artist} - ${song}`;
|
|
if (song) return song;
|
|
if (artist) return artist;
|
|
|
|
return "";
|
|
}
|
|
|
|
/** Title burned into art-track layout (never the YouTube-only field alone when songTitle set). */
|
|
export function resolveBurnedSongTitle(
|
|
meta: TitleFields,
|
|
fallback = "Untitled",
|
|
): string {
|
|
return meta.songTitle?.trim() || fallback;
|
|
}
|
|
|
|
export function validateYouTubeTitle(meta: TitleFields): string | null {
|
|
const resolved = resolveYouTubeTitle(meta);
|
|
if (!resolved) {
|
|
return "Enter a video title, song title, or artist";
|
|
}
|
|
return null;
|
|
}
|