From 187d76ea77c3ccd506f09f921521f856b0c547d6 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Sat, 23 Sep 2017 01:08:21 +0100 Subject: [PATCH 1/7] Fixed a bunch of issues on #1513 --- .../Engine/Interfaces/ITvRequestEngine.cs | 2 + src/Ombi.Core/Engine/TreeNode.cs | 9 + src/Ombi.Core/Engine/TvRequestEngine.cs | 64 ++++- src/Ombi.Core/Engine/TvSearchEngine.cs | 53 +++- .../Jobs/Emby/EmbyEpisodeCacher.cs | 6 + .../Jobs/Ombi/OmbiAutomaticUpdater.cs | 31 +-- .../Entities/ApplicationConfiguration.cs | 3 +- .../ClientApp/app/interfaces/IRequestModel.ts | 1 + .../ClientApp/app/login/login.component.html | 2 +- .../ClientApp/app/login/login.component.scss | 254 +++++++++--------- .../tvrequest-children.component.html | 6 +- .../requests/tvrequest-children.component.ts | 5 + .../app/requests/tvrequests.component.html | 7 +- .../app/requests/tvrequests.component.ts | 129 +-------- .../search/seriesinformation.component.html | 9 +- .../app/search/seriesinformation.component.ts | 2 + .../app/search/tvsearch.component.html | 2 +- .../ClientApp/app/services/request.service.ts | 10 + .../app/settings/emby/emby.component.html | 9 +- .../notifications/pushover.component.ts | 5 +- src/Ombi/Controllers/LandingPageController.cs | 99 ++++--- src/Ombi/Controllers/RequestController.cs | 34 ++- src/Ombi/Ombi.csproj | 9 +- src/Ombi/Program.cs | 9 +- 24 files changed, 384 insertions(+), 376 deletions(-) diff --git a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs index 5066b7ad5..e85b793de 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs @@ -13,8 +13,10 @@ namespace Ombi.Core.Engine.Interfaces Task RequestTvShow(SearchTvShowViewModel tv); Task> SearchTvRequest(string search); + Task>>> SearchTvRequestTree(string search); Task UpdateTvRequest(TvRequests request); + Task>>> GetRequestsTreeNode(int count, int position); Task> GetAllChldren(int tvId); Task UpdateChildRequest(ChildRequests request); Task RemoveTvChild(int requestId); diff --git a/src/Ombi.Core/Engine/TreeNode.cs b/src/Ombi.Core/Engine/TreeNode.cs index 1744b8ffd..14f2f4cb0 100644 --- a/src/Ombi.Core/Engine/TreeNode.cs +++ b/src/Ombi.Core/Engine/TreeNode.cs @@ -11,4 +11,13 @@ namespace Ombi.Core.Engine public bool Leaf { get; set; } public bool Expanded { get; set; } } + + public class TreeNode + { + public string Label { get; set; } + public T Data { get; set; } + public List> Children { get; set; } + public bool Leaf { get; set; } + public bool Expanded { get; set; } + } } \ No newline at end of file diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index 51be4d7ab..867b1ea1d 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -37,7 +37,7 @@ namespace Ombi.Core.Engine private INotificationHelper NotificationHelper { get; } private ITvMazeApi TvApi { get; } private IMapper Mapper { get; } - private ITvSender TvSender {get;} + private ITvSender TvSender { get; } private IAuditRepository Audit { get; } public async Task RequestTvShow(SearchTvShowViewModel tv) @@ -51,7 +51,7 @@ namespace Ombi.Core.Engine .CreateChild(tv, user.Id); await tvBuilder.BuildEpisodes(tv); - + var ruleResults = await RunRequestRules(tvBuilder.ChildRequest); var results = ruleResults as RuleResult[] ?? ruleResults.ToArray(); if (results.Any(x => !x.Success)) @@ -122,6 +122,12 @@ namespace Ombi.Core.Engine return allRequests; } + public async Task>>> GetRequestsTreeNode(int count, int position) + { + var allRequests = await TvRepository.Get().Skip(position).Take(count).ToListAsync(); + return ParseIntoTreeNode(allRequests); + } + public async Task> GetRequests() { var allRequests = TvRepository.Get(); @@ -132,7 +138,7 @@ namespace Ombi.Core.Engine { return await TvRepository.GetChild().Where(x => x.ParentRequestId == tvId).ToListAsync(); } - + public async Task> SearchTvRequest(string search) { var allRequests = TvRepository.Get(); @@ -140,6 +146,13 @@ namespace Ombi.Core.Engine return results; } + public async Task>>> SearchTvRequestTree(string search) + { + var allRequests = TvRepository.Get(); + var results = await allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToListAsync(); + return ParseIntoTreeNode(results); + } + public async Task UpdateTvRequest(TvRequests request) { await Audit.Record(AuditType.Updated, AuditArea.TvRequest, $"Updated Request {request.Title}", Username); @@ -154,7 +167,7 @@ namespace Ombi.Core.Engine public async Task UpdateChildRequest(ChildRequests request) { await Audit.Record(AuditType.Updated, AuditArea.TvRequest, $"Updated Request {request.Title}", Username); - + await TvRepository.UpdateChild(request); return request; } @@ -164,7 +177,7 @@ namespace Ombi.Core.Engine var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == requestId); var all = TvRepository.Db.TvRequests.Include(x => x.ChildRequests); var parent = all.FirstOrDefault(x => x.Id == request.ParentRequestId); - + // Is this the only child? If so delete the parent if (parent.ChildRequests.Count <= 1) { @@ -201,6 +214,41 @@ namespace Ombi.Core.Engine return await AfterRequest(model.ChildRequests.FirstOrDefault()); } + private static List>> ParseIntoTreeNode(IEnumerable result) + { + var node = new List>>(); + + foreach (var value in result) + { + node.Add(new TreeNode> + { + Data = value, + Children = new List>> + { + new TreeNode> + { + Data = SortEpisodes(value.ChildRequests), + Leaf = true + } + } + }); + } + return node; + } + + private static List SortEpisodes(List items) + { + foreach (var value in items) + { + foreach (var requests in value.SeasonRequests) + { + requests.Episodes.OrderBy(x => x.EpisodeNumber); + } + } + return items; + } + + private async Task AfterRequest(ChildRequests model) { var sendRuleResult = await RunSpecificRule(model, SpecificRules.CanSendNotification); @@ -209,7 +257,7 @@ namespace Ombi.Core.Engine NotificationHelper.NewRequest(model); } - if(model.Approved) + if (model.Approved) { // Autosend await TvSender.SendToSonarr(model); @@ -221,8 +269,8 @@ namespace Ombi.Core.Engine //public async Task> GetApprovedRequests() //{ // var allRequests = TvRepository.Get(); - - + + //} //public async Task> GetNewRequests() diff --git a/src/Ombi.Core/Engine/TvSearchEngine.cs b/src/Ombi.Core/Engine/TvSearchEngine.cs index 28aa6061a..862dde5a5 100644 --- a/src/Ombi.Core/Engine/TvSearchEngine.cs +++ b/src/Ombi.Core/Engine/TvSearchEngine.cs @@ -19,13 +19,14 @@ using Ombi.Store.Entities.Requests; using Ombi.Store.Repository.Requests; using Ombi.Store.Entities; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; namespace Ombi.Core.Engine { public class TvSearchEngine : BaseMediaEngine, ITvSearchEngine { public TvSearchEngine(IPrincipal identity, IRequestServiceMain service, ITvMazeApi tvMaze, IMapper mapper, ISettingsService plexSettings, - ISettingsService embySettings, IPlexContentRepository repo, ITraktApi trakt, IRuleEvaluator r, UserManager um) + ISettingsService embySettings, IPlexContentRepository repo, IEmbyContentRepository embyRepo, ITraktApi trakt, IRuleEvaluator r, UserManager um) : base(identity, service, r, um) { TvMazeApi = tvMaze; @@ -34,6 +35,7 @@ namespace Ombi.Core.Engine EmbySettings = embySettings; PlexContentRepo = repo; TraktApi = trakt; + EmbyContentRepo = embyRepo; } private ITvMazeApi TvMazeApi { get; } @@ -41,6 +43,7 @@ namespace Ombi.Core.Engine private ISettingsService PlexSettings { get; } private ISettingsService EmbySettings { get; } private IPlexContentRepository PlexContentRepo { get; } + private IEmbyContentRepository EmbyContentRepo { get; } private ITraktApi TraktApi { get; } public async Task> Search(string searchTerm) @@ -175,11 +178,31 @@ namespace Ombi.Core.Engine { if (embySettings.Enable) { - //var embyShow = EmbyChecker.GetTvShow(embyCached.ToArray(), t.show.name, t.show.premiered?.Substring(0, 4), providerId); - //if (embyShow != null) - //{ - // viewT.Available = true; - //} + var content = await EmbyContentRepo.Get(item.Id.ToString()); + + if (content != null) + { + item.Available = true; + } + + // Let's go through the episodes now + if (item.SeasonRequests.Any()) + { + var allEpisodes = EmbyContentRepo.GetAllEpisodes().Include(x => x.Series); + foreach (var season in item.SeasonRequests) + { + foreach (var episode in season.Episodes) + { + var epExists = await allEpisodes.FirstOrDefaultAsync(x => + x.EpisodeNumber == episode.EpisodeNumber && x.SeasonNumber == season.SeasonNumber && item.Id.ToString() == x.Series.ProviderId); + if (epExists != null) + { + episode.Available = true; + } + } + } + } + } if (plexSettings.Enable) { @@ -190,6 +213,24 @@ namespace Ombi.Core.Engine item.Available = true; item.PlexUrl = content.Url; } + // Let's go through the episodes now + if (item.SeasonRequests.Any()) + { + var allEpisodes = PlexContentRepo.GetAllEpisodes(); + foreach (var season in item.SeasonRequests) + { + foreach (var episode in season.Episodes) + { + var epExists = await allEpisodes.FirstOrDefaultAsync(x => + x.EpisodeNumber == episode.EpisodeNumber && x.SeasonNumber == season.SeasonNumber); + if (epExists != null) + { + episode.Available = true; + } + } + } + } + } if (item.Id > 0) diff --git a/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeCacher.cs b/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeCacher.cs index 9031993ff..d6e8878aa 100644 --- a/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeCacher.cs +++ b/src/Ombi.Schedule/Jobs/Emby/EmbyEpisodeCacher.cs @@ -77,6 +77,12 @@ namespace Ombi.Schedule.Jobs.Emby foreach (var ep in allEpisodes.Items) { + if (ep.LocationType.Equals("Virtual", StringComparison.CurrentCultureIgnoreCase)) + { + // This means that we don't actully have the file, it's just Emby being nice and showing future stuff + continue; + } + var epInfo = await _api.GetEpisodeInformation(ep.Id, server.ApiKey, server.AdministratorId, server.FullUri); if (epInfo?.ProviderIds?.Tvdb == null) { diff --git a/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs b/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs index a7cc8179e..831d562d6 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs @@ -108,31 +108,8 @@ namespace Ombi.Schedule.Jobs.Ombi } else { - // Linux - if (desc.Contains("ubuntu", CompareOptions.IgnoreCase)) - { - // Ubuntu - Logger.LogInformation(LoggingEvents.Updater, "We are ubuntu"); - download = updates.Downloads.FirstOrDefault(x => x.Name.Contains("ubuntu", CompareOptions.IgnoreCase)); - - } - else if (desc.Contains("debian", CompareOptions.IgnoreCase)) - { - // Debian - Logger.LogInformation(LoggingEvents.Updater, "We are debian"); - download = updates.Downloads.FirstOrDefault(x => x.Name.Contains("debian", CompareOptions.IgnoreCase)); - } - else if (desc.Contains("centos", CompareOptions.IgnoreCase)) - { - // Centos - Logger.LogInformation(LoggingEvents.Updater, "We are centos"); - download = updates.Downloads.FirstOrDefault(x => x.Name.Contains("centos", - CompareOptions.IgnoreCase)); - } - else - { - return; - } + Logger.LogInformation(LoggingEvents.Updater, "We are linux"); + download = updates.Downloads.FirstOrDefault(x => x.Name.Contains("linux", CompareOptions.IgnoreCase)); } if (download == null) { @@ -201,7 +178,7 @@ namespace Ombi.Schedule.Jobs.Ombi { UseShellExecute = false, CreateNoWindow = true, - FileName = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),"TempUpdate",$"Ombi.Updater{updaterExtension}"), + FileName = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "TempUpdate", $"Ombi.Updater{updaterExtension}"), Arguments = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + " " + extension }; using (var proc = new Process { StartInfo = start }) @@ -212,7 +189,7 @@ namespace Ombi.Schedule.Jobs.Ombi } } catch (Exception e) - { + { Ctx.WriteLine(e); throw; } diff --git a/src/Ombi.Store/Entities/ApplicationConfiguration.cs b/src/Ombi.Store/Entities/ApplicationConfiguration.cs index adf7e3342..a16335ab2 100644 --- a/src/Ombi.Store/Entities/ApplicationConfiguration.cs +++ b/src/Ombi.Store/Entities/ApplicationConfiguration.cs @@ -14,6 +14,7 @@ namespace Ombi.Store.Entities Url, Port, FanartTv, - TheMovieDb + TheMovieDb, + StoragePath } } \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts index ff1adf130..9ba2f0647 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts @@ -137,4 +137,5 @@ export interface IEpisodesRequests { available: boolean; requested: boolean; approved: boolean; + selected:boolean; // This is for the UI only } diff --git a/src/Ombi/ClientApp/app/login/login.component.html b/src/Ombi/ClientApp/app/login/login.component.html index 1e621e1aa..9458b07fc 100644 --- a/src/Ombi/ClientApp/app/login/login.component.html +++ b/src/Ombi/ClientApp/app/login/login.component.html @@ -9,7 +9,7 @@ include the remember me checkbox
-
+

