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);
            }
        }
예제 #2
0
        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);
        }