mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-16 02:02:55 -07:00
Mapping mainly
This commit is contained in:
parent
3f62d0d5ec
commit
41f03b46f1
20 changed files with 291 additions and 109 deletions
|
@ -2,6 +2,9 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using AutoMapper;
|
||||||
|
using Ombi.Api.TheMovieDb;
|
||||||
|
using Ombi.Api.TheMovieDb.Models;
|
||||||
using Ombi.Core.Models.Requests;
|
using Ombi.Core.Models.Requests;
|
||||||
using Ombi.Core.Models.Search;
|
using Ombi.Core.Models.Search;
|
||||||
using Ombi.Core.Requests.Models;
|
using Ombi.Core.Requests.Models;
|
||||||
|
@ -15,13 +18,15 @@ namespace Ombi.Core.Engine
|
||||||
public class MovieEngine : IMovieEngine
|
public class MovieEngine : IMovieEngine
|
||||||
{
|
{
|
||||||
|
|
||||||
public MovieEngine(IRequestService service, IMovieDbApi movApi)
|
public MovieEngine(IRequestService service, IMovieDbApi movApi, IMapper mapper)
|
||||||
{
|
{
|
||||||
RequestService = service;
|
RequestService = service;
|
||||||
MovieApi = movApi;
|
MovieApi = movApi;
|
||||||
|
Mapper = mapper;
|
||||||
}
|
}
|
||||||
private IRequestService RequestService { get; }
|
private IRequestService RequestService { get; }
|
||||||
private IMovieDbApi MovieApi { get; }
|
private IMovieDbApi MovieApi { get; }
|
||||||
|
private IMapper Mapper { get; }
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> LookupImdbInformation(IEnumerable<SearchMovieViewModel> movies)
|
public async Task<IEnumerable<SearchMovieViewModel>> LookupImdbInformation(IEnumerable<SearchMovieViewModel> movies)
|
||||||
{
|
{
|
||||||
|
@ -31,27 +36,8 @@ namespace Ombi.Core.Engine
|
||||||
{
|
{
|
||||||
|
|
||||||
var movieInfo = await MovieApi.GetMovieInformationWithVideo(m.Id);
|
var movieInfo = await MovieApi.GetMovieInformationWithVideo(m.Id);
|
||||||
var viewMovie = new SearchMovieViewModel
|
var viewMovie = Mapper.Map<SearchMovieViewModel>(movieInfo);
|
||||||
{
|
|
||||||
Adult = movieInfo.adult,
|
|
||||||
BackdropPath = movieInfo.backdrop_path,
|
|
||||||
Id = movieInfo.id,
|
|
||||||
OriginalLanguage = movieInfo.original_language,
|
|
||||||
OriginalTitle = movieInfo.original_title,
|
|
||||||
Overview = movieInfo.overview,
|
|
||||||
Popularity = movieInfo.popularity,
|
|
||||||
PosterPath = movieInfo.poster_path,
|
|
||||||
ReleaseDate =
|
|
||||||
string.IsNullOrEmpty(movieInfo.release_date)
|
|
||||||
? DateTime.MinValue
|
|
||||||
: DateTime.Parse(movieInfo.release_date),
|
|
||||||
Title = movieInfo.title,
|
|
||||||
Video = movieInfo.video,
|
|
||||||
VoteAverage = movieInfo.vote_average,
|
|
||||||
VoteCount = movieInfo.vote_count,
|
|
||||||
ImdbId = movieInfo?.imdb_id,
|
|
||||||
Homepage = movieInfo?.homepage
|
|
||||||
};
|
|
||||||
retVal.Add(viewMovie);
|
retVal.Add(viewMovie);
|
||||||
// TODO needs to be careful about this, it's adding extra time to search...
|
// TODO needs to be careful about this, it's adding extra time to search...
|
||||||
// https://www.themoviedb.org/talk/5807f4cdc3a36812160041f2
|
// https://www.themoviedb.org/talk/5807f4cdc3a36812160041f2
|
||||||
|
@ -62,9 +48,9 @@ namespace Ombi.Core.Engine
|
||||||
//viewMovie.Trailer = string.IsNullOrEmpty(videoId)
|
//viewMovie.Trailer = string.IsNullOrEmpty(videoId)
|
||||||
// ? string.Empty
|
// ? string.Empty
|
||||||
// : $"https://www.youtube.com/watch?v={videoId}";
|
// : $"https://www.youtube.com/watch?v={videoId}";
|
||||||
if (dbMovies.ContainsKey(movieInfo.id) /*&& canSee*/) // compare to the requests db
|
if (dbMovies.ContainsKey(movieInfo.Id) /*&& canSee*/) // compare to the requests db
|
||||||
{
|
{
|
||||||
var dbm = dbMovies[movieInfo.id];
|
var dbm = dbMovies[movieInfo.Id];
|
||||||
|
|
||||||
viewMovie.Requested = true;
|
viewMovie.Requested = true;
|
||||||
viewMovie.Approved = dbm.Approved;
|
viewMovie.Approved = dbm.Approved;
|
||||||
|
@ -76,59 +62,54 @@ namespace Ombi.Core.Engine
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> ProcessMovieSearch(string search)
|
public async Task<IEnumerable<SearchMovieViewModel>> ProcessMovieSearch(string search)
|
||||||
{
|
{
|
||||||
var api = new TheMovieDbApi.TheMovieDbApi();
|
var result = await MovieApi.SearchMovie(search);
|
||||||
var result = await api.SearchMovie(search);
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
return await TransformMovieResultsToResponse(result.results);
|
return await TransformMovieResultsToResponse(result);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> PopularMovies()
|
public async Task<IEnumerable<SearchMovieViewModel>> PopularMovies()
|
||||||
{
|
{
|
||||||
var api = new TheMovieDbApi.TheMovieDbApi();
|
var result = await MovieApi.PopularMovies();
|
||||||
var result = await api.PopularMovies();
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
return await TransformMovieResultsToResponse(result.results);
|
return await TransformMovieResultsToResponse(result);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> TopRatedMovies()
|
public async Task<IEnumerable<SearchMovieViewModel>> TopRatedMovies()
|
||||||
{
|
{
|
||||||
var api = new TheMovieDbApi.TheMovieDbApi();
|
var result = await MovieApi.TopRated();
|
||||||
var result = await api.TopRated();
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
return await TransformMovieResultsToResponse(result.results);
|
return await TransformMovieResultsToResponse(result);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> UpcomingMovies()
|
public async Task<IEnumerable<SearchMovieViewModel>> UpcomingMovies()
|
||||||
{
|
{
|
||||||
var api = new TheMovieDbApi.TheMovieDbApi();
|
var result = await MovieApi.Upcoming();
|
||||||
var result = await api.Upcoming();
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
return await TransformMovieResultsToResponse(result.results);
|
return await TransformMovieResultsToResponse(result);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
public async Task<IEnumerable<SearchMovieViewModel>> NowPlayingMovies()
|
public async Task<IEnumerable<SearchMovieViewModel>> NowPlayingMovies()
|
||||||
{
|
{
|
||||||
var api = new TheMovieDbApi.TheMovieDbApi();
|
var result = await MovieApi.NowPlaying();
|
||||||
var result = await api.NowPlaying();
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
{
|
{
|
||||||
return await TransformMovieResultsToResponse(result.results);
|
return await TransformMovieResultsToResponse(result);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task<List<SearchMovieViewModel>> TransformMovieResultsToResponse(IEnumerable<SearchResult> movies)
|
private async Task<List<SearchMovieViewModel>> TransformMovieResultsToResponse(IEnumerable<MovieSearchResult> movies)
|
||||||
{
|
{
|
||||||
await Task.Yield();
|
await Task.Yield();
|
||||||
var viewMovies = new List<SearchMovieViewModel>();
|
var viewMovies = new List<SearchMovieViewModel>();
|
||||||
|
@ -136,22 +117,8 @@ namespace Ombi.Core.Engine
|
||||||
Dictionary<int, RequestModel> dbMovies = await RequestedMovies();
|
Dictionary<int, RequestModel> dbMovies = await RequestedMovies();
|
||||||
foreach (var movie in movies)
|
foreach (var movie in movies)
|
||||||
{
|
{
|
||||||
var viewMovie = new SearchMovieViewModel
|
var viewMovie = Mapper.Map<SearchMovieViewModel>(movie);
|
||||||
{
|
|
||||||
Adult = movie.adult,
|
|
||||||
BackdropPath = movie.backdrop_path,
|
|
||||||
Id = movie.id,
|
|
||||||
OriginalLanguage = movie.original_language,
|
|
||||||
OriginalTitle = movie.original_title,
|
|
||||||
Overview = movie.overview,
|
|
||||||
Popularity = movie.popularity,
|
|
||||||
PosterPath = movie.poster_path,
|
|
||||||
ReleaseDate = string.IsNullOrEmpty(movie.release_date) ? DateTime.MinValue : DateTime.Parse(movie.release_date),
|
|
||||||
Title = movie.title,
|
|
||||||
Video = movie.video,
|
|
||||||
VoteAverage = movie.vote_average,
|
|
||||||
VoteCount = movie.vote_count
|
|
||||||
};
|
|
||||||
viewMovies.Add(viewMovie);
|
viewMovies.Add(viewMovie);
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,9 +153,9 @@ namespace Ombi.Core.Engine
|
||||||
// viewMovie.Available = true;
|
// viewMovie.Available = true;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
if (dbMovies.ContainsKey(movie.id) /*&& canSee*/) // compare to the requests db
|
if (dbMovies.ContainsKey(movie.Id) /*&& canSee*/) // compare to the requests db
|
||||||
{
|
{
|
||||||
var dbm = dbMovies[movie.id];
|
var dbm = dbMovies[movie.Id];
|
||||||
|
|
||||||
viewMovie.Requested = true;
|
viewMovie.Requested = true;
|
||||||
viewMovie.Approved = dbm.Approved;
|
viewMovie.Approved = dbm.Approved;
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Ombi.Api.TheMovieDb;
|
||||||
using Ombi.Core.Models.Requests;
|
using Ombi.Core.Models.Requests;
|
||||||
using Ombi.Core.Models.Search;
|
using Ombi.Core.Models.Search;
|
||||||
using Ombi.Core.Requests.Models;
|
using Ombi.Core.Requests.Models;
|
||||||
|
@ -38,7 +39,7 @@ namespace Ombi.Core.Engine
|
||||||
//});
|
//});
|
||||||
}
|
}
|
||||||
var fullMovieName =
|
var fullMovieName =
|
||||||
$"{movieInfo.title}{(!string.IsNullOrEmpty(movieInfo.release_date) ? $" ({DateTime.Parse(movieInfo.release_date).Year})" : string.Empty)}";
|
$"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";
|
||||||
|
|
||||||
var existingRequest = await RequestService.CheckRequestAsync(model.Id);
|
var existingRequest = await RequestService.CheckRequestAsync(model.Id);
|
||||||
if (existingRequest != null)
|
if (existingRequest != null)
|
||||||
|
@ -95,14 +96,14 @@ namespace Ombi.Core.Engine
|
||||||
|
|
||||||
var requestModel = new RequestModel
|
var requestModel = new RequestModel
|
||||||
{
|
{
|
||||||
ProviderId = movieInfo.id,
|
ProviderId = movieInfo.Id,
|
||||||
Type = RequestType.Movie,
|
Type = RequestType.Movie,
|
||||||
Overview = movieInfo.overview,
|
Overview = movieInfo.Overview,
|
||||||
ImdbId = movieInfo.imdb_id,
|
ImdbId = movieInfo.ImdbId,
|
||||||
PosterPath = movieInfo.poster_path,
|
PosterPath = movieInfo.PosterPath,
|
||||||
Title = movieInfo.title,
|
Title = movieInfo.Title,
|
||||||
ReleaseDate = !string.IsNullOrEmpty(movieInfo.release_date) ? DateTime.Parse(movieInfo.release_date) : DateTime.MinValue,
|
ReleaseDate = !string.IsNullOrEmpty(movieInfo.ReleaseDate) ? DateTime.Parse(movieInfo.ReleaseDate) : DateTime.MinValue,
|
||||||
Status = movieInfo.status,
|
Status = movieInfo.Status,
|
||||||
RequestedDate = DateTime.UtcNow,
|
RequestedDate = DateTime.UtcNow,
|
||||||
Approved = false,
|
Approved = false,
|
||||||
//RequestedUsers = new List<string> { Username },
|
//RequestedUsers = new List<string> { Username },
|
||||||
|
|
|
@ -7,12 +7,14 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using Ombi.Api.Emby;
|
using Ombi.Api.Emby;
|
||||||
using Ombi.Api.Plex;
|
using Ombi.Api.Plex;
|
||||||
using Ombi.Api.Sonarr;
|
using Ombi.Api.Sonarr;
|
||||||
|
using Ombi.Api.TheMovieDb;
|
||||||
using Ombi.Core;
|
using Ombi.Core;
|
||||||
using Ombi.Core.Engine;
|
using Ombi.Core.Engine;
|
||||||
using Ombi.Core.IdentityResolver;
|
using Ombi.Core.IdentityResolver;
|
||||||
using Ombi.Core.Models.Requests;
|
using Ombi.Core.Models.Requests;
|
||||||
using Ombi.Core.Requests.Models;
|
using Ombi.Core.Requests.Models;
|
||||||
using Ombi.Core.Settings;
|
using Ombi.Core.Settings;
|
||||||
|
using Ombi.Schedule;
|
||||||
using Ombi.Store.Context;
|
using Ombi.Store.Context;
|
||||||
using Ombi.Store.Repository;
|
using Ombi.Store.Repository;
|
||||||
using Ombi.TheMovieDbApi;
|
using Ombi.TheMovieDbApi;
|
||||||
|
@ -29,6 +31,7 @@ namespace Ombi.DependencyInjection
|
||||||
services.RegisterServices();
|
services.RegisterServices();
|
||||||
services.RegisterStore();
|
services.RegisterStore();
|
||||||
services.RegisterIdentity();
|
services.RegisterIdentity();
|
||||||
|
services.RegisterJobs();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +45,7 @@ namespace Ombi.DependencyInjection
|
||||||
|
|
||||||
public static IServiceCollection RegisterApi(this IServiceCollection services)
|
public static IServiceCollection RegisterApi(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddTransient<IMovieDbApi, TheMovieDbApi.TheMovieDbApi>();
|
services.AddTransient<IMovieDbApi, Api.TheMovieDb.TheMovieDbApi>();
|
||||||
services.AddTransient<IPlexApi, PlexApi>();
|
services.AddTransient<IPlexApi, PlexApi>();
|
||||||
services.AddTransient<IEmbyApi, EmbyApi>();
|
services.AddTransient<IEmbyApi, EmbyApi>();
|
||||||
services.AddTransient<ISonarrApi, SonarrApi>();
|
services.AddTransient<ISonarrApi, SonarrApi>();
|
||||||
|
@ -68,6 +71,13 @@ namespace Ombi.DependencyInjection
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IServiceCollection RegisterJobs(this IServiceCollection services)
|
||||||
|
{
|
||||||
|
services.AddTransient<ITestJob, TestJob>();
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
public static IServiceCollection RegisterIdentity(this IServiceCollection services)
|
public static IServiceCollection RegisterIdentity(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddTransient<IUserIdentityManager, UserIdentityManager>();
|
services.AddTransient<IUserIdentityManager, UserIdentityManager>();
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<ProjectReference Include="..\Ombi.Api.Plex\Ombi.Api.Plex.csproj" />
|
<ProjectReference Include="..\Ombi.Api.Plex\Ombi.Api.Plex.csproj" />
|
||||||
<ProjectReference Include="..\Ombi.Api.Sonarr\Ombi.Api.Sonarr.csproj" />
|
<ProjectReference Include="..\Ombi.Api.Sonarr\Ombi.Api.Sonarr.csproj" />
|
||||||
<ProjectReference Include="..\Ombi.Core\Ombi.Core.csproj" />
|
<ProjectReference Include="..\Ombi.Core\Ombi.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\Ombi.Schedule\Ombi.Schedule.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
26
Ombi/Ombi.Mapping/MappingConverters.cs
Normal file
26
Ombi/Ombi.Mapping/MappingConverters.cs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
using AutoMapper;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ombi.Mapping
|
||||||
|
{
|
||||||
|
public class StringToDateTimeConverter : ITypeConverter<string, DateTime>
|
||||||
|
{
|
||||||
|
|
||||||
|
public DateTime Convert(string source, DateTime destination, ResolutionContext context)
|
||||||
|
{
|
||||||
|
DateTime dateTime;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(source))
|
||||||
|
{
|
||||||
|
return default(DateTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DateTime.TryParse(source.ToString(), out dateTime))
|
||||||
|
{
|
||||||
|
return dateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
return default(DateTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AutoMapper" Version="6.0.2" />
|
<PackageReference Include="AutoMapper" Version="6.0.2" />
|
||||||
|
<PackageReference Include="AutoMapper.Collection" Version="3.0.0" />
|
||||||
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="2.0.1" />
|
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="2.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
|
using Ombi.Api.TheMovieDb.Models;
|
||||||
using Ombi.Core.Models;
|
using Ombi.Core.Models;
|
||||||
|
using Ombi.Core.Models.Search;
|
||||||
using Ombi.Store.Entities;
|
using Ombi.Store.Entities;
|
||||||
|
using Ombi.TheMovieDbApi.Models;
|
||||||
|
|
||||||
namespace Ombi.Mapping
|
namespace Ombi.Mapping
|
||||||
{
|
{
|
||||||
|
@ -9,7 +13,49 @@ namespace Ombi.Mapping
|
||||||
{
|
{
|
||||||
public OmbiProfile()
|
public OmbiProfile()
|
||||||
{
|
{
|
||||||
|
|
||||||
CreateMap<User, UserDto>().ReverseMap();
|
CreateMap<User, UserDto>().ReverseMap();
|
||||||
|
|
||||||
|
CreateMap<string, DateTime>().ConvertUsing<StringToDateTimeConverter>();
|
||||||
|
|
||||||
|
CreateMap<SearchResult, MovieSearchResult>()
|
||||||
|
.ForMember(dest => dest.Adult, opts => opts.MapFrom(src => src.adult))
|
||||||
|
.ForMember(dest => dest.BackdropPath, opts => opts.MapFrom(src => src.backdrop_path))
|
||||||
|
.ForMember(dest => dest.Id, opts => opts.MapFrom(src => src.id))
|
||||||
|
.ForMember(dest => dest.OriginalLanguage, opts => opts.MapFrom(src => src.original_language))
|
||||||
|
.ForMember(dest => dest.OriginalTitle, opts => opts.MapFrom(src => src.original_title))
|
||||||
|
.ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.overview))
|
||||||
|
.ForMember(dest => dest.Popularity, opts => opts.MapFrom(src => src.popularity))
|
||||||
|
.ForMember(dest => dest.PosterPath, opts => opts.MapFrom(src => src.poster_path))
|
||||||
|
.ForMember(dest => dest.ReleaseDate, opts => opts.MapFrom(src => src.release_date))
|
||||||
|
.ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.title))
|
||||||
|
.ForMember(dest => dest.Video, opts => opts.MapFrom(src => src.video))
|
||||||
|
.ForMember(dest => dest.VoteAverage, opts => opts.MapFrom(src => src.vote_average))
|
||||||
|
.ForMember(dest => dest.VoteCount, opts => opts.MapFrom(src => src.vote_count));
|
||||||
|
|
||||||
|
CreateMap<MovieResponse, MovieResponseDto>()
|
||||||
|
.ForMember(dest => dest.Adult, opts => opts.MapFrom(src => src.adult))
|
||||||
|
.ForMember(dest => dest.BackdropPath, opts => opts.MapFrom(src => src.backdrop_path))
|
||||||
|
.ForMember(dest => dest.Id, opts => opts.MapFrom(src => src.id))
|
||||||
|
.ForMember(dest => dest.OriginalLanguage, opts => opts.MapFrom(src => src.original_language))
|
||||||
|
.ForMember(dest => dest.OriginalTitle, opts => opts.MapFrom(src => src.original_title))
|
||||||
|
.ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.overview))
|
||||||
|
.ForMember(dest => dest.Popularity, opts => opts.MapFrom(src => src.popularity))
|
||||||
|
.ForMember(dest => dest.PosterPath, opts => opts.MapFrom(src => src.poster_path))
|
||||||
|
.ForMember(dest => dest.ReleaseDate, opts => opts.MapFrom(src => src.release_date))
|
||||||
|
.ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.title))
|
||||||
|
.ForMember(dest => dest.Video, opts => opts.MapFrom(src => src.video))
|
||||||
|
.ForMember(dest => dest.VoteAverage, opts => opts.MapFrom(src => src.vote_average))
|
||||||
|
.ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.imdb_id))
|
||||||
|
.ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.homepage))
|
||||||
|
.ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.runtime))
|
||||||
|
.ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.status))
|
||||||
|
.ForMember(dest => dest.Tagline, opts => opts.MapFrom(src => src.tagline))
|
||||||
|
.ForMember(dest => dest.VoteCount, opts => opts.MapFrom(src => src.vote_count));
|
||||||
|
CreateMap<Genre, GenreDto>();
|
||||||
|
|
||||||
|
CreateMap<MovieSearchResult, SearchMovieViewModel>().ReverseMap();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Ombi.Schedule
|
|
||||||
{
|
|
||||||
public class Class1
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
11
Ombi/Ombi.Schedule/ITestJob.cs
Normal file
11
Ombi/Ombi.Schedule/ITestJob.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
using Hangfire.RecurringJobExtensions;
|
||||||
|
using Hangfire.Server;
|
||||||
|
|
||||||
|
namespace Ombi.Schedule
|
||||||
|
{
|
||||||
|
public interface ITestJob
|
||||||
|
{
|
||||||
|
[RecurringJob("*/1 * * * *")]
|
||||||
|
void Test(PerformContext context);
|
||||||
|
}
|
||||||
|
}
|
20
Ombi/Ombi.Schedule/IoCJobActivator.cs
Normal file
20
Ombi/Ombi.Schedule/IoCJobActivator.cs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
using System;
|
||||||
|
using Hangfire;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace Ombi.Schedule
|
||||||
|
{
|
||||||
|
public class IoCJobActivator : JobActivator
|
||||||
|
{
|
||||||
|
private readonly IServiceProvider _container;
|
||||||
|
public IoCJobActivator(IServiceProvider container)
|
||||||
|
{
|
||||||
|
_container = container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ActivateJob(Type type)
|
||||||
|
{
|
||||||
|
return _container.GetService(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@
|
||||||
<PackageReference Include="Hangfire" Version="1.6.12" />
|
<PackageReference Include="Hangfire" Version="1.6.12" />
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.6.12" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.6.12" />
|
||||||
<PackageReference Include="Hangfire.MemoryStorage.Core" Version="1.4.0" />
|
<PackageReference Include="Hangfire.MemoryStorage.Core" Version="1.4.0" />
|
||||||
|
<PackageReference Include="Hangfire.RecurringJobExtensions" Version="1.1.6" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
17
Ombi/Ombi.Schedule/TestJob.cs
Normal file
17
Ombi/Ombi.Schedule/TestJob.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using Hangfire;
|
||||||
|
using Hangfire.RecurringJobExtensions;
|
||||||
|
using Hangfire.Server;
|
||||||
|
|
||||||
|
namespace Ombi.Schedule
|
||||||
|
{
|
||||||
|
public class TestJob : ITestJob
|
||||||
|
{
|
||||||
|
[RecurringJob("*/1 * * * *")]
|
||||||
|
public void Test(PerformContext context)
|
||||||
|
{
|
||||||
|
Debug.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss} TestJob1 Running ...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,17 +1,18 @@
|
||||||
using System.Threading.Tasks;
|
using System.Collections.Generic;
|
||||||
using Ombi.Api;
|
using System.Threading.Tasks;
|
||||||
|
using Ombi.Api.TheMovieDb.Models;
|
||||||
using Ombi.TheMovieDbApi.Models;
|
using Ombi.TheMovieDbApi.Models;
|
||||||
|
|
||||||
namespace Ombi.TheMovieDbApi
|
namespace Ombi.Api.TheMovieDb
|
||||||
{
|
{
|
||||||
public interface IMovieDbApi
|
public interface IMovieDbApi
|
||||||
{
|
{
|
||||||
Task<MovieResponse> GetMovieInformation(int movieId);
|
Task<MovieResponseDto> GetMovieInformation(int movieId);
|
||||||
Task<MovieResponse> GetMovieInformationWithVideo(int movieId);
|
Task<MovieResponseDto> GetMovieInformationWithVideo(int movieId);
|
||||||
Task<TheMovieDbContainer<SearchResult>> NowPlaying();
|
Task<List<MovieSearchResult>> NowPlaying();
|
||||||
Task<TheMovieDbContainer<SearchResult>> PopularMovies();
|
Task<List<MovieSearchResult>> PopularMovies();
|
||||||
Task<TheMovieDbContainer<SearchResult>> SearchMovie(string searchTerm);
|
Task<List<MovieSearchResult>> SearchMovie(string searchTerm);
|
||||||
Task<TheMovieDbContainer<SearchResult>> TopRated();
|
Task<List<MovieSearchResult>> TopRated();
|
||||||
Task<TheMovieDbContainer<SearchResult>> Upcoming();
|
Task<List<MovieSearchResult>> Upcoming();
|
||||||
}
|
}
|
||||||
}
|
}
|
8
Ombi/Ombi.TheMovieDbApi/Models/GenreDto.cs
Normal file
8
Ombi/Ombi.TheMovieDbApi/Models/GenreDto.cs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
namespace Ombi.Api.TheMovieDb.Models
|
||||||
|
{
|
||||||
|
public class GenreDto
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
}
|
27
Ombi/Ombi.TheMovieDbApi/Models/MovieResponseDTO.cs
Normal file
27
Ombi/Ombi.TheMovieDbApi/Models/MovieResponseDTO.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
namespace Ombi.Api.TheMovieDb.Models
|
||||||
|
{
|
||||||
|
public class MovieResponseDto
|
||||||
|
{
|
||||||
|
public bool Adult { get; set; }
|
||||||
|
public string BackdropPath { get; set; }
|
||||||
|
public int Budget { get; set; }
|
||||||
|
public GenreDto[] Genres { get; set; }
|
||||||
|
public string Homepage { get; set; }
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string ImdbId { get; set; }
|
||||||
|
public string OriginalLanguage { get; set; }
|
||||||
|
public string OriginalTitle { get; set; }
|
||||||
|
public string Overview { get; set; }
|
||||||
|
public float Popularity { get; set; }
|
||||||
|
public string PosterPath { get; set; }
|
||||||
|
public string ReleaseDate { get; set; }
|
||||||
|
public int Revenue { get; set; }
|
||||||
|
public int Runtime { get; set; }
|
||||||
|
public string Status { get; set; }
|
||||||
|
public string Tagline { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public bool Video { get; set; }
|
||||||
|
public float VoteAverage { get; set; }
|
||||||
|
public int VoteCount { get; set; }
|
||||||
|
}
|
||||||
|
}
|
20
Ombi/Ombi.TheMovieDbApi/Models/MovieSearchResult.cs
Normal file
20
Ombi/Ombi.TheMovieDbApi/Models/MovieSearchResult.cs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
namespace Ombi.Api.TheMovieDb.Models
|
||||||
|
{
|
||||||
|
public class MovieSearchResult
|
||||||
|
{
|
||||||
|
public string PosterPath { get; set; }
|
||||||
|
public bool Adult { get; set; }
|
||||||
|
public string Overview { get; set; }
|
||||||
|
public string ReleaseDate { get; set; }
|
||||||
|
public int?[] GenreIds { get; set; }
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string OriginalTitle { get; set; }
|
||||||
|
public string OriginalLanguage { get; set; }
|
||||||
|
public string Title { get; set; }
|
||||||
|
public string BackdropPath { get; set; }
|
||||||
|
public float Popularity { get; set; }
|
||||||
|
public int VoteCount { get; set; }
|
||||||
|
public bool Video { get; set; }
|
||||||
|
public float VoteAverage { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,4 +10,10 @@
|
||||||
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
|
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="AutoMapper">
|
||||||
|
<HintPath>..\..\..\..\..\.nuget\packages\automapper\6.0.2\lib\netstandard1.3\AutoMapper.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
|
@ -1,72 +1,83 @@
|
||||||
using System.Net.Http;
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Ombi.Api;
|
using AutoMapper;
|
||||||
|
using Ombi.Api.TheMovieDb.Models;
|
||||||
using Ombi.TheMovieDbApi.Models;
|
using Ombi.TheMovieDbApi.Models;
|
||||||
|
|
||||||
namespace Ombi.TheMovieDbApi
|
namespace Ombi.Api.TheMovieDb
|
||||||
{
|
{
|
||||||
public class TheMovieDbApi : IMovieDbApi
|
public class TheMovieDbApi : IMovieDbApi
|
||||||
{
|
{
|
||||||
public TheMovieDbApi()
|
public TheMovieDbApi(IMapper mapper)
|
||||||
{
|
{
|
||||||
Api = new Api.Api();
|
Api = new Ombi.Api.Api();
|
||||||
|
Mapper = mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IMapper Mapper { get; }
|
||||||
private const string ApiToken = "b8eabaf5608b88d0298aa189dd90bf00";
|
private const string ApiToken = "b8eabaf5608b88d0298aa189dd90bf00";
|
||||||
private static readonly string BaseUri ="http://api.themoviedb.org/3/";
|
private static readonly string BaseUri ="http://api.themoviedb.org/3/";
|
||||||
private Api.Api Api { get; }
|
private Ombi.Api.Api Api { get; }
|
||||||
|
|
||||||
public async Task<MovieResponse> GetMovieInformation(int movieId)
|
public async Task<MovieResponseDto> GetMovieInformation(int movieId)
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/{movieId}", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/{movieId}", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
|
|
||||||
return await Api.Request<MovieResponse>(request);
|
var result = await Api.Request<MovieResponse>(request);
|
||||||
|
return Mapper.Map<MovieResponseDto>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<MovieResponse> GetMovieInformationWithVideo(int movieId)
|
public async Task<MovieResponseDto> GetMovieInformationWithVideo(int movieId)
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/{movieId}", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/{movieId}", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("append_to_response", "videos");
|
request.FullUri = request.FullUri.AddQueryParameter("append_to_response", "videos");
|
||||||
return await Api.Request<MovieResponse>(request);
|
var result = await Api.Request<MovieResponse>(request);
|
||||||
|
return Mapper.Map<MovieResponseDto>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TheMovieDbContainer<SearchResult>> SearchMovie(string searchTerm)
|
public async Task<List<MovieSearchResult>> SearchMovie(string searchTerm)
|
||||||
{
|
{
|
||||||
var request = new Request($"search/movie", BaseUri, HttpMethod.Get);
|
var request = new Request($"search/movie", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("query", searchTerm);
|
request.FullUri = request.FullUri.AddQueryParameter("query", searchTerm);
|
||||||
|
|
||||||
return await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
|
return Mapper.Map<List<MovieSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TheMovieDbContainer<SearchResult>> PopularMovies()
|
public async Task<List<MovieSearchResult>> PopularMovies()
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/popular", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/popular", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
return await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
return Mapper.Map<List<MovieSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TheMovieDbContainer<SearchResult>> TopRated()
|
public async Task<List<MovieSearchResult>> TopRated()
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/top_rated", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/top_rated", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
return await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
|
return Mapper.Map<List<MovieSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TheMovieDbContainer<SearchResult>> Upcoming()
|
public async Task<List<MovieSearchResult>> Upcoming()
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/upcoming", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/upcoming", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
return await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
|
return Mapper.Map<List<MovieSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TheMovieDbContainer<SearchResult>> NowPlaying()
|
public async Task<List<MovieSearchResult>> NowPlaying()
|
||||||
{
|
{
|
||||||
var request = new Request($"movie/now_playing", BaseUri, HttpMethod.Get);
|
var request = new Request($"movie/now_playing", BaseUri, HttpMethod.Get);
|
||||||
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
request.FullUri = request.FullUri.AddQueryParameter("api_key", ApiToken);
|
||||||
return await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
var result = await Api.Request<TheMovieDbContainer<SearchResult>>(request);
|
||||||
|
return Mapper.Map<List<MovieSearchResult>>(result.results);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
<PackageReference Include="AutoMapper" Version="6.0.2" />
|
<PackageReference Include="AutoMapper" Version="6.0.2" />
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.6.12" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.6.12" />
|
||||||
<PackageReference Include="Hangfire.MemoryStorage.Core" Version="1.4.0" />
|
<PackageReference Include="Hangfire.MemoryStorage.Core" Version="1.4.0" />
|
||||||
|
<PackageReference Include="Hangfire.RecurringJobExtensions" Version="1.1.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
|
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
<ProjectReference Include="..\Ombi.Core\Ombi.Core.csproj" />
|
<ProjectReference Include="..\Ombi.Core\Ombi.Core.csproj" />
|
||||||
<ProjectReference Include="..\Ombi.DependencyInjection\Ombi.DependencyInjection.csproj" />
|
<ProjectReference Include="..\Ombi.DependencyInjection\Ombi.DependencyInjection.csproj" />
|
||||||
<ProjectReference Include="..\Ombi.Mapping\Ombi.Mapping.csproj" />
|
<ProjectReference Include="..\Ombi.Mapping\Ombi.Mapping.csproj" />
|
||||||
|
<ProjectReference Include="..\Ombi.Schedule\Ombi.Schedule.csproj" />
|
||||||
<ProjectReference Include="..\Ombi.TheMovieDbApi\Ombi.Api.TheMovieDb.csproj" />
|
<ProjectReference Include="..\Ombi.TheMovieDbApi\Ombi.Api.TheMovieDb.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
|
using AutoMapper.EquivalencyExpression;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using Hangfire.MemoryStorage;
|
using Hangfire.MemoryStorage;
|
||||||
|
using Hangfire.RecurringJobExtensions;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.StaticFiles;
|
using Microsoft.AspNetCore.StaticFiles;
|
||||||
|
@ -9,6 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Ombi.DependencyInjection;
|
using Ombi.DependencyInjection;
|
||||||
using Ombi.Mapping;
|
using Ombi.Mapping;
|
||||||
|
using Ombi.Schedule;
|
||||||
|
|
||||||
namespace Ombi
|
namespace Ombi
|
||||||
{
|
{
|
||||||
|
@ -33,10 +36,20 @@ namespace Ombi
|
||||||
// Add framework services.
|
// Add framework services.
|
||||||
services.AddMvc();
|
services.AddMvc();
|
||||||
services.AddOmbiMappingProfile();
|
services.AddOmbiMappingProfile();
|
||||||
services.AddAutoMapper();
|
services.AddAutoMapper(expression =>
|
||||||
|
{
|
||||||
|
expression.AddCollectionMappers();
|
||||||
|
});
|
||||||
services.RegisterDependencies(); // Ioc and EF
|
services.RegisterDependencies(); // Ioc and EF
|
||||||
|
|
||||||
services.AddHangfire(x => x.UseMemoryStorage(new MemoryStorageOptions()));
|
|
||||||
|
services.AddHangfire(x =>
|
||||||
|
{
|
||||||
|
x.UseMemoryStorage(new MemoryStorageOptions());
|
||||||
|
//using RecurringJobAttribute to build RecurringJob automatically.
|
||||||
|
x.UseRecurringJob(typeof(ITestJob));
|
||||||
|
//x.UseActivator(new IoCJobActivator(services.BuildServiceProvider()));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||||
|
@ -54,6 +67,7 @@ namespace Ombi
|
||||||
app.UseExceptionHandler("/Home/Error");
|
app.UseExceptionHandler("/Home/Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
app.UseHangfireServer();
|
app.UseHangfireServer();
|
||||||
app.UseHangfireDashboard();
|
app.UseHangfireDashboard();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue