diff --git a/src/Ombi.Api.Trakt/ITraktApi.cs b/src/Ombi.Api.Trakt/ITraktApi.cs index 36e25e600..17c4203cb 100644 --- a/src/Ombi.Api.Trakt/ITraktApi.cs +++ b/src/Ombi.Api.Trakt/ITraktApi.cs @@ -1,16 +1,16 @@ using System.Collections.Generic; using System.Threading.Tasks; -//using TraktApiSharp.Enums; -//using TraktApiSharp.Objects.Get.Shows; -//using TraktApiSharp.Objects.Get.Shows.Common; +using TraktApiSharp.Enums; +using TraktApiSharp.Objects.Get.Shows; +using TraktApiSharp.Objects.Get.Shows.Common; namespace Ombi.Api.Trakt { public interface ITraktApi { - //Task> GetAnticipatedShows(int? page = default(int?), int? limitPerPage = default(int?)); - //Task> GetMostWatchesShows(TraktTimePeriod period = null, int? page = default(int?), int? limitPerPage = default(int?)); - //Task> GetPopularShows(int? page = default(int?), int? limitPerPage = default(int?)); - //Task> GetTrendingShows(int? page = default(int?), int? limitPerPage = default(int?)); + Task> GetAnticipatedShows(int? page = default(int?), int? limitPerPage = default(int?)); + Task> GetMostWatchesShows(TraktTimePeriod period = null, int? page = default(int?), int? limitPerPage = default(int?)); + Task> GetPopularShows(int? page = default(int?), int? limitPerPage = default(int?)); + Task> GetTrendingShows(int? page = default(int?), int? limitPerPage = default(int?)); } } \ No newline at end of file diff --git a/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj b/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj index c173d1dd7..17a6b9abc 100644 --- a/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj +++ b/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj @@ -4,6 +4,10 @@ netstandard1.6 + + + + diff --git a/src/Ombi.Api.Trakt/TraktApi.cs b/src/Ombi.Api.Trakt/TraktApi.cs index 8ee6fc20a..23773eb87 100644 --- a/src/Ombi.Api.Trakt/TraktApi.cs +++ b/src/Ombi.Api.Trakt/TraktApi.cs @@ -1,49 +1,49 @@ -//using System; -//using System.Collections.Generic; -//using System.Threading.Tasks; -//using Ombi.Helpers; -//using TraktApiSharp; -//using TraktApiSharp.Enums; -//using TraktApiSharp.Objects.Get.Shows; -//using TraktApiSharp.Objects.Get.Shows.Common; -//using TraktApiSharp.Requests.Parameters; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Ombi.Helpers; +using TraktApiSharp; +using TraktApiSharp.Enums; +using TraktApiSharp.Objects.Get.Shows; +using TraktApiSharp.Objects.Get.Shows.Common; +using TraktApiSharp.Requests.Parameters; -//namespace Ombi.Api.Trakt -//{ -// public class TraktApi : ITraktApi -// { -// private TraktClient Client { get; } +namespace Ombi.Api.Trakt +{ + public class TraktApi : ITraktApi + { + private TraktClient Client { get; } -// private static readonly string Encrypted = "MTM0ZTU2ODM1MGY3NDI3NTExZTI1N2E2NTM0MDI2NjYwNDgwY2Y5YjkzYzc3ZjczNzhmMzQwNjAzYjY3MzgxZA=="; -// private readonly string _apiKey = StringCipher.DecryptString(Encrypted, "ApiKey"); -// public TraktApi() -// { -// Client = new TraktClient(_apiKey); -// } + private static readonly string Encrypted = "MTM0ZTU2ODM1MGY3NDI3NTExZTI1N2E2NTM0MDI2NjYwNDgwY2Y5YjkzYzc3ZjczNzhmMzQwNjAzYjY3MzgxZA=="; + private readonly string _apiKey = StringCipher.DecryptString(Encrypted, "ApiKey"); + public TraktApi() + { + Client = new TraktClient(_apiKey); + } -// public async Task> GetPopularShows(int? page = null, int? limitPerPage = null) -// { -// var popular = await Client.Shows.GetPopularShowsAsync(new TraktExtendedInfo { Full = true }, null, page ?? 1, limitPerPage ?? 10); -// return popular.Value; -// } + public async Task> GetPopularShows(int? page = null, int? limitPerPage = null) + { + var popular = await Client.Shows.GetPopularShowsAsync(new TraktExtendedInfo { Full = true, Images = true}, null, page ?? 1, limitPerPage ?? 10); + return popular.Value; + } -// public async Task> GetTrendingShows(int? page = null, int? limitPerPage = null) -// { -// var trendingShowsTop10 = await Client.Shows.GetTrendingShowsAsync(new TraktExtendedInfo { Full = true }, null, page ?? 1, limitPerPage ?? 10); -// return trendingShowsTop10.Value; -// } + public async Task> GetTrendingShows(int? page = null, int? limitPerPage = null) + { + var trendingShowsTop10 = await Client.Shows.GetTrendingShowsAsync(new TraktExtendedInfo { Full = true, Images = true }, null, page ?? 1, limitPerPage ?? 10); + return trendingShowsTop10.Value; + } -// public async Task> GetAnticipatedShows(int? page = null, int? limitPerPage = null) -// { -// var anticipatedShows = await Client.Shows.GetMostAnticipatedShowsAsync(new TraktExtendedInfo { Full = true }, null, page ?? 1, limitPerPage ?? 10); -// return anticipatedShows.Value; -// } + public async Task> GetAnticipatedShows(int? page = null, int? limitPerPage = null) + { + var anticipatedShows = await Client.Shows.GetMostAnticipatedShowsAsync(new TraktExtendedInfo { Full = true, Images = true }, null, page ?? 1, limitPerPage ?? 10); + return anticipatedShows.Value; + } -// public async Task> GetMostWatchesShows(TraktTimePeriod period = null, int? page = null, int? limitPerPage = null) -// { -// var anticipatedShows = await Client.Shows.GetMostWatchedShowsAsync(period ?? TraktTimePeriod.Monthly, new TraktExtendedInfo { Full = true }, null, page ?? 1, limitPerPage ?? 10); -// return anticipatedShows.Value; -// } -// } -//} + public async Task> GetMostWatchesShows(TraktTimePeriod period = null, int? page = null, int? limitPerPage = null) + { + var anticipatedShows = await Client.Shows.GetMostWatchedShowsAsync(period ?? TraktTimePeriod.Monthly, new TraktExtendedInfo { Full = true, Images = true }, null, page ?? 1, limitPerPage ?? 10); + return anticipatedShows.Value; + } + } +} diff --git a/src/Ombi.Core/Engine/BaseMediaEngine.cs b/src/Ombi.Core/Engine/BaseMediaEngine.cs index 1d971cbcc..e07935c9f 100644 --- a/src/Ombi.Core/Engine/BaseMediaEngine.cs +++ b/src/Ombi.Core/Engine/BaseMediaEngine.cs @@ -52,5 +52,26 @@ namespace Ombi.Core.Engine } return _dbTv; } + + public RequestCountModel RequestCount() + { + var movieQuery = MovieRequestService.GetAllQueryable(); + var tvQuery = MovieRequestService.GetAllQueryable(); + + var pendingMovies = movieQuery.Count(x => !x.Approved && !x.Available); + var approvedMovies = movieQuery.Count(x => x.Approved && !x.Available); + var availableMovies = movieQuery.Count(x => x.Available); + + var pendingTv = tvQuery.Count(x => !x.Approved && !x.Available); + var approvedTv = tvQuery.Count(x => x.Approved && !x.Available); + var availableTv = tvQuery.Count(x => x.Available); + + return new RequestCountModel + { + Approved = approvedTv + approvedMovies, + Available = availableTv + availableMovies, + Pending = pendingMovies + pendingTv + }; + } } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index 3f3af63a1..8649ecfde 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -14,5 +14,6 @@ namespace Ombi.Core.Engine Task> SearchMovieRequest(string search); Task RemoveMovieRequest(int requestId); Task UpdateMovieRequest(MovieRequestModel request); + RequestCountModel RequestCount(); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/ITvRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs similarity index 93% rename from src/Ombi.Core/Engine/ITvRequestEngine.cs rename to src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs index a875e726f..c0c6dcb6c 100644 --- a/src/Ombi.Core/Engine/ITvRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs @@ -12,5 +12,6 @@ namespace Ombi.Core.Engine Task RequestTvShow(SearchTvShowViewModel tv); Task> SearchTvRequest(string search); Task UpdateTvRequest(TvRequestModel request); + RequestCountModel RequestCount(); } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/Interfaces/ITvSearchEngine.cs b/src/Ombi.Core/Engine/Interfaces/ITvSearchEngine.cs index 9d86d8dc9..561088764 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvSearchEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvSearchEngine.cs @@ -9,9 +9,10 @@ namespace Ombi.Core.Engine.Interfaces Task> Search(string searchTerm); Task GetShowInformation(int tvdbId); - //Task> Popular(); - //Task> Anticipated(); - //Task> MostWatches(); - //Task> Trending(); + Task> Popular(); + Task> Anticipated(); + Task> MostWatches(); + Task> Trending(); + } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/TvSearchEngine.cs b/src/Ombi.Core/Engine/TvSearchEngine.cs index 229bb75a0..bfcc1cee7 100644 --- a/src/Ombi.Core/Engine/TvSearchEngine.cs +++ b/src/Ombi.Core/Engine/TvSearchEngine.cs @@ -22,7 +22,7 @@ namespace Ombi.Core.Engine { public TvSearchEngine(IPrincipal identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper, ISettingsService plexSettings, - ISettingsService embySettings, IPlexContentRepository repo) + ISettingsService embySettings, IPlexContentRepository repo, ITraktApi trakt) : base(identity, service) { TvMazeApi = tvMaze; @@ -30,7 +30,7 @@ namespace Ombi.Core.Engine PlexSettings = plexSettings; EmbySettings = embySettings; PlexContentRepo = repo; - //TraktApi = trakt; + TraktApi = trakt; } private ITvMazeApi TvMazeApi { get; } @@ -38,7 +38,7 @@ namespace Ombi.Core.Engine private ISettingsService PlexSettings { get; } private ISettingsService EmbySettings { get; } private IPlexContentRepository PlexContentRepo { get; } - //private ITraktApi TraktApi { get; } + private ITraktApi TraktApi { get; } public async Task> Search(string searchTerm) @@ -97,27 +97,27 @@ namespace Ombi.Core.Engine return await ProcessResult(mapped, existingRequests, plexSettings, embySettings); } - //public async Task> Popular() - //{ - // var result = await TraktApi.GetPopularShows(); - // return await ProcessResults(result); - //} + public async Task> Popular() + { + var result = await TraktApi.GetPopularShows(); + return await ProcessResults(result); + } - //public async Task> Anticipated() - //{ - // var result = await TraktApi.GetAnticipatedShows(); - // return await ProcessResults(result); - //} - //public async Task> MostWatches() - //{ - // var result = await TraktApi.GetMostWatchesShows(); - // return await ProcessResults(result); - //} - //public async Task> Trending() - //{ - // var result = await TraktApi.GetTrendingShows(); - // return await ProcessResults(result); - //} + public async Task> Anticipated() + { + var result = await TraktApi.GetAnticipatedShows(); + return await ProcessResults(result); + } + public async Task> MostWatches() + { + var result = await TraktApi.GetMostWatchesShows(); + return await ProcessResults(result); + } + public async Task> Trending() + { + var result = await TraktApi.GetTrendingShows(); + return await ProcessResults(result); + } private async Task> ProcessResults(IEnumerable items) { @@ -154,13 +154,6 @@ namespace Ombi.Core.Engine item.Available = true; item.PlexUrl = content.Url; } - //var plexShow = PlexChecker.GetTvShow(plexTvShows.ToArray(), t.show.name, t.show.premiered?.Substring(0, 4), - // providerId); - //if (plexShow != null) - //{ - // viewT.Available = true; - // viewT.PlexUrl = plexShow.Url; - //} } if (item.Id > 0 && item.Available) diff --git a/src/Ombi.Core/Models/Requests/IRequestService.cs b/src/Ombi.Core/Models/Requests/IRequestService.cs index 10493d028..f0825ab40 100644 --- a/src/Ombi.Core/Models/Requests/IRequestService.cs +++ b/src/Ombi.Core/Models/Requests/IRequestService.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Ombi.Core.Models.Requests; using Ombi.Store.Entities; @@ -22,5 +23,6 @@ namespace Ombi.Core.Requests.Models Task> GetAllAsync(int count, int position); Task GetAsync(int id); T UpdateRequest(T model); + IQueryable GetAllQueryable(); } } \ No newline at end of file diff --git a/src/Ombi.Core/Models/Requests/JsonRequestService.cs b/src/Ombi.Core/Models/Requests/JsonRequestService.cs index fb240ae9a..930113f7e 100644 --- a/src/Ombi.Core/Models/Requests/JsonRequestService.cs +++ b/src/Ombi.Core/Models/Requests/JsonRequestService.cs @@ -128,6 +128,23 @@ namespace Ombi.Core.Models.Requests return retVal; } + public IQueryable GetAllQueryable() + { + var retVal = new List(); + var blobs = Repo.GetAllQueryable(); + foreach (var b in blobs) + { + if (b == null) + { + continue; + } + var model = ByteConverterHelper.ReturnObject(b.Content); + model.Id = b.Id; + retVal.Add(model); + } + return retVal.AsQueryable(); + } + public async Task> GetAllAsync() { var blobs = await Repo.GetAllAsync().ConfigureAwait(false); diff --git a/src/Ombi.Core/Models/Requests/RequestCountModel.cs b/src/Ombi.Core/Models/Requests/RequestCountModel.cs new file mode 100644 index 000000000..8f0b459c0 --- /dev/null +++ b/src/Ombi.Core/Models/Requests/RequestCountModel.cs @@ -0,0 +1,9 @@ +namespace Ombi.Core.Models.Requests +{ + public class RequestCountModel + { + public int Pending { get; set; } + public int Approved { get; set; } + public int Available { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs index 861ca00e6..004ec8784 100644 --- a/src/Ombi.DependencyInjection/IocExtensions.cs +++ b/src/Ombi.DependencyInjection/IocExtensions.cs @@ -6,6 +6,7 @@ using Ombi.Api.Emby; using Ombi.Api.Plex; using Ombi.Api.Sonarr; using Ombi.Api.TheMovieDb; +using Ombi.Api.Trakt; using Ombi.Api.TvMaze; using Ombi.Core; using Ombi.Core.Engine; @@ -51,6 +52,7 @@ namespace Ombi.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } public static void RegisterStore(this IServiceCollection services) diff --git a/src/Ombi.Mapping/Profiles/TvProfile.cs b/src/Ombi.Mapping/Profiles/TvProfile.cs index 67e775064..49ed13683 100644 --- a/src/Ombi.Mapping/Profiles/TvProfile.cs +++ b/src/Ombi.Mapping/Profiles/TvProfile.cs @@ -5,6 +5,9 @@ using Ombi.Api.TvMaze.Models; using Ombi.Core.Models.Requests; using Ombi.Core.Models.Search; using Ombi.Helpers; +using TraktApiSharp.Objects.Get.Shows; +using TraktApiSharp.Objects.Get.Shows.Common; + //using TraktApiSharp.Objects.Get.Shows; //using TraktApiSharp.Objects.Get.Shows.Common; @@ -43,57 +46,58 @@ namespace Ombi.Mapping.Profiles .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.status)) .ForMember(dest => dest.SeasonRequests, opts => opts.MapFrom(src => src.Season)); - //CreateMap() - // .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Ids.Tvdb.ToString()))) - // .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.FirstAired.HasValue ? src.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) - // .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Ids.Imdb)) - // .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Network)) - // .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Overview.RemoveHtml())) - // .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Rating.ToString())) - // .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Runtime.ToString())) - // .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Title)) - // .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Status.DisplayName)) - // .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Trailer)) - // .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Homepage)); + CreateMap() + .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Ids.Tvdb.ToString()))) + .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.FirstAired.HasValue ? src.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) + .ForMember(dest => dest.Banner, opts => opts.MapFrom(src => src.Ids.Imdb)) + .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Ids.Imdb)) + .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Network)) + .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Overview.RemoveHtml())) + .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Rating.ToString())) + .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Runtime.ToString())) + .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Title)) + .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Status.DisplayName)) + .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Trailer)) + .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Homepage)); - //CreateMap() - // .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) - // .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) - // .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) - // .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) - // .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) - // .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) - // .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) - // .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) - // .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) - // .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) - // .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); + CreateMap() + .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) + .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) + .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) + .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) + .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) + .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) + .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) + .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) + .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) + .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) + .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); - //CreateMap() - // .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) - // .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) - // .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) - // .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) - // .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) - // .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) - // .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) - // .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) - // .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) - // .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) - // .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); + CreateMap() + .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) + .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) + .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) + .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) + .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) + .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) + .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) + .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) + .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) + .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) + .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); - //CreateMap() - // .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) - // .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) - // .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) - // .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) - // .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) - // .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) - // .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) - // .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) - // .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) - // .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) - // .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); + CreateMap() + .ForMember(dest => dest.Id, opts => opts.MapFrom(src => Convert.ToInt32(src.Show.Ids.Tvdb.ToString()))) + .ForMember(dest => dest.FirstAired, opts => opts.MapFrom(src => src.Show.FirstAired.HasValue ? src.Show.FirstAired.Value.ToString("yyyy-MM-ddTHH:mm:ss") : string.Empty)) + .ForMember(dest => dest.ImdbId, opts => opts.MapFrom(src => src.Show.Ids.Imdb)) + .ForMember(dest => dest.Network, opts => opts.MapFrom(src => src.Show.Network)) + .ForMember(dest => dest.Overview, opts => opts.MapFrom(src => src.Show.Overview.RemoveHtml())) + .ForMember(dest => dest.Rating, opts => opts.MapFrom(src => src.Show.Rating.ToString())) + .ForMember(dest => dest.Runtime, opts => opts.MapFrom(src => src.Show.Runtime.ToString())) + .ForMember(dest => dest.Title, opts => opts.MapFrom(src => src.Show.Title)) + .ForMember(dest => dest.Status, opts => opts.MapFrom(src => src.Show.Status.DisplayName)) + .ForMember(dest => dest.Trailer, opts => opts.MapFrom(src => src.Show.Trailer)) + .ForMember(dest => dest.Homepage, opts => opts.MapFrom(src => src.Show.Homepage)); } } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/IRequestRepository.cs b/src/Ombi.Store/Repository/IRequestRepository.cs index a24985c34..40bba77cb 100644 --- a/src/Ombi.Store/Repository/IRequestRepository.cs +++ b/src/Ombi.Store/Repository/IRequestRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Ombi.Store.Entities; @@ -17,5 +18,6 @@ namespace Ombi.Store.Repository Task InsertAsync(RequestBlobs entity); RequestBlobs Update(RequestBlobs entity); void UpdateAll(IEnumerable entity); + IQueryable GetAllQueryable(); } } \ No newline at end of file diff --git a/src/Ombi.Store/Repository/RequestJsonRepository.cs b/src/Ombi.Store/Repository/RequestJsonRepository.cs index ba0472bac..d6f0c902c 100644 --- a/src/Ombi.Store/Repository/RequestJsonRepository.cs +++ b/src/Ombi.Store/Repository/RequestJsonRepository.cs @@ -143,5 +143,10 @@ namespace Ombi.Store.Repository Db.SaveChanges(); } + + public IQueryable GetAllQueryable() + { + return Db.Requests.AsQueryable(); + } } } \ No newline at end of file diff --git a/src/Ombi/Config/ApplicationSettings.cs b/src/Ombi/Config/ApplicationSettings.cs new file mode 100644 index 000000000..3caf6b2f2 --- /dev/null +++ b/src/Ombi/Config/ApplicationSettings.cs @@ -0,0 +1,7 @@ +namespace Ombi.Config +{ + public class ApplicationSettings + { + public string Version { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index a1c36144d..2b460dc0c 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -58,7 +58,6 @@ namespace Ombi.Controllers { try { - return await TvRequestEngine.GetTvRequests(count, position); } catch (Exception e) @@ -93,5 +92,13 @@ namespace Ombi.Controllers { return await TvRequestEngine.UpdateTvRequest(model); } + + [HttpGet("count")] + [AllowAnonymous] + public RequestCountModel GetCountOfRequests() + { + // Doesn't matter if we use the TvEngine or MovieEngine, this method is in the base class + return TvRequestEngine.RequestCount(); + } } } diff --git a/src/Ombi/Controllers/SearchController.cs b/src/Ombi/Controllers/SearchController.cs index 36e9cc320..3c986521b 100644 --- a/src/Ombi/Controllers/SearchController.cs +++ b/src/Ombi/Controllers/SearchController.cs @@ -72,25 +72,25 @@ namespace Ombi.Controllers return await TvEngine.GetShowInformation(tvdbId); } - //[HttpGet("tv/popular")] - //public async Task> PopularTv() - //{ - // return await TvEngine.Popular(); - //} - //[HttpGet("tv/anticiplated")] - //public async Task> AnticiplatedTv() - //{ - // return await TvEngine.Anticipated(); - //} - //[HttpGet("tv/mostwatched")] - //public async Task> MostWatched() - //{ - // return await TvEngine.MostWatches(); - //} - //[HttpGet("tv/trending")] - //public async Task> Trending() - //{ - // return await TvEngine.Trending(); - //} + [HttpGet("tv/popular")] + public async Task> PopularTv() + { + return await TvEngine.Popular(); + } + [HttpGet("tv/anticiplated")] + public async Task> AnticiplatedTv() + { + return await TvEngine.Anticipated(); + } + [HttpGet("tv/mostwatched")] + public async Task> MostWatched() + { + return await TvEngine.MostWatches(); + } + [HttpGet("tv/trending")] + public async Task> Trending() + { + return await TvEngine.Trending(); + } } } diff --git a/src/Ombi/Startup.cs b/src/Ombi/Startup.cs index a89893cab..44d1160d6 100644 --- a/src/Ombi/Startup.cs +++ b/src/Ombi/Startup.cs @@ -15,6 +15,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Ombi.Auth; +using Ombi.Config; using Ombi.DependencyInjection; using Ombi.Mapping; using Ombi.Schedule; @@ -72,6 +73,7 @@ namespace Ombi services.Configure(Configuration.GetSection("TokenAuthentication")); + services.Configure(Configuration.GetSection("ApplicationSettings")); services.AddHangfire(x => { diff --git a/src/Ombi/appsettings.json b/src/Ombi/appsettings.json index 9f2b53bdb..4d21149d6 100644 --- a/src/Ombi/appsettings.json +++ b/src/Ombi/appsettings.json @@ -5,9 +5,11 @@ "Default": "Warning" } }, - "Version": "{{VERSIONNUMBER}}", + "ApplicationSettings": { + "Verison": "{{VERSIONNUMBER}}" + }, "TokenAuthentication": { - "SecretKey": "OmbiKey", + "SecretKey": "secretkey_secretkey123!", "Issuer": "OmbiIssuer", "Audience": "OmbiAudience", "TokenPath": "/api/v1/token/", diff --git a/src/Ombi/wwwroot/app/interfaces/IRequestModel.ts b/src/Ombi/wwwroot/app/interfaces/IRequestModel.ts index 22b41e153..52a35dc8e 100644 --- a/src/Ombi/wwwroot/app/interfaces/IRequestModel.ts +++ b/src/Ombi/wwwroot/app/interfaces/IRequestModel.ts @@ -33,8 +33,14 @@ export interface ITvRequestModel extends IMediaBase { firstAired: string, } +export interface IRequestCountModel { + pending: number, + approved: number, + available: number +} + export interface IChildTvRequest extends IMediaBase { - requestAll: boolean, + requestAll: boolean, seasonRequests: ISeasonRequests[], } diff --git a/src/Ombi/wwwroot/app/landingpage/landingpage.component.css b/src/Ombi/wwwroot/app/landingpage/landingpage.component.css index e9853be20..962348019 100644 --- a/src/Ombi/wwwroot/app/landingpage/landingpage.component.css +++ b/src/Ombi/wwwroot/app/landingpage/landingpage.component.css @@ -1,7 +1,12 @@ .landing-box { height: 150px; background: #333333 !important; - border-radius: 2% + border-radius: 2%; + display: flex; + justify-content: center; + flex-direction: column; + text-align: center; + box-shadow: 5px 3px 5px black; } .landing-logo { diff --git a/src/Ombi/wwwroot/app/landingpage/landingpage.component.html b/src/Ombi/wwwroot/app/landingpage/landingpage.component.html index d4dbc1293..c22ffa3a6 100644 --- a/src/Ombi/wwwroot/app/landingpage/landingpage.component.html +++ b/src/Ombi/wwwroot/app/landingpage/landingpage.component.html @@ -1,27 +1,49 @@ 
- + -

