From 505929737c253c1bc5859400a9441d9442f42cfd Mon Sep 17 00:00:00 2001 From: Jamie Date: Sat, 18 Aug 2018 22:18:41 +0100 Subject: [PATCH] Added the ability to invite Plex Friends from the user management screen. --- src/Ombi.Api.Plex/IPlexApi.cs | 1 + .../Models/PlexLibrariesForMachineId.cs | 66 +++++++++++++++++++ src/Ombi.Api.Plex/PlexApi.cs | 7 ++ src/Ombi/ClientApp/app/interfaces/IPlex.ts | 13 ++++ .../app/services/applications/plex.service.ts | 6 +- .../usermanagement/addplexuser.component.html | 19 ++++-- .../usermanagement/addplexuser.component.ts | 8 +-- .../usermanagement.component.html | 9 +-- src/Ombi/ClientApp/styles/base.scss | 16 ++++- .../Controllers/External/PlexController.cs | 10 +-- .../Models/External/PlexLibrariesResponse.cs | 8 +++ 11 files changed, 138 insertions(+), 25 deletions(-) create mode 100644 src/Ombi.Api.Plex/Models/PlexLibrariesForMachineId.cs diff --git a/src/Ombi.Api.Plex/IPlexApi.cs b/src/Ombi.Api.Plex/IPlexApi.cs index 9cf188981..82db74278 100644 --- a/src/Ombi.Api.Plex/IPlexApi.cs +++ b/src/Ombi.Api.Plex/IPlexApi.cs @@ -11,6 +11,7 @@ namespace Ombi.Api.Plex public interface IPlexApi { Task GetStatus(string authToken, string uri); + Task GetLibrariesForMachineId(string authToken, string machineId); Task SignIn(UserRequest user); Task GetServer(string authToken); Task GetLibrarySections(string authToken, string plexFullHost); diff --git a/src/Ombi.Api.Plex/Models/PlexLibrariesForMachineId.cs b/src/Ombi.Api.Plex/Models/PlexLibrariesForMachineId.cs new file mode 100644 index 000000000..17ac59b81 --- /dev/null +++ b/src/Ombi.Api.Plex/Models/PlexLibrariesForMachineId.cs @@ -0,0 +1,66 @@ +namespace Ombi.Api.Plex.Models +{ + + using System; + using System.Xml.Serialization; + using System.Collections.Generic; + + [XmlRoot(ElementName = "Section")] + public class SectionLite + { + [XmlAttribute(AttributeName = "id")] + public string Id { get; set; } + [XmlAttribute(AttributeName = "key")] + public string Key { get; set; } + [XmlAttribute(AttributeName = "type")] + public string Type { get; set; } + [XmlAttribute(AttributeName = "title")] + public string Title { get; set; } + } + + [XmlRoot(ElementName = "Server")] + public class ServerLib + { + [XmlElement(ElementName = "Section")] + public List Section { get; set; } + [XmlAttribute(AttributeName = "name")] + public string Name { get; set; } + [XmlAttribute(AttributeName = "address")] + public string Address { get; set; } + [XmlAttribute(AttributeName = "port")] + public string Port { get; set; } + [XmlAttribute(AttributeName = "version")] + public string Version { get; set; } + [XmlAttribute(AttributeName = "scheme")] + public string Scheme { get; set; } + [XmlAttribute(AttributeName = "host")] + public string Host { get; set; } + [XmlAttribute(AttributeName = "localAddresses")] + public string LocalAddresses { get; set; } + [XmlAttribute(AttributeName = "machineIdentifier")] + public string MachineIdentifier { get; set; } + [XmlAttribute(AttributeName = "createdAt")] + public string CreatedAt { get; set; } + [XmlAttribute(AttributeName = "updatedAt")] + public string UpdatedAt { get; set; } + [XmlAttribute(AttributeName = "owned")] + public string Owned { get; set; } + [XmlAttribute(AttributeName = "synced")] + public string Synced { get; set; } + } + + [XmlRoot(ElementName = "MediaContainer")] + public class PlexLibrariesForMachineId + { + [XmlElement(ElementName = "Server")] + public ServerLib Server { get; set; } + [XmlAttribute(AttributeName = "friendlyName")] + public string FriendlyName { get; set; } + [XmlAttribute(AttributeName = "identifier")] + public string Identifier { get; set; } + [XmlAttribute(AttributeName = "machineIdentifier")] + public string MachineIdentifier { get; set; } + [XmlAttribute(AttributeName = "size")] + public string Size { get; set; } + } +} \ No newline at end of file diff --git a/src/Ombi.Api.Plex/PlexApi.cs b/src/Ombi.Api.Plex/PlexApi.cs index 556d23b24..bed75b4d8 100644 --- a/src/Ombi.Api.Plex/PlexApi.cs +++ b/src/Ombi.Api.Plex/PlexApi.cs @@ -127,6 +127,13 @@ namespace Ombi.Api.Plex return await Api.Request(request); } + public async Task GetLibrariesForMachineId(string authToken, string machineId) + { + var request = new Request("", $"https://plex.tv/api/servers/{machineId}", HttpMethod.Get, ContentType.Xml); + await AddHeaders(request, authToken); + return await Api.Request(request); + } + /// // 192.168.1.69:32400/library/metadata/3662/allLeaves // The metadata ratingkey should be in the Cache diff --git a/src/Ombi/ClientApp/app/interfaces/IPlex.ts b/src/Ombi/ClientApp/app/interfaces/IPlex.ts index 6e9a6b35a..de3fc8cf1 100644 --- a/src/Ombi/ClientApp/app/interfaces/IPlex.ts +++ b/src/Ombi/ClientApp/app/interfaces/IPlex.ts @@ -34,6 +34,19 @@ export interface IPlexLibResponse { data: IPlexLibraries; } +export interface IPlexLibSimpleResponse { + successful: boolean; + message: string; + data: IPlexSection[]; +} + +export interface IPlexSection { + id: string; + key: string; + type: string; + title: string; +} + export interface IMediaContainer { directory: IDirectory[]; } diff --git a/src/Ombi/ClientApp/app/services/applications/plex.service.ts b/src/Ombi/ClientApp/app/services/applications/plex.service.ts index 4a616ba33..9f53d0e34 100644 --- a/src/Ombi/ClientApp/app/services/applications/plex.service.ts +++ b/src/Ombi/ClientApp/app/services/applications/plex.service.ts @@ -6,7 +6,7 @@ import { Observable } from "rxjs"; import { ServiceHelpers } from "../service.helpers"; -import { IPlexAuthentication, IPlexLibResponse, IPlexOAuthViewModel, IPlexServer, IPlexServerAddViewModel, IPlexServerViewModel, IPlexUserAddResponse, IPlexUserViewModel, IUsersModel } from "../../interfaces"; +import { IPlexAuthentication, IPlexLibResponse, IPlexLibSimpleResponse, IPlexOAuthViewModel, IPlexServer, IPlexServerAddViewModel, IPlexServerViewModel, IPlexUserAddResponse, IPlexUserViewModel, IUsersModel } from "../../interfaces"; @Injectable() export class PlexService extends ServiceHelpers { @@ -30,8 +30,8 @@ export class PlexService extends ServiceHelpers { return this.http.post(`${this.url}Libraries`, JSON.stringify(plexSettings), {headers: this.headers}); } - public getLibrariesFromSettings(machineId: string): Observable { - return this.http.get(`${this.url}Libraries/${machineId}`, {headers: this.headers}); + public getLibrariesFromSettings(machineId: string): Observable { + return this.http.get(`${this.url}Libraries/${machineId}`, {headers: this.headers}); } public addUserToServer(user: IPlexUserViewModel): Observable { diff --git a/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.html b/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.html index d21509043..5f56ee710 100644 --- a/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.html @@ -3,6 +3,9 @@ \ No newline at end of file diff --git a/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.ts b/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.ts index c45dfc0e9..1c77a0181 100644 --- a/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.ts +++ b/src/Ombi/ClientApp/app/usermanagement/addplexuser.component.ts @@ -4,7 +4,7 @@ import { NgbActiveModal } from "@ng-bootstrap/ng-bootstrap"; import { NotificationService, PlexService } from "../services"; -import { IPlexLibraries, IPlexServersAdd } from "../interfaces"; +import { IPlexSection, IPlexServersAdd } from "../interfaces"; @Component({ selector: "ngbd-modal-content", @@ -15,7 +15,7 @@ export class AddPlexUserComponent implements OnInit { @Input() public name: string; public plexServers: IPlexServersAdd[]; - public plexLibs: IPlexLibraries; + public plexLibs: IPlexSection[]; public libsSelected: number[] = []; @@ -65,12 +65,11 @@ export class AddPlexUserComponent implements OnInit { } public onSubmit(form: FormGroup) { - debugger; if (form.invalid) { this.notificationService.error("Please check your entered values"); return; } - const libs = form.value.allLibsSelected ? this.plexLibs.mediaContainer.directory.map(x => +x.key) : this.libsSelected; + const libs = form.value.allLibsSelected ? [] : this.libsSelected; this.plexService.addUserToServer({ username: form.value.username, machineIdentifier: form.value.selectedServer, libsSelected: libs }).subscribe(x => { if (x.success) { @@ -78,6 +77,7 @@ export class AddPlexUserComponent implements OnInit { } else { this.notificationService.error(x.error); } + this.activeModal.close(); }); } diff --git a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html index 6d371847d..519db023f 100644 --- a/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html +++ b/src/Ombi/ClientApp/app/usermanagement/usermanagement.component.html @@ -1,12 +1,13 @@ 