@@ -68,7 +68,7 @@ Available Processing Request
-
Pending Approval
+
Pending Approval
diff --git a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts index d6ca8d432..d4d3a011d 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequest-children.component.ts @@ -36,6 +36,11 @@ export class TvRequestChildrenComponent { public approve(request: IChildRequests) { request.approved = true; request.denied = false; + request.seasonRequests.forEach((season) => { + season.episodes.forEach((ep) => { + ep.approved = true; + }); + }); this.requestService.updateChild(request) .subscribe(); } diff --git a/src/Ombi/ClientApp/app/requests/tvrequests.component.html b/src/Ombi/ClientApp/app/requests/tvrequests.component.html index e515ee47a..22021fa28 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequests.component.html +++ b/src/Ombi/ClientApp/app/requests/tvrequests.component.html @@ -19,11 +19,6 @@ (scrolled)="loadMore()">-->
- @@ -63,7 +58,7 @@
- +
diff --git a/src/Ombi/ClientApp/app/requests/tvrequests.component.ts b/src/Ombi/ClientApp/app/requests/tvrequests.component.ts index eed66b1cc..f46d1d86b 100644 --- a/src/Ombi/ClientApp/app/requests/tvrequests.component.ts +++ b/src/Ombi/ClientApp/app/requests/tvrequests.component.ts @@ -1,8 +1,7 @@ -import { Component, OnDestroy, OnInit, ViewEncapsulation } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import "rxjs/add/operator/debounceTime"; import "rxjs/add/operator/distinctUntilChanged"; import "rxjs/add/operator/map"; -import "rxjs/add/operator/takeUntil"; import { Subject } from "rxjs/Subject"; import "rxjs/add/operator/debounceTime"; @@ -13,18 +12,14 @@ import { AuthService } from "../auth/auth.service"; import { RequestService } from "../services"; import { TreeNode } from "primeng/primeng"; -import { IChildRequests, IEpisodesRequests, INewSeasonRequests, ITvRequests } from "../interfaces"; +import { ITvRequests } from "../interfaces"; @Component({ selector: "tv-requests", templateUrl: "./tvrequests.component.html", styleUrls: ["./tvrequests.component.scss"], - //Was required to turn off encapsulation since CSS only should be overridden for this component - //However when encapsulation is on angular injects prefixes to all classes so css selectors - //Stop working - encapsulation: ViewEncapsulation.None, }) -export class TvRequestsComponent implements OnInit, OnDestroy { +export class TvRequestsComponent implements OnInit { public tvRequests: TreeNode[]; public searchChanged = new Subject(); @@ -35,23 +30,20 @@ export class TvRequestsComponent implements OnInit, OnDestroy { private currentlyLoaded: number; private amountToLoad: number; - private subscriptions = new Subject(); constructor(private requestService: RequestService, private auth: AuthService) { this.searchChanged .debounceTime(600) // Wait Xms afterthe last event before emitting last event .distinctUntilChanged() // only emit if value is different from previous value - .takeUntil(this.subscriptions) .subscribe(x => { this.searchText = x as string; if (this.searchText === "") { this.resetSearch(); return; } - this.requestService.searchTvRequests(this.searchText) - .takeUntil(this.subscriptions) - .subscribe(m => this.tvRequests = this.transformData(m)); + this.requestService.searchTvRequestsTree(this.searchText) + .subscribe(m => this.tvRequests = m); }); } public openClosestTab(el: any) { @@ -78,30 +70,7 @@ export class TvRequestsComponent implements OnInit, OnDestroy { } } } - public transformData(data: ITvRequests[]): TreeNode[] { - const temp: TreeNode[] = []; - data.forEach((value) => { - temp.push({ - data: value, - children: [{ - data: this.fixEpisodeSort(value.childRequests), leaf: true, - }], - leaf: false, - }); - }, this); - return temp; - } - public fixEpisodeSort(items: IChildRequests[]) { - items.forEach((value) => { - value.seasonRequests.forEach((requests: INewSeasonRequests) => { - requests.episodes.sort((a: IEpisodesRequests, b: IEpisodesRequests) => { - return a.episodeNumber - b.episodeNumber; - }); - }); - }); - return items; - } public ngOnInit() { this.amountToLoad = 1000; this.currentlyLoaded = 5; @@ -116,10 +85,9 @@ export class TvRequestsComponent implements OnInit, OnDestroy { //if you scroll really quickly then you start getting duplicates of movies //since it's async and some subsequent results return first and then incrementer //is increased so you see movies which had already been gotten show up... - this.requestService.getTvRequests(this.amountToLoad, this.currentlyLoaded + 1) - .takeUntil(this.subscriptions) + this.requestService.getTvRequestsTree(this.amountToLoad, this.currentlyLoaded + 1) .subscribe(x => { - this.tvRequests.push.apply(this.tvRequests, this.transformData(x)); + this.tvRequests = x; this.currentlyLoaded = this.currentlyLoaded + this.amountToLoad; }); } @@ -128,87 +96,15 @@ export class TvRequestsComponent implements OnInit, OnDestroy { this.searchChanged.next(text.target.value); } - public removeRequest(request: ITvRequests) { - this.requestService.removeTvRequest(request); - this.removeRequestFromUi(request); - } - - public changeAvailability(request: IChildRequests, available: boolean) { - request.available = available; - - //this.updateRequest(request); - } - - //Was already here but not sure what's using it...' - //public approve(request: IChildRequests) { - // request.approved = true; - // request.denied = false; - // //this.updateRequest(request); - //} - public approve(request: IChildRequests) { - request.approved = true; - request.denied = false; - this.requestService.updateChild(request) - .subscribe(); - } - //Was already here but not sure what's using it...' - //public deny(request: IChildRequests) { - // request.approved = false; - // request.denied = true; - // //this.updateRequest(request); - //} - public deny(request: IChildRequests) { - request.approved = false; - request.denied = true; - this.requestService.updateChild(request) - .subscribe(); - } - - public approveSeasonRequest(request: IChildRequests) { - request.approved = true; - request.denied = false; - this.requestService.updateTvRequest(this.selectedSeason) - .subscribe(); - } - - public denySeasonRequest(request: IChildRequests) { - request.approved = false; - request.denied = true; - this.requestService.updateTvRequest(this.selectedSeason) - .subscribe(); - } - public showChildren(request: ITvRequests) { this.selectedSeason = request; this.showChildDialogue = true; } - public getColour(ep: IEpisodesRequests): string { - if (ep.available) { - return "lime"; - } - if (ep.approved) { - return "#00c0ff"; - } - return "white"; - } - - public ngOnDestroy() { - this.subscriptions.next(); - this.subscriptions.complete(); - } - - //private updateRequest(request: ITvRequests) { - // this.requestService.updateTvRequest(request) - // .takeUntil(this.subscriptions) - // .subscribe(x => request = x); - //} - private loadInit() { - this.requestService.getTvRequests(this.amountToLoad, 0) - .takeUntil(this.subscriptions) + this.requestService.getTvRequestsTree(this.amountToLoad, 0) .subscribe(x => { - this.tvRequests = this.transformData(x); + this.tvRequests = x; }); } @@ -216,11 +112,4 @@ export class TvRequestsComponent implements OnInit, OnDestroy { this.currentlyLoaded = 5; this.loadInit(); } - - private removeRequestFromUi(key: ITvRequests) { - const index = this.tvRequests.findIndex(x => x.data === key); - if (index > -1) { - this.tvRequests.splice(index, 1); - } - } } diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.html b/src/Ombi/ClientApp/app/search/seriesinformation.component.html index ce71207be..5b546b722 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.html +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.html @@ -55,14 +55,15 @@ Available - Processing Request - Pending Approval + Processing Request + Selected + Pending Approval Not Requested - - + + diff --git a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts index 34124acd9..4b68ba305 100644 --- a/src/Ombi/ClientApp/app/search/seriesinformation.component.ts +++ b/src/Ombi/ClientApp/app/search/seriesinformation.component.ts @@ -54,10 +54,12 @@ export class SeriesInformationComponent implements OnInit, OnDestroy { public addRequest(episode: IEpisodesRequests) { episode.requested = true; + episode.selected = true; } public removeRequest(episode: IEpisodesRequests) { episode.requested = false; + episode.selected = false; } public ngOnDestroy() { diff --git a/src/Ombi/ClientApp/app/search/tvsearch.component.html b/src/Ombi/ClientApp/app/search/tvsearch.component.html index 8a9f6051a..a6e6ae7fb 100644 --- a/src/Ombi/ClientApp/app/search/tvsearch.component.html +++ b/src/Ombi/ClientApp/app/search/tvsearch.component.html @@ -59,7 +59,7 @@ Air Date: {{node.data.firstAired | date: 'dd/MM/yyyy'}} - Available + Available diff --git a/src/Ombi/ClientApp/app/services/request.service.ts b/src/Ombi/ClientApp/app/services/request.service.ts index 13714f757..46cbb3c3b 100644 --- a/src/Ombi/ClientApp/app/services/request.service.ts +++ b/src/Ombi/ClientApp/app/services/request.service.ts @@ -3,6 +3,7 @@ import { Http } from "@angular/http"; import { AuthHttp } from "angular2-jwt"; import { Observable } from "rxjs/Rx"; +import { TreeNode } from "primeng/primeng"; import { IRequestEngineResult } from "../interfaces"; import { IChildRequests, IMovieRequests, IRequestCountModel, IRequestGrid, ITvRequests } from "../interfaces"; import { ISearchMovieResult } from "../interfaces"; @@ -44,6 +45,11 @@ export class RequestService extends ServiceAuthHelpers { .catch(this.handleError); } + public getTvRequestsTree(count: number, position: number): Observable { + return this.http.get(`${this.url}tv/${count}/${position}/tree`).map(this.extractData) + .catch(this.handleError); + } + public getChildRequests(requestId: number): Observable { return this.http.get(`${this.url}tv/${requestId}/child`).map(this.extractData) .catch(this.handleError); @@ -51,6 +57,10 @@ export class RequestService extends ServiceAuthHelpers { public searchTvRequests(search: string): Observable { return this.http.get(`${this.url}tv/search/${search}`).map(this.extractData); + } + + public searchTvRequestsTree(search: string): Observable { + return this.http.get(`${this.url}tv/search/${search}/tree`).map(this.extractData); } public removeTvRequest(request: ITvRequests) { diff --git a/src/Ombi/ClientApp/app/settings/emby/emby.component.html b/src/Ombi/ClientApp/app/settings/emby/emby.component.html index 16f3e2d8b..78b2fed02 100644 --- a/src/Ombi/ClientApp/app/settings/emby/emby.component.html +++ b/src/Ombi/ClientApp/app/settings/emby/emby.component.html @@ -24,7 +24,7 @@

-
+

@@ -76,23 +76,20 @@
- +
-
-
-
+
-
\ No newline at end of file diff --git a/src/Ombi/ClientApp/app/settings/notifications/pushover.component.ts b/src/Ombi/ClientApp/app/settings/notifications/pushover.component.ts index 8851577ee..3fb5f9591 100644 --- a/src/Ombi/ClientApp/app/settings/notifications/pushover.component.ts +++ b/src/Ombi/ClientApp/app/settings/notifications/pushover.component.ts @@ -58,11 +58,10 @@ export class PushoverComponent implements OnInit { this.testerService.pushoverTest(form.value).subscribe(x => { if (x) { - this.notificationService.success("Successful", "Successfully sent a Pushbullet message, please check the discord channel"); + this.notificationService.success("Successful", "Successfully sent a Pushover message"); } else { - this.notificationService.success("Error", "There was an error when sending the Pushbullet message. Please check your settings"); + this.notificationService.success("Error", "There was an error when sending the Pushover message. Please check your settings"); } }); - } } diff --git a/src/Ombi/Controllers/LandingPageController.cs b/src/Ombi/Controllers/LandingPageController.cs index 0582a931d..e495f2cf3 100644 --- a/src/Ombi/Controllers/LandingPageController.cs +++ b/src/Ombi/Controllers/LandingPageController.cs @@ -36,58 +36,55 @@ namespace Ombi.Controllers { var model = new MediaSeverAvailibilityViewModel(); - model.ServersAvailable = 3; - model.ServersUnavailable = 1; - return model; - //var plex = await _plexSettings.GetSettingsAsync(); - //if (plex.Enable) - //{ - - // foreach (var s in plex.Servers) - // { - // try - // { - // var result = await _plexApi.GetStatus(s.PlexAuthToken, s.FullUri); - // if (!string.IsNullOrEmpty(result.MediaContainer?.version)) - // { - // model.ServersAvailable++; - // } - // else - // { - // model.ServersUnavailable++; - // } - // } - // catch (Exception) - // { - // model.ServersUnavailable++; - // } - // } - //} + var plex = await _plexSettings.GetSettingsAsync(); + if (plex.Enable) + { + + foreach (var s in plex.Servers) + { + try + { + var result = await _plexApi.GetStatus(s.PlexAuthToken, s.FullUri); + if (!string.IsNullOrEmpty(result.MediaContainer?.version)) + { + model.ServersAvailable++; + } + else + { + model.ServersUnavailable++; + } + } + catch (Exception) + { + model.ServersUnavailable++; + } + } + } - //var emby = await _embySettings.GetSettingsAsync(); - //if (emby.Enable) - //{ - // foreach (var server in emby.Servers) - // { - // try - // { - // var result = await _embyApi.GetUsers(server.FullUri, server.ApiKey); - // if (result.Any()) - // { - // model.ServersAvailable++; - // } - // else - // { - // model.ServersUnavailable++; - // } - // } - // catch (Exception) - // { - // model.ServersUnavailable++; - // } - // } - //} - //return model; + var emby = await _embySettings.GetSettingsAsync(); + if (emby.Enable) + { + foreach (var server in emby.Servers) + { + try + { + var result = await _embyApi.GetUsers(server.FullUri, server.ApiKey); + if (result.Any()) + { + model.ServersAvailable++; + } + else + { + model.ServersUnavailable++; + } + } + catch (Exception) + { + model.ServersUnavailable++; + } + } + } + return model; } } } \ No newline at end of file diff --git a/src/Ombi/Controllers/RequestController.cs b/src/Ombi/Controllers/RequestController.cs index fb9a40f6e..467df7888 100644 --- a/src/Ombi/Controllers/RequestController.cs +++ b/src/Ombi/Controllers/RequestController.cs @@ -89,6 +89,18 @@ namespace Ombi.Controllers return await MovieRequestEngine.UpdateMovieRequest(model); } + /// + /// Gets the tv requests. + /// + /// The count of items you want to return. + /// The position. + /// + [HttpGet("tv/{count:int}/{position:int}/tree")] + public async Task>>> GetTvRequestsTree(int count, int position) + { + return await TvRequestEngine.GetRequestsTreeNode(count, position); + } + /// /// Gets the tv requests. /// @@ -98,16 +110,7 @@ namespace Ombi.Controllers [HttpGet("tv/{count:int}/{position:int}")] public async Task> GetTvRequests(int count, int position) { - try - { - - return await TvRequestEngine.GetRequests(count, position); - } - catch (System.Exception e) - { - Debug.WriteLine(e.Message); - throw; - } + return await TvRequestEngine.GetRequests(count, position); } /// @@ -142,6 +145,17 @@ namespace Ombi.Controllers return await TvRequestEngine.SearchTvRequest(searchTerm); } + /// + /// Searches for a specific tv request + /// + /// The search term. + /// + [HttpGet("tv/search/{searchTerm}/tree")] + public async Task>>> SearchTvTree(string searchTerm) + { + return await TvRequestEngine.SearchTvRequestTree(searchTerm); + } + /// /// Deletes the a specific tv request /// diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj index d548f5d27..62d4725a5 100644 --- a/src/Ombi/Ombi.csproj +++ b/src/Ombi/Ombi.csproj @@ -24,12 +24,16 @@ + + + + @@ -77,11 +81,6 @@ - - - - - diff --git a/src/Ombi/Program.cs b/src/Ombi/Program.cs index 2b341630d..ad726d184 100644 --- a/src/Ombi/Program.cs +++ b/src/Ombi/Program.cs @@ -19,11 +19,13 @@ namespace Ombi int port = 0; string host = string.Empty; + string storagePath = string.Empty; Parser.Default.ParseArguments(args) .WithParsed(o => { port = o.Port; host = o.Host; + storagePath = o.StoragePath; }); UrlArgs = $"{host}:{port}"; @@ -46,7 +48,7 @@ namespace Ombi Type = ConfigurationTypes.Port, Value = "5000" }; - + ctx.ApplicationConfigurations.Add(url); ctx.ApplicationConfigurations.Add(dbPort); ctx.SaveChanges(); @@ -87,5 +89,10 @@ namespace Ombi [Option('p', "port", Required = false, HelpText = "The port, default is 5000", Default = 5000)] public int Port { get; set; } + + + [Option('s', "storage", Required = false, HelpText = "Storage path, where we save the logs and database")] + public string StoragePath { get; set; } + } } From b6011cf7a43bc3d69d181cca70c257188a3d1fd9 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Sat, 23 Sep 2017 01:39:32 +0100 Subject: [PATCH 2/7] !minor fixed build --- src/Ombi/ClientApp/app/interfaces/IRequestModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts index 9ba2f0647..70aeed4b9 100644 --- a/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/app/interfaces/IRequestModel.ts @@ -137,5 +137,5 @@ export interface IEpisodesRequests { available: boolean; requested: boolean; approved: boolean; - selected:boolean; // This is for the UI only + selected: boolean; // This is for the UI only } From 573c0b5f33ab43c1303df88c5bebc38315c9a786 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Sat, 23 Sep 2017 02:04:22 +0100 Subject: [PATCH 3/7] #865 Added donation link --- src/Ombi/ClientApp/app/app.component.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Ombi/ClientApp/app/app.component.html b/src/Ombi/ClientApp/app/app.component.html index 7f912a718..6f665bde1 100644 --- a/src/Ombi/ClientApp/app/app.component.html +++ b/src/Ombi/ClientApp/app/app.component.html @@ -27,6 +27,9 @@ +