using System.IO; using System.Linq; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies; namespace NzbDrone.Core.MediaFiles.MediaInfo { public interface IUpdateMediaInfo { bool Update(MovieFile movieFile, Movie movie); } public class UpdateMediaInfoService : IUpdateMediaInfo, IHandle { private readonly IDiskProvider _diskProvider; private readonly IMediaFileService _mediaFileService; private readonly IVideoFileInfoReader _videoFileInfoReader; private readonly IConfigService _configService; private readonly Logger _logger; public UpdateMediaInfoService(IDiskProvider diskProvider, IMediaFileService mediaFileService, IVideoFileInfoReader videoFileInfoReader, IConfigService configService, Logger logger) { _diskProvider = diskProvider; _mediaFileService = mediaFileService; _videoFileInfoReader = videoFileInfoReader; _configService = configService; _logger = logger; } public void Handle(MovieScannedEvent message) { if (!_configService.EnableMediaInfo) { _logger.Debug("MediaInfo is disabled"); return; } var allMediaFiles = _mediaFileService.GetFilesByMovie(message.Movie.Id); var filteredMediaFiles = allMediaFiles.Where(c => c.MediaInfo == null || c.MediaInfo.SchemaRevision < VideoFileInfoReader.MINIMUM_MEDIA_INFO_SCHEMA_REVISION).ToList(); foreach (var mediaFile in filteredMediaFiles) { UpdateMediaInfo(mediaFile, message.Movie); } } public bool Update(MovieFile movieFile, Movie movie) { if (!_configService.EnableMediaInfo) { _logger.Debug("MediaInfo is disabled"); return false; } return UpdateMediaInfo(movieFile, movie); } private bool UpdateMediaInfo(MovieFile movieFile, Movie movie) { var path = Path.Combine(movie.Path, movieFile.RelativePath); if (!_diskProvider.FileExists(path)) { _logger.Debug("Can't update MediaInfo because '{0}' does not exist", path); return false; } var updatedMediaInfo = _videoFileInfoReader.GetMediaInfo(path); if (updatedMediaInfo == null) { return false; } movieFile.MediaInfo = updatedMediaInfo; _mediaFileService.Update(movieFile); _logger.Debug("Updated MediaInfo for '{0}'", path); return true; } } }