|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
using NzbDrone.Core.Configuration;
|
|
|
|
using NzbDrone.Core.Exceptions;
|
|
|
|
using NzbDrone.Core.Languages;
|
|
|
|
using NzbDrone.Core.MediaCover;
|
|
|
|
using NzbDrone.Core.MetadataSource;
|
|
|
|
using NzbDrone.Core.Movies;
|
|
|
|
using NzbDrone.Core.Organizer;
|
|
|
|
using Radarr.Http;
|
|
|
|
using Radarr.Http.REST;
|
|
|
|
|
|
|
|
namespace Radarr.Api.V3.Movies
|
|
|
|
{
|
|
|
|
[V3ApiController("movie/lookup")]
|
|
|
|
public class MovieLookupController : RestController<MovieResource>
|
|
|
|
{
|
|
|
|
private readonly ISearchForNewMovie _searchProxy;
|
|
|
|
private readonly IProvideMovieInfo _movieInfo;
|
|
|
|
private readonly IBuildFileNames _fileNameBuilder;
|
|
|
|
private readonly INamingConfigService _namingService;
|
|
|
|
private readonly IMapCoversToLocal _coverMapper;
|
|
|
|
private readonly IConfigService _configService;
|
|
|
|
|
|
|
|
public MovieLookupController(ISearchForNewMovie searchProxy,
|
|
|
|
IProvideMovieInfo movieInfo,
|
|
|
|
IBuildFileNames fileNameBuilder,
|
|
|
|
INamingConfigService namingService,
|
|
|
|
IMapCoversToLocal coverMapper,
|
|
|
|
IConfigService configService)
|
|
|
|
{
|
|
|
|
_movieInfo = movieInfo;
|
|
|
|
_searchProxy = searchProxy;
|
|
|
|
_fileNameBuilder = fileNameBuilder;
|
|
|
|
_namingService = namingService;
|
|
|
|
_coverMapper = coverMapper;
|
|
|
|
_configService = configService;
|
|
|
|
}
|
|
|
|
|
|
|
|
[NonAction]
|
|
|
|
protected override MovieResource GetResourceById(int id)
|
|
|
|
{
|
|
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
|
|
|
|
|
|
[HttpGet("tmdb")]
|
|
|
|
public object SearchByTmdbId(int tmdbId)
|
|
|
|
{
|
|
|
|
var availDelay = _configService.AvailabilityDelay;
|
|
|
|
var result = new Movie { MovieMetadata = _movieInfo.GetMovieInfo(tmdbId).Item1 };
|
|
|
|
var translation = result.MovieMetadata.Value.Translations.FirstOrDefault(t => t.Language == (Language)_configService.MovieInfoLanguage);
|
|
|
|
return result.ToResource(availDelay, translation);
|
|
|
|
}
|
|
|
|
|
|
|
|
[HttpGet("imdb")]
|
|
|
|
public object SearchByImdbId(string imdbId)
|
|
|
|
{
|
|
|
|
var result = new Movie { MovieMetadata = _movieInfo.GetMovieByImdbId(imdbId) };
|
|
|
|
|
|
|
|
var availDelay = _configService.AvailabilityDelay;
|
|
|
|
var translation = result.MovieMetadata.Value.Translations.FirstOrDefault(t => t.Language == (Language)_configService.MovieInfoLanguage);
|
|
|
|
return result.ToResource(availDelay, translation);
|
|
|
|
}
|
|
|
|
|
|
|
|
[HttpGet]
|
|
|
|
public object Search([FromQuery] string term)
|
|
|
|
{
|
|
|
|
var searchResults = _searchProxy.SearchForNewMovie(term);
|
|
|
|
searchResults = PopulateFromImdbIfEmpty(searchResults, term);
|
|
|
|
return MapToResource(searchResults);
|
|
|
|
}
|
|
|
|
|
|
|
|
private List<Movie> PopulateFromImdbIfEmpty(List<Movie> searchResults, string imdbid)
|
|
|
|
{
|
|
|
|
var regex = new Regex(@"^tt\d{7,8}$");
|
|
|
|
if (searchResults.Count == 0 && imdbid.StartsWith("tt") && regex.IsMatch(imdbid))
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var movieLookup = _searchProxy.GetMovieByImdbId(imdbid);
|
|
|
|
var movies = new List<Movie> { new Movie { MovieMetadata = movieLookup } };
|
|
|
|
return movies;
|
|
|
|
}
|
|
|
|
catch (MovieNotFoundException)
|
|
|
|
{
|
|
|
|
return new List<Movie>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return searchResults;
|
|
|
|
}
|
|
|
|
|
|
|
|
private IEnumerable<MovieResource> MapToResource(IEnumerable<Movie> movies)
|
|
|
|
{
|
|
|
|
var movieInfoLanguage = (Language)_configService.MovieInfoLanguage;
|
|
|
|
var availDelay = _configService.AvailabilityDelay;
|
|
|
|
var namingConfig = _namingService.GetConfig();
|
|
|
|
|
|
|
|
foreach (var currentMovie in movies)
|
|
|
|
{
|
|
|
|
var translation = currentMovie.MovieMetadata.Value.Translations.FirstOrDefault(t => t.Language == movieInfoLanguage);
|
|
|
|
var resource = currentMovie.ToResource(availDelay, translation);
|
|
|
|
|
|
|
|
_coverMapper.ConvertToLocalUrls(resource.Id, resource.Images);
|
|
|
|
|
|
|
|
var poster = currentMovie.MovieMetadata.Value.Images.FirstOrDefault(c => c.CoverType == MediaCoverTypes.Poster);
|
|
|
|
if (poster != null)
|
|
|
|
{
|
|
|
|
resource.RemotePoster = poster.RemoteUrl;
|
|
|
|
}
|
|
|
|
|
|
|
|
resource.Folder = _fileNameBuilder.GetMovieFolder(currentMovie, namingConfig);
|
|
|
|
|
|
|
|
yield return resource;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|