Files
songs2vid/lib/jobs/resolve-playlist.ts
T
Atakan Doğan ÖzbanandCursor 925aadae75 Strip Songs2VID to a payment-free self-hosted OSS core.
Remove Stripe/billing/pricing/marketing, simplify schema and entitlements for unlimited self-host use, and keep auth, encode, and YouTube upload.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 06:52:00 +02:00

42 lines
1.3 KiB
TypeScript

import type { CreateJobPayload, CreatePlaylistRequest, ItemMetadata } from "../types";
import { createYouTubePlaylist } from "../youtube/upload";
export function parseCreatePlaylistInput(raw: unknown): CreatePlaylistRequest | null {
if (!raw || typeof raw !== "object") return null;
const value = raw as Record<string, unknown>;
const title = typeof value.title === "string" ? value.title.trim() : "";
if (!title) return null;
const privacy =
value.privacy === "public" || value.privacy === "unlisted" || value.privacy === "private"
? value.privacy
: undefined;
return {
title,
description: typeof value.description === "string" ? value.description : undefined,
privacy,
};
}
export async function applyCreatePlaylistToItems(
user: { id: string },
items: CreateJobPayload["items"],
createPlaylist: CreatePlaylistRequest | null | undefined,
) {
if (!createPlaylist) {
return { items, playlist: null as Awaited<ReturnType<typeof createYouTubePlaylist>> | null };
}
const playlist = await createYouTubePlaylist(user.id, createPlaylist);
const nextItems = items.map((item) => ({
...item,
metadata: {
...item.metadata,
playlistId: item.metadata.playlistId || playlist.id,
} satisfies ItemMetadata,
}));
return { items: nextItems, playlist };
}