diff --git a/supabase/functions/_shared/verifyHandles.ts b/supabase/functions/_shared/verifyHandles.ts index da44462..1dd95c2 100644 --- a/supabase/functions/_shared/verifyHandles.ts +++ b/supabase/functions/_shared/verifyHandles.ts @@ -66,11 +66,11 @@ async function verifyYouTube(handle: string, apiKey: string): Promise { if (YOUTUBE_API_KEY && ytVerified?.verified) { tasks.push((async () => { const YT = "https://www.googleapis.com/youtube/v3"; - const channelId = (ytVerified?.channelId as string) || ""; + let channelId = (ytVerified?.channelId as string) || ""; + + // If no channelId, try to resolve from handle + if (!channelId && ytVerified?.handle) { + const h = (ytVerified.handle as string).replace(/^@/, ''); + if (h.startsWith('UC')) { + channelId = h; + } else { + for (const param of ['forHandle', 'forUsername']) { + const lookupRes = await fetch(`${YT}/channels?part=id&${param}=${h}&key=${YOUTUBE_API_KEY}`); + const lookupData = await lookupRes.json(); + channelId = lookupData.items?.[0]?.id || ''; + if (channelId) break; + } + } + } if (!channelId) return; const chRes = await fetch(`${YT}/channels?part=snippet,statistics,brandingSettings&id=${channelId}&key=${YOUTUBE_API_KEY}`); diff --git a/supabase/functions/discover-channels/index.ts b/supabase/functions/discover-channels/index.ts index d2fc291..5f5acaf 100644 --- a/supabase/functions/discover-channels/index.ts +++ b/supabase/functions/discover-channels/index.ts @@ -221,6 +221,8 @@ Deno.serve(async (req) => { h = h.replace(/^@/, ''); // Reject if it looks like a non-YouTube URL if (h.includes('http') || h.includes('/') || h.includes('.com')) return null; + // Channel IDs start with UC — don't add @ prefix + if (/^UC[a-zA-Z0-9_-]{20,}$/.test(h)) return h; if (/^[a-zA-Z0-9._-]+$/.test(h) && h.length >= 2) return `@${h}`; return null; }