public async Task <IActionResult> AddFileEpisode(string token, [FromBody] CrossRef_File_Episode episode) { try { SessionInfoWithError s = await VerifyTokenAsync(token); if (s.Error != null) { return(s.Error); } WebCache_CrossRef_File_Episode ep = await _db.CrossRef_File_Episodes.FirstOrDefaultAsync(a => a.CrossRef_File_EpisodeID == episode.CrossRef_File_EpisodeID && a.AniDBUserId == s.AniDBUserId); if (ep == null) { ep = new WebCache_CrossRef_File_Episode(); _db.Add(ep); } ep.FillWith(episode); ep.AniDBUserId = s.AniDBUserId; await _db.SaveChangesAsync(); return(Ok()); } catch (Exception e) { _logger.LogError(e, $"ADDFILEEPISODE with Token={token}"); return(StatusCode(500)); } }
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(); }
public void Delete(int id) { int animeID = 0; using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { CrossRef_File_Episode cr = GetByID(id); if (cr != null) { animeID = cr.AnimeID; session.Delete(cr); transaction.Commit(); } } } if (animeID > 0) { logger.Trace("Updating group stats by anime from CrossRef_File_EpisodeRepository.Delete: {0}", animeID); AniDB_Anime.UpdateStatsByAnimeID(animeID); } }
public bool AddCrossRef_File_Episode(CrossRef_File_Episode episode) { return(WrapAuthentication((token) => { cclient.AddFileEpisode(token, episode); })); }
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 CrossRef_File_EpisodeResult(CrossRef_File_Episode xref) { this.Hash = xref.Hash; this.AnimeID = xref.AnimeID; this.EpisodeID = xref.EpisodeID; this.Percentage = xref.Percentage; this.EpisodeOrder = xref.EpisodeOrder; }
public static FileNameHash ToFileNameHash(this CrossRef_File_Episode cfe) { return(new FileNameHash { FileName = cfe.FileName, FileSize = cfe.FileSize, Hash = cfe.Hash, DateTimeUpdated = DateTime.Now, }); }
public static void FillWith(this CrossRef_File_Episode prov, CrossRef_File_Episode origin) { prov.EpisodeID = origin.EpisodeID; prov.AnimeID = origin.AnimeID; prov.CrossRefSource = origin.CrossRefSource; prov.EpisodeOrder = origin.EpisodeOrder; prov.FileName = origin.FileName; prov.Hash = origin.Hash; prov.FileSize = origin.FileSize; prov.Percentage = origin.Percentage; }
public static void PopulateManually(this CrossRef_File_Episode cross, SVR_VideoLocal vid, SVR_AnimeEpisode ep) { cross.Hash = vid.ED2KHash; cross.FileName = vid.FileName; cross.FileSize = vid.FileSize; cross.CrossRefSource = (int)CrossRefSource.User; cross.AnimeID = ep.GetAnimeSeries().AniDB_ID; cross.EpisodeID = ep.AniDB_EpisodeID; cross.Percentage = 100; cross.EpisodeOrder = 1; }
public void CreateCrossEpisodes(string localFileName) { if (episodesRAW != null) //Only create relations if the origin of the data if from Raw (AniDB) { List <CrossRef_File_Episode> fileEps = RepoFactory.CrossRef_File_Episode.GetByHash(this.Hash); foreach (CrossRef_File_Episode fileEp in fileEps) { RepoFactory.CrossRef_File_Episode.Delete(fileEp.CrossRef_File_EpisodeID); } char apostrophe = "'".ToCharArray()[0]; char epiSplit = ','; if (episodesRAW.Contains(apostrophe)) { epiSplit = apostrophe; } char eppSplit = ','; if (episodesPercentRAW.Contains(apostrophe)) { eppSplit = apostrophe; } string[] epi = episodesRAW.Split(epiSplit); string[] epp = episodesPercentRAW.Split(eppSplit); for (int x = 0; x < epi.Length; x++) { string epis = epi[x].Trim(); string epps = epp[x].Trim(); if (epis.Length > 0) { int.TryParse(epis, out int epid); int.TryParse(epps, out int eppp); if (epid != 0) { CrossRef_File_Episode cross = new CrossRef_File_Episode { Hash = Hash, CrossRefSource = (int)CrossRefSource.AniDB, AnimeID = this.AnimeID, EpisodeID = epid, Percentage = eppp, EpisodeOrder = x + 1, FileName = localFileName, FileSize = FileSize }; RepoFactory.CrossRef_File_Episode.Save(cross); } } } } }
public void Save(CrossRef_File_Episode obj) { using (var session = WebCache.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } }
private static bool TryGetCrossRefsFromWebCache(SVR_VideoLocal vidLocal, ref List <CrossRef_File_Episode> crossRefs) { if (!ServerSettings.Instance.WebCache.Enabled || !ServerSettings.Instance.WebCache.XRefFileEpisode_Get) { logger.Debug($"Cannot get AniDB_File record so exiting: {vidLocal.ED2KHash}"); return(true); } 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(true); } string fileName = vidLocal.GetBestVideoLocalPlace()?.FullServerPath; fileName = !string.IsNullOrEmpty(fileName) ? Path.GetFileName(fileName) : vidLocal.FileName; foreach (Azure_CrossRef_File_Episode xref in xrefs) { bool duplicate = crossRefs.Any(a => a.AnimeID == xref.AnimeID && a.EpisodeID == xref.EpisodeID && a.Hash == xref.Hash); if (duplicate) { continue; } CrossRef_File_Episode xref2 = 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 }; crossRefs.Add(xref2); // in this case we need to save the cross refs manually as AniDB did not provide them // use a session to prevent updating stats using var session = DatabaseFactory.SessionFactory.OpenSession(); using var trans = session.BeginTransaction(); RepoFactory.CrossRef_File_Episode.SaveWithOpenTransaction(session, xref2); trans.Commit(); } return(false); }
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(); }
/// <summary> /// This is the only way to uniquely identify the record other than the IDENTITY /// </summary> /// <param name="hash"></param> /// <param name="episodeID"></param> /// <returns></returns> public CrossRef_File_Episode GetByHashAndEpisodeID(string hash, int episodeID) { using (var session = JMMService.SessionFactory.OpenSession()) { CrossRef_File_Episode obj = session .CreateCriteria(typeof(CrossRef_File_Episode)) .Add(Restrictions.Eq("Hash", hash)) .Add(Restrictions.Eq("EpisodeID", episodeID)) .UniqueResult <CrossRef_File_Episode>(); return(obj); } }
public static Azure_CrossRef_File_Episode_Request ToRequest(this CrossRef_File_Episode xref) { Azure_CrossRef_File_Episode_Request r = new Azure_CrossRef_File_Episode_Request { Hash = xref.Hash, AnimeID = xref.AnimeID, EpisodeID = xref.EpisodeID, Percentage = xref.Percentage, EpisodeOrder = xref.EpisodeOrder, Username = Constants.AnonWebCacheUsername, }; return(r); }
public static void Send_CrossRefFileEpisode(CrossRef_File_Episode data) { if (!ServerSettings.Instance.WebCache.XRefFileEpisode_Send) { return; } string uri = $@"http://{azureHostBaseAddress}/api/CrossRef_File_Episode"; Azure_CrossRef_File_Episode_Request input = data.ToRequest(); string json = JSONHelper.Serialize(input); SendData(uri, json, "POST"); }
public void Save(CrossRef_File_Episode obj) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } logger.Trace("Updating group stats by file from CrossRef_File_EpisodeRepository.Save: {0}", obj.Hash); AniDB_Anime.UpdateStatsByAnimeID(obj.AnimeID); }
public static void Send_CrossRef_File_Episode(CrossRef_File_Episode data) { if (!ServerSettings.WebCache_XRefFileEpisode_Send) { return; } string uri = string.Format("http://{0}/AddCrossRef_File_Episode.aspx", ServerSettings.WebCache_Address); CrossRef_File_EpisodeRequest fhr = new CrossRef_File_EpisodeRequest(data); string xml = fhr.ToXML(); SendData(uri, xml); }
public static void Send_CrossRefFileEpisode(CrossRef_File_Episode data) { if (!ServerSettings.WebCache_XRefFileEpisode_Send) { return; } string uri = string.Format(@"http://{0}/api/CrossRef_File_Episode", azureHostBaseAddress); Azure_CrossRef_File_Episode_Request input = data.ToRequest(); string json = JSONHelper.Serialize <Azure_CrossRef_File_Episode_Request>(input); SendData(uri, json, "POST"); }
public static VideoLocal_User GetVideoLocalUserRecord(this CrossRef_File_Episode cross, int userID) { SVR_VideoLocal vid = RepoFactory.VideoLocal.GetByHash(cross.Hash); if (vid != null) { VideoLocal_User vidUser = vid.GetUserRecord(userID); if (vidUser != null) { return(vidUser); } } return(null); }
public void Delete(int id) { using (var session = WebCache.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { CrossRef_File_Episode cr = GetByID(id); if (cr != null) { session.Delete(cr); transaction.Commit(); } } } }
public static Azure_CrossRef_File_Episode_Request ToRequest(this CrossRef_File_Episode xref) { Azure_CrossRef_File_Episode_Request r = new Azure_CrossRef_File_Episode_Request(); r.Hash = xref.Hash; r.AnimeID = xref.AnimeID; r.EpisodeID = xref.EpisodeID; r.Percentage = xref.Percentage; r.EpisodeOrder = xref.EpisodeOrder; r.Username = ServerSettings.AniDB_Username; if (ServerSettings.WebCache_Anonymous) { r.Username = Constants.AnonWebCacheUsername; } return(r); }
// default constructor public CrossRef_File_EpisodeRequest(CrossRef_File_Episode data) { this.AnimeID = data.AnimeID; this.EpisodeID = data.EpisodeID; this.Percentage = data.Percentage; this.EpisodeOrder = data.EpisodeOrder; this.hash = data.Hash; string username = ServerSettings.AniDB_Username; if (ServerSettings.WebCache_Anonymous) { username = Constants.AnonWebCacheUsername; } this.uname = username; }
public override void ProcessCommand() { try { CrossRef_File_EpisodeRepository repVids = new CrossRef_File_EpisodeRepository(); CrossRef_File_Episode xref = repVids.GetByID(CrossRef_File_EpisodeID); if (xref == null) { return; } JMMServer.Providers.Azure.AzureWebAPI.Send_CrossRefFileEpisode(xref); } catch (Exception ex) { logger.Error("Error processing CommandRequest_WebCacheSendXRefFileEpisode: {0} - {1}", CrossRef_File_EpisodeID, ex.ToString()); return; } }
public override void ProcessCommand() { try { CrossRef_File_Episode xref = RepoFactory.CrossRef_File_Episode.GetByID(CrossRef_File_EpisodeID); if (xref == null) { return; } AzureWebAPI.Send_CrossRefFileEpisode(xref); } catch (Exception ex) { logger.Error("Error processing CommandRequest_WebCacheSendXRefFileEpisode: {0} - {1}", CrossRef_File_EpisodeID, ex); } }
public static Azure_CrossRef_File_Episode_Request ToRequest(this CrossRef_File_Episode xref) { Azure_CrossRef_File_Episode_Request r = new Azure_CrossRef_File_Episode_Request { Hash = xref.Hash, AnimeID = xref.AnimeID, EpisodeID = xref.EpisodeID, Percentage = xref.Percentage, EpisodeOrder = xref.EpisodeOrder, Username = ServerSettings.Instance.AniDb.Username }; if (ServerSettings.Instance.WebCache.Anonymous) { r.Username = Constants.AnonWebCacheUsername; } return(r); }
public override void Run(IProgress <ICommand> progress = null) { try { ReportInit(progress); CrossRef_File_Episode xref = Repo.Instance.CrossRef_File_Episode.GetByID(CrossRef_File_EpisodeID); if (xref == null) { ReportFinish(progress); return; } ReportUpdate(progress, 50); WebCacheAPI.Instance.AddCrossRef_File_Episode(xref); ReportFinish(progress); } catch (Exception ex) { ReportError(progress, $"Error processing WebCacheDeleteXRefAniDBOther: {CrossRef_File_EpisodeID} - {ex}", ex); } }
public static AniDB_Episode GetEpisode(this CrossRef_File_Episode cross) { return(RepoFactory.AniDB_Episode.GetByEpisodeID(cross.EpisodeID)); }
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 void CreateCrossEpisodes(string localFileName) { if (episodesRAW == null) { return; } List <CrossRef_File_Episode> fileEps = RepoFactory.CrossRef_File_Episode.GetByHash(Hash); foreach (CrossRef_File_Episode fileEp in fileEps) { RepoFactory.CrossRef_File_Episode.Delete(fileEp.CrossRef_File_EpisodeID); } fileEps = new List <CrossRef_File_Episode>(); char apostrophe = "'".ToCharArray()[0]; char epiSplit = ','; if (episodesRAW.Contains(apostrophe)) { epiSplit = apostrophe; } char eppSplit = ','; if (episodesPercentRAW.Contains(apostrophe)) { eppSplit = apostrophe; } string[] epi = episodesRAW.Split(epiSplit); string[] epp = episodesPercentRAW.Split(eppSplit); for (int x = 0; x < epi.Length; x++) { string epis = epi[x].Trim(); string epps = epp[x].Trim(); if (epis.Length <= 0) { continue; } if (!int.TryParse(epis, out int epid)) { continue; } if (!int.TryParse(epps, out int eppp)) { continue; } if (epid == 0) { continue; } CrossRef_File_Episode cross = new CrossRef_File_Episode { Hash = Hash, CrossRefSource = (int)CrossRefSource.AniDB, AnimeID = AnimeID, EpisodeID = epid, Percentage = eppp, EpisodeOrder = x + 1, FileName = localFileName, FileSize = FileSize }; fileEps.Add(cross); } // There is a chance that AniDB returned a dup, however unlikely fileEps.DistinctBy(a => $"{a.Hash}-{a.EpisodeID}") .ForEach(fileEp => RepoFactory.CrossRef_File_Episode.Save(fileEp)); }
void workerMyAnime2_DoWork(object sender, DoWorkEventArgs e) { MA2Progress ma2Progress = new MA2Progress(); ma2Progress.CurrentFile = 0; ma2Progress.ErrorMessage = ""; ma2Progress.MigratedFiles = 0; ma2Progress.TotalFiles = 0; try { string databasePath = e.Argument as string; string connString = string.Format(@"data source={0};useutf16encoding=True", databasePath); SQLiteConnection myConn = new SQLiteConnection(connString); myConn.Open(); // get a list of unlinked files VideoLocalRepository repVids = new VideoLocalRepository(); AniDB_EpisodeRepository repAniEps = new AniDB_EpisodeRepository(); AniDB_AnimeRepository repAniAnime = new AniDB_AnimeRepository(); AnimeSeriesRepository repSeries = new AnimeSeriesRepository(); AnimeEpisodeRepository repEps = new AnimeEpisodeRepository(); List<VideoLocal> vids = repVids.GetVideosWithoutEpisode(); ma2Progress.TotalFiles = vids.Count; foreach (VideoLocal vid in vids) { ma2Progress.CurrentFile = ma2Progress.CurrentFile + 1; workerMyAnime2.ReportProgress(0, ma2Progress); // search for this file in the XrossRef table in MA2 string sql = string.Format("SELECT AniDB_EpisodeID from CrossRef_Episode_FileHash WHERE Hash = '{0}' AND FileSize = {1}", vid.ED2KHash, vid.FileSize); SQLiteCommand sqCommand = new SQLiteCommand(sql); sqCommand.Connection = myConn; SQLiteDataReader myReader = sqCommand.ExecuteReader(); while (myReader.Read()) { int episodeID = 0; if (!int.TryParse(myReader.GetValue(0).ToString(), out episodeID)) continue; if (episodeID <= 0) continue; sql = string.Format("SELECT AnimeID from AniDB_Episode WHERE EpisodeID = {0}", episodeID); sqCommand = new SQLiteCommand(sql); sqCommand.Connection = myConn; SQLiteDataReader myReader2 = sqCommand.ExecuteReader(); while (myReader2.Read()) { int animeID = myReader2.GetInt32(0); // so now we have all the needed details we can link the file to the episode // as long as wehave the details in JMM AniDB_Anime anime = null; AniDB_Episode ep = repAniEps.GetByEpisodeID(episodeID); if (ep == null) { logger.Debug("Getting Anime record from AniDB...."); anime = JMMService.AnidbProcessor.GetAnimeInfoHTTP(animeID, true, ServerSettings.AutoGroupSeries); } else anime = repAniAnime.GetByAnimeID(animeID); // create the group/series/episode records if needed AnimeSeries ser = null; if (anime == null) continue; logger.Debug("Creating groups, series and episodes...."); // check if there is an AnimeSeries Record associated with this AnimeID ser = repSeries.GetByAnimeID(animeID); if (ser == null) { // create a new AnimeSeries record ser = anime.CreateAnimeSeriesAndGroup(); } ser.CreateAnimeEpisodes(); // check if we have any group status data for this associated anime // if not we will download it now AniDB_GroupStatusRepository repStatus = new AniDB_GroupStatusRepository(); if (repStatus.GetByAnimeID(anime.AnimeID).Count == 0) { CommandRequest_GetReleaseGroupStatus cmdStatus = new CommandRequest_GetReleaseGroupStatus(anime.AnimeID, false); cmdStatus.Save(); } // update stats ser.EpisodeAddedDate = DateTime.Now; repSeries.Save(ser); AnimeGroupRepository repGroups = new AnimeGroupRepository(); foreach (AnimeGroup grp in ser.AllGroupsAbove) { grp.EpisodeAddedDate = DateTime.Now; repGroups.Save(grp); } AnimeEpisode epAnime = repEps.GetByAniDBEpisodeID(episodeID); if (epAnime == null) continue; CrossRef_File_EpisodeRepository repXRefs = new CrossRef_File_EpisodeRepository(); CrossRef_File_Episode xref = new CrossRef_File_Episode(); try { xref.PopulateManually(vid, epAnime); } catch (Exception ex) { string msg = string.Format("Error populating XREF: {0} - {1}", vid.ToStringDetailed(), ex.ToString()); throw; } repXRefs.Save(xref); vid.RenameIfRequired(); vid.MoveFileIfRequired(); // update stats for groups and series if (ser != null) { // update all the groups above this series in the heirarchy ser.UpdateStats(true, true, true); StatsCache.Instance.UpdateUsingSeries(ser.AnimeSeriesID); } // Add this file to the users list if (ServerSettings.AniDB_MyList_AddFiles) { CommandRequest_AddFileToMyList cmd = new CommandRequest_AddFileToMyList(vid.ED2KHash); cmd.Save(); } ma2Progress.MigratedFiles = ma2Progress.MigratedFiles + 1; workerMyAnime2.ReportProgress(0, ma2Progress); } myReader2.Close(); //Console.WriteLine(myReader.GetString(0)); } myReader.Close(); } myConn.Close(); ma2Progress.CurrentFile = ma2Progress.CurrentFile + 1; workerMyAnime2.ReportProgress(0, ma2Progress); } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); ma2Progress.ErrorMessage = ex.Message; workerMyAnime2.ReportProgress(0, ma2Progress); } }