import { getParameter } from '../../lib/secrets'; import { plexUrl } from './plex'; import { err, ok, Result } from 'neverthrow'; import { ErrorWithCode, newError, PlexErrors, } from 'web-shared/src/types/errors'; export const getArtwork = async ( path: string, ): Promise< Result<{ data: ArrayBuffer; contentType: string }, ErrorWithCode> > => { try { const plexToken = await getParameter('/web-api/plex-api-token', true); if (plexToken.isErr()) { return err(newError('PlexTokenError', 'Unable to fetch plex token')); } const response = await fetch( `${plexUrl}/${path}?X-Plex-Token=${plexToken.value}`, { method: 'GET', }, ); if (!response.ok) { return err( newError('ArtworkNotFound', 'Unable to fetch artwork'), ); } const data = await response.arrayBuffer(); const contentType = response.headers.get('Content-Type') || 'image/png'; if (!['image/png', 'image/jpg', 'image/jpeg'].includes(contentType)) { return err( newError( 'UnexpectedMimeType', `Received unexpected contentType`, { contentType }, ), ); } return ok({ data, contentType }); } catch (error) { return err( newError('ServerError', 'An unexpected error occured', { error, }), ); } };