using System.Text.RegularExpressions; namespace Application.Abstractions.YouTube; /// /// YouTube URL에서 채널 ID, 핸들, 비디오 ID를 추출하는 유틸리티 /// public static partial class YouTubeUrlHelper { /// /// YouTube URL에서 Channel ID 추출 /// 지원 형식: /// - https://www.youtube.com/channel/UCxxxxxxxxx /// - https://www.youtube.com/@handle /// - https://youtube.com/c/CustomName /// public static (string? channelId, string? handle) ExtractChannelInfo(string url) { if (string.IsNullOrWhiteSpace(url)) { return (null, null); } // /channel/UCxxxxx 형식 var channelMatch = ChannelIdRegex().Match(url); if (channelMatch.Success) { return (channelMatch.Groups[1].Value, null); } // /@handle 형식 var handleMatch = HandleRegex().Match(url); if (handleMatch.Success) { return (null, handleMatch.Groups[1].Value); } // /c/CustomName 형식 → 핸들로 처리 var customMatch = CustomUrlRegex().Match(url); if (customMatch.Success) { return (null, customMatch.Groups[1].Value); } return (null, null); } /// /// YouTube URL에서 Video ID 추출 /// 지원 형식: /// - https://www.youtube.com/watch?v=xxxxxxxxxxx /// - https://youtu.be/xxxxxxxxxxx /// - https://www.youtube.com/live/xxxxxxxxxxx /// public static string? ExtractVideoId(string url) { if (string.IsNullOrWhiteSpace(url)) { return null; } var match = VideoIdRegex().Match(url); return match.Success ? match.Groups[1].Value : null; } [GeneratedRegex(@"youtube\.com/channel/(UC[\w-]+)", RegexOptions.IgnoreCase)] private static partial Regex ChannelIdRegex(); [GeneratedRegex(@"youtube\.com/@([\w.-]+)", RegexOptions.IgnoreCase)] private static partial Regex HandleRegex(); [GeneratedRegex(@"youtube\.com/c/([\w.-]+)", RegexOptions.IgnoreCase)] private static partial Regex CustomUrlRegex(); [GeneratedRegex(@"(?:youtube\.com/watch\?v=|youtu\.be/|youtube\.com/live/)([\w-]{11})", RegexOptions.IgnoreCase)] private static partial Regex VideoIdRegex(); }