public static void Init() { JMMUser.Populate(a => a.JMMUserID); CloudAccount.Populate(a => a.CloudID); ImportFolder.Populate(a => a.ImportFolderID); AniDB_Anime.Populate(a => a.AniDB_AnimeID); AniDB_Episode.Populate(a => a.AniDB_EpisodeID); AniDB_File.Populate(a => a.AniDB_FileID); AniDB_Anime_Title.Populate(a => a.AniDB_Anime_TitleID); AniDB_Anime_Tag.Populate(a => a.AniDB_Anime_TagID); AniDB_Tag.Populate(a => a.AniDB_TagID); CustomTag.Populate(a => a.CustomTagID); CrossRef_CustomTag.Populate(a => a.CrossRef_CustomTagID); CrossRef_File_Episode.Populate(a => a.CrossRef_File_EpisodeID); VideoLocalPlace.Populate(a => a.VideoLocal_Place_ID); VideoLocal.Populate(a => a.VideoLocalID); VideoLocalUser.Populate(a => a.VideoLocal_UserID); GroupFilter.Populate(a => a.GroupFilterID); AnimeEpisode.Populate(a => a.AnimeEpisodeID); AnimeEpisode_User.Populate(a => a.AnimeEpisode_UserID); AnimeSeries.Populate(a => a.AnimeSeriesID); AnimeSeries_User.Populate(a => a.AnimeSeries_UserID); AnimeGroup.Populate(a => a.AnimeGroupID); AnimeGroup_User.Populate(a => a.AnimeGroup_UserID); GroupFilter.PostProcess(); CleanUpMemory(); }
private static void PopulateVideoEpisodeFromAnimeEpisode(Video v, AnimeEpisode ep, int userid) { AniDB_Episode aep = ep.AniDB_Episode; if (aep != null) { v.EpNumber = aep.EpisodeNumber; v.Index = aep.EpisodeNumber.ToString(); v.Title = aep.EnglishName; v.OriginalTitle = aep.RomajiName; v.Rating = (float.Parse(aep.Rating, CultureInfo.InvariantCulture)).ToString(CultureInfo.InvariantCulture); if (aep.AirDateAsDate.HasValue) { v.Year = aep.AirDateAsDate.Value.Year.ToString(); v.OriginallyAvailableAt = aep.AirDateAsDate.Value.ToPlexDate(); } AnimeEpisode_User epuser = ep.GetUserRecord(userid); if (epuser != null) { v.ViewCount = epuser.WatchedCount.ToString(); if (epuser.WatchedDate.HasValue) { v.LastViewedAt = epuser.WatchedDate.Value.ToUnixTime(); } } MetroContract_Anime_Episode contract = new MetroContract_Anime_Episode(); JMMServiceImplementationMetro.SetTvDBInfo(aep.AnimeID, aep, ref contract); v.Thumb = contract.GenPoster(); v.Summary = contract.EpisodeOverview; } }
public string RemoveLinkAniDBTvDBEpisode(int aniDBEpisodeID, int tvDBEpisodeID) { try { AniDB_Episode ep = RepoFactory.AniDB_Episode.GetByEpisodeID(aniDBEpisodeID); if (ep == null) { return("Could not find Episode"); } CrossRef_AniDB_TvDB_Episode_Override xref = RepoFactory.CrossRef_AniDB_TvDB_Episode_Override.GetByAniDBAndTvDBEpisodeIDs(aniDBEpisodeID, tvDBEpisodeID); if (xref == null) { return("Could not find Link!"); } RepoFactory.CrossRef_AniDB_TvDB_Episode_Override.Delete(xref.CrossRef_AniDB_TvDB_Episode_OverrideID); return(string.Empty); } catch (Exception ex) { logger.Error(ex, ex.ToString()); return(ex.Message); } }
public static void CreateAnimeEpisode(this AniDB_Episode episode, ISession session, int animeSeriesID) { // check if there is an existing episode for this EpisodeID SVR_AnimeEpisode existingEp = RepoFactory.AnimeEpisode.GetByAniDBEpisodeID(episode.EpisodeID); if (existingEp == null) { SVR_AnimeEpisode animeEp = new SVR_AnimeEpisode(); animeEp.Populate(episode); animeEp.AnimeSeriesID = animeSeriesID; RepoFactory.AnimeEpisode.Save(animeEp); } else { if (existingEp.AnimeSeriesID != animeSeriesID) { existingEp.AnimeSeriesID = animeSeriesID; } existingEp.PlexContract = null; RepoFactory.AnimeEpisode.Save(existingEp); foreach (var episodeUser in RepoFactory.AnimeEpisode_User.GetByEpisodeID(existingEp.AnimeEpisodeID)) { RepoFactory.AnimeEpisode_User.SaveWithOpenTransaction(session, episodeUser); } } }
public string RemoveLinkAniDBTraktEpisode(int aniDBEpisodeID, string traktEpisodeID) { try { AniDB_Episode ep = Repo.Instance.AniDB_Episode.GetByEpisodeID(aniDBEpisodeID); if (ep == null) { return("Could not find Episode"); } using (var upd = Repo.Instance.CrossRef_AniDB_Provider.BeginAddOrUpdate(() => Repo.Instance.CrossRef_AniDB_Provider.GetByAnimeIDAndType(ep.AnimeID, CrossRefType.TraktTV).FirstOrDefault(a => a.EpisodesListOverride.GetByProviderId(traktEpisodeID) != null))) { if (!upd.IsUpdate) { return("Could not find Link!"); } upd.Entity.EpisodesListOverride.DeleteFromProviderEpisodeId(traktEpisodeID); if (upd.Entity.EpisodesListOverride.NeedPersitance) { upd.Commit(); } } return(string.Empty); } catch (Exception ex) { logger.Error(ex, ex.ToString()); return(ex.Message); } }
public AniDB(AniDB_Episode ep) { if (!decimal.TryParse(ep.Rating, out var rating)) { rating = 0; } if (!int.TryParse(ep.Votes, out var votes)) { votes = 0; } var titles = RepoFactory.AniDB_Episode_Title.GetByEpisodeID(ep.EpisodeID); ID = ep.EpisodeID; Type = MapAniDBEpisodeType(ep.GetEpisodeTypeEnum()); EpisodeNumber = ep.EpisodeNumber; AirDate = ep.GetAirDateAsDate(); Description = ep.Description; Rating = new Rating { MaxValue = 10, Value = rating, Votes = votes, Source = "AniDB", }; Titles = titles.Select(a => new Title { Name = a.Title, Language = a.Language.ToLower(), Default = false, Source = "AniDB", } ).ToList(); }
public static void Init() { JMMUser.Populate(); CloudAccount.Populate(); ImportFolder.Populate(); AniDB_Anime.Populate(); AniDB_Episode.Populate(); AniDB_File.Populate(); AniDB_Anime_Title.Populate(); AniDB_Anime_Tag.Populate(); AniDB_Tag.Populate(); CustomTag.Populate(); CrossRef_CustomTag.Populate(); CrossRef_File_Episode.Populate(); VideoLocalPlace.Populate(); VideoLocal.Populate(); VideoLocalUser.Populate(); GroupFilter.Populate(); AnimeEpisode.Populate(); AnimeEpisode_User.Populate(); AnimeSeries.Populate(); AnimeSeries_User.Populate(); AnimeGroup.Populate(); AnimeGroup_User.Populate(); // Update Contracts if necessary try { JMMUser.RegenerateDb(); CloudAccount.RegenerateDb(); ImportFolder.RegenerateDb(); AniDB_Anime.RegenerateDb(); AniDB_Episode.RegenerateDb(); AniDB_File.RegenerateDb(); AniDB_Anime_Title.RegenerateDb(); AniDB_Anime_Tag.RegenerateDb(); AniDB_Tag.RegenerateDb(); CustomTag.RegenerateDb(); CrossRef_CustomTag.RegenerateDb(); CrossRef_File_Episode.RegenerateDb(); VideoLocalPlace.RegenerateDb(); VideoLocal.RegenerateDb(); VideoLocalUser.RegenerateDb(); AnimeEpisode.RegenerateDb(); AnimeEpisode_User.RegenerateDb(); AnimeSeries.RegenerateDb(); AnimeSeries_User.RegenerateDb(); AnimeGroup.RegenerateDb(); AnimeGroup_User.RegenerateDb(); GroupFilter.RegenerateDb(); GroupFilter.PostProcess(); } catch (Exception e) { LogManager.GetCurrentClassLogger().Error(e, "There was an error starting the Database Factory"); } CleanUpMemory(); }
public AniDB_Episode GetByEpisodeID(int id) { using (var session = JMMService.SessionFactory.OpenSession()) { AniDB_Episode cr = session .CreateCriteria(typeof(AniDB_Episode)) .Add(Restrictions.Eq("EpisodeID", id)) .UniqueResult <AniDB_Episode>(); return(cr); } }
public EpisodeDetails(AniDB_Episode episode, SVR_AniDB_Anime anime, SVR_AnimeSeries series = null) { ID = episode.EpisodeID; Title = Episode.GetEpisodeTitle(episode.EpisodeID); Number = episode.EpisodeNumber; Type = Episode.MapAniDBEpisodeType(episode.GetEpisodeTypeEnum()); AirDate = (DateTime)episode.GetAirDateAsDate(); InCollection = series != null; SeriesID = anime.AnimeID; SeriesTitle = series?.GetSeriesName() ?? anime.PreferredTitle; SeriesPoster = Series.GetDefaultImage(anime.AnimeID, ImageSizeType.Poster) ?? Series.GetAniDBPoster(anime.AnimeID); }
public void Save(AniDB_Episode obj) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } }
public static void CreateAnimeEpisode(this AniDB_Episode episode, ISession session, int animeSeriesID) { // check if there is an existing episode for this EpisodeID SVR_AnimeEpisode existingEp = RepoFactory.AnimeEpisode.GetByAniDBEpisodeID(episode.EpisodeID) ?? new SVR_AnimeEpisode(); existingEp.Populate(episode); existingEp.AnimeSeriesID = animeSeriesID; RepoFactory.AnimeEpisode.Save(existingEp); // We might have removed our AnimeEpisode_User records when wiping out AnimeEpisodes, recreate them if there's watched files var vlUsers = existingEp?.GetVideoLocals() .SelectMany(a => RepoFactory.VideoLocalUser.GetByVideoLocalID(a.VideoLocalID)).ToList(); // get the list of unique users var users = vlUsers.Select(a => a.JMMUserID).Distinct(); if (vlUsers.Count > 0) { // per user. An episode is watched if any file is foreach (int uid in users) { // get the last watched file var vlUser = vlUsers.Where(a => a.JMMUserID == uid && a.WatchedDate != null) .MaxBy(a => a.WatchedDate).FirstOrDefault(); // create or update the record var epUser = RepoFactory.AnimeEpisode_User.GetByUserIDAndEpisodeID(uid, existingEp.AnimeEpisodeID); if (epUser == null) { epUser = new SVR_AnimeEpisode_User { JMMUserID = uid, WatchedDate = vlUser?.WatchedDate, PlayedCount = vlUser != null ? 1 : 0, WatchedCount = vlUser != null ? 1 : 0, AnimeSeriesID = animeSeriesID, AnimeEpisodeID = existingEp.AnimeEpisodeID }; RepoFactory.AnimeEpisode_User.Save(epUser); } } } else { // since these are created with VideoLocal_User, // these will probably never exist, but if they do, cover our bases foreach (var episodeUser in RepoFactory.AnimeEpisode_User.GetByEpisodeID(existingEp.AnimeEpisodeID)) { RepoFactory.AnimeEpisode_User.Save(episodeUser); } } }
public static void Init() { JMMUser.Populate(); CloudAccount.Populate(); ImportFolder.Populate(); AniDB_Anime.Populate(); AniDB_Episode.Populate(); AniDB_File.Populate(); AniDB_Anime_Title.Populate(); AniDB_Anime_Tag.Populate(); AniDB_Tag.Populate(); CustomTag.Populate(); CrossRef_CustomTag.Populate(); CrossRef_File_Episode.Populate(); VideoLocalPlace.Populate(); VideoLocal.Populate(); VideoLocalUser.Populate(); GroupFilter.Populate(); AnimeEpisode.Populate(); AnimeEpisode_User.Populate(); AnimeSeries.Populate(); AnimeSeries_User.Populate(); AnimeGroup.Populate(); AnimeGroup_User.Populate(); // Update Contracts if necessary JMMUser.RegenerateDb(); CloudAccount.RegenerateDb(); ImportFolder.RegenerateDb(); AniDB_Anime.RegenerateDb(); AniDB_Episode.RegenerateDb(); AniDB_File.RegenerateDb(); AniDB_Anime_Title.RegenerateDb(); AniDB_Anime_Tag.RegenerateDb(); AniDB_Tag.RegenerateDb(); CustomTag.RegenerateDb(); CrossRef_CustomTag.RegenerateDb(); CrossRef_File_Episode.RegenerateDb(); VideoLocalPlace.RegenerateDb(); VideoLocal.RegenerateDb(); VideoLocalUser.RegenerateDb(); AnimeEpisode.RegenerateDb(); AnimeEpisode_User.RegenerateDb(); AnimeSeries.RegenerateDb(); AnimeSeries_User.RegenerateDb(); AnimeGroup.RegenerateDb(); AnimeGroup_User.RegenerateDb(); GroupFilter.RegenerateDb(); GroupFilter.PostProcess(); CleanUpMemory(); }
public static void CreateAnimeEpisode(this AniDB_Episode episode, int animeSeriesID) { SVR_AnimeEpisode existingEp; // check if there is an existing episode for this EpisodeID using (var upd = Repo.Instance.AnimeEpisode.BeginAddOrUpdate(() => Repo.Instance.AnimeEpisode.GetByAniDBEpisodeID(episode.EpisodeID))) { upd.Entity.Populate_RA(episode); upd.Entity.AnimeSeriesID = animeSeriesID; existingEp = upd.Commit(); } Repo.Instance.AnimeEpisode_User.Touch(() => Repo.Instance.AnimeEpisode_User.GetByEpisodeID(existingEp.AnimeEpisodeID)); }
public static void Populate(this AniDB_Episode episode, Raw_AniDB_Episode epInfo) { episode.AirDate = epInfo.AirDate; episode.AnimeID = epInfo.AnimeID; episode.DateTimeUpdated = DateTime.Now; episode.EpisodeID = epInfo.EpisodeID; episode.EpisodeNumber = epInfo.EpisodeNumber; episode.EpisodeType = epInfo.EpisodeType; episode.LengthSeconds = epInfo.LengthSeconds; episode.Rating = epInfo.Rating.ToString(CultureInfo.InvariantCulture); episode.Votes = epInfo.Votes.ToString(CultureInfo.InvariantCulture); episode.Description = epInfo.Description ?? string.Empty; }
public static void CreateAnimeEpisode(this AniDB_Episode episode, ISession session, int animeSeriesID) { // check if there is an existing episode for this EpisodeID SVR_AnimeEpisode existingEp = RepoFactory.AnimeEpisode.GetByAniDBEpisodeID(episode.EpisodeID); if (existingEp == null) { SVR_AnimeEpisode animeEp = new SVR_AnimeEpisode(); animeEp.Populate(episode); animeEp.AnimeSeriesID = animeSeriesID; RepoFactory.AnimeEpisode.Save(animeEp); } }
public static void Populate(this AniDB_Episode episode, Raw_AniDB_Episode epInfo) { episode.AirDate = epInfo.AirDate; episode.AnimeID = epInfo.AnimeID; episode.DateTimeUpdated = DateTime.Now; episode.EnglishName = epInfo.EnglishName; episode.EpisodeID = epInfo.EpisodeID; episode.EpisodeNumber = epInfo.EpisodeNumber; episode.EpisodeType = epInfo.EpisodeType; episode.LengthSeconds = epInfo.LengthSeconds; episode.Rating = epInfo.Rating.ToString(); episode.RomajiName = epInfo.RomajiName; episode.Votes = epInfo.Votes.ToString(); }
private static TvDB_Episode GetTvDBEpisodeFromAniDB(ISession session, AniDB_Episode aep, CrossRef_AniDB_TvDBV2 xref_tvdb2) { int epnumber = (aep.EpisodeNumber + xref_tvdb2.TvDBStartEpisodeNumber - 1) - (xref_tvdb2.AniDBStartEpisodeNumber - 1); TvDB_Episode tvep = null; int season = xref_tvdb2.TvDBSeasonNumber; List <TvDB_Episode> tvdb_eps = RepoFactory.TvDB_Episode.GetBySeriesIDAndSeasonNumber(xref_tvdb2.TvDBID, season); tvep = tvdb_eps.Find(a => a.EpisodeNumber == epnumber); if (tvep != null) { return(tvep); } int lastSeason = RepoFactory.TvDB_Episode.getLastSeasonForSeries(xref_tvdb2.TvDBID); int previousSeasonsCount = 0; // we checked once, so increment the season season++; previousSeasonsCount += tvdb_eps.Count; do { if (season == 0) { break; // Specials will often be wrong } if (season > lastSeason) { break; } if (epnumber - previousSeasonsCount <= 0) { break; } // This should be 1 or 0, hopefully 1 tvdb_eps = RepoFactory.TvDB_Episode.GetBySeriesIDAndSeasonNumber(xref_tvdb2.TvDBID, season); tvep = tvdb_eps.Find(a => a.EpisodeNumber == epnumber - previousSeasonsCount); AddCrossRef_AniDB_TvDBV2(session, aep.AnimeID, previousSeasonsCount + 1, xref_tvdb2.TvDBID, season, xref_tvdb2.GetTvDBSeries()?.SeriesName ?? ""); if (tvep != null) { break; } previousSeasonsCount += tvdb_eps.Count; season++; } while (true); return(tvep); }
public void Delete(int id) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { AniDB_Episode cr = GetByID(id); if (cr != null) { session.Delete(cr); transaction.Commit(); } } } }
public void UpdateContract(SVR_AnimeEpisode_User aeu) { CL_AnimeEpisode_User caep = aeu.Contract ?? new CL_AnimeEpisode_User(); SVR_AnimeEpisode ep = Repo.Instance.AnimeEpisode.GetByID(aeu.AnimeEpisodeID); if (ep == null) { return; } AniDB_Episode aniEp = ep.AniDB_Episode; caep.AniDB_EpisodeID = ep.AniDB_EpisodeID; caep.AnimeEpisodeID = ep.AnimeEpisodeID; caep.AnimeSeriesID = ep.AnimeSeriesID; caep.DateTimeUpdated = ep.DateTimeUpdated; caep.PlayedCount = aeu.PlayedCount; caep.StoppedCount = aeu.StoppedCount; caep.WatchedCount = aeu.WatchedCount; caep.WatchedDate = aeu.WatchedDate; var englishTitle = Repo.Instance.AniDB_Episode_Title.GetByEpisodeIDAndLanguage(ep.AniDB_EpisodeID, "EN") .FirstOrDefault()?.Title; var romajiTitle = Repo.Instance.AniDB_Episode_Title.GetByEpisodeIDAndLanguage(ep.AniDB_EpisodeID, "X-JAT") .FirstOrDefault()?.Title; caep.AniDB_EnglishName = englishTitle; caep.AniDB_RomajiName = romajiTitle; caep.EpisodeNameEnglish = englishTitle; caep.EpisodeNameRomaji = romajiTitle; if (aniEp != null) { caep.AniDB_AirDate = aniEp.GetAirDateAsDate(); caep.AniDB_LengthSeconds = aniEp.LengthSeconds; caep.AniDB_Rating = aniEp.Rating; caep.AniDB_Votes = aniEp.Votes; caep.EpisodeNumber = aniEp.EpisodeNumber; caep.Description = aniEp.Description; caep.EpisodeType = aniEp.EpisodeType; } /* * //TODO if this is needed, calculating it in here will not affect performance * caep.ReleaseGroups = new List<CL_AniDB_GroupStatus>(); */ aeu.Contract = caep; }
public static CL_AniDB_Episode ToClient(this AniDB_Episode ep) { var titles = Repo.Instance.AniDB_Episode_Title.GetByEpisodeID(ep.EpisodeID); return(new CL_AniDB_Episode { EpisodeID = ep.EpisodeID, AnimeID = ep.AnimeID, LengthSeconds = ep.LengthSeconds, Rating = ep.Rating, Votes = ep.Votes, EpisodeNumber = ep.EpisodeNumber, EpisodeType = ep.EpisodeType, Description = ep.Description, AirDate = ep.AirDate, DateTimeUpdated = ep.DateTimeUpdated, Titles = titles.ToDictionary(a => a.Language, a => a.Title) }); }
public static void CreateAnimeEpisode(this AniDB_Episode episode, int animeSeriesID) { SVR_AnimeEpisode existingEp; // check if there is an existing episode for this EpisodeID using (var upd = Repo.Instance.AnimeEpisode.BeginAddOrUpdate(() => Repo.Instance.AnimeEpisode.GetByAniDBEpisodeID(episode.EpisodeID))) { upd.Entity.Populate_RA(episode); upd.Entity.AnimeSeriesID = animeSeriesID; existingEp = upd.Commit(); } // We might have removed our AnimeEpisode_User records when wiping out AnimeEpisodes, recreate them if there's watched files foreach (var videoLocal in existingEp.GetVideoLocals()) { var videoLocalUsers = Repo.Instance.VideoLocal_User.GetByVideoLocalID(videoLocal.VideoLocalID); if (videoLocalUsers.Count > 0) { foreach (var videoLocalUser in videoLocalUsers) { using (var upd = Repo.Instance.AnimeEpisode_User.BeginAddOrUpdate(() => Repo.Instance.AnimeEpisode_User.GetByUserIDAndEpisodeID( videoLocalUser.JMMUserID, existingEp.AnimeEpisodeID))) { upd.Entity.JMMUserID = videoLocalUser.JMMUserID; upd.Entity.WatchedDate = videoLocalUser.WatchedDate; upd.Entity.PlayedCount = videoLocalUser.WatchedDate.HasValue ? 1 : 0; upd.Entity.WatchedCount = videoLocalUser.WatchedDate.HasValue ? 1 : 0; upd.Entity.AnimeSeriesID = animeSeriesID; upd.Entity.AnimeEpisodeID = existingEp.AnimeEpisodeID; upd.Commit(); } } } else { // these will probably never exist, but if they do, cover our bases Repo.Instance.AnimeEpisode_User.Touch(() => Repo.Instance.AnimeEpisode_User.GetByEpisodeID(existingEp.AnimeEpisodeID)); } } }
public void UpdateContract(ISession session, AnimeEpisode_User aeu) { AnimeEpisodeRepository aerepo = new AnimeEpisodeRepository(); Contract_AnimeEpisode caep = aeu.Contract ?? new Contract_AnimeEpisode(); AnimeEpisode ep = aerepo.GetByID(aeu.AnimeEpisodeID); if (ep == null) { return; } AniDB_Episode aniEp = ep.AniDB_Episode; caep.AniDB_EpisodeID = ep.AniDB_EpisodeID; caep.AnimeEpisodeID = ep.AnimeEpisodeID; caep.AnimeSeriesID = ep.AnimeSeriesID; caep.DateTimeUpdated = ep.DateTimeUpdated; caep.IsWatched = aeu.WatchedCount > 0 ? 1 : 0; caep.PlayedCount = aeu.PlayedCount; caep.StoppedCount = aeu.StoppedCount; caep.WatchedCount = aeu.WatchedCount; caep.WatchedDate = aeu.WatchedDate; if (aniEp != null) { caep.AniDB_AirDate = aniEp.AirDateAsDate; caep.AniDB_EnglishName = aniEp.EnglishName; caep.AniDB_LengthSeconds = aniEp.LengthSeconds; caep.AniDB_Rating = aniEp.Rating; caep.AniDB_RomajiName = aniEp.RomajiName; caep.AniDB_Votes = aniEp.Votes; caep.EpisodeNumber = aniEp.EpisodeNumber; caep.EpisodeNameRomaji = aniEp.RomajiName; caep.EpisodeNameEnglish = aniEp.EnglishName; caep.EpisodeType = aniEp.EpisodeType; } //TODO if this is needed, calculating it in here will not affect performance caep.ReleaseGroups = new List <Contract_AniDBReleaseGroup>(); aeu.Contract = caep; }
public void UpdateContract(SVR_AnimeEpisode_User aeu) { Shoko.Models.Client.CL_AnimeEpisode_User caep = aeu.Contract ?? new CL_AnimeEpisode_User(); SVR_AnimeEpisode ep = RepoFactory.AnimeEpisode.GetByID(aeu.AnimeEpisodeID); if (ep == null) { return; } AniDB_Episode aniEp = ep.AniDB_Episode; caep.AniDB_EpisodeID = ep.AniDB_EpisodeID; caep.AnimeEpisodeID = ep.AnimeEpisodeID; caep.AnimeSeriesID = ep.AnimeSeriesID; caep.DateTimeUpdated = ep.DateTimeUpdated; caep.PlayedCount = aeu.PlayedCount; caep.StoppedCount = aeu.StoppedCount; caep.WatchedCount = aeu.WatchedCount; caep.WatchedDate = aeu.WatchedDate; if (aniEp != null) { caep.AniDB_AirDate = aniEp.GetAirDateAsDate(); caep.AniDB_EnglishName = aniEp.EnglishName; caep.AniDB_LengthSeconds = aniEp.LengthSeconds; caep.AniDB_Rating = aniEp.Rating; caep.AniDB_RomajiName = aniEp.RomajiName; caep.AniDB_Votes = aniEp.Votes; caep.EpisodeNumber = aniEp.EpisodeNumber; caep.EpisodeNameRomaji = aniEp.RomajiName; caep.EpisodeNameEnglish = aniEp.EnglishName; caep.EpisodeType = aniEp.EpisodeType; } /* * //TODO if this is needed, calculating it in here will not affect performance * caep.ReleaseGroups = new List<CL_AniDB_GroupStatus>(); */ aeu.Contract = caep; }
public static void LinkAniDBTvDBEpisode(int aniDBID, int tvDBID) { AniDB_Episode ep = Repo.Instance.AniDB_Episode.GetByEpisodeID(aniDBID); TvDB_Episode tvep = Repo.Instance.TvDB_Episode.GetByID(tvDBID); using (var upd = Repo.Instance.CrossRef_AniDB_Provider.BeginAddOrUpdate(() => Repo.Instance.CrossRef_AniDB_Provider.GetByAnimeIdAndProvider(CrossRefType.TvDB, ep.AnimeID, tvep.SeriesID.ToString()))) { upd.Entity.EpisodesListOverride.AddOrUpdate(aniDBID, tvDBID.ToString(), tvep.SeasonNumber, ep.EpisodeNumber, ep.GetEpisodeTypeEnum(), MatchRating.UserVerified); if (upd.Entity.EpisodesListOverride.NeedPersitance) { upd.Commit(); } } using (var upd = Repo.Instance.AnimeEpisode.BeginAddOrUpdate(() => Repo.Instance.AnimeEpisode.GetByAniDBEpisodeID(aniDBID))) { SVR_AniDB_Anime.UpdateStatsByAnimeID(ep.AnimeID); upd.Commit(); } logger.Trace($"Changed tvdb episode association: {aniDBID}"); }
public static AniDB GetAniDBInfo(AniDB_Episode ep) { decimal rating = 0; int votes = 0; try { rating = decimal.Parse(ep.Rating); votes = int.Parse(ep.Votes); } catch {} var titles = RepoFactory.AniDB_Episode_Title.GetByEpisodeID(ep.EpisodeID); return(new AniDB { ID = ep.EpisodeID, Type = (EpisodeType)ep.EpisodeType, EpisodeNumber = ep.EpisodeNumber, AirDate = ep.GetAirDateAsDate(), Description = ep.Description, Rating = new Rating { Source = "AniDB", Value = rating, MaxValue = 10, Votes = votes }, Titles = titles.Select(a => new Title { Source = "AniDB", Name = a.Title, Language = a.Language }).ToList() }); }
private void ProcessFile_AniDB(SVR_VideoLocal vidLocal) { logger.Trace($"Checking for AniDB_File record for: {vidLocal.Hash} --- {vidLocal.FileName}"); // check if we already have this AniDB_File info in the database lock (vidLocal) { SVR_AniDB_File aniFile = null; if (!ForceAniDB) { aniFile = Repo.Instance.AniDB_File.GetByHashAndFileSize(vidLocal.Hash, vlocal.FileSize); if (aniFile == null) { logger.Trace("AniDB_File record not found"); } } // If cross refs were wiped, but the AniDB_File was not, we unfortunately need to requery the info List <CrossRef_File_Episode> crossRefs = Repo.Instance.CrossRef_File_Episode.GetByHash(vidLocal.Hash); if (crossRefs == null || crossRefs.Count == 0) { aniFile = null; } int animeID = 0; if (aniFile == null) { // get info from AniDB logger.Debug("Getting AniDB_File record from AniDB...."); // check if we already have a record using (var upd = Repo.Instance.AniDB_File.BeginAddOrUpdate(() => Repo.Instance.AniDB_File.GetByHashAndFileSize(vidLocal.Hash, vlocal.FileSize))) { bool skip = false; if (!upd.IsUpdate) { Raw_AniDB_File fileInfo = ShokoService.AnidbProcessor.GetFileInfo(vidLocal); if (fileInfo != null) { upd.Entity.Populate_RA(fileInfo); } else { skip = true; } } if (!skip) { //overwrite with local file name string localFileName = vidLocal.GetBestVideoLocalPlace()?.FullServerPath; localFileName = !string.IsNullOrEmpty(localFileName) ? Path.GetFileName(localFileName) : vidLocal.FileName; upd.Entity.FileName = localFileName; aniFile = upd.Commit(false); aniFile.CreateLanguages(); aniFile.CreateCrossEpisodes(localFileName); animeID = aniFile.AnimeID; } upd.Commit(); } } bool missingEpisodes = false; // if we still haven't got the AniDB_File Info we try the web cache or local records if (aniFile == null) { // check if we have any records from previous imports crossRefs = Repo.Instance.CrossRef_File_Episode.GetByHash(vidLocal.Hash); if (crossRefs == null || crossRefs.Count == 0) { // lets see if we can find the episode/anime info from the web cache if (ServerSettings.Instance.WebCache.XRefFileEpisode_Get) { List <Azure_CrossRef_File_Episode> xrefs = AzureWebAPI.Get_CrossRefFileEpisode(vidLocal); crossRefs = new List <CrossRef_File_Episode>(); if (xrefs == null || xrefs.Count == 0) { logger.Debug( $"Cannot find AniDB_File record or get cross ref from web cache record so exiting: {vidLocal.ED2KHash}"); return; } string fileName = vidLocal.GetBestVideoLocalPlace()?.FullServerPath; fileName = !string.IsNullOrEmpty(fileName) ? Path.GetFileName(fileName) : vidLocal.FileName; foreach (Azure_CrossRef_File_Episode xref in xrefs) { CrossRef_File_Episode xrefEnt = new CrossRef_File_Episode { Hash = vidLocal.ED2KHash, FileName = fileName, FileSize = vidLocal.FileSize, CrossRefSource = (int)CrossRefSource.WebCache, AnimeID = xref.AnimeID, EpisodeID = xref.EpisodeID, Percentage = xref.Percentage, EpisodeOrder = xref.EpisodeOrder }; bool duplicate = false; foreach (CrossRef_File_Episode xrefcheck in crossRefs) { if (xrefcheck.AnimeID == xrefEnt.AnimeID && xrefcheck.EpisodeID == xrefEnt.EpisodeID && xrefcheck.Hash == xrefEnt.Hash) { duplicate = true; } } if (!duplicate) { crossRefs.Add(xrefEnt); // in this case we need to save the cross refs manually as AniDB did not provide them Repo.Instance.CrossRef_File_Episode.BeginAdd(xrefEnt).Commit(); } } } else { logger.Debug($"Cannot get AniDB_File record so exiting: {vidLocal.ED2KHash}"); return; } } // we assume that all episodes belong to the same anime foreach (CrossRef_File_Episode xref in crossRefs) { animeID = xref.AnimeID; AniDB_Episode ep = Repo.Instance.AniDB_Episode.GetByEpisodeID(xref.EpisodeID); if (ep == null) { missingEpisodes = true; } } } else { // check if we have the episode info // if we don't, we will need to re-download the anime info (which also has episode info) if (aniFile.EpisodeCrossRefs.Count == 0) { animeID = aniFile.AnimeID; // if we have the anidb file, but no cross refs it means something has been broken logger.Debug($"Could not find any cross ref records for: {vidLocal.ED2KHash}"); missingEpisodes = true; } else { foreach (CrossRef_File_Episode xref in aniFile.EpisodeCrossRefs) { AniDB_Episode ep = Repo.Instance.AniDB_Episode.GetByEpisodeID(xref.EpisodeID); if (ep == null) { missingEpisodes = true; } animeID = xref.AnimeID; } } } // get from DB SVR_AniDB_Anime anime = Repo.Instance.AniDB_Anime.GetByAnimeID(animeID); var update = Repo.Instance.AniDB_AnimeUpdate.GetByAnimeID(animeID); bool animeRecentlyUpdated = false; if (anime != null && update != null) { TimeSpan ts = DateTime.Now - update.UpdatedAt; if (ts.TotalHours < 4) { animeRecentlyUpdated = true; } } else { missingEpisodes = true; } // even if we are missing episode info, don't get data more than once every 4 hours // this is to prevent banning if (missingEpisodes && !animeRecentlyUpdated) { logger.Debug("Getting Anime record from AniDB...."); anime = ShokoService.AnidbProcessor.GetAnimeInfoHTTP(animeID, true, ServerSettings.Instance.AutoGroupSeries || ServerSettings.Instance.AniDb.DownloadRelatedAnime); } // create the group/series/episode records if needed if (anime != null) { logger.Debug("Creating groups, series and episodes...."); // check if there is an AnimeSeries Record associated with this AnimeID SVR_AnimeSeries ser; using (var upd = Repo.Instance.AnimeSeries.BeginAddOrUpdate( () => Repo.Instance.AnimeSeries.GetByAnimeID(animeID), () => anime.CreateAnimeSeriesAndGroup() )) { upd.Entity.CreateAnimeEpisodes(); // check if we have any group status data for this associated anime // if not we will download it now if (Repo.Instance.AniDB_GroupStatus.GetByAnimeID(anime.AnimeID).Count == 0) { CommandRequest_GetReleaseGroupStatus cmdStatus = new CommandRequest_GetReleaseGroupStatus(anime.AnimeID, false); cmdStatus.Save(); } // update stats upd.Entity.EpisodeAddedDate = DateTime.Now; ser = upd.Commit(); } Repo.Instance.AnimeGroup.BatchAction(ser.AllGroupsAbove, ser.AllGroupsAbove.Count, (grp, _) => grp.EpisodeAddedDate = DateTime.Now, (true, false, false)); // We do this inside, as the info will not be available as needed otherwise List <SVR_VideoLocal> videoLocals = aniFile?.EpisodeIDs?.SelectMany(a => Repo.Instance.VideoLocal.GetByAniDBEpisodeID(a)) .Where(b => b != null) .ToList(); if (videoLocals != null) { // Copy over watched states foreach (var user in Repo.Instance.JMMUser.GetAll()) { var watchedVideo = videoLocals.FirstOrDefault(a => a?.GetUserRecord(user.JMMUserID)?.WatchedDate != null); // No files that are watched if (watchedVideo == null) { continue; } var watchedRecord = watchedVideo.GetUserRecord(user.JMMUserID); using (var upd = Repo.Instance.VideoLocal_User.BeginAddOrUpdate( () => vidLocal.GetUserRecord(user.JMMUserID), () => new VideoLocal_User { JMMUserID = user.JMMUserID, VideoLocalID = vidLocal.VideoLocalID } )) { upd.Entity.WatchedDate = watchedRecord.WatchedDate; upd.Entity.ResumePosition = watchedRecord.ResumePosition; upd.Commit(); } } if (ServerSettings.Instance.FileQualityFilterEnabled) { videoLocals.Sort(FileQualityFilter.CompareTo); List <SVR_VideoLocal> keep = videoLocals .Take(FileQualityFilter.Settings.MaxNumberOfFilesToKeep) .ToList(); foreach (SVR_VideoLocal vl2 in keep) { videoLocals.Remove(vl2); } if (!FileQualityFilter.Settings.AllowDeletionOfImportedFiles && videoLocals.Contains(vidLocal)) { videoLocals.Remove(vidLocal); } videoLocals = videoLocals.Where(a => !FileQualityFilter.CheckFileKeep(a)).ToList(); videoLocals.ForEach(a => a.Places.ForEach(b => b.RemoveAndDeleteFile())); } } // update stats for groups and series // update all the groups above this series in the heirarchy SVR_AniDB_Anime.UpdateStatsByAnimeID(animeID); } else { logger.Warn($"Unable to create AniDB_Anime for file: {vidLocal.FileName}"); } vidLocal.Places.ForEach(a => { a.RenameAndMoveAsRequired(); }); // Add this file to the users list if (ServerSettings.Instance.AniDb.MyList_AddFiles) { CommandRequest_AddFileToMyList cmd = new CommandRequest_AddFileToMyList(vidLocal.ED2KHash); cmd.Save(); } } }
public bool Init(AnimeEpisode aniepisode) { try { if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password)) { return(false); } username = ServerSettings.Trakt_Username; password = Utils.CalculateSHA1(ServerSettings.Trakt_Password, Encoding.Default); imdb_id = ""; AnimeSeries ser = aniepisode.GetAnimeSeries(); if (ser == null) { return(false); } CrossRef_AniDB_TraktRepository repCrossRef = new CrossRef_AniDB_TraktRepository(); CrossRef_AniDB_Trakt xref = repCrossRef.GetByAnimeID(ser.AniDB_ID); if (xref == null) { return(false); } Trakt_ShowRepository repShows = new Trakt_ShowRepository(); Trakt_Show show = repShows.GetByTraktID(xref.TraktID); if (show == null) { return(false); } if (!show.TvDB_ID.HasValue) { return(false); } tvdb_id = show.TvDB_ID.Value.ToString(); title = show.Title; year = show.Year; int retEpNum = 0, retSeason = 0; GetTraktEpisodeNumber(aniepisode, show, xref.TraktSeasonNumber, ref retEpNum, ref retSeason); if (retEpNum < 0) { return(false); } episode = retEpNum.ToString(); season = retSeason.ToString(); AniDB_Episode aniep = aniepisode.AniDB_Episode; if (aniep != null) { TimeSpan t = TimeSpan.FromSeconds(aniep.LengthSeconds + 14); int toMinutes = int.Parse(Math.Round(t.TotalMinutes).ToString()); duration = toMinutes.ToString(); } else { duration = "25"; } progress = "100"; plugin_version = "0.4"; media_center_version = "1.2.0.1"; media_center_date = "Dec 17 2010"; } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); return(false); } return(true); }
public static Video GenerateVideoFromAnimeEpisode(SVR_AnimeEpisode ep, int userID) { Video l = new Video(); List <SVR_VideoLocal> vids = ep.GetVideoLocals(); l.Type = "episode"; l.Summary = "Episode Overview Not Available"; //TODO Intenationalization l.Id = ep.AnimeEpisodeID; l.AnimeType = AnimeTypes.AnimeEpisode.ToString(); if (vids.Count > 0) { //List<string> hashes = vids.Select(a => a.Hash).Distinct().ToList(); l.Title = Path.GetFileNameWithoutExtension(vids[0].FileName); l.AddedAt = vids[0].DateTimeCreated.ToUnixTime(); l.UpdatedAt = vids[0].DateTimeUpdated.ToUnixTime(); l.OriginallyAvailableAt = vids[0].DateTimeCreated.ToPlexDate(); l.Year = vids[0].DateTimeCreated.Year; l.Medias = new List <Media>(); foreach (SVR_VideoLocal v in vids) { if (v?.Media == null) { continue; } var legacy = new Media(v.VideoLocalID, v.Media); var place = v.GetBestVideoLocalPlace(); legacy.Parts.ForEach(p => { if (string.IsNullOrEmpty(p.LocalKey)) { p.LocalKey = place.FullServerPath; } string name = UrlSafe.Replace(Path.GetFileName(place.FilePath), " ").CompactWhitespaces() .Trim(); name = UrlSafe2.Replace(name, string.Empty) .Trim() .CompactCharacters('.') .Replace(" ", "_") .CompactCharacters('_') .Replace("_.", "."); while (name.StartsWith("_")) { name = name.Substring(1); } while (name.StartsWith(".")) { name = name.Substring(1); } p.Key = ((IProvider)null).ReplaceSchemeHost( ((IProvider)null).ConstructVideoLocalStream(userID, v.VideoLocalID, name, false)); if (p.Streams == null) { return; } foreach (Stream s in p.Streams.Where(a => a.File != null && a.StreamType == 3).ToList()) { s.Key = ((IProvider)null).ReplaceSchemeHost( ((IProvider)null).ConstructFileStream(userID, s.File, false)); } }); l.Medias.Add(legacy); } string title = ep.Title; if (!String.IsNullOrEmpty(title)) { l.Title = title; } string romaji = RepoFactory.AniDB_Episode_Title.GetByEpisodeIDAndLanguage(ep.AniDB_EpisodeID, "X-JAT") .FirstOrDefault()?.Title; if (!String.IsNullOrEmpty(romaji)) { l.OriginalTitle = romaji; } AniDB_Episode aep = ep?.AniDB_Episode; if (aep != null) { l.EpisodeNumber = aep.EpisodeNumber; l.Index = aep.EpisodeNumber; l.EpisodeType = aep.EpisodeType; l.Rating = (int)Single.Parse(aep.Rating, CultureInfo.InvariantCulture); AniDB_Vote vote = RepoFactory.AniDB_Vote.GetByEntityAndType(ep.AnimeEpisodeID, AniDBVoteType.Episode); if (vote != null) { l.UserRating = (int)(vote.VoteValue / 100D); } if (aep.GetAirDateAsDate().HasValue) { l.Year = aep.GetAirDateAsDate()?.Year ?? 0; l.OriginallyAvailableAt = aep.GetAirDateAsDate()?.ToPlexDate(); } #region TvDB TvDB_Episode tvep = ep.TvDBEpisode; if (tvep != null) { l.Thumb = tvep.GenPoster(null); l.Summary = tvep.Overview; l.Season = $"{tvep.SeasonNumber}x{tvep.EpisodeNumber:0#}"; } #endregion } if (l.Thumb == null || l.Summary == null) { l.Thumb = ((IProvider)null).ConstructSupportImageLink("plex_404.png"); l.Summary = "Episode Overview not Available"; } } l.Id = ep.AnimeEpisodeID; return(l); }
public static void Populate(this SVR_AnimeEpisode animeep, AniDB_Episode anidbEp) { animeep.AniDB_EpisodeID = anidbEp.EpisodeID; animeep.DateTimeUpdated = DateTime.Now; animeep.DateTimeCreated = DateTime.Now; }
public static string GetEnglishTitle(this AniDB_Episode ep) { return(Repo.Instance.AniDB_Episode_Title.GetByEpisodeIDAndLanguage(ep.EpisodeID, "EN").FirstOrDefault() ?.Title); }