using System.Collections.Generic; using System.IO; using System.Linq; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Extras.Files; using NzbDrone.Core.Extras.Metadata.Files; using NzbDrone.Core.Extras.Subtitles; using NzbDrone.Core.Parser; using NzbDrone.Core.Music; namespace NzbDrone.Core.Extras.Metadata { public class ExistingMetadataImporter : ImportExistingExtraFilesBase { private readonly IExtraFileService _metadataFileService; private readonly IParsingService _parsingService; private readonly Logger _logger; private readonly List _consumers; public ExistingMetadataImporter(IExtraFileService metadataFileService, IEnumerable consumers, IParsingService parsingService, Logger logger) : base(metadataFileService) { _metadataFileService = metadataFileService; _parsingService = parsingService; _logger = logger; _consumers = consumers.ToList(); } public override int Order => 0; public override IEnumerable ProcessFiles(Artist artist, List filesOnDisk, List importedFiles) { _logger.Debug("Looking for existing metadata in {0}", artist.Path); var metadataFiles = new List(); var filterResult = FilterAndClean(artist, filesOnDisk, importedFiles); foreach (var possibleMetadataFile in filterResult.FilesOnDisk) { // Don't process files that have known Subtitle file extensions (saves a bit of unecessary processing) if (SubtitleFileExtensions.Extensions.Contains(Path.GetExtension(possibleMetadataFile))) { continue; } foreach (var consumer in _consumers) { var metadata = consumer.FindMetadataFile(artist, possibleMetadataFile); if (metadata == null) { continue; } if (metadata.Type == MetadataType.TrackImage || metadata.Type == MetadataType.TrackMetadata) { var localTrack = _parsingService.GetLocalTrack(possibleMetadataFile, artist); if (localTrack == null) { _logger.Debug("Unable to parse extra file: {0}", possibleMetadataFile); continue; } if (localTrack.Tracks.Empty()) { _logger.Debug("Cannot find related episodes for: {0}", possibleMetadataFile); continue; } if (localTrack.Tracks.DistinctBy(e => e.TrackFileId).Count() > 1) { _logger.Debug("Extra file: {0} does not match existing files.", possibleMetadataFile); continue; } metadata.AlbumId = localTrack.Album.Id; metadata.TrackFileId = localTrack.Tracks.First().TrackFileId; } metadata.Extension = Path.GetExtension(possibleMetadataFile); metadataFiles.Add(metadata); } } _logger.Info("Found {0} existing metadata files", metadataFiles.Count); _metadataFileService.Upsert(metadataFiles); // Return files that were just imported along with files that were // previously imported so previously imported files aren't imported twice return metadataFiles.Concat(filterResult.PreviouslyImported); } } }