private MediaContainer GetItemsFromPlaylist(IProvider prov, int userid, string id, BreadCrumbs info) { var PlaylistID = -1; int.TryParse(id, out PlaylistID); if (PlaylistID == 0) { using (var session = DatabaseFactory.SessionFactory.OpenSession()) { var ret = new BaseObject(prov.NewMediaContainer(MediaContainerTypes.Show, "Playlists", true, true, info)); if (!ret.Init()) return new MediaContainer(); //Normal var retPlaylists = new List<Video>(); var playlists = RepoFactory.Playlist.GetAll(); var sessionWrapper = session.Wrap(); foreach (var playlist in playlists) { var dir = new Directory(); dir.Key = prov.ShortUrl(prov.ConstructPlaylistIdUrl(userid, playlist.PlaylistID)); dir.Title = playlist.PlaylistName; dir.Id = playlist.PlaylistID.ToString(); dir.AnimeType = JMMContracts.PlexAndKodi.AnimeTypes.AnimePlaylist.ToString(); var episodeID = -1; if (int.TryParse(playlist.PlaylistItems.Split('|')[0].Split(';')[1], out episodeID)) { var anime = RepoFactory.AnimeEpisode.GetByID(episodeID).GetAnimeSeries(sessionWrapper).GetAnime(); dir.Thumb = anime?.GetDefaultPosterDetailsNoBlanks(sessionWrapper)?.GenPoster(); dir.Art = anime?.GetDefaultFanartDetailsNoBlanks(sessionWrapper)?.GenArt(); dir.Banner = anime?.GetDefaultWideBannerDetailsNoBlanks(sessionWrapper)?.GenArt(); } else { dir.Thumb = Helper.ConstructSupportImageLink("plex_404V.png"); } dir.LeafCount = playlist.PlaylistItems.Split('|').Count().ToString(); dir.ViewedLeafCount = "0"; retPlaylists.Add(prov, dir, info); } retPlaylists = retPlaylists.OrderBy(a => a.Title).ToList(); ret.Childrens = retPlaylists; return ret.GetStream(prov); } } if (PlaylistID > 0) { var playlist = RepoFactory.Playlist.GetByID(PlaylistID); var playlistItems = playlist.PlaylistItems.Split('|'); var vids = new List<Video>(); var ret = new BaseObject(prov.NewMediaContainer(MediaContainerTypes.Episode, playlist.PlaylistName, true, true, info)); if (!ret.Init()) return new MediaContainer(); //Normal foreach (var item in playlistItems) { try { var episodeID = -1; int.TryParse(item.Split(';')[1], out episodeID); if (episodeID < 0) return new MediaContainer() { ErrorString = "Invalid Episode ID" }; AnimeEpisode e = RepoFactory.AnimeEpisode.GetByID(episodeID); if (e == null) return new MediaContainer() { ErrorString = "Invalid Episode" }; KeyValuePair<AnimeEpisode, Contract_AnimeEpisode> ep = new KeyValuePair<AnimeEpisode, Contract_AnimeEpisode>(e, e.GetUserContract(userid)); if (ep.Value != null && ep.Value.LocalFileCount == 0) continue; AnimeSeries ser = RepoFactory.AnimeSeries.GetByID(ep.Key.AnimeSeriesID); if (ser == null) return new MediaContainer() { ErrorString = "Invalid Series" }; Contract_AnimeSeries con = ser.GetUserContract(userid); if (con == null) return new MediaContainer() { ErrorString = "Invalid Series, Contract not found" }; Video v = Helper.VideoFromAnimeEpisode(prov, con.CrossRefAniDBTvDBV2, ep, userid); if (v != null && v.Medias != null && v.Medias.Count > 0) { Helper.AddInformationFromMasterSeries(v, con, ser.GetPlexContract(userid)); v.Type = "episode"; vids.Add(prov, v, info); if (prov.ConstructFakeIosParent) v.GrandparentKey = prov.Proxyfy(prov.ConstructFakeIosThumb(userid, v.ParentThumb, v.Art ?? v.ParentArt ?? v.GrandparentArt)); v.ParentKey = null; } } catch (Exception e) { //Fast fix if file do not exist, and still is in db. (Xml Serialization of video info will fail on null) } } ret.MediaContainer.RandomizeArt(vids); ret.Childrens = vids; return ret.GetStream(prov); } return new MediaContainer() { ErrorString = "Invalid Playlist" }; }