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()
{