public static IChannel CreateChannel(ChannelPOCO poco, string dirPath = null) { SiteType site = poco.Site; IChannel channel = null; switch (site) { case SiteType.YouTube: channel = new YouChannel { ID = poco.ID, Title = poco.Title, SubTitle = poco.SubTitle, // .WordWrap(80); Thumbnail = poco.Thumbnail, CountNew = poco.Countnew, UseFast = poco.UseFast }; if (poco.Items != null) { foreach (VideoItemPOCO item in poco.Items) { channel.AddNewItem(VideoItemFactory.CreateVideoItem(item, site)); } } if (poco.Playlists != null) { foreach (PlaylistPOCO playlist in poco.Playlists) { channel.ChannelPlaylists.Add(PlaylistFactory.CreatePlaylist(playlist, site)); } } break; case SiteType.RuTracker: channel = null; break; case SiteType.Tapochek: channel = null; break; } if (channel == null) { throw new Exception(poco.ID); } if (dirPath != null) { channel.DirPath = dirPath; } channel.ChannelItemsCollectionView = CollectionViewSource.GetDefaultView(channel.ChannelItems); return(channel); }
private static async Task SyncPlaylists(IChannel channel, List <string> dbids) { List <string> plIdsNet = await YouTubeSite.GetChannelPlaylistsIdsNetAsync(channel.ID).ConfigureAwait(true); List <string> plIdsDb = await db.GetChannelsPlaylistsIdsListDbAsync(channel.ID).ConfigureAwait(false); foreach (string playlistId in plIdsDb) { if (plIdsNet.Contains(playlistId)) { // обновим плейлисты, которые есть уже в базе List <string> plitemsIdsNet = await YouTubeSite.GetPlaylistItemsIdsListNetAsync(playlistId, 0).ConfigureAwait(true); List <string> plitemsIdsDb = await db.GetPlaylistItemsIdsListDbAsync(playlistId).ConfigureAwait(false); List <string> ids = plitemsIdsNet.Where(netid => !plitemsIdsDb.Contains(netid)).ToList(); if (!ids.Any()) { continue; } var lstInDb = new List <string>(); var lstNoInDb = new List <string>(); foreach (string id in ids) { if (dbids.Contains(id)) { lstInDb.Add(id); } else { lstNoInDb.Add(id); } } foreach (string id in lstInDb) { await db.UpdatePlaylistAsync(playlistId, id, channel.ID).ConfigureAwait(false); } IEnumerable <List <string> > chanks = lstNoInDb.SplitList(); foreach (List <string> list in chanks) { List <VideoItemPOCO> trlist = await YouTubeSite.GetVideosListByIdsLiteAsync(list).ConfigureAwait(true); List <string> trueIds = (from poco in trlist where poco.ParentID == channel.ID select poco.ID).ToList(); if (!trueIds.Any()) { continue; } // странный вариант, через аплоад видео не пришло, а через плейлист - есть, но оставим await InsertNewItems(trueIds, channel, playlistId).ConfigureAwait(true); } } else { // просто удалим уже не существующий в инете плейлист из базы await db.DeletePlaylistAsync(playlistId).ConfigureAwait(false); } } // новые плейлисты foreach (string playlistId in plIdsNet.Where(playlistId => !plIdsDb.Contains(playlistId))) { PlaylistPOCO plpoco = await YouTubeSite.GetPlaylistNetAsync(playlistId).ConfigureAwait(true); List <string> plpocoitems = await YouTubeSite.GetPlaylistItemsIdsListNetAsync(playlistId, 0).ConfigureAwait(true); plpoco.PlaylistItems.AddRange(plpocoitems); IPlaylist pl = PlaylistFactory.CreatePlaylist(plpoco, channel.Site); pl.State = SyncState.Added; channel.ChannelPlaylists.Add(pl); channel.PlaylistCount += 1; await db.InsertPlaylistAsync(pl).ConfigureAwait(false); dbids = await db.GetChannelItemsIdListDbAsync(channel.ID, 0, 0).ConfigureAwait(false); List <string> ids = plpocoitems.Where(netid => !dbids.Contains(netid)).ToList(); IEnumerable <List <string> > chanks = ids.SplitList(); foreach (List <string> trueIds in chanks) { await InsertNewItems(trueIds, channel, playlistId).ConfigureAwait(true); } foreach (string plpocoitem in plpocoitems) { await db.UpdatePlaylistAsync(pl.ID, plpocoitem, channel.ID).ConfigureAwait(false); } } }
public static async Task SyncChannelPlaylistsAsync(IChannel channel) { switch (channel.Site) { case SiteType.YouTube: List <PlaylistPOCO> fbres = await YouTubeSite.GetChannelPlaylistsNetAsync(channel.ID).ConfigureAwait(true); var pls = new List <IPlaylist>(); pls.AddRange(fbres.Select(poco => PlaylistFactory.CreatePlaylist(poco, channel.Site))); if (pls.Any()) { List <string> ids = await db.GetChannelItemsIdListDbAsync(channel.ID, 0, 0).ConfigureAwait(false); await db.DeleteChannelPlaylistsAsync(channel.ID).ConfigureAwait(false); channel.ChannelPlaylists.Clear(); channel.PlaylistCount = pls.Count; foreach (IPlaylist playlist in pls) { await db.InsertPlaylistAsync(playlist).ConfigureAwait(false); List <string> plv = await YouTubeSite.GetPlaylistItemsIdsListNetAsync(playlist.ID, 0).ConfigureAwait(true); foreach (string id in plv) { if (ids.Contains(id)) { await db.UpdatePlaylistAsync(playlist.ID, id, channel.ID).ConfigureAwait(false); if (!playlist.PlItems.Contains(id)) { playlist.PlItems.Add(id); } } else { IVideoItem item = await VideoItemFactory.GetVideoItemNetAsync(id, channel.Site).ConfigureAwait(false); if (item.ParentID != channel.ID) { continue; } channel.AddNewItem(item); await db.InsertItemAsync(item).ConfigureAwait(false); await db.UpdatePlaylistAsync(playlist.ID, item.ID, channel.ID).ConfigureAwait(false); if (!playlist.PlItems.Contains(id)) { playlist.PlItems.Add(id); } } } channel.ChannelPlaylists.Add(playlist); } } break; } }