Skip to content

Commit

Permalink
fix: handle favorites with special chars for topFavorites and customT…
Browse files Browse the repository at this point in the history
…humbnail (+ifMissing)
  • Loading branch information
punxaphil committed Sep 27, 2023
1 parent 78b32f0 commit 52cc78c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
5 changes: 3 additions & 2 deletions src/sections/media-browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { CardConfig, MediaPlayerItem, Section } from '../types';
import { dispatchShowSection } from '../utils/utils';
import { BROWSE_CLICKED, BROWSE_STATE, MEDIA_ITEM_SELECTED, PLAY_DIR } from '../constants';
import { MediaPlayer } from '../model/media-player';
import { indexOfWithoutSpecialChars } from '../utils/media-browser-utils';

const LOCAL_STORAGE_CURRENT_DIR = 'custom-sonos-card_currentDir';

Expand Down Expand Up @@ -141,8 +142,8 @@ export class MediaBrowser extends LitElement {
);
allFavorites = allFavorites.sort((a, b) => {
const topFavorites = this.config.topFavorites ?? [];
const aIndex = topFavorites.indexOf(a.title);
const bIndex = topFavorites.indexOf(b.title);
const aIndex = indexOfWithoutSpecialChars(topFavorites, a.title);
const bIndex = indexOfWithoutSpecialChars(topFavorites, b.title);
if (aIndex > -1 && bIndex > -1) {
return aIndex - bIndex;
} else {
Expand Down
3 changes: 2 additions & 1 deletion src/services/media-browse-service.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { MediaPlayerItem } from '../types';
import HassService from './hass-service';
import { MediaPlayer } from '../model/media-player';
import { indexOfWithoutSpecialChars } from '../utils/media-browser-utils';

function mediaBrowserFilter(ignoredTitles: string[] = [], items?: MediaPlayerItem[]) {
return items?.filter(
(item) =>
['media-source://tts', 'media-source://camera'].indexOf(item.media_content_id || '') === -1 &&
ignoredTitles.indexOf(item.title) === -1,
indexOfWithoutSpecialChars(ignoredTitles, item.title) === -1,
);
}

Expand Down
28 changes: 26 additions & 2 deletions src/utils/media-browser-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,20 @@ const DEFAULT_MEDIA_THUMBNAIL =
function hasItemsWithImage(items: MediaPlayerItem[]) {
return items.some((item) => item.thumbnail);
}

function getValueFromKeyIgnoreSpecialChars(array: { [title: string]: string } | undefined, str: string) {
for (const key in array) {
if (removeSpecialChars(key) === removeSpecialChars(str)) {
return array[key];
}
}
return undefined;
}

function getThumbnail(mediaItem: MediaPlayerItem, config: CardConfig, itemsWithImage: boolean) {
let thumbnail = config.customThumbnail?.[mediaItem.title] ?? mediaItem.thumbnail;
let thumbnail = getValueFromKeyIgnoreSpecialChars(config.customThumbnail, mediaItem.title) ?? mediaItem.thumbnail;
if (!thumbnail) {
thumbnail = config.customThumbnailIfMissing?.[mediaItem.title];
thumbnail = getValueFromKeyIgnoreSpecialChars(config.customThumbnailIfMissing, mediaItem.title);
if (itemsWithImage && !thumbnail) {
thumbnail = config.customThumbnailIfMissing?.['default'] || DEFAULT_MEDIA_THUMBNAIL;
}
Expand All @@ -20,6 +30,20 @@ function getThumbnail(mediaItem: MediaPlayerItem, config: CardConfig, itemsWithI
return thumbnail || '';
}

function removeSpecialChars(str: string) {
return str.replace(/[^a-zA-Z ]/g, '');
}

export function indexOfWithoutSpecialChars(array: string[], str: string) {
let result = -1;
array.forEach((value, index) => {
if (removeSpecialChars(value) === removeSpecialChars(str)) {
result = index;
}
});
return result;
}

export function itemsWithFallbacks(mediaPlayerItems: MediaPlayerItem[], config: CardConfig) {
const itemsWithImage = hasItemsWithImage(mediaPlayerItems);
return mediaPlayerItems.map((item) => {
Expand Down

0 comments on commit 52cc78c

Please sign in to comment.