36 lines
930 B
TypeScript
36 lines
930 B
TypeScript
import { clsx, type ClassValue } from "clsx"
|
|
import { twMerge } from "tailwind-merge"
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs))
|
|
}
|
|
|
|
// Validate YouTube URL
|
|
export function isValidYouTubeUrl(url: string): boolean {
|
|
const youtubeRegex = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/.+/;
|
|
return youtubeRegex.test(url);
|
|
}
|
|
|
|
// Extract YouTube video ID
|
|
export function extractYouTubeId(url: string): string | null {
|
|
const patterns = [
|
|
/(?:youtube\.com\/watch\?v=|youtu\.be\/)([^&\n?#]+)/,
|
|
/youtube\.com\/embed\/([^&\n?#]+)/,
|
|
/youtube\.com\/v\/([^&\n?#]+)/,
|
|
];
|
|
|
|
for (const pattern of patterns) {
|
|
const match = url.match(pattern);
|
|
if (match && match[1]) {
|
|
return match[1];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
// Validate a bare YouTube video ID (11 chars, URL-safe)
|
|
export function isValidYouTubeId(id: string): boolean {
|
|
return /^[A-Za-z0-9_-]{11}$/.test(id);
|
|
}
|