public ActionResult RescanFile([FromRoute] int fileID, [FromQuery] bool priority = false) { var file = RepoFactory.VideoLocal.GetByID(fileID); if (file == null) { return(NotFound(FileNotFoundWithFileID)); } var filePath = file.GetBestVideoLocalPlace(true)?.FullServerPath; if (string.IsNullOrEmpty(filePath)) { return(BadRequest(FileNoPath)); } var command = new CommandRequest_ProcessFile(file.VideoLocalID, true); if (priority) { command.Priority = (int)CommandRequestPriority.Priority1; } command.Save(); return(Ok()); }
public static void CheckForAniDBFileUpdate(bool forceRefresh) { if (ServerSettings.AniDB_File_UpdateFrequency == ScheduledUpdateFrequency.Never && !forceRefresh) return; int freqHours = Utils.GetScheduledHours(ServerSettings.AniDB_File_UpdateFrequency); // check for any updated anime info every 12 hours ScheduledUpdateRepository repSched = new ScheduledUpdateRepository(); AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository(); ScheduledUpdate sched = repSched.GetByUpdateType((int)ScheduledUpdateType.AniDBFileUpdates); if (sched != null) { // if we have run this in the last 12 hours and are not forcing it, then exit TimeSpan tsLastRun = DateTime.Now - sched.LastUpdate; if (tsLastRun.TotalHours < freqHours) { if (!forceRefresh) return; } } UpdateAniDBFileData(true, false, false); // files which have been hashed, but don't have an associated episode VideoLocalRepository repVidLocals = new VideoLocalRepository(); List<VideoLocal> filesWithoutEpisode = repVidLocals.GetVideosWithoutEpisode(); foreach (VideoLocal vl in filesWithoutEpisode) { CommandRequest_ProcessFile cmd = new CommandRequest_ProcessFile(vl.VideoLocalID, true); cmd.Save(); } // now check for any files which have been manually linked and are less than 30 days old if (sched == null) { sched = new ScheduledUpdate(); sched.UpdateType = (int)ScheduledUpdateType.AniDBFileUpdates; sched.UpdateDetails = ""; } sched.LastUpdate = DateTime.Now; repSched.Save(sched); }
public static void RunImport_IntegrityCheck() { VideoLocalRepository repVidLocals = new VideoLocalRepository(); AniDB_FileRepository repAniFile = new AniDB_FileRepository(); AniDB_EpisodeRepository repAniEps = new AniDB_EpisodeRepository(); AniDB_AnimeRepository repAniAnime = new AniDB_AnimeRepository(); // files which don't have a valid import folder List<VideoLocal> filesToDelete = repVidLocals.GetVideosWithoutImportFolder(); foreach (VideoLocal vl in filesToDelete) repVidLocals.Delete(vl.VideoLocalID); // files which have not been hashed yet // or files which do not have a VideoInfo record List<VideoLocal> filesToHash = repVidLocals.GetVideosWithoutHash(); Dictionary<int, VideoLocal> dictFilesToHash = new Dictionary<int, VideoLocal>(); foreach (VideoLocal vl in filesToHash) { dictFilesToHash[vl.VideoLocalID] = vl; CommandRequest_HashFile cmd = new CommandRequest_HashFile(vl.FullServerPath, false); cmd.Save(); } List<VideoLocal> filesToRehash = repVidLocals.GetVideosWithoutVideoInfo(); Dictionary<int, VideoLocal> dictFilesToRehash = new Dictionary<int, VideoLocal>(); foreach (VideoLocal vl in filesToHash) { dictFilesToRehash[vl.VideoLocalID] = vl; // don't use if it is in the previous list if (!dictFilesToHash.ContainsKey(vl.VideoLocalID)) { try { CommandRequest_HashFile cmd = new CommandRequest_HashFile(vl.FullServerPath, false); cmd.Save(); } catch (Exception ex) { string msg = string.Format("Error RunImport_IntegrityCheck XREF: {0} - {1}", vl.ToStringDetailed(), ex.ToString()); logger.Info(msg); } } } // files which have been hashed, but don't have an associated episode List<VideoLocal> filesWithoutEpisode = repVidLocals.GetVideosWithoutEpisode(); Dictionary<int, VideoLocal> dictFilesWithoutEpisode = new Dictionary<int, VideoLocal>(); foreach (VideoLocal vl in filesWithoutEpisode) dictFilesWithoutEpisode[vl.VideoLocalID] = vl; // check that all the episode data is populated List<VideoLocal> filesAll = repVidLocals.GetAll(); Dictionary<string, VideoLocal> dictFilesAllExisting = new Dictionary<string, VideoLocal>(); foreach (VideoLocal vl in filesAll) { try { dictFilesAllExisting[vl.FullServerPath] = vl; } catch (Exception ex) { string msg = string.Format("Error RunImport_IntegrityCheck XREF: {0} - {1}", vl.ToStringDetailed(), ex.ToString()); logger.Error(msg); continue; } // check if it has an episode if (dictFilesWithoutEpisode.ContainsKey(vl.VideoLocalID)) { CommandRequest_ProcessFile cmd = new CommandRequest_ProcessFile(vl.VideoLocalID, false); cmd.Save(); continue; } // if the file is not manually associated, then check for AniDB_File info AniDB_File aniFile = repAniFile.GetByHash(vl.Hash); foreach (CrossRef_File_Episode xref in vl.EpisodeCrossRefs) { if (xref.CrossRefSource != (int)CrossRefSource.AniDB) continue; if (aniFile == null) { CommandRequest_ProcessFile cmd = new CommandRequest_ProcessFile(vl.VideoLocalID, false); cmd.Save(); continue; } } if (aniFile == null) continue; // the cross ref is created before the actually episode data is downloaded // so lets check for that bool missingEpisodes = false; foreach (CrossRef_File_Episode xref in aniFile.EpisodeCrossRefs) { AniDB_Episode ep = repAniEps.GetByEpisodeID(xref.EpisodeID); if (ep == null) missingEpisodes = true; } if (missingEpisodes) { // this will then download the anime etc CommandRequest_ProcessFile cmd = new CommandRequest_ProcessFile(vl.VideoLocalID, false); cmd.Save(); continue; } } }