From b122f1135e832a7d62b8695165b9f8f7e002c728 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 12 Jul 2012 14:08:21 -0700 Subject: [PATCH] Metadata will be called when needed #ND-21 Import/Rename episode files Import series/update series info --- .../ProviderTests/DiskScanProviderTest.cs | 4 +- .../Metadata/Xbmc_ForEpisodeFile_Fixture.cs | 8 +-- .../Metadata/Xbmc_ForSeries_Fixture.cs | 14 ++--- .../ProcessDownloadProviderFixture.cs | 5 +- NzbDrone.Core/Jobs/RenameSeasonJob.cs | 27 ++++++++-- NzbDrone.Core/Jobs/RenameSeriesJob.cs | 26 +++++++-- NzbDrone.Core/Providers/DiskScanProvider.cs | 8 +-- .../Providers/Metadata/MetadataBase.cs | 16 +++++- NzbDrone.Core/Providers/Metadata/Xbmc.cs | 40 ++++++++++++-- NzbDrone.Core/Providers/MetadataProvider.cs | 54 ++++++++++++++++++- .../Providers/PostDownloadProvider.cs | 7 ++- 11 files changed, 172 insertions(+), 37 deletions(-) diff --git a/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTest.cs index b4af0456e..596da2640 100644 --- a/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTest.cs @@ -212,7 +212,7 @@ namespace NzbDrone.Core.Test.ProviderTests var result = Mocker.Resolve().MoveEpisodeFile(file, false); //Assert - result.Should().BeFalse(); + result.Should().BeNull(); } [Test] @@ -368,7 +368,7 @@ namespace NzbDrone.Core.Test.ProviderTests var result = Mocker.Resolve().MoveEpisodeFile(file, true); //Assert - result.Should().BeTrue(); + result.Should().NotBeNull(); Mocker.GetMock() .Verify(e => e.OnDownload("30 Rock - 1x01 - [WEBDL]", It.IsAny()), Times.Once()); } diff --git a/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForEpisodeFile_Fixture.cs b/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForEpisodeFile_Fixture.cs index 53f3df7f4..c3499c2d3 100644 --- a/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForEpisodeFile_Fixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForEpisodeFile_Fixture.cs @@ -123,14 +123,14 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata public void should_not_blowup() { WithSingleEpisodeFile(); - Mocker.Resolve().ForEpisodeFile(episodeFile, tvdbSeries); + Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); } [Test] public void should_call_diskprovider_writeAllText_once_for_single_episode() { WithSingleEpisodeFile(); - Mocker.Resolve().ForEpisodeFile(episodeFile, tvdbSeries); + Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.WriteAllText(episodeFile.Path.Replace("avi", "nfo"), It.IsAny()), Times.Once()); } @@ -138,7 +138,7 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata public void should_call_diskprovider_writeAllText_once_for_multi_episode() { WithMultiEpisodeFile(); - Mocker.Resolve().ForEpisodeFile(episodeFile, tvdbSeries); + Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.WriteAllText(episodeFile.Path.Replace("avi", "nfo"), It.IsAny()), Times.Once()); } @@ -146,7 +146,7 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata public void should_download_thumbnail_when_thumbnail_path_is_not_null() { WithSingleEpisodeFile(); - Mocker.Resolve().ForEpisodeFile(episodeFile, tvdbSeries); + Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(tvdbSeries.Episodes.First().BannerPath, episodeFile.Path.Replace("avi", "tbn")), Times.Once()); } } diff --git a/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForSeries_Fixture.cs b/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForSeries_Fixture.cs index 4e468b501..5df294d65 100644 --- a/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForSeries_Fixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/Metadata/Xbmc_ForSeries_Fixture.cs @@ -78,27 +78,27 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata [Test] public void should_not_blowup() { - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); } [Test] public void should_call_diskprovider_writeAllText() { - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.WriteAllText(Path.Combine(series.Path, "tvshow.nfo"), It.IsAny()), Times.Once()); } [Test] public void should_download_fanart() { - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(tvdbSeries.FanartPath, Path.Combine(series.Path, "fanart.jpg")), Times.Once()); } [Test] public void should_download_poster_when_useBanners_is_false() { - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(tvdbSeries.PosterPath, Path.Combine(series.Path, "folder.jpg")), Times.Once()); } @@ -106,14 +106,14 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata public void should_download_banner_when_useBanners_is_true() { WithUseBanners(); - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(tvdbSeries.BannerPath, Path.Combine(series.Path, "folder.jpg")), Times.Once()); } [Test] public void should_download_season_poster_when_useBanners_is_false() { - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(It.Is(s => !s.Contains("banners")), It.IsRegex(@"season\d{2}\.tbn")), Times.Exactly(2)); } @@ -121,7 +121,7 @@ namespace NzbDrone.Core.Test.ProviderTests.Metadata public void should_download_season_banner_when_useBanners_is_true() { WithUseBanners(); - Mocker.Resolve().ForSeries(series, tvdbSeries); + Mocker.Resolve().CreateForSeries(series, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(It.Is(s => s.Contains("banners")), It.IsRegex(@"season\d{2}\.tbn")), Times.Exactly(2)); } } diff --git a/NzbDrone.Core.Test/ProviderTests/PostDownloadProviderTests/ProcessDownloadProviderFixture.cs b/NzbDrone.Core.Test/ProviderTests/PostDownloadProviderTests/ProcessDownloadProviderFixture.cs index 9ce2a76dd..68b051838 100644 --- a/NzbDrone.Core.Test/ProviderTests/PostDownloadProviderTests/ProcessDownloadProviderFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/PostDownloadProviderTests/ProcessDownloadProviderFixture.cs @@ -210,7 +210,7 @@ namespace NzbDrone.Core.Test.ProviderTests.PostDownloadProviderTests Mocker.GetMock().Setup(s => s.MoveDirectory(droppedFolder.FullName, taggedFolder)); Mocker.GetMock().Setup(s => s.GetDirectorySize(droppedFolder.FullName)).Returns(Constants.IgnoreFileSize + 10.Megabytes()); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(fakeEpisodeFiles); - Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(true); + Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(new EpisodeFile()); Mocker.Resolve().ProcessDownload(droppedFolder); @@ -281,9 +281,10 @@ namespace NzbDrone.Core.Test.ProviderTests.PostDownloadProviderTests Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(fakeSeries); Mocker.GetMock().Setup(s => s.CleanUpDropFolder(droppedFolder.FullName)); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(fakeEpisodeFiles); - Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(true); + Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(new EpisodeFile()); Mocker.GetMock().Setup(s => s.GetDirectorySize(droppedFolder.FullName)).Returns(Constants.IgnoreFileSize - 1.Megabytes()); Mocker.GetMock().Setup(s => s.DeleteFolder(droppedFolder.FullName, true)); + Mocker.GetMock().Setup(s => s.CreateForEpisodeFiles(It.IsAny>())); //Act Mocker.Resolve().ProcessDownload(droppedFolder); diff --git a/NzbDrone.Core/Jobs/RenameSeasonJob.cs b/NzbDrone.Core/Jobs/RenameSeasonJob.cs index 39fc70ebb..e379d9ab6 100644 --- a/NzbDrone.Core/Jobs/RenameSeasonJob.cs +++ b/NzbDrone.Core/Jobs/RenameSeasonJob.cs @@ -1,9 +1,11 @@ +using System.Collections.Generic; using System.Linq; using System; using NLog; using Ninject; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository; namespace NzbDrone.Core.Jobs { @@ -13,17 +15,20 @@ namespace NzbDrone.Core.Jobs private readonly DiskScanProvider _diskScanProvider; private readonly ExternalNotificationProvider _externalNotificationProvider; private readonly SeriesProvider _seriesProvider; + private readonly MetadataProvider _metadataProvider; private static readonly Logger logger = LogManager.GetCurrentClassLogger(); [Inject] public RenameSeasonJob(MediaFileProvider mediaFileProvider, DiskScanProvider diskScanProvider, - ExternalNotificationProvider externalNotificationProvider, SeriesProvider seriesProvider) + ExternalNotificationProvider externalNotificationProvider, SeriesProvider seriesProvider, + MetadataProvider metadataProvider) { _mediaFileProvider = mediaFileProvider; _diskScanProvider = diskScanProvider; _externalNotificationProvider = externalNotificationProvider; _seriesProvider = seriesProvider; + _metadataProvider = metadataProvider; } public string Name @@ -57,18 +62,32 @@ namespace NzbDrone.Core.Jobs return; } + var newEpisodeFiles = new List(); + var oldEpisodeFiles = new List(); + foreach (var episodeFile in episodeFiles) { try { - _diskScanProvider.MoveEpisodeFile(episodeFile); + var newFile = _diskScanProvider.MoveEpisodeFile(episodeFile); + + if (newFile != null) + { + newEpisodeFiles.Add(newFile); + oldEpisodeFiles.Add(episodeFile); + } } - catch (Exception exception) + + catch (Exception e) { - logger.WarnException("An error has occurred while renaming file", exception); + logger.WarnException("An error has occurred while renaming file", e); } } + //Remove & Create Metadata for episode files + _metadataProvider.RemoveForEpisodeFiles(oldEpisodeFiles); + _metadataProvider.CreateForEpisodeFiles(newEpisodeFiles); + //Start AfterRename var message = String.Format("Renamed: Series {0}, Season: {1}", series.Title, secondaryTargetId); diff --git a/NzbDrone.Core/Jobs/RenameSeriesJob.cs b/NzbDrone.Core/Jobs/RenameSeriesJob.cs index e11f744ff..f44f85786 100644 --- a/NzbDrone.Core/Jobs/RenameSeriesJob.cs +++ b/NzbDrone.Core/Jobs/RenameSeriesJob.cs @@ -1,9 +1,11 @@ +using System.Collections.Generic; using System.Linq; using System; using NLog; using Ninject; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository; namespace NzbDrone.Core.Jobs { @@ -13,17 +15,20 @@ namespace NzbDrone.Core.Jobs private readonly DiskScanProvider _diskScanProvider; private readonly ExternalNotificationProvider _externalNotificationProvider; private readonly SeriesProvider _seriesProvider; + private readonly MetadataProvider _metadataProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [Inject] public RenameSeriesJob(MediaFileProvider mediaFileProvider, DiskScanProvider diskScanProvider, - ExternalNotificationProvider externalNotificationProvider, SeriesProvider seriesProvider) + ExternalNotificationProvider externalNotificationProvider, SeriesProvider seriesProvider, + MetadataProvider metadataProvider) { _mediaFileProvider = mediaFileProvider; _diskScanProvider = diskScanProvider; _externalNotificationProvider = externalNotificationProvider; _seriesProvider = seriesProvider; + _metadataProvider = metadataProvider; } public string Name @@ -54,19 +59,32 @@ namespace NzbDrone.Core.Jobs return; } + var newEpisodeFiles = new List(); + var oldEpisodeFiles = new List(); + foreach (var episodeFile in episodeFiles) { try { - _diskScanProvider.MoveEpisodeFile(episodeFile); + var newFile = _diskScanProvider.MoveEpisodeFile(episodeFile); + + if (newFile != null) + { + newEpisodeFiles.Add(newFile); + oldEpisodeFiles.Add(episodeFile); + } } + catch(Exception e) { Logger.WarnException("An error has occurred while renaming file", e); - } - + } } + //Remove & Create Metadata for episode files + _metadataProvider.RemoveForEpisodeFiles(oldEpisodeFiles); + _metadataProvider.CreateForEpisodeFiles(newEpisodeFiles); + //Start AfterRename var message = String.Format("Renamed: Series {0}", series.Title); diff --git a/NzbDrone.Core/Providers/DiskScanProvider.cs b/NzbDrone.Core/Providers/DiskScanProvider.cs index d7dec59c3..27d9b32c7 100644 --- a/NzbDrone.Core/Providers/DiskScanProvider.cs +++ b/NzbDrone.Core/Providers/DiskScanProvider.cs @@ -168,7 +168,7 @@ namespace NzbDrone.Core.Providers return episodeFile; } - public virtual bool MoveEpisodeFile(EpisodeFile episodeFile, bool newDownload = false) + public virtual EpisodeFile MoveEpisodeFile(EpisodeFile episodeFile, bool newDownload = false) { if (episodeFile == null) throw new ArgumentNullException("episodeFile"); @@ -182,14 +182,14 @@ namespace NzbDrone.Core.Providers if (DiskProvider.PathEquals(episodeFile.Path, newFile.FullName)) { Logger.Debug("Skipping file rename, source and destination are the same: {0}", episodeFile.Path); - return false; + return null; } _diskProvider.CreateDirectory(newFile.DirectoryName); Logger.Debug("Moving [{0}] > [{1}]", episodeFile.Path, newFile.FullName); _diskProvider.MoveFile(episodeFile.Path, newFile.FullName); - + _diskProvider.InheritFolderPermissions(newFile.FullName); episodeFile.Path = newFile.FullName; @@ -213,7 +213,7 @@ namespace NzbDrone.Core.Providers _externalNotificationProvider.OnRename(message, series); } - return true; + return episodeFile; } /// diff --git a/NzbDrone.Core/Providers/Metadata/MetadataBase.cs b/NzbDrone.Core/Providers/Metadata/MetadataBase.cs index dc2f84ee2..740785acc 100644 --- a/NzbDrone.Core/Providers/Metadata/MetadataBase.cs +++ b/NzbDrone.Core/Providers/Metadata/MetadataBase.cs @@ -36,14 +36,26 @@ namespace NzbDrone.Core.Providers.Metadata /// /// The series to create the metadata for /// Series information from TheTvDb - public abstract void ForSeries(Series series, TvdbSeries tvDbSeries); + public abstract void CreateForSeries(Series series, TvdbSeries tvDbSeries); /// /// Creates metadata for the episode file /// /// The episode file to create the metadata /// Series information from TheTvDb - public abstract void ForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries); + public abstract void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries); + + /// + /// Removes metadata for a series + /// + /// The series to create the metadata for + public abstract void RemoveForSeries(Series series); + + /// + /// Removes metadata for the episode file + /// + /// The episode file to create the metadata + public abstract void RemoveForEpisodeFile(EpisodeFile episodeFile); public virtual string GetEpisodeGuideUrl(int seriesId) { diff --git a/NzbDrone.Core/Providers/Metadata/Xbmc.cs b/NzbDrone.Core/Providers/Metadata/Xbmc.cs index fe2e16d89..e81092e61 100644 --- a/NzbDrone.Core/Providers/Metadata/Xbmc.cs +++ b/NzbDrone.Core/Providers/Metadata/Xbmc.cs @@ -28,9 +28,9 @@ namespace NzbDrone.Core.Providers.Metadata get { return "XBMC"; } } - public override void ForSeries(Series series, TvdbSeries tvDbSeries) + public override void CreateForSeries(Series series, TvdbSeries tvDbSeries) { - //Create tvshow.nfo, fanart.jpg, folder.jpg and searon##.tbn + //Create tvshow.nfo, fanart.jpg, folder.jpg and season##.tbn var episodeGuideUrl = GetEpisodeGuideUrl(series.SeriesId); _logger.Debug("Generating tvshow.nfo for: {0}", series.Title); @@ -90,10 +90,9 @@ namespace NzbDrone.Core.Providers.Metadata } } - public override void ForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries) + public override void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries) { - //Download filename.tbn and filename.nfo - //Use BannerPath for Thumbnail + //Create filename.tbn and filename.nfo var episodes = _episodeProvider.GetEpisodesByFileId(episodeFile.EpisodeFileId); if (!episodes.Any()) @@ -191,6 +190,37 @@ namespace NzbDrone.Core.Providers.Metadata _diskProvider.WriteAllText(filename, xmlResult); } + public override void RemoveForSeries(Series series) + { + //Remove tvshow.nfo, fanart.jpg, folder.jpg and season##.tbn + _logger.Debug("Deleting series metadata for: ", series.Title); + + _diskProvider.DeleteFile(Path.Combine(series.Path, "tvshow.nfo")); + _diskProvider.DeleteFile(Path.Combine(series.Path, "fanart.jpg")); + _diskProvider.DeleteFile(Path.Combine(series.Path, "fanart.jpg")); + + foreach (var file in _diskProvider.GetFiles(series.Path, SearchOption.TopDirectoryOnly)) + { + if (Path.GetExtension(file) != ".tbn") + continue; + + if (!Path.GetFileName(file).StartsWith("season")) + continue; + + _logger.Debug("Deleting season thumbnail: {0}", file); + _diskProvider.DeleteFile(file); + } + } + + public override void RemoveForEpisodeFile(EpisodeFile episodeFile) + { + //Remove filename.tbn and filename.nfo + _logger.Debug("Deleting episode metadata for: {0}", episodeFile); + + _diskProvider.DeleteFile(episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".nfo")); + _diskProvider.DeleteFile(episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".tbn")); + } + private void DownloadSeasonThumbnails(Series series, TvdbSeries tvDbSeries, TvdbSeasonBanner.Type bannerType) { var seasons = tvDbSeries.SeasonBanners.Where(s => s.BannerType == bannerType).Select(s => s.Season); diff --git a/NzbDrone.Core/Providers/MetadataProvider.cs b/NzbDrone.Core/Providers/MetadataProvider.cs index 91084d974..3907ce274 100644 --- a/NzbDrone.Core/Providers/MetadataProvider.cs +++ b/NzbDrone.Core/Providers/MetadataProvider.cs @@ -100,7 +100,7 @@ namespace NzbDrone.Core.Providers { foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) { - provider.ForSeries(series, tvDbSeries); + provider.CreateForSeries(series, tvDbSeries); } } @@ -108,10 +108,60 @@ namespace NzbDrone.Core.Providers { var tvDbSeries = _tvDbProvider.GetSeries(episodeFile.SeriesId, true, true); + CreateForEpisodeFile(episodeFile, tvDbSeries); + } + + public virtual void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries) + { + foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) + { + provider.CreateForEpisodeFile(episodeFile, tvDbSeries); + } + } + + public virtual void CreateForEpisodeFiles(List episodeFiles) + { + var tvDbSeries = _tvDbProvider.GetSeries(episodeFiles.First().SeriesId, true, true); + + foreach(var episodeFile in episodeFiles) + { + foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) + { + provider.CreateForEpisodeFile(episodeFile, tvDbSeries); + } + } + } + + public virtual void RemoveForSeries(Series series) + { foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) { - provider.ForEpisodeFile(episodeFile, tvDbSeries); + provider.RemoveForSeries(series); } } + + public virtual void RemoveForEpisodeFile(EpisodeFile episodeFile) + { + foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) + { + provider.RemoveForEpisodeFile(episodeFile); + } + } + + public virtual void RemoveForEpisodeFiles(List episodeFiles) + { + foreach (var episodeFile in episodeFiles) + { + foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) + { + provider.RemoveForEpisodeFile(episodeFile); + } + } + } + + public virtual void RenameForEpisodeFile(EpisodeFile episodeFile) + { + + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/PostDownloadProvider.cs b/NzbDrone.Core/Providers/PostDownloadProvider.cs index 9bd196b7b..244a202b3 100644 --- a/NzbDrone.Core/Providers/PostDownloadProvider.cs +++ b/NzbDrone.Core/Providers/PostDownloadProvider.cs @@ -16,14 +16,16 @@ namespace NzbDrone.Core.Providers private readonly DiskProvider _diskProvider; private readonly DiskScanProvider _diskScanProvider; private readonly SeriesProvider _seriesProvider; + private readonly MetadataProvider _metadataProvider; [Inject] public PostDownloadProvider(DiskProvider diskProvider, DiskScanProvider diskScanProvider, - SeriesProvider seriesProvider) + SeriesProvider seriesProvider, MetadataProvider metadataProvider) { _diskProvider = diskProvider; _diskScanProvider = diskScanProvider; _seriesProvider = seriesProvider; + _metadataProvider = metadataProvider; } public PostDownloadProvider() @@ -71,6 +73,9 @@ namespace NzbDrone.Core.Providers var importedFiles = _diskScanProvider.Scan(series, subfolderInfo.FullName); importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); + //Create Metadata for all the episode files found + _metadataProvider.CreateForEpisodeFiles(importedFiles); + //Delete the folder only if folder is small enough if (_diskProvider.GetDirectorySize(subfolderInfo.FullName) < Constants.IgnoreFileSize) {