public static InfoDict FromDict(Dictionary <string, object> infoDict, string type = null) { if (type == null) { type = (string)infoDict.GetValueOrDefault("_type"); } if (infoDict.ContainsKey("_type")) { infoDict.Remove("_type"); } switch (type) { case "video": return(new Video(infoDict)); case "playlist": return(new Playlist(infoDict)); case "url": return(new ContentUrl(infoDict)); case "url-transparent": return(new TransparentUrl(infoDict)); case "format": return(FormatBase.FromDict(infoDict)); case "thumbnail": return(new Thumbnail(infoDict)); case "subtitleformat": return(new SubtitleFormat(infoDict)); default: return(new InfoDict(infoDict)); } }
public Video(Dictionary <string, object> infoDict) : base(infoDict) { if (infoDict.TryGetValue("thumbnails", out object thumbnails)) { var thumbnailList = new List <Thumbnail>(); if (thumbnails is List <Dictionary <string, object> > xthumbnails) { foreach (Dictionary <string, object> thumbDict in xthumbnails) { thumbDict.Add("_type", "thumbnail"); Thumbnail thumbInfoDict = InfoDict.FromDict <Thumbnail>(thumbDict); thumbnailList.Add(thumbInfoDict); } } else if (thumbnails is List <object> xthumbnails2) { foreach (object thumbDict in xthumbnails2) { var td = (thumbDict as Dictionary <string, object>); td.Add("_type", "thumbnail"); Thumbnail thumbInfoDict = InfoDict.FromDict <Thumbnail>(td); thumbnailList.Add(thumbInfoDict); } } thumbnailList.Sort(); for (int i = 0; i < thumbnailList.Count; i++) { thumbnailList[i].Url = Util.SanitizeUrl(thumbnailList[i].Url); if (thumbnailList[i].Id == null) { thumbnailList[i].Id = i.ToString(); } } if (AdditionalProperties.ContainsKey("thumbnails")) { AdditionalProperties.Remove("thumbnails"); } Thumbnails = new ThumbnailCollection(thumbnailList); } else if (infoDict.TryGetValue("thumbnail", out object thumbnail)) { var thumbnailList = new List <Thumbnail>(); Dictionary <string, object> xthumbnail = new Dictionary <string, object>() { { "url", (string)thumbnail } }; Thumbnail thumbInfoDict = InfoDict.FromDict <Thumbnail>(xthumbnail); thumbInfoDict.Url = Util.SanitizeUrl(thumbInfoDict.Url); thumbnailList.Add(thumbInfoDict); if (AdditionalProperties.ContainsKey("thumbnail")) { AdditionalProperties.Remove("thumbnail"); } Thumbnails = new ThumbnailCollection(thumbnailList); } if (infoDict.TryGetValue("timestamp", out object timestamp)) { if (timestamp is string s) { UploadDate = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(s)).UtcDateTime; } else if (timestamp is int i) { UploadDate = DateTimeOffset.FromUnixTimeSeconds(i).UtcDateTime; } else if (timestamp is long l) { UploadDate = DateTimeOffset.FromUnixTimeSeconds(l).UtcDateTime; } } if (infoDict.TryGetValue("duration", out object duration)) { if (timestamp is string s) { Duration = TimeSpan.FromSeconds(Convert.ToInt32(s)); } else if (duration is int i) { Duration = TimeSpan.FromSeconds(i); } else if (duration is long l) { Duration = TimeSpan.FromSeconds(l); } } if (infoDict.TryGetValue("subtitles", out object subs)) { var subtitles = new List <Subtitle>(); Dictionary <string, object> xsubs = (Dictionary <string, object>)subs; foreach (var kv in xsubs) { Subtitle sub = new Subtitle(kv.Key); foreach (Dictionary <string, object> subDict in (List <Dictionary <string, object> >)kv.Value) { subDict.Add("_type", "subtitleformat"); SubtitleFormat subf = InfoDict.FromDict <SubtitleFormat>(subDict); subf.Url = Util.SanitizeUrl(subf.Url); // subf.Extension = Util.DetermineExt(subf.Extension); sub.Formats.Add(subf); } subtitles.Add(sub); } if (AdditionalProperties.ContainsKey("subtitles")) { AdditionalProperties.Remove("subtitles"); } Subtitles = new SubtitleCollection(subtitles); } if (infoDict.TryGetValue("automatic_captions", out object autoSubs)) { var automaticSubtitles = new List <Subtitle>(); Dictionary <string, object> xsubs = (Dictionary <string, object>)autoSubs; foreach (var kv in xsubs) { Subtitle sub = new Subtitle(kv.Key); foreach (Dictionary <string, object> subDict in (List <Dictionary <string, object> >)kv.Value) { subDict.Add("_type", "subtitleformat"); SubtitleFormat subf = InfoDict.FromDict <SubtitleFormat>(subDict); subf.Url = Util.SanitizeUrl(subf.Url); // subf.Extension = Util.DetermineExt(subf.Extension); sub.Formats.Add(subf); } automaticSubtitles.Add(sub); } if (AdditionalProperties.ContainsKey("automatic_captions")) { AdditionalProperties.Remove("automatic_captions"); } AutomaticSubtitles = new SubtitleCollection(automaticSubtitles); } if (infoDict.TryGetValue("formats", out object formats)) { var formatlist = new List <IFormat>(); List <object> xformats = (List <object>)formats; foreach (Dictionary <string, object> formatDict in xformats) { IFormat fmt = FormatBase.FromDict(formatDict); // fmt.Url = Util.SanitizeUrl(fmt.Url); // fmt.Extension = Util.DetermineExt(fmt.Extension); formatlist.Add(fmt); } if (AdditionalProperties.ContainsKey("formats")) { AdditionalProperties.Remove("formats"); } Formats = new FormatCollection(formatlist); } else { // the video is a format var formatlist = new List <IFormat>(); IFormat fmt = FormatBase.FromDict(AdditionalProperties); formatlist.Add(fmt); Formats = new FormatCollection(formatlist); } }