User Management

-
- -
-
+ + +
+ +
diff --git a/src/Ombi/ClientApp/styles/base.scss b/src/Ombi/ClientApp/styles/base.scss index 9666e9077..7bd29aaaa 100644 --- a/src/Ombi/ClientApp/styles/base.scss +++ b/src/Ombi/ClientApp/styles/base.scss @@ -977,7 +977,17 @@ a > h4:hover { top: 7%; } -.modal-header { - background-color: #282828; - padding-top:75px; +.modal.fade .modal-dialog { + -webkit-transform: translate(0, 0%); + -ms-transform: translate(0, 0%); + -o-transform: translate(0, 0%); + transform: translate(0, 0%); + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; +} + +.modal-footer .btn+.btn { + margin-left: 5px; + margin-bottom: 10px; } \ No newline at end of file diff --git a/src/Ombi/Controllers/External/PlexController.cs b/src/Ombi/Controllers/External/PlexController.cs index 8a627b710..d7cefd091 100644 --- a/src/Ombi/Controllers/External/PlexController.cs +++ b/src/Ombi/Controllers/External/PlexController.cs @@ -130,18 +130,18 @@ namespace Ombi.Controllers.External [HttpGet("Libraries/{machineId}")] [PowerUser] - public async Task GetPlexLibraries(string machineId) + public async Task GetPlexLibraries(string machineId) { try { var s = await PlexSettings.GetSettingsAsync(); var settings = s.Servers.FirstOrDefault(x => x.MachineIdentifier == machineId); - var libs = await PlexApi.GetLibrarySections(settings.PlexAuthToken, settings.FullUri); + var libs = await PlexApi.GetLibrariesForMachineId(settings.PlexAuthToken, machineId); - return new PlexLibrariesResponse + return new PlexLibrariesLiteResponse { Successful = true, - Data = libs + Data = libs.Server.Section }; } catch (Exception e) @@ -149,7 +149,7 @@ namespace Ombi.Controllers.External _log.LogWarning(e, "Error thrown when attempting to obtain the plex libs"); var message = e.InnerException != null ? $"{e.Message} - {e.InnerException.Message}" : e.Message; - return new PlexLibrariesResponse + return new PlexLibrariesLiteResponse { Successful = false, Message = message diff --git a/src/Ombi/Models/External/PlexLibrariesResponse.cs b/src/Ombi/Models/External/PlexLibrariesResponse.cs index d1033f12e..e5aaa5a3c 100644 --- a/src/Ombi/Models/External/PlexLibrariesResponse.cs +++ b/src/Ombi/Models/External/PlexLibrariesResponse.cs @@ -25,6 +25,7 @@ // ************************************************************************/ #endregion +using System.Collections.Generic; using Ombi.Api.Plex.Models; namespace Ombi.Models.External @@ -35,4 +36,11 @@ namespace Ombi.Models.External public bool Successful { get; set; } public string Message { get; set; } } + + public class PlexLibrariesLiteResponse + { + public List Data { get; set; } + public bool Successful { get; set; } + public string Message { get; set; } + } } \ No newline at end of file