import { Privacy } from "@prisma/client"; import type { LayoutSettings } from "./layout"; import type { WatermarkSettings } from "./watermark"; export type ItemMetadata = { title: string; description: string; tags: string; privacy: Privacy; categoryId: string; resolution: string; notifySubscribers: boolean; madeForKids: boolean; embeddable: boolean; creativeCommons: boolean; /** Legacy Free toggle default Songs2VID branding when watermark.mode is omitted. */ includeWatermark: boolean; /** YouTube playlist ID (Pro only). Video is added after upload. */ playlistId?: string | null; /** * Optional per-item cover image path (Pro / perItemImages). * When omitted, the job-level shared imagePath is used. */ imagePath?: string | null; /** Pro custom branding. Free may only use mode none|default at bottom-right. */ watermark?: Partial | null; /** Artist line for art-track layouts (optional). */ artist?: string | null; /** * Pro art-track layout. Prefer camelCase; snake_case aliases accepted: * layout_template, blur_amount, text_padding. */ layout?: Partial & { layoutTemplate?: string | null; layout_template?: string | null; blur_amount?: number; blur_opacity?: number; text_padding?: number; title_artist_gap?: number; text_offset_x?: number; text_offset_y?: number; } | null; /** Flat aliases (also accepted). */ layoutTemplate?: string | null; layout_template?: string | null; blurAmount?: number; blur_amount?: number; blurOpacity?: number; blur_opacity?: number; textPadding?: number; text_padding?: number; titleArtistGap?: number; title_artist_gap?: number; textOffsetX?: number; text_offset_x?: number; textOffsetY?: number; text_offset_y?: number; }; export type UploadedAudio = { path: string; filename: string; metadata: ItemMetadata; }; export type CreatePlaylistRequest = { title: string; description?: string; privacy?: "public" | "unlisted" | "private"; }; export type CreateJobPayload = { /** Shared cover for Free / default when items omit imagePath. */ imagePath: string; items: Array<{ audioPath: string; audioFilename: string; metadata: ItemMetadata; }>; /** Create a new playlist and attach its ID to every item (Pro). */ createPlaylist?: CreatePlaylistRequest | null; }; export type JobItemResponse = { id: string; audioFilename: string; title: string; status: string; youtubeVideoId: string | null; error: string | null; }; export type JobResponse = { id: string; status: string; createdAt: string; completedAt: string | null; items: JobItemResponse[]; }; export type VideoJobData = { jobItemId: string; userId: string; jobId: string; };