Hey! Welcome back to {{customizationSettings.applicationName}}

- +

+ Hey! Welcome back to + + {{customizationSettings.applicationName}} + + + Ombi + +

+
+
+

-
+
- Request Something + Search
-
+
View all your requests +
+
+
+
+ Pending Requests: {{requestCount.pending}} +
+ Approved Requests: {{requestCount.approved}} +
+ Available Requests: {{requestCount.available}} +
- Report an issue + Media Server Status: + +
diff --git a/src/Ombi/wwwroot/app/landingpage/landingpage.component.ts b/src/Ombi/wwwroot/app/landingpage/landingpage.component.ts index 6bd1c63dd..aafc8c68e 100644 --- a/src/Ombi/wwwroot/app/landingpage/landingpage.component.ts +++ b/src/Ombi/wwwroot/app/landingpage/landingpage.component.ts @@ -1,6 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { SettingsService } from '../services/settings.service'; +import { RequestService } from '../services/request.service'; import { ILandingPageSettings, ICustomizationSettings } from '../interfaces/ISettings'; +import { IRequestCountModel } from '../interfaces/IRequestModel'; @Component({ selector: 'ombi', @@ -10,13 +12,19 @@ import { ILandingPageSettings, ICustomizationSettings } from '../interfaces/ISet }) export class LandingPageComponent implements OnInit { - constructor(private settingsService: SettingsService) { } + constructor(private settingsService: SettingsService, private requestService : RequestService) { } customizationSettings : ICustomizationSettings; landingPageSettings: ILandingPageSettings; + requestCount: IRequestCountModel; + + mediaServerStatus: boolean; ngOnInit(): void { this.settingsService.getCustomization().subscribe(x => this.customizationSettings = x); this.settingsService.getLandingPage().subscribe(x => this.landingPageSettings = x); + this.requestService.getRequestsCount().subscribe(x => this.requestCount = x); + + this.mediaServerStatus = true; } } \ No newline at end of file diff --git a/src/Ombi/wwwroot/app/login/login.component.ts b/src/Ombi/wwwroot/app/login/login.component.ts index 3344f6e9a..3aa85f2cf 100644 --- a/src/Ombi/wwwroot/app/login/login.component.ts +++ b/src/Ombi/wwwroot/app/login/login.component.ts @@ -5,6 +5,8 @@ import { AuthService } from '../auth/auth.service'; import { StatusService } from '../services/status.service'; import { NotificationService } from '../services/notification.service'; + + @Component({ selector: 'ombi', moduleId: module.id, diff --git a/src/Ombi/wwwroot/app/services/request.service.ts b/src/Ombi/wwwroot/app/services/request.service.ts index a29c40d1e..eade30273 100644 --- a/src/Ombi/wwwroot/app/services/request.service.ts +++ b/src/Ombi/wwwroot/app/services/request.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; import { AuthHttp } from 'angular2-jwt'; import { Observable } from 'rxjs/Rx'; @@ -6,11 +7,11 @@ import { ServiceAuthHelpers } from './service.helpers'; import { IRequestEngineResult } from '../interfaces/IRequestEngineResult'; import { ISearchMovieResult } from '../interfaces/ISearchMovieResult'; import { ISearchTvResult } from '../interfaces/ISearchTvResult'; -import { IMovieRequestModel, ITvRequestModel } from '../interfaces/IRequestModel'; +import { IMovieRequestModel, ITvRequestModel, IRequestCountModel } from '../interfaces/IRequestModel'; @Injectable() export class RequestService extends ServiceAuthHelpers { - constructor(http: AuthHttp) { + constructor(http: AuthHttp, private basicHttp : Http) { super(http, '/api/v1/Request/'); } @@ -53,4 +54,8 @@ export class RequestService extends ServiceAuthHelpers { updateTvRequest(request: ITvRequestModel): Observable { return this.http.post(`${this.url}tv/`, JSON.stringify(request), { headers: this.headers }).map(this.extractData); } + + getRequestsCount(): Observable { + return this.basicHttp.get(`${this.url}count`).map(this.extractData); + } } \ No newline at end of file