From 099e8a029bc35d02bbda95f1a3cd57fa93cfc614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Nyi=CC=81ri?= Date: Thu, 12 Aug 2021 12:33:20 +0200 Subject: [PATCH] Add #28: Collections into UI editor --- dist/plex-meets-homeassistant.js | 39 +++++++++++++++++++++++++++++++- src/editor.ts | 15 +++++++++++- src/modules/Plex.ts | 29 ++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/dist/plex-meets-homeassistant.js b/dist/plex-meets-homeassistant.js index bb19c0e..24d9d58 100644 --- a/dist/plex-meets-homeassistant.js +++ b/dist/plex-meets-homeassistant.js @@ -18674,6 +18674,7 @@ class Plex { this.clients = []; this.requestTimeout = 10000; this.sections = []; + this.collections = false; this.init = async () => { await Promise.all([this.getSections(), this.getClients(), this.getServerID()]); }; @@ -18713,6 +18714,31 @@ class Plex { } return this.sections; }; + this.getCollections = async () => { + if (!lodash.isArray(this.collections)) { + const sections = await this.getSections(); + const collectionRequests = []; + lodash.forEach(sections, section => { + collectionRequests.push(this.getCollection(section.key)); + }); + const allResults = await Promise.all(collectionRequests); + const collections = []; + lodash.forEach(allResults, result => { + lodash.forEach(result, collection => { + collections.push(collection); + }); + }); + this.collections = collections; + } + return this.collections; + }; + this.getCollection = async (sectionID) => { + const url = this.authorizeURL(`${this.getBasicURL()}/library/sections/${sectionID}/collections`); + const collectionsData = await axios.get(url, { + timeout: this.requestTimeout + }); + return lodash.isNil(collectionsData.data.MediaContainer.Metadata) ? [] : collectionsData.data.MediaContainer.Metadata; + }; this.getSectionData = async (sectionID) => { return this.exportSectionsData([await this.getSectionDataWithoutProcessing(sectionID)]); }; @@ -19505,6 +19531,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.entities = []; this.scriptEntities = []; this.sections = []; + this.collections = []; this.clients = {}; this.entitiesRegistry = false; this.plexValidSection = document.createElement('div'); @@ -19590,9 +19617,12 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { } }; this.render = async () => { - const addDropdownItem = (text) => { + const addDropdownItem = (text, disabled = false) => { const libraryItem = document.createElement('paper-item'); libraryItem.innerHTML = text; + if (disabled) { + libraryItem.disabled = true; + } return libraryItem; }; const createEntitiesDropdown = (selected, changeHandler) => { @@ -19692,6 +19722,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.content.appendChild(this.token); this.libraryName.innerHTML = ''; const libraryItems = document.createElement('paper-listbox'); + libraryItems.appendChild(addDropdownItem('Smart Libraries', true)); libraryItems.appendChild(addDropdownItem('Continue Watching')); libraryItems.appendChild(addDropdownItem('Deck')); libraryItems.appendChild(addDropdownItem('Recently Added')); @@ -19706,6 +19737,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.appendChild(this.content); this.plex = new Plex(this.config.ip, this.plexPort, this.config.token, this.plexProtocol, this.config.sort); this.sections = await this.plex.getSections(); + this.collections = await this.plex.getCollections(); this.clients = await this.plex.getClients(); this.plexValidSection.style.display = 'none'; this.plexValidSection.innerHTML = ''; @@ -19905,9 +19937,14 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.runAfter.value = this.config.runAfter; this.plexValidSection.appendChild(this.runAfter); if (!lodash.isEmpty(this.sections)) { + libraryItems.appendChild(addDropdownItem('Libraries', true)); lodash.forEach(this.sections, (section) => { libraryItems.appendChild(addDropdownItem(section.title)); }); + libraryItems.appendChild(addDropdownItem('Collections', true)); + lodash.forEach(this.collections, (collection) => { + libraryItems.appendChild(addDropdownItem(collection.title)); + }); this.libraryName.disabled = false; this.libraryName.value = this.config.libraryName; let libraryType = ''; diff --git a/src/editor.ts b/src/editor.ts index 8646a00..2a786bf 100644 --- a/src/editor.ts +++ b/src/editor.ts @@ -56,6 +56,8 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { sections: Array> = []; + collections: Array> = []; + clients: Record = {}; entitiesRegistry: false | Array> = false; @@ -148,9 +150,12 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { }; render = async (): Promise => { - const addDropdownItem = (text: string): HTMLElement => { + const addDropdownItem = (text: string, disabled = false): HTMLElement => { const libraryItem: any = document.createElement('paper-item'); libraryItem.innerHTML = text; + if (disabled) { + libraryItem.disabled = true; + } return libraryItem; }; const createEntitiesDropdown = (selected: string, changeHandler: Function): HTMLElement | false => { @@ -259,6 +264,8 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.libraryName.innerHTML = ''; const libraryItems: any = document.createElement('paper-listbox'); + + libraryItems.appendChild(addDropdownItem('Smart Libraries', true)); libraryItems.appendChild(addDropdownItem('Continue Watching')); libraryItems.appendChild(addDropdownItem('Deck')); libraryItems.appendChild(addDropdownItem('Recently Added')); @@ -275,6 +282,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.plex = new Plex(this.config.ip, this.plexPort, this.config.token, this.plexProtocol, this.config.sort); this.sections = await this.plex.getSections(); + this.collections = await this.plex.getCollections(); this.clients = await this.plex.getClients(); this.plexValidSection.style.display = 'none'; @@ -482,9 +490,14 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement { this.plexValidSection.appendChild(this.runAfter); if (!_.isEmpty(this.sections)) { + libraryItems.appendChild(addDropdownItem('Libraries', true)); _.forEach(this.sections, (section: Record) => { libraryItems.appendChild(addDropdownItem(section.title)); }); + libraryItems.appendChild(addDropdownItem('Collections', true)); + _.forEach(this.collections, (collection: Record) => { + libraryItems.appendChild(addDropdownItem(collection.title)); + }); this.libraryName.disabled = false; this.libraryName.value = this.config.libraryName; diff --git a/src/modules/Plex.ts b/src/modules/Plex.ts index b506062..c504a10 100644 --- a/src/modules/Plex.ts +++ b/src/modules/Plex.ts @@ -21,6 +21,8 @@ class Plex { sections: Array> = []; + collections: Array> | false = false; + constructor( ip: string, port: number | false = false, @@ -80,6 +82,33 @@ class Plex { return this.sections; }; + getCollections = async (): Promise>> => { + if (!_.isArray(this.collections)) { + const sections = await this.getSections(); + const collectionRequests: Array> = []; + _.forEach(sections, section => { + collectionRequests.push(this.getCollection(section.key)); + }); + const allResults = await Promise.all(collectionRequests); + const collections: Array> = []; + _.forEach(allResults, result => { + _.forEach(result, collection => { + collections.push(collection); + }); + }); + this.collections = collections; + } + return this.collections; + }; + + getCollection = async (sectionID: number): Promise>> => { + const url = this.authorizeURL(`${this.getBasicURL()}/library/sections/${sectionID}/collections`); + const collectionsData = await axios.get(url, { + timeout: this.requestTimeout + }); + return _.isNil(collectionsData.data.MediaContainer.Metadata) ? [] : collectionsData.data.MediaContainer.Metadata; + }; + getSectionData = async (sectionID: number): Promise => { return this.exportSectionsData([await this.getSectionDataWithoutProcessing(sectionID)]); };