mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
move function to get backdrop image to api-client utils
This commit is contained in:
parent
5df5f6cdb2
commit
8ec943bc30
4 changed files with 57 additions and 58 deletions
|
@ -14,7 +14,7 @@ import alert from '../alert';
|
||||||
import { PluginType } from '../../types/plugin.ts';
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import { includesAny } from '../../utils/container.ts';
|
import { includesAny } from '../../utils/container.ts';
|
||||||
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
import { getItems } from '../../utils/jellyfin-apiclient/getItems.ts';
|
||||||
import { getItemBackdropImageUrl } from '../../utils/url';
|
import { getItemBackdropImageUrl } from '../../utils/jellyfin-apiclient/BackdropImage';
|
||||||
|
|
||||||
const UNLIMITED_ITEMS = -1;
|
const UNLIMITED_ITEMS = -1;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ import Dashboard from '../../utils/dashboard';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
import confirm from '../../components/confirm/confirm';
|
import confirm from '../../components/confirm/confirm';
|
||||||
import { download } from '../../scripts/fileDownloader';
|
import { download } from '../../scripts/fileDownloader';
|
||||||
import { getItemBackdropImageUrl } from '../../utils/url';
|
import { getItemBackdropImageUrl } from '../../utils/jellyfin-apiclient/BackdropImage';
|
||||||
|
|
||||||
function autoFocus(container) {
|
function autoFocus(container) {
|
||||||
import('../../components/autoFocuser').then(({ default: autoFocuser }) => {
|
import('../../components/autoFocuser').then(({ default: autoFocuser }) => {
|
||||||
|
|
55
src/utils/jellyfin-apiclient/BackdropImage.ts
Normal file
55
src/utils/jellyfin-apiclient/BackdropImage.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
|
||||||
|
import { randomInt } from '../number';
|
||||||
|
import { ApiClient } from 'jellyfin-apiclient';
|
||||||
|
|
||||||
|
export interface ScaleImageOptions {
|
||||||
|
maxWidth?: number;
|
||||||
|
width?: number;
|
||||||
|
maxHeight?: number;
|
||||||
|
height?: number;
|
||||||
|
fillWidth?: number;
|
||||||
|
fillHeight?: number;
|
||||||
|
quality?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the url of the first or a random backdrop image of an item.
|
||||||
|
* If the item has no backdrop image, the url of the first or a random backdrop image of the parent item is returned.
|
||||||
|
* Falls back to the primary image (cover) of the item, if neither the item nor it's parent have at least one backdrop image.
|
||||||
|
* Returns undefined if no usable image was found.
|
||||||
|
* @param apiClient The ApiClient to generate the url.
|
||||||
|
* @param item The item for which the backdrop image is requested.
|
||||||
|
* @param random If set to true and the item has more than one backdrop, a random image is returned.
|
||||||
|
* @param options Optional; allows to scale the backdrop image.
|
||||||
|
* @returns The url of the first or a random backdrop image of the provided item.
|
||||||
|
*/
|
||||||
|
export const getItemBackdropImageUrl = (apiClient: ApiClient, item: BaseItemDto, random = false, options: ScaleImageOptions = {}): string | undefined => {
|
||||||
|
let imgUrl;
|
||||||
|
|
||||||
|
if (item.BackdropImageTags?.length) {
|
||||||
|
const backdropImgIndex = random ? randomInt(0, item.BackdropImageTags.length - 1) : 0;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||||
|
imgUrl = apiClient.getScaledImageUrl(item.Id!, {
|
||||||
|
type: 'Backdrop',
|
||||||
|
index: backdropImgIndex,
|
||||||
|
tag: item.BackdropImageTags[backdropImgIndex],
|
||||||
|
...options
|
||||||
|
});
|
||||||
|
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags?.length) {
|
||||||
|
const backdropImgIndex = random ? randomInt(0, item.ParentBackdropImageTags.length - 1) : 0;
|
||||||
|
imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, {
|
||||||
|
type: 'Backdrop',
|
||||||
|
index: backdropImgIndex,
|
||||||
|
tag: item.ParentBackdropImageTags[backdropImgIndex],
|
||||||
|
...options
|
||||||
|
});
|
||||||
|
} else if (item.ImageTags?.Primary) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||||
|
imgUrl = apiClient.getScaledImageUrl(item.Id!, {
|
||||||
|
type: 'Primary',
|
||||||
|
tag: item.ImageTags.Primary,
|
||||||
|
...options
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return imgUrl;
|
||||||
|
};
|
|
@ -1,7 +1,3 @@
|
||||||
import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
|
|
||||||
import { randomInt } from './number';
|
|
||||||
import { ApiClient } from 'jellyfin-apiclient';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the url search string.
|
* Gets the url search string.
|
||||||
* This function should be used instead of location.search alone, because the app router
|
* This function should be used instead of location.search alone, because the app router
|
||||||
|
@ -37,55 +33,3 @@ export const getParameterByName = (name: string, url?: string | null | undefined
|
||||||
// eslint-disable-next-line compat/compat
|
// eslint-disable-next-line compat/compat
|
||||||
return new URLSearchParams(url).get(name) || '';
|
return new URLSearchParams(url).get(name) || '';
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface ScaleImageOptions {
|
|
||||||
maxWidth?: number;
|
|
||||||
width?: number;
|
|
||||||
maxHeight?: number;
|
|
||||||
height?: number;
|
|
||||||
fillWidth?: number;
|
|
||||||
fillHeight?: number;
|
|
||||||
quality?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the url of the first or a random backdrop image of an item.
|
|
||||||
* If the item has no backdrop image, the url of the first or a random backdrop image of the parent item is returned.
|
|
||||||
* Falls back to the primary image (cover) of the item, if neither the item nor it's parent have at least one backdrop image.
|
|
||||||
* Returns undefined if no usable image was found.
|
|
||||||
* @param apiClient The ApiClient to generate the url.
|
|
||||||
* @param item The item for which the backdrop image is requested.
|
|
||||||
* @param random If set to true and the item has more than one backdrop, a random image is returned.
|
|
||||||
* @param options Optional; allows to scale the backdrop image.
|
|
||||||
* @returns The url of the first or a random backdrop image of the provided item.
|
|
||||||
*/
|
|
||||||
export const getItemBackdropImageUrl = (apiClient: ApiClient, item: BaseItemDto, random = false, options: ScaleImageOptions = {}): string | undefined => {
|
|
||||||
let imgUrl;
|
|
||||||
|
|
||||||
if (item.BackdropImageTags?.length) {
|
|
||||||
const backdropImgIndex = random ? randomInt(0, item.BackdropImageTags.length - 1) : 0;
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.Id!, {
|
|
||||||
type: 'Backdrop',
|
|
||||||
index: backdropImgIndex,
|
|
||||||
tag: item.BackdropImageTags[backdropImgIndex],
|
|
||||||
...options
|
|
||||||
});
|
|
||||||
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags?.length) {
|
|
||||||
const backdropImgIndex = random ? randomInt(0, item.ParentBackdropImageTags.length - 1) : 0;
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, {
|
|
||||||
type: 'Backdrop',
|
|
||||||
index: backdropImgIndex,
|
|
||||||
tag: item.ParentBackdropImageTags[backdropImgIndex],
|
|
||||||
...options
|
|
||||||
});
|
|
||||||
} else if (item.ImageTags?.Primary) {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.Id!, {
|
|
||||||
type: 'Primary',
|
|
||||||
tag: item.ImageTags.Primary,
|
|
||||||
...options
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return imgUrl;
|
|
||||||
};
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue