This commit is contained in:
Qstick 2022-04-10 21:30:25 -05:00
parent b6f94855eb
commit fb7ab09f57
26 changed files with 80 additions and 88 deletions

View file

@ -74,11 +74,11 @@ class CollectionConnector extends Component {
onScroll = ({ scrollTop }) => {
scrollPositions.movieCollections = scrollTop;
}
};
onUpdateSelectedPress = (payload) => {
this.props.onUpdateSelectedPress(payload);
}
};
//
// Render

View file

@ -269,7 +269,7 @@ class MovieDetails extends Component {
monitored,
studio,
genres,
collectionId,
collection,
overview,
youTubeTrailerId,
isAvailable,
@ -576,7 +576,7 @@ class MovieDetails extends Component {
</InfoLabel>
{
!!collectionId &&
!!collection &&
<InfoLabel
className={styles.detailsInfoLabel}
title={translate('Collection')}
@ -584,7 +584,7 @@ class MovieDetails extends Component {
>
<div className={styles.collection}>
<MovieCollectionLabelConnector
collectionId={collectionId}
tmdbId={collection.tmdbId}
/>
</div>
</InfoLabel>
@ -800,7 +800,7 @@ MovieDetails.propTypes = {
status: PropTypes.string.isRequired,
studio: PropTypes.string,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
collectionId: PropTypes.number,
collection: PropTypes.object,
youTubeTrailerId: PropTypes.string,
isAvailable: PropTypes.bool.isRequired,
inCinemas: PropTypes.string,

View file

@ -4,7 +4,6 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import * as commandNames from 'Commands/commandNames';
import { executeCommand } from 'Store/Actions/commandActions';
import createCollectionSelector from 'Store/Selectors/createCollectionSelector';
import createExecutingCommandsSelector from 'Store/Selectors/createExecutingCommandsSelector';
import createMovieQualityProfileSelector from 'Store/Selectors/createMovieQualityProfileSelector';
import createMovieSelector from 'Store/Selectors/createMovieSelector';
@ -30,14 +29,12 @@ function selectShowSearchAction() {
function createMapStateToProps() {
return createSelector(
createMovieSelector(),
createCollectionSelector(),
createMovieQualityProfileSelector(),
selectShowSearchAction(),
createExecutingCommandsSelector(),
(state) => state.queue.details.items,
(
movie,
collection,
qualityProfile,
showSearchAction,
executingCommands,
@ -71,7 +68,6 @@ function createMapStateToProps() {
return {
...movie,
collection,
qualityProfile,
showSearchAction,
isRefreshingMovie,

View file

@ -3,13 +3,14 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { toggleCollectionMonitored } from 'Store/Actions/movieCollectionActions';
import createCollectionSelector from 'Store/Selectors/createCollectionSelector';
import MovieCollectionLabel from './MovieCollectionLabel';
function createMapStateToProps() {
return createSelector(
createCollectionSelector(),
(collection) => {
(state, { tmdbId }) => tmdbId,
(state) => state.movieCollections.items,
(tmdbId, collections) => {
const collection = collections.find((movie) => movie.tmdbId === tmdbId);
return {
...collection
};
@ -28,10 +29,10 @@ class MovieCollectionLabelConnector extends Component {
onMonitorTogglePress = (monitored) => {
this.props.toggleCollectionMonitored({
collectionId: this.props.collectionId,
collectionId: this.props.id,
monitored
});
}
};
//
// Render
@ -47,7 +48,8 @@ class MovieCollectionLabelConnector extends Component {
}
MovieCollectionLabelConnector.propTypes = {
collectionId: PropTypes.number.isRequired,
tmdbId: PropTypes.number.isRequired,
id: PropTypes.number.isRequired,
monitored: PropTypes.bool.isRequired,
toggleCollectionMonitored: PropTypes.func.isRequired
};

View file

@ -50,10 +50,10 @@ namespace NzbDrone.Core.Test.Datastore.Migration
collections.First().Title.Should().Be("Some Collection");
collections.First().Monitored.Should().BeFalse();
var movies = db.Query<Movie208>("SELECT Id, CollectionId FROM MovieMetadata");
var movies = db.Query<Movie208>("SELECT Id, CollectionTmdbId FROM MovieMetadata");
movies.Should().HaveCount(1);
movies.First().CollectionId.Should().Be(collections.First().Id);
movies.First().CollectionTmdbId.Should().Be(collections.First().TmdbId);
}
[Test]
@ -277,7 +277,7 @@ namespace NzbDrone.Core.Test.Datastore.Migration
public class Movie208
{
public int Id { get; set; }
public int CollectionId { get; set; }
public int CollectionTmdbId { get; set; }
}
public class ListDefinition208

View file

@ -16,6 +16,7 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
{
var collection = Builder<MovieCollection>.CreateNew()
.With(h => h.Id = 3)
.With(h => h.TmdbId = 123456)
.With(h => h.Title = "Some Credit")
.BuildNew();
@ -29,12 +30,13 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers
{
var collection = Builder<MovieCollection>.CreateNew()
.With(h => h.Id = 3)
.With(h => h.TmdbId = 123456)
.With(h => h.Title = "Some Credit")
.BuildNew();
Db.Insert(collection);
var movie = Builder<MovieMetadata>.CreateNew().With(m => m.CollectionId = collection.Id).BuildNew();
var movie = Builder<MovieMetadata>.CreateNew().With(m => m.CollectionTmdbId = collection.TmdbId).BuildNew();
Db.Insert(movie);

View file

@ -227,7 +227,7 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
public void should_replace_movie_collection()
{
_namingConfig.StandardMovieFormat = "{Movie Collection}";
_movie.MovieMetadata.Value.Collection = new MovieCollection { Title = "South Part Collection" };
_movie.MovieMetadata.Value.CollectionTitle = "South Part Collection";
Subject.BuildFileName(_movie, _movieFile)
.Should().Be("South Part Collection");

View file

@ -29,10 +29,11 @@ namespace NzbDrone.Core.Datastore.Migration
.WithColumn("Images").AsString().WithDefaultValue("[]")
.WithColumn("Monitored").AsBoolean().WithDefaultValue(false)
.WithColumn("LastInfoSync").AsDateTime().Nullable()
.WithColumn("Added").AsDateTime().Nullable()
.WithColumn("MovieTmdbIds").AsString().WithDefaultValue("[]");
.WithColumn("Added").AsDateTime().Nullable();
Alter.Table("MovieMetadata").AddColumn("CollectionTmdbId").AsInt32().Nullable()
.AddColumn("CollectionTitle").AsString().Nullable();
Alter.Table("MovieMetadata").AddColumn("CollectionId").AsInt32().Nullable();
Alter.Table("ImportLists").AddColumn("Monitor").AsInt32().Nullable();
Execute.WithConnection(MigrateCollections);
@ -192,23 +193,6 @@ namespace NzbDrone.Core.Datastore.Migration
private void MapCollections(IDbConnection conn, IDbTransaction tran)
{
var collections = new List<MovieCollection207>();
using (var getCollections = conn.CreateCommand())
{
getCollections.Transaction = tran;
getCollections.CommandText = @"SELECT ""Id"", ""TmdbId"" FROM ""Collections""";
using (var definitionsReader = getCollections.ExecuteReader())
{
while (definitionsReader.Read())
{
int id = definitionsReader.GetInt32(0);
int tmdbId = definitionsReader.GetInt32(1);
collections.Add(new MovieCollection207 { Id = id, TmdbId = tmdbId });
}
}
}
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tran;
@ -222,13 +206,15 @@ namespace NzbDrone.Core.Datastore.Migration
var collection = reader.GetString(1);
var data = STJson.Deserialize<MovieCollection206>(collection);
var collectionId = collections.SingleOrDefault(x => x.TmdbId == data.TmdbId).Id;
var collectionId = data.TmdbId;
var collectionTitle = data.Name;
using (var updateCmd = conn.CreateCommand())
{
updateCmd.Transaction = tran;
updateCmd.CommandText = @"UPDATE ""MovieMetadata"" SET ""CollectionId"" = ? WHERE ""Id"" = ?";
updateCmd.CommandText = @"UPDATE ""MovieMetadata"" SET ""CollectionTmdbId"" = ?, ""CollectionTitle"" = ? WHERE ""Id"" = ?";
updateCmd.AddParameter(collectionId);
updateCmd.AddParameter(collectionTitle);
updateCmd.AddParameter(id);
updateCmd.ExecuteNonQuery();

View file

@ -52,7 +52,7 @@ namespace NzbDrone.Core.Download.Clients.Flood
switch (additionalTag)
{
case (int)AdditionalTags.Collection:
result.Add(remoteMovie.Movie.MovieMetadata.Value.Collection.Value.Title);
result.Add(remoteMovie.Movie.MovieMetadata.Value.CollectionTitle);
break;
case (int)AdditionalTags.Quality:
result.Add(remoteMovie.ParsedMovieInfo.Quality.Quality.ToString());

View file

@ -251,11 +251,11 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
details.Add(new XElement("country"));
if (movie.MovieMetadata.Value.Collection?.Value.Title != null)
if (movie.MovieMetadata.Value.CollectionTitle != null)
{
var setElement = new XElement("set");
setElement.Add(new XElement("name", movie.MovieMetadata.Value.Collection.Value.Title));
setElement.Add(new XElement("name", movie.MovieMetadata.Value.CollectionTitle));
setElement.Add(new XElement("overview"));
details.Add(setElement);

View file

@ -16,12 +16,12 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
{
using (var mapper = _database.OpenConnection())
{
mapper.Execute(@"DELETE FROM Collections
WHERE Id IN (
SELECT Collections.Id FROM Collections
LEFT OUTER JOIN Movies
ON Collections.Id = Movies.CollectionId
WHERE Movies.Id IS NULL)");
mapper.Execute(@"DELETE FROM ""Collections""
WHERE ""TmdbId"" IN (
SELECT ""Collections"".""TmdbId"" FROM ""Collections""
LEFT OUTER JOIN ""MovieMetadata""
ON ""Collections"".""TmdbId"" = ""MovieMetadata"".""CollectionTmdbId""
WHERE ""MovieMetadata"".""Id"" IS NULL)");
}
}
}

View file

@ -287,7 +287,8 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
if (resource.Collection != null)
{
movie.Collection = MapCollection(resource.Collection);
movie.CollectionTmdbId = resource.Collection.TmdbId;
movie.CollectionTitle = resource.Collection.Name;
}
return movie;
@ -510,7 +511,6 @@ namespace NzbDrone.Core.MetadataSource.SkyHook
CleanTitle = arg.Name.CleanMovieTitle(),
SortTitle = Parser.Parser.NormalizeTitle(arg.Name),
Images = arg.Images?.Select(MapImage).ToList() ?? new List<MediaCover.MediaCover>(),
MovieTmdbIds = arg.Parts?.Select(x => x.TmdbId).ToList() ?? new List<int>(),
Movies = arg.Parts?.Select(x => MapMovie(x)).ToList() ?? new List<MovieMetadata>()
};

View file

@ -61,10 +61,10 @@ namespace NzbDrone.Core.Movies
_logger.Info("Adding Movie {0} Path: [{1}]", newMovie, newMovie.Path);
// add collection
if (newMovie.MovieMetadata.Value.Collection != null)
if (newMovie.MovieMetadata.Value.CollectionTmdbId > 0)
{
var newCollection = _collectionService.AddMovieCollection(BuildCollection(newMovie));
newMovie.MovieMetadata.Value.CollectionId = newCollection.Id;
newMovie.MovieMetadata.Value.CollectionTmdbId = newCollection.TmdbId;
}
_movieMetadataService.Upsert(newMovie.MovieMetadata.Value);
@ -92,10 +92,10 @@ namespace NzbDrone.Core.Movies
movie.Added = added;
// add collection
if (movie.MovieMetadata.Value.Collection != null)
if (movie.MovieMetadata.Value.CollectionTmdbId > 0)
{
var newCollection = _collectionService.AddMovieCollection(BuildCollection(movie));
movie.MovieMetadata.Value.CollectionId = newCollection.Id;
movie.MovieMetadata.Value.CollectionTmdbId = newCollection.TmdbId;
}
moviesToAdd.Add(movie);
@ -142,7 +142,12 @@ namespace NzbDrone.Core.Movies
private MovieCollection BuildCollection(Movie newMovie)
{
var collection = newMovie.MovieMetadata.Value.Collection.Value;
var collection = new MovieCollection
{
TmdbId = newMovie.MovieMetadata.Value.CollectionTmdbId,
Title = newMovie.MovieMetadata.Value.CollectionTitle
};
collection.Monitored = newMovie.AddOptions?.Monitor == MonitorTypes.MovieAndCollection;
collection.SearchOnAdd = newMovie.AddOptions?.SearchForMovie ?? false;
collection.QualityProfileId = newMovie.ProfileId;

View file

@ -9,7 +9,6 @@ namespace NzbDrone.Core.Movies.Collections
public MovieCollection()
{
Images = new List<MediaCover.MediaCover>();
MovieTmdbIds = new List<int>();
}
public string Title { get; set; }
@ -25,7 +24,6 @@ namespace NzbDrone.Core.Movies.Collections
public DateTime? LastInfoSync { get; set; }
public List<MediaCover.MediaCover> Images { get; set; }
public DateTime Added { get; set; }
public List<int> MovieTmdbIds { get; set; }
public List<MovieMetadata> Movies { get; set; }
public void ApplyChanges(MovieCollection otherCollection)

View file

@ -92,20 +92,20 @@ namespace NzbDrone.Core.Movies.Collections
public void HandleAsync(MoviesDeletedEvent message)
{
var collections = message.Movies.Select(x => x.MovieMetadata.Value.CollectionId).Distinct();
var collections = message.Movies.Select(x => x.MovieMetadata.Value.CollectionTmdbId).Distinct();
foreach (var collectionId in collections)
foreach (var collectionTmdbId in collections)
{
if (collectionId == 0 || _movieMetadataService.GetMoviesByCollectionId(collectionId).Any())
if (collectionTmdbId == 0 || _movieMetadataService.GetMoviesByCollectionTmdbId(collectionTmdbId).Any())
{
continue;
}
var collection = GetCollection(collectionId);
var collection = FindByTmdbId(collectionTmdbId);
_eventAggregator.PublishEvent(new CollectionDeletedEvent(collection));
_repo.Delete(collectionId);
_repo.Delete(collectionTmdbId);
}
}

View file

@ -33,8 +33,8 @@ namespace NzbDrone.Core.Movies
public int Year { get; set; }
public Ratings Ratings { get; set; }
public int CollectionId { get; set; }
public LazyLoaded<MovieCollection> Collection { get; set; }
public int CollectionTmdbId { get; set; }
public string CollectionTitle { get; set; }
public DateTime? LastInfoSync { get; set; }
public int Runtime { get; set; }
public string Website { get; set; }

View file

@ -10,7 +10,7 @@ namespace NzbDrone.Core.Movies
{
MovieMetadata FindByTmdbId(int tmdbId);
List<MovieMetadata> FindById(List<int> tmdbIds);
List<MovieMetadata> GetMoviesByCollectionId(int collectionId);
List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId);
bool UpsertMany(List<MovieMetadata> data);
}
@ -34,9 +34,9 @@ namespace NzbDrone.Core.Movies
return Query(x => Enumerable.Contains(tmdbIds, x.TmdbId));
}
public List<MovieMetadata> GetMoviesByCollectionId(int collectionId)
public List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId)
{
return Query(x => x.CollectionId == collectionId);
return Query(x => x.CollectionTmdbId == collectionId);
}
public bool UpsertMany(List<MovieMetadata> data)

View file

@ -6,7 +6,7 @@ namespace NzbDrone.Core.Movies
{
MovieMetadata Get(int id);
MovieMetadata FindByTmdbId(int tmdbid);
List<MovieMetadata> GetMoviesByCollectionId(int collectionId);
List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId);
bool Upsert(MovieMetadata movie);
bool UpsertMany(List<MovieMetadata> movies);
}
@ -25,9 +25,9 @@ namespace NzbDrone.Core.Movies
return _movieMetadataRepository.FindByTmdbId(tmdbid);
}
public List<MovieMetadata> GetMoviesByCollectionId(int collectionId)
public List<MovieMetadata> GetMoviesByCollectionTmdbId(int collectionId)
{
return _movieMetadataRepository.GetMoviesByCollectionId(collectionId);
return _movieMetadataRepository.GetMoviesByCollectionTmdbId(collectionId);
}
public MovieMetadata Get(int id)

View file

@ -225,7 +225,7 @@ namespace NzbDrone.Core.Movies
public List<Movie> GetMoviesByCollectionId(int collectionId)
{
return Query(x => x.MovieMetadata.Value.CollectionId == collectionId);
return Query(x => x.MovieMetadata.Value.CollectionTmdbId == collectionId);
}
public void SetFileId(int fileId, int movieId)

View file

@ -65,9 +65,8 @@ namespace NzbDrone.Core.Movies
collection.SortTitle = collectionInfo.SortTitle;
collection.LastInfoSync = DateTime.UtcNow;
collection.Images = collectionInfo.Images;
collection.MovieTmdbIds = collectionInfo.MovieTmdbIds;
collectionInfo.Movies.ForEach(x => x.CollectionId = collection.Id);
collectionInfo.Movies.ForEach(x => x.CollectionTmdbId = collection.TmdbId);
_movieMetadataService.UpsertMany(collectionInfo.Movies);
_logger.Debug("Finished collection refresh for {0}", collection.Title);
@ -100,9 +99,10 @@ namespace NzbDrone.Core.Movies
{
var existingMovies = _movieService.AllMovieTmdbIds();
_addMovieService.AddMovies(collection.MovieTmdbIds.Where(m => !existingMovies.Contains(m)).Select(m => new Movie
_addMovieService.AddMovies(collection.Movies.Where(m => !existingMovies.Contains(m.TmdbId)).Select(m => new Movie
{
TmdbId = m,
TmdbId = m.TmdbId,
Title = m.Title,
ProfileId = collection.QualityProfileId,
RootFolderPath = collection.RootFolderPath,
MinimumAvailability = collection.MinimumAvailability,

View file

@ -106,7 +106,8 @@ namespace NzbDrone.Core.Movies
movieMetadata.LastInfoSync = DateTime.UtcNow;
movieMetadata.Runtime = movieInfo.Runtime;
movieMetadata.Ratings = movieInfo.Ratings;
movieMetadata.Collection = movieInfo.Collection;
movieMetadata.CollectionTmdbId = movieInfo.CollectionTmdbId;
movieMetadata.CollectionTitle = movieInfo.CollectionTitle;
//movie.Genres = movieInfo.Genres;
movieMetadata.Certification = movieInfo.Certification;

View file

@ -268,7 +268,7 @@ namespace NzbDrone.Core.Organizer
tokenHandlers["{Movie CleanOriginalTitle}"] = m => CleanTitle(movie.MovieMetadata.Value.OriginalTitle) ?? string.Empty;
tokenHandlers["{Movie Certification}"] = m => movie.MovieMetadata.Value.Certification ?? string.Empty;
tokenHandlers["{Movie Collection}"] = m => movie.MovieMetadata.Value.Collection?.Value.Title ?? string.Empty;
tokenHandlers["{Movie Collection}"] = m => movie.MovieMetadata.Value.CollectionTitle ?? string.Empty;
}
private string GetLanguageTitle(Movie movie, string isoCodes)

View file

@ -55,7 +55,8 @@ namespace NzbDrone.Core.Organizer
{
Title = "The Movie: Title",
OriginalTitle = "The Original Movie Title",
Collection = new MovieCollection { Title = "The Movie Collection", TmdbId = 123654 },
CollectionTitle = "The Movie Collection",
CollectionTmdbId = 123654,
Certification = "R",
Year = 2010,
ImdbId = "tt0066921",

View file

@ -96,7 +96,7 @@ namespace Radarr.Api.V3.Collections
{
var resource = collection.ToResource();
foreach (var movie in _movieMetadataService.GetMoviesByCollectionId(collection.Id))
foreach (var movie in _movieMetadataService.GetMoviesByCollectionTmdbId(collection.TmdbId))
{
var movieResource = movie.ToResource();
movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { Title = movie.Title, Year = movie.Year, ImdbId = movie.ImdbId, TmdbId = movie.TmdbId });

View file

@ -76,8 +76,8 @@ namespace Radarr.Api.V3.ImportLists
Genres = model.MovieMetadata.Value.Genres,
Ratings = model.MovieMetadata.Value.Ratings,
YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId,
Studio = model.MovieMetadata.Value.Studio,
Collection = model.MovieMetadata.Value.Collection
Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId },
Studio = model.MovieMetadata.Value.Studio
};
}
@ -112,7 +112,7 @@ namespace Radarr.Api.V3.ImportLists
Ratings = model.MovieMetadata.Value.Ratings,
YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId,
Studio = model.MovieMetadata.Value.Studio,
Collection = model.MovieMetadata.Value.Collection,
Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId },
Lists = new HashSet<int> { model.ListId }
};
}

View file

@ -5,6 +5,7 @@ using NzbDrone.Core.DecisionEngine.Specifications;
using NzbDrone.Core.Languages;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.Movies;
using NzbDrone.Core.Movies.Collections;
using NzbDrone.Core.Movies.Translations;
using NzbDrone.Core.Parser;
using Radarr.Api.V3.MovieFiles;
@ -73,7 +74,7 @@ namespace Radarr.Api.V3.Movies
public AddMovieOptions AddOptions { get; set; }
public Ratings Ratings { get; set; }
public MovieFileResource MovieFile { get; set; }
public int CollectionId { get; set; }
public MovieCollection Collection { get; set; }
public float Popularity { get; set; }
}
@ -140,7 +141,7 @@ namespace Radarr.Api.V3.Movies
MovieFile = movieFile,
YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId,
Studio = model.MovieMetadata.Value.Studio,
CollectionId = model.MovieMetadata.Value.CollectionId,
Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId },
Popularity = model.MovieMetadata.Value.Popularity
};
}