public virtual void ProcessVideoFile(string videoFile) { if (_diskProvider.GetLastFileWrite(videoFile).AddMinutes(2) > DateTime.UtcNow) { Logger.Trace("[{0}] is too fresh. skipping", videoFile); return; } if (_diskProvider.IsFileLocked(new FileInfo(videoFile))) { Logger.Trace("[{0}] is currently locked by another process, skipping", videoFile); return; } var seriesName = Parser.ParseSeriesName(Path.GetFileNameWithoutExtension(videoFile)); var series = _seriesProvider.FindSeries(seriesName); if (series == null) { Logger.Trace("Unknown Series on Import: {0}", videoFile); return; } if (!_diskProvider.FolderExists(series.Path)) { Logger.Warn("Series Folder doesn't exist: {0}", series.Path); return; } var size = _diskProvider.GetSize(videoFile); var freeSpace = _diskProvider.FreeDiskSpace(new DirectoryInfo(series.Path)); if (Convert.ToUInt64(size) > freeSpace) { Logger.Error("Not enough free disk space for series: {0}, {1}", series.Title, series.Path); return; } var episodeFile = _diskScanProvider.ImportFile(series, videoFile); if (episodeFile != null) { _diskScanProvider.MoveEpisodeFile(episodeFile, true); _metadataProvider.CreateForEpisodeFile(episodeFile); } }
public virtual EpisodeFile ImportFile(Series series, string filePath) { Logger.Trace("Importing file to database [{0}]", filePath); if (_mediaFileProvider.Exists(filePath)) { Logger.Trace("[{0}] already exists in the database. skipping.", filePath); return(null); } var parseResult = Parser.ParsePath(filePath); if (parseResult == null) { return(null); } var size = _diskProvider.GetSize(filePath); var runTime = _mediaInfoProvider.GetRunTime(filePath); if (series.IsDaily || parseResult.SeasonNumber > 0) { if (size < Constants.IgnoreFileSize && runTime < 180) { Logger.Trace("[{0}] appears to be a sample. skipping.", filePath); return(null); } } if (!_diskProvider.IsChildOfPath(filePath, series.Path)) { parseResult.SceneSource = true; } parseResult.SeriesTitle = series.Title; //replaces the nasty path as title to help with logging parseResult.Series = series; var episodes = _episodeProvider.GetEpisodesByParseResult(parseResult); if (episodes.Count <= 0) { Logger.Debug("Can't find any matching episodes in the database. Skipping {0}", filePath); return(null); } //Make sure this file is an upgrade for ALL episodes already on disk if (episodes.All(e => e.EpisodeFile == null || e.EpisodeFile.QualityWrapper < parseResult.Quality)) { Logger.Info("Deleting the existing file(s) on disk to upgrade to: {0}", filePath); //Do the delete for files where there is already an episode on disk episodes.Where(e => e.EpisodeFile != null).Select(e => e.EpisodeFile.Path).Distinct().ToList().ForEach(p => _recycleBinProvider.DeleteFile(p)); } else { //Skip this file because its not an upgrade Logger.Trace("This file isn't an upgrade for all episodes. Skipping {0}", filePath); return(null); } var episodeFile = new EpisodeFile(); episodeFile.DateAdded = DateTime.Now; episodeFile.SeriesId = series.SeriesId; episodeFile.Path = filePath.NormalizePath(); episodeFile.Size = size; episodeFile.Quality = parseResult.Quality.Quality; episodeFile.Proper = parseResult.Quality.Proper; episodeFile.SeasonNumber = parseResult.SeasonNumber; episodeFile.SceneName = Path.GetFileNameWithoutExtension(filePath.NormalizePath()); episodeFile.ReleaseGroup = parseResult.ReleaseGroup; //Todo: We shouldn't actually import the file until we confirm its the only one we want. //Todo: Separate episodeFile creation from importing (pass file to import to import) var fileId = _mediaFileProvider.Add(episodeFile); //Link file to all episodes foreach (var ep in episodes) { ep.EpisodeFileId = fileId; ep.PostDownloadStatus = PostDownloadStatusType.NoError; _episodeProvider.UpdateEpisode(ep); Logger.Debug("Linking [{0}] > [{1}]", filePath, ep); } return(episodeFile); }