func TYTD.GetVideoId(v) { func IsValidId(_v) { if(_v.Count != 11) return false; each(var item : _v) { if(!(item.IsLetter() || item.IsDigit() || item == '-' || item == '_')) return false; } return true; } if(TypeOf(v) != "String") return null; if(IsValidId(v)) return v; each(var __re : ["youtube\\..+?/watch.*?v=(.*?)(?:&|/|$)","youtu\\.be/(.*?)(?:\\?|&|/|$)","youtube\\..+?/embed/(.*?)(?:\\?|&|/|$)","youtube\\..+?/shorts/(.*?)(?:\\?|&|/|$)","youtube\\..+?/live/(.*?)(?:\\?|&|/|$)"]) { var __r = new Regex(__re); var __s = __r.Search(v); if(__s.Count == 2) { __r=__s[1].Text; if(IsValidId(__r)) { return __r; } } } return null; } func TYTD.GetPlaylistId(pid) { func IsValidId(v) { if(v.Count < 2) return false; each(var item : v) { if(!(item.IsLetter() || item.IsDigit() || item == '-' || item == '_')) return false; } return true; } if(TypeOf(pid) != "String") return null; if(IsValidId(pid)) return pid; each(var __re : ["youtube\\..+?/playlist.*?list=(.*?)(?:&|/|$)","youtube\\..+?/watch.*?list=(.*?)(?:&|/|$)","youtu\\.be/.*?/.*?list=(.*?)(?:&|/|$)","youtube\\..+?/embed/.*?/.*?list=(.*?)(?:&|/|$)"]) { var __r = new Regex(__re); var __s = __r.Search(pid); if(__s.Count == 2) { __r=__s[1].Text; if(IsValidId(__r)) { return __r; } } } return null; } func TYTD.GetChannelId(cid) { func IsValidId(v) { if(v.Count != 24) return false; if(!v.StartsWith("UC")) return false; each(var item : v) { if(!(item.IsLetter() || item.IsDigit() || item == '-' || item == '_')) return false; } return true; } if(TypeOf(cid) != "String") return null; if(IsValidId(cid)) return cid; each(var __re : ["youtube\\..+?/channel/(.*?)(?:\\?|&|/|$)"]) { var __r = new Regex(__re); var __s = __r.Search(cid); if(__s.Count == 2) { __r=__s[1].Text; if(IsValidId(__r)) { return __r; } } } return null; } func TYTD.CreateYouTubeTempPlaylist(ids) { var url = "https://www.youtube.com/watch_videos?video_ids="; var first=true; each(var item : ids) { if(!first) url += $"{url},{Net.Http.UrlEncode(item)}"; else url += Net.Http.UrlEncode(item); first=false; } return url; } func TYTD.GetYouTubeTempPlaylistRedirect(url) { if(url.Contains("/watch_videos?") && url.Contains("video_ids=")) { var queryPart = url.Split("?",true,2); return $"/watch_videos?{queryPart[1]}"; } return null; } func TYTD.GetYouTubeTempPlaylist(url) { if(url.Contains("/watch_videos?") && url.Contains("video_ids=")) { var queryPart = url.Split("?",true,2); if(queryPart.Length == 2) { var queryParms =queryPart[1].Split("&"); each(var item : queryParms) { const vals = item.Split("=",true,2); if(vals.Length == 2 && vals[0] == "video_ids") { return Net.Http.UrlDecode(vals[1]).Split(","); } } } } return null; }