Merge pull request #52 from JurajNyiri/3.3.1

3.3.1
sonos 3.3.1
Juraj Nyíri 3 years ago committed by GitHub
commit a25f03029c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -18863,11 +18863,21 @@ class Plex {
};
this.getSectionDataWithoutProcessing = async (sectionID, type = false) => {
const bulkItems = 50;
let url = this.authorizeURL(`${this.getBasicURL()}/library/sections/${sectionID}/all`);
url += `&sort=${this.sort}`;
let url = `${this.getBasicURL()}/library/sections/${sectionID}`;
if (type) {
url += `&type=${type}`;
if (lodash.isEqual(type, 'folder')) {
url += `/folder`;
}
else {
url += `/all`;
url += `?type=${type}`;
}
}
else {
url += `/all`;
}
url = this.authorizeURL(url);
url += `&sort=${this.sort}`;
url += `&includeCollections=1&includeExternalMedia=1&includeAdvanced=1&includeMeta=1`;
let result = {};
try {
@ -19091,8 +19101,8 @@ class Plex {
timeout: this.requestTimeout
})).data.MediaContainer.Metadata[0];
};
this.getLibraryData = async (id) => {
const url = this.authorizeURL(`${this.getBasicURL()}/library/metadata/${id}/children`);
this.getLibraryData = async (path) => {
const url = this.authorizeURL(`${this.getBasicURL()}${path}`);
return (await axios.get(url, {
timeout: this.requestTimeout
})).data.MediaContainer.Metadata;
@ -19293,7 +19303,12 @@ const createTrackView = (playController, plex, data, fontSize1, fontSize2, isEve
trackContainer.append(trackIndexElem);
const trackTitleElem = document.createElement('td');
trackTitleElem.className = 'trackTitleElem';
trackTitleElem.innerHTML = escapeHtml(data.title);
if (!lodash.isEmpty(data.title)) {
trackTitleElem.innerHTML = escapeHtml(data.title);
}
else if (!lodash.isEmpty(data.titleSort)) {
trackTitleElem.innerHTML = escapeHtml(data.titleSort);
}
trackTitleElem.style.fontSize = `${fontSize1}px`;
trackTitleElem.style.lineHeight = `${fontSize1}px`;
trackTitleElem.style.marginBottom = `${margin1}px`;
@ -19811,6 +19826,10 @@ class PlayController {
this.playButtons.push(playButton);
return playButton;
};
this.setPlayActionDisplay = (displayValue) => {
const playActionButton = this.updateDetailPlayAction();
playActionButton.style.display = displayValue;
};
this.setPlayActionButtonType = (mediaType) => {
const playActionButton = this.updateDetailPlayAction();
playActionButton.setAttribute('data-mediaType', mediaType);
@ -20833,8 +20852,14 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement {
typeItems.appendChild(addDropdownItem('', ''));
let typeAvailable = false;
lodash.forEach(types, (sectionType) => {
if (sectionType.type !== 'folder' && sectionType.type !== 'track' && sectionType.type !== 'episode') {
const key = sectionType.key.split('type=')[1];
if (sectionType.type !== 'track' &&
sectionType.type !== 'episode' &&
(sectionType.type !== 'folder' ||
(sectionType.type === 'folder' && lodash.isEqual(lodash.get(libraryData, '[0].viewGroup'), 'artist')))) {
let key = sectionType.key.split('type=')[1];
if (sectionType.type === 'folder') {
key = 'folder';
}
if (lodash.isEqual(key, this.config.displayType)) {
typeAvailable = true;
}
@ -20872,7 +20897,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement {
});
}
const sortFields = lodash.get(libraryData, `[0].Meta.Type[${displayTypeIndex}].Sort`);
if (!lodash.isNil(sortFields) && sortFields.length > 0) {
if (!lodash.isNil(sortFields) && sortFields.length > 0 && this.config.displayType !== 'folder') {
lodash.forEach(sortFields, (sortField) => {
sortItems.appendChild(addDropdownItem(sortField.key));
});
@ -21885,6 +21910,26 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.calculatePositions();
}
};
this.resizeHandler = () => {
if (this.isVisible) {
if (!this.detailsShown) {
const videoPlayer = this.getElementsByClassName('videoPlayer')[0];
let isFullScreen = false;
if (videoPlayer.children.length > 0) {
isFullScreen = isVideoFullScreen(this);
}
if (this.card && this.movieElems.length > 0 && !isFullScreen) {
if (this.previousPageWidth !== this.card.offsetWidth) {
this.previousPageWidth = this.card.offsetWidth;
this.renderPage();
const contentbg = this.getElementsByClassName('contentbg');
this.contentBGHeight = getHeight(contentbg[0]);
}
}
}
this.renderNewElementsIfNeeded();
}
};
this.loadInitialData = async () => {
this.initialDataLoaded = true;
setInterval(() => {
@ -21939,24 +21984,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.renderNewElementsIfNeeded();
});
window.addEventListener('resize', () => {
if (this.isVisible) {
if (!this.detailsShown) {
const videoPlayer = this.getElementsByClassName('videoPlayer')[0];
let isFullScreen = false;
if (videoPlayer.children.length > 0) {
isFullScreen = isVideoFullScreen(this);
}
if (this.card && this.movieElems.length > 0 && !isFullScreen) {
if (this.previousPageWidth !== this.card.offsetWidth) {
this.previousPageWidth = this.card.offsetWidth;
this.renderPage();
const contentbg = this.getElementsByClassName('contentbg');
this.contentBGHeight = getHeight(contentbg[0]);
}
}
}
this.renderNewElementsIfNeeded();
}
this.resizeHandler();
});
if (this.card) {
this.previousPageWidth = this.card.offsetWidth;
@ -22599,15 +22627,9 @@ class PlexMeetsHomeAssistant extends HTMLElement {
break;
}
else {
this.resizeHandler();
clearInterval(setLeftOffsetsInterval);
}
/*
this.movieElems[i].style.left = `${this.movieElems[i].offsetLeft}px`;
this.movieElems[i].dataset.left = this.movieElems[i].offsetLeft;
this.movieElems[i].style.top = `${this.movieElems[i].offsetTop}px`;
this.movieElems[i].dataset.top = this.movieElems[i].offsetTop;
this.movieElems[i].style.position = 'absolute';
*/
}
}, 100);
};
@ -22801,7 +22823,12 @@ class PlexMeetsHomeAssistant extends HTMLElement {
}
this.detailElem.style.transition = '0s';
this.detailElem.style.top = `${top - 1000}px`;
this.detailElem.style.left = `${this.minExpandedWidth + 30}px`;
if (!lodash.isEmpty(lodash.get(data, 'thumb'))) {
this.detailElem.style.left = `${this.minExpandedWidth + 30}px`;
}
else {
this.detailElem.style.left = `16px`;
}
clearInterval(this.showDetailsTimeout);
// eslint-disable-next-line @typescript-eslint/no-misused-promises
this.showDetailsTimeout = setTimeout(async () => {
@ -22947,14 +22974,27 @@ class PlexMeetsHomeAssistant extends HTMLElement {
if (this.plex) {
let childrenData = {};
if (lodash.isEqual(data.type, 'episode')) {
childrenData = await this.plex.getLibraryData(data.grandparentKey.split('/')[3]);
childrenData = await this.plex.getLibraryData(`${data.grandparentKey}/children`);
}
else if (data.childCount > 0 || lodash.isEqual(data.type, 'artist') || lodash.isEqual(data.type, 'album')) {
childrenData = await this.plex.getLibraryData(data.key.split('/')[3]);
else if (data.childCount > 0 ||
lodash.isEqual(data.type, 'artist') ||
lodash.isEqual(data.type, 'album') ||
lodash.includes(data.key, 'folder')) {
childrenData = await this.plex.getLibraryData(data.key);
}
if (this.playController) {
if (lodash.includes(data.key, 'folder')) {
this.playController.setPlayActionDisplay('none');
}
else {
this.playController.setPlayActionDisplay('block');
}
}
let dataDetails = {};
if (!lodash.isNil(data.key)) {
dataDetails = await this.plex.getDetails(data.key.split('/')[3]);
if (!lodash.includes(data.key, 'folder')) {
dataDetails = await this.plex.getDetails(data.key.split('/')[3]);
}
if (this.videoElem) {
const art = this.plex.authorizeURL(this.plex.getBasicURL() + data.art);
const trailerURL = findTrailerURL(dataDetails);
@ -23074,9 +23114,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
tableView.style.border = 'none';
tableView.cellSpacing = '0';
tableView.cellPadding = '0';
if (lodash.isEqual(data.type, 'album')) {
this.episodesElem.append(tableView);
}
this.episodesElem.append(tableView);
let isEven = false;
lodash.forEach(childrenData, childData => {
if (this.episodesElem && this.playController && this.plex) {
@ -23094,7 +23132,15 @@ class PlexMeetsHomeAssistant extends HTMLElement {
if (this.episodesElem) {
this.episodesElem.style.transition = `0.7s`;
if (this.activeMovieElem) {
this.episodesElem.style.top = `${top + getHeight(this.activeMovieElem) + 16 * 2}px`;
if (!lodash.isEmpty(lodash.get(data, 'thumb'))) {
this.episodesElem.style.top = `${top + getHeight(this.activeMovieElem) + 16 * 2}px`;
}
else if (this.detailElem) {
this.episodesElem.style.top = `${top + getHeight(this.detailElem)}px`;
}
else {
this.episodesElem.style.top = `${top}px`;
}
}
else {
this.episodesElem.style.top = `${top + this.minExpandedHeight + 16}px`;
@ -23111,7 +23157,6 @@ class PlexMeetsHomeAssistant extends HTMLElement {
else {
lodash.forEach(childrenData, childData => {
if (this.seasonsElem && this.plex) {
console.log(childData);
this.seasonsElemHidden = false;
const seasonContainer = document.createElement('div');
seasonContainer.className = 'seasonContainer';
@ -23229,7 +23274,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
(async () => {
if (this.plex && (childData.leafCount > 0 || lodash.isEqual(childData.type, 'album'))) {
this.episodesElemFreshlyLoaded = true;
const episodesData = await this.plex.getLibraryData(childData.key.split('/')[3]);
const episodesData = await this.plex.getLibraryData(childData.key);
if (this.episodesElem) {
this.episodesElemHidden = false;
this.episodesElem.style.display = 'block';
@ -23345,7 +23390,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.episodesElem.style.transition = `0s`;
this.episodesElem.style.top = `${top + 2000}px`;
if (lodash.isEqual(data.type, 'season')) {
const episodesData = await this.plex.getLibraryData(data.key.split('/')[3]);
const episodesData = await this.plex.getLibraryData(data.key);
lodash.forEach(episodesData, episodeData => {
if (this.episodesElem && this.playController && this.plex) {
this.episodesElem.append(createEpisodesView(this.playController, this.plex, episodeData, this.fontSize1, this.fontSize2));
@ -23485,8 +23530,11 @@ class PlexMeetsHomeAssistant extends HTMLElement {
movieElem.className = 'movieElem';
movieElem.style.width = `${CSS_STYLE.width}px`;
movieElem.style.height = `${CSS_STYLE.height}px`;
if (!lodash.isNil(data.channelCallSign) || lodash.isEqual(data.type, 'artist') || lodash.isEqual(data.type, 'album')) {
if (!lodash.isEqual(data.type, 'artist') && !lodash.isEqual(data.type, 'album')) {
if (!lodash.isNil(data.channelCallSign) ||
lodash.isEqual(data.type, 'artist') ||
lodash.isEqual(data.type, 'album') ||
lodash.includes(data.key, 'folder')) {
if (!lodash.isEqual(data.type, 'artist') && !lodash.isEqual(data.type, 'album') && !lodash.includes(data.key, 'folder')) {
movieElem.style.backgroundSize = '80%';
}
movieElem.style.backgroundColor = 'rgba(0,0,0,0.2)';

@ -797,8 +797,16 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement {
typeItems.appendChild(addDropdownItem('', ''));
let typeAvailable = false;
_.forEach(types, (sectionType: Record<string, any>) => {
if (sectionType.type !== 'folder' && sectionType.type !== 'track' && sectionType.type !== 'episode') {
const key = sectionType.key.split('type=')[1];
if (
sectionType.type !== 'track' &&
sectionType.type !== 'episode' &&
(sectionType.type !== 'folder' ||
(sectionType.type === 'folder' && _.isEqual(_.get(libraryData, '[0].viewGroup'), 'artist')))
) {
let key = sectionType.key.split('type=')[1];
if (sectionType.type === 'folder') {
key = 'folder';
}
if (_.isEqual(key, this.config.displayType)) {
typeAvailable = true;
}
@ -835,7 +843,7 @@ class PlexMeetsHomeAssistantEditor extends HTMLElement {
});
}
const sortFields = _.get(libraryData, `[0].Meta.Type[${displayTypeIndex}].Sort`);
if (!_.isNil(sortFields) && sortFields.length > 0) {
if (!_.isNil(sortFields) && sortFields.length > 0 && this.config.displayType !== 'folder') {
_.forEach(sortFields, (sortField: Record<string, any>) => {
sortItems.appendChild(addDropdownItem(sortField.key));
});

@ -507,6 +507,11 @@ class PlayController {
return playButton;
};
setPlayActionDisplay = (displayValue: string): void => {
const playActionButton = this.updateDetailPlayAction();
playActionButton.style.display = displayValue;
};
setPlayActionButtonType = (mediaType: string): void => {
const playActionButton = this.updateDetailPlayAction();
playActionButton.setAttribute('data-mediaType', mediaType);

@ -259,11 +259,19 @@ class Plex {
private getSectionDataWithoutProcessing = async (sectionID: string, type: string | false = false): Promise<any> => {
const bulkItems = 50;
let url = this.authorizeURL(`${this.getBasicURL()}/library/sections/${sectionID}/all`);
url += `&sort=${this.sort}`;
let url = `${this.getBasicURL()}/library/sections/${sectionID}`;
if (type) {
url += `&type=${type}`;
if (_.isEqual(type, 'folder')) {
url += `/folder`;
} else {
url += `/all`;
url += `?type=${type}`;
}
} else {
url += `/all`;
}
url = this.authorizeURL(url);
url += `&sort=${this.sort}`;
url += `&includeCollections=1&includeExternalMedia=1&includeAdvanced=1&includeMeta=1`;
let result: Record<string, any> = {};
try {
@ -543,8 +551,8 @@ class Plex {
).data.MediaContainer.Metadata[0];
};
getLibraryData = async (id: number): Promise<any> => {
const url = this.authorizeURL(`${this.getBasicURL()}/library/metadata/${id}/children`);
getLibraryData = async (path: string): Promise<any> => {
const url = this.authorizeURL(`${this.getBasicURL()}${path}`);
return (
await axios.get(url, {
timeout: this.requestTimeout

@ -232,7 +232,11 @@ const createTrackView = (
const trackTitleElem = document.createElement('td');
trackTitleElem.className = 'trackTitleElem';
trackTitleElem.innerHTML = escapeHtml(data.title);
if (!_.isEmpty(data.title)) {
trackTitleElem.innerHTML = escapeHtml(data.title);
} else if (!_.isEmpty(data.titleSort)) {
trackTitleElem.innerHTML = escapeHtml(data.titleSort);
}
trackTitleElem.style.fontSize = `${fontSize1}px`;
trackTitleElem.style.lineHeight = `${fontSize1}px`;

@ -197,6 +197,28 @@ class PlexMeetsHomeAssistant extends HTMLElement {
}
};
resizeHandler = (): void => {
if (this.isVisible) {
if (!this.detailsShown) {
const videoPlayer = this.getElementsByClassName('videoPlayer')[0] as HTMLElement;
let isFullScreen = false;
if (videoPlayer.children.length > 0) {
isFullScreen = isVideoFullScreen(this);
}
if (this.card && this.movieElems.length > 0 && !isFullScreen) {
if (this.previousPageWidth !== this.card.offsetWidth) {
this.previousPageWidth = this.card.offsetWidth;
this.renderPage();
const contentbg = this.getElementsByClassName('contentbg');
this.contentBGHeight = getHeight(contentbg[0] as HTMLElement);
}
}
}
this.renderNewElementsIfNeeded();
}
};
loadInitialData = async (): Promise<void> => {
this.initialDataLoaded = true;
setInterval(() => {
@ -252,25 +274,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.renderNewElementsIfNeeded();
});
window.addEventListener('resize', () => {
if (this.isVisible) {
if (!this.detailsShown) {
const videoPlayer = this.getElementsByClassName('videoPlayer')[0] as HTMLElement;
let isFullScreen = false;
if (videoPlayer.children.length > 0) {
isFullScreen = isVideoFullScreen(this);
}
if (this.card && this.movieElems.length > 0 && !isFullScreen) {
if (this.previousPageWidth !== this.card.offsetWidth) {
this.previousPageWidth = this.card.offsetWidth;
this.renderPage();
const contentbg = this.getElementsByClassName('contentbg');
this.contentBGHeight = getHeight(contentbg[0] as HTMLElement);
}
}
}
this.renderNewElementsIfNeeded();
}
this.resizeHandler();
});
if (this.card) {
@ -968,15 +972,9 @@ class PlexMeetsHomeAssistant extends HTMLElement {
if (this.movieElems[i].offsetLeft === 0) {
break;
} else {
this.resizeHandler();
clearInterval(setLeftOffsetsInterval);
}
/*
this.movieElems[i].style.left = `${this.movieElems[i].offsetLeft}px`;
this.movieElems[i].dataset.left = this.movieElems[i].offsetLeft;
this.movieElems[i].style.top = `${this.movieElems[i].offsetTop}px`;
this.movieElems[i].dataset.top = this.movieElems[i].offsetTop;
this.movieElems[i].style.position = 'absolute';
*/
}
}, 100);
};
@ -1185,7 +1183,12 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.detailElem.style.transition = '0s';
this.detailElem.style.top = `${top - 1000}px`;
this.detailElem.style.left = `${this.minExpandedWidth + 30}px`;
if (!_.isEmpty(_.get(data, 'thumb'))) {
this.detailElem.style.left = `${this.minExpandedWidth + 30}px`;
} else {
this.detailElem.style.left = `16px`;
}
clearInterval(this.showDetailsTimeout);
// eslint-disable-next-line @typescript-eslint/no-misused-promises
this.showDetailsTimeout = setTimeout(async () => {
@ -1339,13 +1342,28 @@ class PlexMeetsHomeAssistant extends HTMLElement {
if (this.plex) {
let childrenData: Record<string, any> = {};
if (_.isEqual(data.type, 'episode')) {
childrenData = await this.plex.getLibraryData(data.grandparentKey.split('/')[3]);
} else if (data.childCount > 0 || _.isEqual(data.type, 'artist') || _.isEqual(data.type, 'album')) {
childrenData = await this.plex.getLibraryData(data.key.split('/')[3]);
childrenData = await this.plex.getLibraryData(`${data.grandparentKey}/children`);
} else if (
data.childCount > 0 ||
_.isEqual(data.type, 'artist') ||
_.isEqual(data.type, 'album') ||
_.includes(data.key, 'folder')
) {
childrenData = await this.plex.getLibraryData(data.key);
}
if (this.playController) {
if (_.includes(data.key, 'folder')) {
this.playController.setPlayActionDisplay('none');
} else {
this.playController.setPlayActionDisplay('block');
}
}
let dataDetails: Record<string, any> = {};
if (!_.isNil(data.key)) {
dataDetails = await this.plex.getDetails(data.key.split('/')[3]);
if (!_.includes(data.key, 'folder')) {
dataDetails = await this.plex.getDetails(data.key.split('/')[3]);
}
if (this.videoElem) {
const art = this.plex.authorizeURL(this.plex.getBasicURL() + data.art);
const trailerURL = findTrailerURL(dataDetails);
@ -1474,9 +1492,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
tableView.style.border = 'none';
tableView.cellSpacing = '0';
tableView.cellPadding = '0';
if (_.isEqual(data.type, 'album')) {
this.episodesElem.append(tableView);
}
this.episodesElem.append(tableView);
let isEven = false;
_.forEach(childrenData, childData => {
if (this.episodesElem && this.playController && this.plex) {
@ -1497,7 +1513,13 @@ class PlexMeetsHomeAssistant extends HTMLElement {
if (this.episodesElem) {
this.episodesElem.style.transition = `0.7s`;
if (this.activeMovieElem) {
this.episodesElem.style.top = `${top + getHeight(this.activeMovieElem) + 16 * 2}px`;
if (!_.isEmpty(_.get(data, 'thumb'))) {
this.episodesElem.style.top = `${top + getHeight(this.activeMovieElem) + 16 * 2}px`;
} else if (this.detailElem) {
this.episodesElem.style.top = `${top + getHeight(this.detailElem)}px`;
} else {
this.episodesElem.style.top = `${top}px`;
}
} else {
this.episodesElem.style.top = `${top + this.minExpandedHeight + 16}px`;
}
@ -1513,7 +1535,6 @@ class PlexMeetsHomeAssistant extends HTMLElement {
} else {
_.forEach(childrenData, childData => {
if (this.seasonsElem && this.plex) {
console.log(childData);
this.seasonsElemHidden = false;
const seasonContainer = document.createElement('div');
seasonContainer.className = 'seasonContainer';
@ -1649,7 +1670,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
(async (): Promise<void> => {
if (this.plex && (childData.leafCount > 0 || _.isEqual(childData.type, 'album'))) {
this.episodesElemFreshlyLoaded = true;
const episodesData = await this.plex.getLibraryData(childData.key.split('/')[3]);
const episodesData = await this.plex.getLibraryData(childData.key);
if (this.episodesElem) {
this.episodesElemHidden = false;
this.episodesElem.style.display = 'block';
@ -1784,7 +1805,7 @@ class PlexMeetsHomeAssistant extends HTMLElement {
this.episodesElem.style.transition = `0s`;
this.episodesElem.style.top = `${top + 2000}px`;
if (_.isEqual(data.type, 'season')) {
const episodesData = await this.plex.getLibraryData(data.key.split('/')[3]);
const episodesData = await this.plex.getLibraryData(data.key);
_.forEach(episodesData, episodeData => {
if (this.episodesElem && this.playController && this.plex) {
this.episodesElem.append(
@ -1946,8 +1967,13 @@ class PlexMeetsHomeAssistant extends HTMLElement {
movieElem.style.width = `${CSS_STYLE.width}px`;
movieElem.style.height = `${CSS_STYLE.height}px`;
if (!_.isNil(data.channelCallSign) || _.isEqual(data.type, 'artist') || _.isEqual(data.type, 'album')) {
if (!_.isEqual(data.type, 'artist') && !_.isEqual(data.type, 'album')) {
if (
!_.isNil(data.channelCallSign) ||
_.isEqual(data.type, 'artist') ||
_.isEqual(data.type, 'album') ||
_.includes(data.key, 'folder')
) {
if (!_.isEqual(data.type, 'artist') && !_.isEqual(data.type, 'album') && !_.includes(data.key, 'folder')) {
movieElem.style.backgroundSize = '80%';
}
movieElem.style.backgroundColor = 'rgba(0,0,0,0.2)';

Loading…
Cancel
Save