Initial open-source self-hosted Songs2YT edition

This commit is contained in:
Songs2YT
2026-07-17 02:23:59 +02:00
commit 2aa8a84781
134 changed files with 17758 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
export const FREE_PLAN = {
monthlyQuota: 14,
maxFileSizeBytes: 30 * 1024 * 1024,
maxBatchSize: 3,
watermarkOptional: true,
} as const;
export const RESOLUTIONS = [
{ value: "1920x1080", label: "1920x1080 (16:9)", width: 1920, height: 1080 },
{ value: "1280x720", label: "1280x720 (16:9)", width: 1280, height: 720 },
{ value: "854x480", label: "854x480 (16:9)", width: 854, height: 480 },
{ value: "720x720", label: "720x720 (1:1)", width: 720, height: 720 },
{ value: "640x360", label: "640x360 (16:9)", width: 640, height: 360 },
{ value: "426x240", label: "426x240 (16:9)", width: 426, height: 240 },
] as const;
export const YOUTUBE_CATEGORIES = [
{ id: "10", name: "Music" },
{ id: "1", name: "Film & Animation" },
{ id: "2", name: "Autos & Vehicles" },
{ id: "15", name: "Pets & Animals" },
{ id: "17", name: "Sports" },
{ id: "19", name: "Travel & Events" },
{ id: "20", name: "Gaming" },
{ id: "22", name: "People & Blogs" },
{ id: "23", name: "Comedy" },
{ id: "24", name: "Entertainment" },
{ id: "25", name: "News & Politics" },
{ id: "26", name: "Howto & Style" },
{ id: "27", name: "Education" },
{ id: "28", name: "Science & Technology" },
{ id: "29", name: "Nonprofits & Activism" },
] as const;
export const QUEUE_NAME = "video-jobs";
export function getResolution(value: string) {
return RESOLUTIONS.find((r) => r.value === value);
}
export function isAllowedResolution(value: string): boolean {
return RESOLUTIONS.some((r) => r.value === value);
}
export function filenameWithoutExtension(filename: string): string {
const lastDot = filename.lastIndexOf(".");
return lastDot > 0 ? filename.slice(0, lastDot) : filename;
}
export function parseTags(input: string): string[] {
const tags: string[] = [];
const regex = /"([^"]+)"|([^,\s]+)/g;
let match: RegExpExecArray | null;
while ((match = regex.exec(input)) !== null) {
const tag = (match[1] || match[2]).trim();
if (tag) tags.push(tag);
}
return tags.slice(0, 500);
}