using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using TessesYoutubeDownloader.Server.Models; using YoutubeExplode.Channels; using YoutubeExplode.Playlists; using YoutubeExplode.Videos; namespace youtube_downloader.Server.Models { public class InfomationQueueItem { public InfomationQueueItem(VideoId id,Resolution res,bool download = true) { Data = id.Value; DownloadActualDataAfterwards = download; Type = InfoType.Video; this.res = res; } public InfomationQueueItem(PlaylistId id,Resolution res,bool download = true) { Data = id.Value; DownloadActualDataAfterwards = download; Type = InfoType.Playlist; this.res = res; } public InfomationQueueItem(ChannelId id, Resolution res, bool download = true) { Data = id.Value; DownloadActualDataAfterwards = download; Type = InfoType.Channel; this.res = res; } public InfomationQueueItem(UserName id, Resolution res, bool download = true) { Data = id.Value; DownloadActualDataAfterwards = download; Type = InfoType.User; this.res = res; } Resolution res; /// /// Download it afterwards /// public bool DownloadActualDataAfterwards { get; set; } /// /// Kind /// public InfoType Type { get; set; } /// /// ID for item /// public string Data { get; set; } public async Task DownloadData() { switch (Type) { case InfoType.Video: { string infPath = Functions.Downloader.DL.GetPath(true, "Info", Data + ".json"); SavedVideoObject sv; bool exist = File.Exists(infPath); if (exist) { sv = new SavedVideoObject(); sv.Resolution = res; sv.Video = JsonConvert.DeserializeObject(File.ReadAllText(infPath)); } else { var vinfo = await Functions.Downloader.DL.ytc.Videos.GetAsync(Data); sv = SavedVideo.CreateFrom(res, vinfo, Functions.Downloader.DL._DownloadThumbnail); } if (!exist) { File.WriteAllText(infPath, JsonConvert.SerializeObject(sv.Video)); } return new SavedVideoObject[] { sv }; } case InfoType.Playlist: { List video2 = new List(); List vo = new List(); SavedPlaylist pl = await SavedPlaylist.FromPlaylistId(res, Functions.Downloader.DL.ytc, Data, (e,f) => { vo.Add(e); }, Functions.Downloader.DL._DownloadThumbnail); string infpath = Functions.Downloader.DL.GetPath(true, "Playlist", Data + ".json"); File.WriteAllText(infpath, JsonConvert.SerializeObject(pl)); foreach(var str in vo) { string infPath = Functions.Downloader.DL.GetPath(true, "Info", str + ".json"); SavedVideoObject sv; bool exist = File.Exists(infPath); if (exist) { sv = new SavedVideoObject(); sv.Resolution = res; sv.Video = JsonConvert.DeserializeObject(File.ReadAllText(infPath)); } else { try { var vinfo = await Functions.Downloader.DL.ytc.Videos.GetAsync(str); sv = SavedVideo.CreateFrom(res, vinfo, Functions.Downloader.DL._DownloadThumbnail); }catch(Exception ex) { sv = null; _ = ex; } } if (!exist) { File.WriteAllText(infPath, JsonConvert.SerializeObject(sv.Video)); } if(sv != null) { video2.Add(sv); } } return video2.ToArray(); } case InfoType.Channel: { List video = new List(); try { var c = Functions.Downloader.DL.ytc.Channels.GetAsync(Data).GetAwaiter().GetResult(); SavedChannel c2 = SavedChannel.FromChannel(c, Functions.Downloader.DL._DownloadThumbnail); string infpath = Functions.Downloader.DL.GetPath(true, "Channel", Data + ".json"); File.WriteAllText(infpath, JsonConvert.SerializeObject(c2)); try { Functions.Downloader.DL.ytc.Channels.GetUploadsAsync(c.Id).ForEachAsync(async (v) => { string infPath = Functions.Downloader.DL.GetPath(true, "Info", v.Id + ".json"); bool exist = File.Exists(infPath); if (exist) { SavedVideoObject sv = new SavedVideoObject(); sv.Resolution = res; sv.Video = JsonConvert.DeserializeObject(File.ReadAllText(infPath)); video.Add(sv); } else { try { var vinfo = await Functions.Downloader.DL.ytc.Videos.GetAsync(v.Id); SavedVideoObject sv = SavedVideo.CreateFrom(res, vinfo, Functions.Downloader.DL._DownloadThumbnail); video.Add(sv); } catch (Exception ex) { _ = ex; } } }).Wait(); } catch (Exception ex) { _ = ex; } } catch (Exception ex2) { _ = ex2; } return video.ToArray(); } case InfoType.User: { List video = new List(); try { var c = Functions.Downloader.DL.ytc.Channels.GetByUserAsync(Data).GetAwaiter().GetResult(); SavedChannel c2 = SavedChannel.FromChannel(c, Functions.Downloader.DL._DownloadThumbnail); string infpath = Functions.Downloader.DL.GetPath(true, "Channel", Data + ".json"); File.WriteAllText(infpath, JsonConvert.SerializeObject(c2)); try { Functions.Downloader.DL.ytc.Channels.GetUploadsAsync(c.Id).ForEachAsync(async (v) => { string infPath = Functions.Downloader.DL.GetPath(true, "Info", v.Id + ".json"); bool exist = File.Exists(infPath); if (exist) { SavedVideoObject sv = new SavedVideoObject(); sv.Resolution = res; sv.Video = JsonConvert.DeserializeObject(File.ReadAllText(infPath)); video.Add(sv); } else { try { var vinfo = await Functions.Downloader.DL.ytc.Videos.GetAsync(v.Id); SavedVideoObject sv = SavedVideo.CreateFrom(res, vinfo, Functions.Downloader.DL._DownloadThumbnail); video.Add(sv); } catch (Exception ex) { _ = ex; } } }).Wait(); } catch (Exception ex) { _ = ex; } } catch (Exception ex2) { _ = ex2; } return video.ToArray(); } } return new SavedVideoObject[0]; } } }