diff --git a/frontend/src/Activity/History/HistoryRow.css b/frontend/src/Activity/History/HistoryRow.css index 669377fdb..039804b63 100644 --- a/frontend/src/Activity/History/HistoryRow.css +++ b/frontend/src/Activity/History/HistoryRow.css @@ -10,6 +10,12 @@ width: 80px; } +.customFormatScore { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + + width: 55px; +} + .releaseGroup { composes: cell from '~Components/Table/Cells/TableRowCell.css'; diff --git a/frontend/src/Activity/History/HistoryRow.js b/frontend/src/Activity/History/HistoryRow.js index c86b9df1c..9a5b4d283 100644 --- a/frontend/src/Activity/History/HistoryRow.js +++ b/frontend/src/Activity/History/HistoryRow.js @@ -9,6 +9,7 @@ import MovieFormats from 'Movie/MovieFormats'; import MovieLanguage from 'Movie/MovieLanguage'; import MovieQuality from 'Movie/MovieQuality'; import MovieTitleLink from 'Movie/MovieTitleLink'; +import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore'; import HistoryDetailsModal from './Details/HistoryDetailsModal'; import HistoryEventTypeCell from './HistoryEventTypeCell'; import styles from './HistoryRow.css'; @@ -168,6 +169,17 @@ class HistoryRow extends Component { ); } + if (name === 'customFormatScore') { + return ( + + {formatCustomFormatScore(data.customFormatScore)} + + ); + } + if (name === 'releaseGroup') { return ( + + {formatCustomFormatScore(data.customFormatScore)} + + diff --git a/frontend/src/Movie/History/MovieHistoryTableContent.js b/frontend/src/Movie/History/MovieHistoryTableContent.js index 72fca4723..2f21a9166 100644 --- a/frontend/src/Movie/History/MovieHistoryTableContent.js +++ b/frontend/src/Movie/History/MovieHistoryTableContent.js @@ -1,5 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import Icon from 'Components/Icon'; import IconButton from 'Components/Link/IconButton'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import Table from 'Components/Table/Table'; @@ -35,6 +36,15 @@ const columns = [ isSortable: false, isVisible: true }, + { + name: 'customFormatScore', + label: React.createElement(Icon, { + name: icons.SCORE, + title: 'Custom format score' + }), + isSortable: true, + isVisible: true + }, { name: 'date', label: translate('Date'), diff --git a/frontend/src/Store/Actions/historyActions.js b/frontend/src/Store/Actions/historyActions.js index 1cba364cb..e45d41774 100644 --- a/frontend/src/Store/Actions/historyActions.js +++ b/frontend/src/Store/Actions/historyActions.js @@ -1,5 +1,7 @@ +import React from 'react'; import { createAction } from 'redux-actions'; -import { filterTypes, sortDirections } from 'Helpers/Props'; +import Icon from 'Components/Icon'; +import { filterTypes, icons, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; @@ -84,6 +86,15 @@ export const defaultState = { label: translate('SourceTitle'), isVisible: false }, + { + name: 'customFormatScore', + columnLabel: translate('CustomFormatScore'), + label: React.createElement(Icon, { + name: icons.SCORE, + title: 'Custom format score' + }), + isVisible: false + }, { name: 'details', columnLabel: translate('Details'), diff --git a/frontend/src/Utilities/Number/formatCustomFormatScore.js b/frontend/src/Utilities/Number/formatCustomFormatScore.js new file mode 100644 index 000000000..188090458 --- /dev/null +++ b/frontend/src/Utilities/Number/formatCustomFormatScore.js @@ -0,0 +1,16 @@ + +function formatCustomFormatScore(input) { + const score = Number(input); + + if (score > 0) { + return `+${score}`; + } + + if (score < 0) { + return score; + } + + return ''; +} + +export default formatCustomFormatScore; diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguageFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguageFixture.cs index 08fd6d338..acb9172e5 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguageFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguageFixture.cs @@ -70,7 +70,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators [Test] public void should_return_default_if_no_info_is_known() { - var result = Subject.Aggregate(_localMovie, null, false); + var result = Subject.Aggregate(_localMovie, null); result.Languages.Should().Contain(_movie.MovieMetadata.Value.OriginalLanguage); } @@ -83,7 +83,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators null, null); - Subject.Aggregate(_localMovie, null, false).Languages.Should().Equal(new List { Language.French }); + Subject.Aggregate(_localMovie, null).Languages.Should().Equal(new List { Language.French }); } [Test] @@ -94,7 +94,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators null, null); - var aggregation = Subject.Aggregate(_localMovie, null, false); + var aggregation = Subject.Aggregate(_localMovie, null); aggregation.Languages.Should().Equal(new List { Language.German }); } @@ -107,7 +107,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators new List { Language.Spanish }, null); - Subject.Aggregate(_localMovie, null, false).Languages.Should().Equal(new List { Language.Spanish }); + Subject.Aggregate(_localMovie, null).Languages.Should().Equal(new List { Language.Spanish }); } [Test] @@ -118,7 +118,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators new List { Language.Unknown }, null); - Subject.Aggregate(_localMovie, null, false).Languages.Should().Equal(new List { Language.French, Language.German }); + Subject.Aggregate(_localMovie, null).Languages.Should().Equal(new List { Language.French, Language.German }); } [Test] @@ -129,7 +129,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators new List { Language.Unknown }, new List { Language.Japanese, Language.English }); - Subject.Aggregate(_localMovie, null, false).Languages.Should().Equal(new List { Language.Japanese, Language.English }); + Subject.Aggregate(_localMovie, null).Languages.Should().Equal(new List { Language.Japanese, Language.English }); } [Test] @@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators new List { Language.Unknown }, new List { Language.Unknown }); - Subject.Aggregate(_localMovie, null, false).Languages.Should().Equal(new List { Language.French, Language.German }); + Subject.Aggregate(_localMovie, null).Languages.Should().Equal(new List { Language.French, Language.German }); } } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQualityFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQualityFixture.cs index b9439daaf..b903cc779 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQualityFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQualityFixture.cs @@ -60,7 +60,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators GivenAugmenters(_fileExtensionAugmenter, nullMock); - var result = Subject.Aggregate(new LocalMovie(), null, false); + var result = Subject.Aggregate(new LocalMovie(), null); result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Extension); result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.Extension); @@ -72,7 +72,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators { GivenAugmenters(_fileExtensionAugmenter, _nameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), null, false); + var result = Subject.Aggregate(new LocalMovie(), null); result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Name); result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.Name); @@ -84,7 +84,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators { GivenAugmenters(_fileExtensionAugmenter, _mediaInfoAugmenter); - var result = Subject.Aggregate(new LocalMovie(), null, false); + var result = Subject.Aggregate(new LocalMovie(), null); result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Extension); result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.MediaInfo); @@ -96,7 +96,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators { GivenAugmenters(_nameAugmenter, _mediaInfoAugmenter); - var result = Subject.Aggregate(new LocalMovie(), null, false); + var result = Subject.Aggregate(new LocalMovie(), null); result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Name); result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.MediaInfo); @@ -108,7 +108,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators { GivenAugmenters(_nameAugmenter, _releaseNameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem(), false); + var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem()); result.Quality.SourceDetectionSource.Should().Be(QualityDetectionSource.Name); result.Quality.ResolutionDetectionSource.Should().Be(QualityDetectionSource.Name); @@ -120,7 +120,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators { GivenAugmenters(_nameAugmenter, _releaseNameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem(), false); + var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem()); result.Quality.Revision.Version.Should().Be(1); result.Quality.RevisionDetectionSource.Should().Be(QualityDetectionSource.Unknown); @@ -134,7 +134,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators GivenAugmenters(_nameAugmenter, _releaseNameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem(), false); + var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem()); result.Quality.Revision.Version.Should().Be(2); result.Quality.RevisionDetectionSource.Should().Be(QualityDetectionSource.Name); @@ -148,7 +148,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators GivenAugmenters(_nameAugmenter, _releaseNameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem(), false); + var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem()); result.Quality.Revision.Version.Should().Be(0); result.Quality.RevisionDetectionSource.Should().Be(QualityDetectionSource.Name); @@ -165,7 +165,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators GivenAugmenters(_nameAugmenter, _releaseNameAugmenter); - var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem(), false); + var result = Subject.Aggregate(new LocalMovie(), new DownloadClientItem()); result.Quality.Revision.Version.Should().Be(2); result.Quality.RevisionDetectionSource.Should().Be(QualityDetectionSource.Name); diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroupFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroupFixture.cs index 6ac79a438..1bcbd2bc3 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroupFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroupFixture.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators Movie = _movie }; - Subject.Aggregate(localMovie, null, false); + Subject.Aggregate(localMovie, null); localMovie.ReleaseGroup.Should().Be("Viva"); } @@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators Movie = _movie }; - Subject.Aggregate(localMovie, null, false); + Subject.Aggregate(localMovie, null); localMovie.ReleaseGroup.Should().Be("Drone"); } @@ -75,7 +75,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators Movie = _movie }; - Subject.Aggregate(localMovie, null, false); + Subject.Aggregate(localMovie, null); localMovie.ReleaseGroup.Should().Be("Wizzy"); } @@ -95,7 +95,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators Movie = _movie }; - Subject.Aggregate(localMovie, null, false); + Subject.Aggregate(localMovie, null); localMovie.ReleaseGroup.Should().Be("FraMeSToR"); } @@ -115,7 +115,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport.Aggregation.Aggregators Movie = _movie }; - Subject.Aggregate(localMovie, null, false); + Subject.Aggregate(localMovie, null); localMovie.ReleaseGroup.Should().Be("FraMeSToR"); } diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/GetSceneNameFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/GetSceneNameFixture.cs new file mode 100644 index 000000000..5e12da1cd --- /dev/null +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/GetSceneNameFixture.cs @@ -0,0 +1,153 @@ +using System.Collections.Generic; +using System.IO; +using FizzWare.NBuilder; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.MediaFiles.MovieImport; +using NzbDrone.Core.Movies; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Profiles; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.MediaFiles.MovieImport +{ + [TestFixture] + public class GetSceneNameFixture : CoreTest + { + private LocalMovie _localMovie; + private string _movieName = "movie.title.2022.dvdrip.x264-ingot"; + + [SetUp] + public void Setup() + { + var movie = Builder.CreateNew() + .With(e => e.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() }) + .With(s => s.Path = @"C:\Test\Movies\Movie Title".AsOsAgnostic()) + .Build(); + + _localMovie = new LocalMovie + { + Movie = movie, + Path = Path.Combine(movie.Path, "Movie Title - 2022 - Episode Title.mkv"), + Quality = new QualityModel(Quality.Bluray720p), + ReleaseGroup = "DRONE" + }; + } + + private void GivenExistingFileOnDisk() + { + Mocker.GetMock() + .Setup(s => s.GetFilesWithRelativePath(It.IsAny(), It.IsAny())) + .Returns(new List()); + } + + [Test] + public void should_use_download_client_item_title_as_scene_name() + { + _localMovie.DownloadClientMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = _movieName + }; + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .Be(_movieName); + } + + [Test] + public void should_not_use_download_client_item_title_as_scene_name_if_there_are_other_video_files() + { + _localMovie.OtherVideoFiles = true; + _localMovie.DownloadClientMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = _movieName + }; + + _localMovie.Path = Path.Combine(@"C:\Test\Unsorted Movies", _movieName) + .AsOsAgnostic(); + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .BeNull(); + } + + [Test] + public void should_use_file_name_as_scenename_only_if_it_looks_like_scenename() + { + _localMovie.Path = Path.Combine(@"C:\Test\Unsorted Movies", _movieName + ".mkv") + .AsOsAgnostic(); + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .Be(_movieName); + } + + [Test] + public void should_not_use_file_name_as_scenename_if_it_doesnt_look_like_scenename() + { + _localMovie.Path = Path.Combine(@"C:\Test\Unsorted Movies", _movieName, "aaaaa.mkv") + .AsOsAgnostic(); + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .BeNull(); + } + + [Test] + public void should_use_folder_name_as_scenename_only_if_it_looks_like_scenename() + { + _localMovie.FolderMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = _movieName + }; + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .Be(_movieName); + } + + [Test] + public void should_not_use_folder_name_as_scenename_if_it_doesnt_look_like_scenename() + { + _localMovie.Path = Path.Combine(@"C:\Test\Unsorted Movies", _movieName, "aaaaa.mkv") + .AsOsAgnostic(); + + _localMovie.FolderMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = "aaaaa" + }; + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .BeNull(); + } + + [Test] + public void should_not_use_folder_name_as_scenename_if_there_are_other_video_files() + { + _localMovie.OtherVideoFiles = true; + _localMovie.Path = Path.Combine(@"C:\Test\Unsorted Movies", _movieName, "aaaaa.mkv") + .AsOsAgnostic(); + + _localMovie.FolderMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = _movieName + }; + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .BeNull(); + } + + [TestCase(".mkv")] + [TestCase(".par2")] + [TestCase(".nzb")] + public void should_remove_extension_from_nzb_title_for_scene_name(string extension) + { + _localMovie.DownloadClientMovieInfo = new ParsedMovieInfo + { + ReleaseTitle = _movieName + extension + }; + + SceneNameCalculator.GetSceneName(_localMovie).Should() + .Be(_movieName); + } + } +} diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportApprovedMoviesFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportApprovedMoviesFixture.cs index e6278f6cc..b68d89581 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportApprovedMoviesFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportApprovedMoviesFixture.cs @@ -159,84 +159,6 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport Times.Never()); } - [Test] - public void should_use_nzb_title_as_scene_name() - { - GivenNewDownload(); - _downloadClientItem.Title = "malcolm.in.the.middle.2015.dvdrip.xvid-ingot"; - - Subject.Import(new List { _approvedDecisions.First() }, true, _downloadClientItem); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == _downloadClientItem.Title))); - } - - [TestCase(".mkv")] - [TestCase(".par2")] - [TestCase(".nzb")] - public void should_remove_extension_from_nzb_title_for_scene_name(string extension) - { - GivenNewDownload(); - var title = "malcolm.in.the.middle.2015.dvdrip.xvid-ingot"; - - _downloadClientItem.Title = title + extension; - - Subject.Import(new List { _approvedDecisions.First() }, true, _downloadClientItem); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == title))); - } - - [Test] - public void should_use_file_name_as_scenename_only_if_it_looks_like_scenename() - { - GivenNewDownload(); - _approvedDecisions.First().LocalMovie.Path = Path.Combine(_downloadClientItem.OutputPath.ToString(), "movie.title.2018.dvdrip.xvid-ingot.mkv"); - - Subject.Import(new List { _approvedDecisions.First() }, true); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == "movie.title.2018.dvdrip.xvid-ingot"))); - } - - [Test] - public void should_not_use_file_name_as_scenename_if_it_doesnt_looks_like_scenename() - { - GivenNewDownload(); - _approvedDecisions.First().LocalMovie.Path = Path.Combine(_downloadClientItem.OutputPath.ToString(), "aaaaa.mkv"); - - Subject.Import(new List { _approvedDecisions.First() }, true); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == null))); - } - - [Test] - public void should_use_folder_name_as_scenename_only_if_it_looks_like_scenename() - { - GivenNewDownload(); - _approvedDecisions.First().LocalMovie.Path = Path.Combine(_downloadClientItem.OutputPath.ToString(), "aaaaa.mkv"); - _approvedDecisions.First().LocalMovie.FolderMovieInfo = new ParsedMovieInfo - { - ReleaseTitle = "movie.title.2018.dvdrip.xvid-ingot" - }; - - Subject.Import(new List { _approvedDecisions.First() }, true); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == "movie.title.2018.dvdrip.xvid-ingot"))); - } - - [Test] - public void should_not_use_folder_name_as_scenename_if_it_doesnt_looks_like_scenename() - { - GivenNewDownload(); - _approvedDecisions.First().LocalMovie.Path = Path.Combine(_downloadClientItem.OutputPath.ToString(), "aaaaa.mkv"); - _approvedDecisions.First().LocalMovie.FolderMovieInfo = new ParsedMovieInfo - { - ReleaseTitle = "aaaaa.mkv" - }; - - Subject.Import(new List { _approvedDecisions.First() }, true); - - Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.SceneName == null))); - } - [Test] public void should_import_larger_files_first() { @@ -411,5 +333,18 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport Mocker.GetMock().Verify(v => v.Add(It.Is(c => c.OriginalFilePath == $"subfolder\\{name}.mkv".AsOsAgnostic()))); } + + [Test] + public void should_include_scene_name_with_new_downloads() + { + var firstDecision = _approvedDecisions.First(); + firstDecision.LocalMovie.SceneName = "Movie.Title.2022.dvdrip-DRONE"; + + Subject.Import(new List { _approvedDecisions.First() }, true); + + Mocker.GetMock() + .Verify(v => v.UpgradeMovieFile(It.Is(e => e.SceneName == firstDecision.LocalMovie.SceneName), _approvedDecisions.First().LocalMovie, false), + Times.Once()); + } } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportDecisionMakerFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportDecisionMakerFixture.cs index 94c427b0b..b17472708 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportDecisionMakerFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MovieImport/ImportDecisionMakerFixture.cs @@ -102,8 +102,8 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport private void GivenAugmentationSuccess() { Mocker.GetMock() - .Setup(s => s.Augment(It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((localMovie, downloadClientItem, otherFiles) => + .Setup(s => s.Augment(It.IsAny(), It.IsAny())) + .Callback((localMovie, downloadClientItem) => { localMovie.Movie = _localMovie.Movie; }); @@ -173,7 +173,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport GivenSpecifications(_pass1); Mocker.GetMock() - .Setup(c => c.Augment(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(c => c.Augment(It.IsAny(), It.IsAny())) .Throws(); _videoFiles = new List @@ -188,7 +188,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport Subject.GetImportDecisions(_videoFiles, _movie); Mocker.GetMock() - .Verify(c => c.Augment(It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(_videoFiles.Count)); + .Verify(c => c.Augment(It.IsAny(), It.IsAny()), Times.Exactly(_videoFiles.Count)); ExceptionVerification.ExpectedErrors(3); } @@ -209,7 +209,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport var fileNames = _videoFiles.Select(System.IO.Path.GetFileName); Mocker.GetMock() - .Setup(c => c.Augment(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(c => c.Augment(It.IsAny(), It.IsAny())) .Throws(); } @@ -217,7 +217,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MovieImport public void should_return_a_decision_when_exception_is_caught() { Mocker.GetMock() - .Setup(c => c.Augment(It.IsAny(), It.IsAny(), It.IsAny())) + .Setup(c => c.Augment(It.IsAny(), It.IsAny())) .Throws(); _videoFiles = new List diff --git a/src/NzbDrone.Core/History/HistoryService.cs b/src/NzbDrone.Core/History/HistoryService.cs index 46c02dbbf..7a2ff25f1 100644 --- a/src/NzbDrone.Core/History/HistoryService.cs +++ b/src/NzbDrone.Core/History/HistoryService.cs @@ -152,6 +152,7 @@ namespace NzbDrone.Core.History history.Data.Add("Guid", message.Movie.Release.Guid); history.Data.Add("TmdbId", message.Movie.Release.TmdbId.ToString()); history.Data.Add("Protocol", ((int)message.Movie.Release.DownloadProtocol).ToString()); + history.Data.Add("CustomFormatScore", message.Movie.CustomFormatScore.ToString()); history.Data.Add("IndexerFlags", message.Movie.Release.IndexerFlags.ToString()); history.Data.Add("IndexerId", message.Movie.Release.IndexerId.ToString()); diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/AggregationService.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/AggregationService.cs index 773c73abf..da54dfc95 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/AggregationService.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/AggregationService.cs @@ -13,7 +13,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation { public interface IAggregationService { - LocalMovie Augment(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles); + LocalMovie Augment(LocalMovie localMovie, DownloadClientItem downloadClientItem); } public class AggregationService : IAggregationService @@ -37,7 +37,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation _logger = logger; } - public LocalMovie Augment(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles) + public LocalMovie Augment(LocalMovie localMovie, DownloadClientItem downloadClientItem) { var isMediaFile = MediaFileExtensions.Extensions.Contains(Path.GetExtension(localMovie.Path)); @@ -52,6 +52,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation } localMovie.Size = _diskProvider.GetFileSize(localMovie.Path); + localMovie.SceneName = localMovie.SceneSource ? SceneNameCalculator.GetSceneName(localMovie) : null; if (isMediaFile && (!localMovie.ExistingFile || _configService.EnableMediaInfo)) { @@ -62,7 +63,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation { try { - augmenter.Aggregate(localMovie, downloadClientItem, otherFiles); + augmenter.Aggregate(localMovie, downloadClientItem); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateEdition.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateEdition.cs index b0170e573..e4417afd3 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateEdition.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateEdition.cs @@ -6,7 +6,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation.Aggregators { public class AggregateEdition : IAggregateLocalMovie { - public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles) + public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem) { var movieEdition = localMovie.DownloadClientMovieInfo?.Edition; diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguage.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguage.cs index c44b6a23c..82d8246ef 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguage.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateLanguage.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation.Aggregators _logger = logger; } - public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles) + public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem) { var languages = new List { localMovie.Movie?.MovieMetadata.Value.OriginalLanguage ?? Language.Unknown }; var languagesConfidence = Confidence.Default; diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQuality.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQuality.cs index 841b85da8..f53181a02 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQuality.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateQuality.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation.Aggregators _logger = logger; } - public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles) + public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem) { var source = Source.UNKNOWN; var sourceConfidence = Confidence.Default; diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroup.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroup.cs index af7c0cac9..256e4acb7 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroup.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/AggregateReleaseGroup.cs @@ -6,7 +6,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation.Aggregators { public class AggregateReleaseGroup : IAggregateLocalMovie { - public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles) + public LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem) { var releaseGroup = localMovie.DownloadClientMovieInfo?.ReleaseGroup; diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/IAggregateLocalMovie.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/IAggregateLocalMovie.cs index 29f53d8ef..6ec399ae3 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/IAggregateLocalMovie.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Aggregation/Aggregators/IAggregateLocalMovie.cs @@ -5,6 +5,6 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Aggregation.Aggregators { public interface IAggregateLocalMovie { - LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem, bool otherFiles); + LocalMovie Aggregate(LocalMovie localMovie, DownloadClientItem downloadClientItem); } } diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/ImportApprovedMovie.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/ImportApprovedMovie.cs index 8a7bd5e12..55b9b8971 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/ImportApprovedMovie.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/ImportApprovedMovie.cs @@ -118,8 +118,8 @@ namespace NzbDrone.Core.MediaFiles.MovieImport if (newDownload) { + movieFile.SceneName = localMovie.SceneName; movieFile.OriginalFilePath = GetOriginalFilePath(downloadClientItem, localMovie); - movieFile.SceneName = GetSceneName(downloadClientItem, localMovie); var moveResult = _movieFileUpgrader.UpgradeMovieFile(movieFile, localMovie, copyOnly); //TODO: Check if this works oldFiles = moveResult.OldFiles; } @@ -208,32 +208,5 @@ namespace NzbDrone.Core.MediaFiles.MovieImport return Path.Combine(Path.GetFileName(parentPath), Path.GetFileName(path)); } - - private string GetSceneName(DownloadClientItem downloadClientItem, LocalMovie localMovie) - { - if (downloadClientItem != null) - { - var sceneNameTitle = SceneChecker.GetSceneTitle(downloadClientItem.Title); - if (sceneNameTitle != null) - { - return sceneNameTitle; - } - } - - var fileName = Path.GetFileNameWithoutExtension(localMovie.Path.CleanFilePath()); - var sceneNameFile = SceneChecker.GetSceneTitle(fileName); - if (sceneNameFile != null) - { - return sceneNameFile; - } - - var folderTitle = localMovie.FolderMovieInfo?.ReleaseTitle; - if (folderTitle.IsNotNullOrWhiteSpace() && SceneChecker.IsSceneTitle(folderTitle)) - { - return folderTitle; - } - - return null; - } } } diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/ImportDecisionMaker.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/ImportDecisionMaker.cs index eed2912e1..ad9d8d284 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/ImportDecisionMaker.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/ImportDecisionMaker.cs @@ -91,7 +91,8 @@ namespace NzbDrone.Core.MediaFiles.MovieImport FolderMovieInfo = folderInfo, Path = file, SceneSource = sceneSource, - ExistingFile = movie.Path.IsParentPath(file) + ExistingFile = movie.Path.IsParentPath(file), + OtherVideoFiles = nonSampleVideoFileCount > 1 }; decisions.AddIfNotNull(GetDecision(localMovie, downloadClientItem, nonSampleVideoFileCount > 1)); @@ -124,7 +125,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport try { - _aggregationService.Augment(localMovie, downloadClientItem, otherFiles); + _aggregationService.Augment(localMovie, downloadClientItem); if (localMovie.Movie == null) { diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/Manual/ManualImportService.cs index 6632ab971..082d2870f 100644 --- a/src/NzbDrone.Core/MediaFiles/MovieImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/Manual/ManualImportService.cs @@ -341,7 +341,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual localMovie.SceneSource = !existingFile; } - localMovie = _aggregationService.Augment(localMovie, trackedDownload?.DownloadItem, false); + localMovie = _aggregationService.Augment(localMovie, trackedDownload?.DownloadItem); // Apply the user-chosen values. localMovie.Movie = movie; diff --git a/src/NzbDrone.Core/MediaFiles/MovieImport/SceneNameCalculator.cs b/src/NzbDrone.Core/MediaFiles/MovieImport/SceneNameCalculator.cs new file mode 100644 index 000000000..609155bd3 --- /dev/null +++ b/src/NzbDrone.Core/MediaFiles/MovieImport/SceneNameCalculator.cs @@ -0,0 +1,39 @@ +using System.IO; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Parser; +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.MediaFiles.MovieImport +{ + public static class SceneNameCalculator + { + public static string GetSceneName(LocalMovie localMovie) + { + var otherVideoFiles = localMovie.OtherVideoFiles; + var downloadClientInfo = localMovie.DownloadClientMovieInfo; + + if (!otherVideoFiles && downloadClientInfo != null) + { + return Parser.Parser.RemoveFileExtension(downloadClientInfo.ReleaseTitle); + } + + var fileName = Path.GetFileNameWithoutExtension(localMovie.Path.CleanFilePath()); + + if (SceneChecker.IsSceneTitle(fileName)) + { + return fileName; + } + + var folderTitle = localMovie.FolderMovieInfo?.ReleaseTitle; + + if (!otherVideoFiles && + folderTitle.IsNotNullOrWhiteSpace() && + SceneChecker.IsSceneTitle(folderTitle)) + { + return folderTitle; + } + + return null; + } + } +} diff --git a/src/NzbDrone.Core/Parser/Model/LocalMovie.cs b/src/NzbDrone.Core/Parser/Model/LocalMovie.cs index d1f96956c..d2fd17780 100644 --- a/src/NzbDrone.Core/Parser/Model/LocalMovie.cs +++ b/src/NzbDrone.Core/Parser/Model/LocalMovie.cs @@ -25,6 +25,8 @@ namespace NzbDrone.Core.Parser.Model public bool SceneSource { get; set; } public string ReleaseGroup { get; set; } public string Edition { get; set; } + public string SceneName { get; set; } + public bool OtherVideoFiles { get; set; } public override string ToString() {