public void RecreateAllGroups() { try { // pause queues JMMService.CmdProcessorGeneral.Paused = true; JMMService.CmdProcessorHasher.Paused = true; JMMService.CmdProcessorImages.Paused = true; AnimeGroupRepository repGroups = new AnimeGroupRepository(); AnimeGroup_UserRepository repGroupUser = new AnimeGroup_UserRepository(); AnimeSeriesRepository repSeries = new AnimeSeriesRepository(); // get all the old groups List<AnimeGroup> oldGroups = repGroups.GetAll(); List<AnimeGroup_User> oldGroupUsers = repGroupUser.GetAll(); // create a new group, where we will place all the series temporarily AnimeGroup tempGroup = new AnimeGroup(); tempGroup.GroupName = "AAA Migrating Groups AAA"; tempGroup.Description = "AAA Migrating Groups AAA"; tempGroup.SortName = "AAA Migrating Groups AAA"; tempGroup.DateTimeUpdated = DateTime.Now; tempGroup.DateTimeCreated = DateTime.Now; repGroups.Save(tempGroup); // move all series to the new group foreach (AnimeSeries ser in repSeries.GetAll()) { ser.AnimeGroupID = tempGroup.AnimeGroupID; repSeries.Save(ser, false); } // delete all the old groups foreach (AnimeGroup grp in oldGroups) repGroups.Delete(grp.AnimeGroupID); // delete all the old group user records foreach (AnimeGroup_User grpUser in oldGroupUsers) repGroupUser.Delete(grpUser.AnimeGroupID); // recreate groups foreach (AnimeSeries ser in repSeries.GetAll()) { bool createNewGroup = true; if (ServerSettings.AutoGroupSeries) { List<AnimeGroup> grps = AnimeGroup.GetRelatedGroupsFromAnimeID(ser.AniDB_ID); // only use if there is just one result if (grps != null && grps.Count > 0 && !grps[0].GroupName.Equals("AAA Migrating Groups AAA")) { ser.AnimeGroupID = grps[0].AnimeGroupID; createNewGroup = false; } } if (createNewGroup) { AnimeGroup anGroup = new AnimeGroup(); anGroup.Populate(ser); repGroups.Save(anGroup); ser.AnimeGroupID = anGroup.AnimeGroupID; } repSeries.Save(ser, false); } // delete the temp group if (tempGroup.GetAllSeries().Count == 0) repGroups.Delete(tempGroup.AnimeGroupID); // create group user records and update group stats foreach (AnimeGroup grp in repGroups.GetAll()) grp.UpdateStatsFromTopLevel(true, true); // un-pause queues JMMService.CmdProcessorGeneral.Paused = false; JMMService.CmdProcessorHasher.Paused = false; JMMService.CmdProcessorImages.Paused = false; } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); } }
public AnimeSeries CreateAnimeSeriesAndGroup(ISession session) { // create a new AnimeSeries record AnimeSeriesRepository repSeries = new AnimeSeriesRepository(); AnimeGroupRepository repGroups = new AnimeGroupRepository(); AnimeSeries ser = new AnimeSeries(); ser.Populate(this); JMMUserRepository repUsers = new JMMUserRepository(); List<JMMUser> allUsers = repUsers.GetAll(session); // create the AnimeGroup record // check if there are any existing groups we could add this series to bool createNewGroup = true; if (ServerSettings.AutoGroupSeries) { List<AnimeGroup> grps = AnimeGroup.GetRelatedGroupsFromAnimeID(session, ser.AniDB_ID); // only use if there is just one result if (grps != null && grps.Count > 0) { ser.AnimeGroupID = grps[0].AnimeGroupID; createNewGroup = false; } } if (createNewGroup) { AnimeGroup anGroup = new AnimeGroup(); anGroup.Populate(ser); repGroups.Save(anGroup); ser.AnimeGroupID = anGroup.AnimeGroupID; } repSeries.Save(ser); // check for TvDB associations CommandRequest_TvDBSearchAnime cmd = new CommandRequest_TvDBSearchAnime(this.AnimeID, false); cmd.Save(); // check for Trakt associations if (ServerSettings.Trakt_IsEnabled && !string.IsNullOrEmpty(ServerSettings.Trakt_AuthToken)) { CommandRequest_TraktSearchAnime cmd2 = new CommandRequest_TraktSearchAnime(this.AnimeID, false); cmd2.Save(); } return ser; }
/// <summary> /// Creates a single <see cref="AnimeGroup"/> for each <see cref="AnimeSeries"/> in <paramref name="seriesList"/>. /// </summary> /// <remarks> /// This method assumes that there are no active transactions on the specified <paramref name="session"/>. /// </remarks> /// <param name="session">The NHibernate session.</param> /// <param name="seriesList">The list of <see cref="AnimeSeries"/> to create groups for.</param> /// <returns>A sequence of the created <see cref="AnimeGroup"/>s.</returns> private IEnumerable<AnimeGroup> CreateGroupPerSeries(ISessionWrapper session, IReadOnlyList<AnimeSeries> seriesList) { _log.Info("Generating AnimeGroups for {0} AnimeSeries", seriesList.Count); DateTime now = DateTime.Now; var newGroupsToSeries = new Tuple<AnimeGroup, AnimeSeries>[seriesList.Count]; // Create one group per series for (int grp = 0; grp < seriesList.Count; grp++) { AnimeGroup group = new AnimeGroup(); AnimeSeries series = seriesList[grp]; group.Populate(series, now); newGroupsToSeries[grp] = new Tuple<AnimeGroup, AnimeSeries>(group, series); } using (ITransaction trans = session.BeginTransaction()) { _animeGroupRepo.InsertBatch(session, newGroupsToSeries.Select(gts => gts.Item1).AsReadOnlyCollection()); trans.Commit(); } // Anime groups should have IDs now they've been inserted. Now assign the group ID's to their respective series // (The caller of this method will be responsible for saving the AnimeSeries) foreach (Tuple<AnimeGroup, AnimeSeries> groupAndSeries in newGroupsToSeries) { groupAndSeries.Item2.AnimeGroupID = groupAndSeries.Item1.AnimeGroupID; } _log.Info("Generated {0} AnimeGroups", newGroupsToSeries.Length); return newGroupsToSeries.Select(gts => gts.Item1); }
/// <summary> /// Gets or creates an <see cref="AnimeGroup"/> for the specified series. /// </summary> /// <param name="session">The NHibernate session.</param> /// <param name="series">The series for which the group is to be created/retrieved (Must be initialised first).</param> /// <returns>The <see cref="AnimeGroup"/> to use for the specified series.</returns> /// <exception cref="ArgumentNullException"><paramref name="session"/> or <paramref name="series"/> is <c>null</c>.</exception> public AnimeGroup GetOrCreateSingleGroupForSeries(ISessionWrapper session, AnimeSeries series) { if (session == null) throw new ArgumentNullException(nameof(session)); if (series == null) throw new ArgumentNullException(nameof(series)); AnimeGroup animeGroup = null; if (_autoGroupSeries) { var grpCalculator = AutoAnimeGroupCalculator.CreateFromServerSettings(session); IReadOnlyList<int> grpAnimeIds = grpCalculator.GetIdsOfAnimeInSameGroup(series.AniDB_ID); // Try to find an existing AnimeGroup to add the series to // We basically pick the first group that any of the related series belongs to already animeGroup = grpAnimeIds.Select(id => RepoFactory.AnimeSeries.GetByAnimeID(id)) .Where(s => s != null) .Select(s => RepoFactory.AnimeGroup.GetByID(s.AnimeGroupID)) .FirstOrDefault(); if (animeGroup == null) { // No existing group was found, so create a new one int mainAnimeId = grpCalculator.GetGroupAnimeId(series.AniDB_ID); AnimeSeries mainSeries = _animeSeriesRepo.GetByAnimeID(mainAnimeId); animeGroup = CreateAnimeGroup(session, mainSeries, mainAnimeId, DateTime.Now); RepoFactory.AnimeGroup.Save(animeGroup, true, true); } } else // We're not auto grouping (e.g. we're doing group per series) { animeGroup = new AnimeGroup(); animeGroup.Populate(series, DateTime.Now); RepoFactory.AnimeGroup.Save(animeGroup, true, true); } return animeGroup; }
/// <summary> /// Creates an <see cref="AnimeGroup"/> instance. /// </summary> /// <remarks> /// This method only creates an <see cref="AnimeGroup"/> instance. It does NOT save it to the database. /// </remarks> /// <param name="session">The NHibernate session.</param> /// <param name="mainSeries">The <see cref="AnimeSeries"/> whose name will represent the group (Optional. Pass <c>null</c> if not available).</param> /// <param name="mainAnimeId">The ID of the anime whose name will represent the group if <paramref name="mainSeries"/> is <c>null</c>.</param> /// <param name="now">The current date/time.</param> /// <returns>The created <see cref="AnimeGroup"/>.</returns> private AnimeGroup CreateAnimeGroup(ISessionWrapper session, AnimeSeries mainSeries, int mainAnimeId, DateTime now) { AnimeGroup animeGroup = new AnimeGroup(); string groupName = null; if (mainSeries != null) { animeGroup.Populate(mainSeries, now); groupName = mainSeries.GetSeriesName(session); } else // The anime chosen as the group's main anime doesn't actually have a series { AniDB_Anime mainAnime = _aniDbAnimeRepo.GetByAnimeID(mainAnimeId); animeGroup.Populate(mainAnime, now); groupName = mainAnime.GetFormattedTitle(); } groupName = _truncateYearRegex.Replace(groupName, String.Empty); // If the title appears to end with a year suffix, then remove it animeGroup.GroupName = groupName; animeGroup.SortName = groupName; return animeGroup; }