Fixed bug introduced in last commit and revamped some old code

pull/3800/merge^2
Anatole Sot 3 months ago
parent df198f1d2e
commit 60b9fbef00

@ -5146,7 +5146,16 @@ paths:
type: array
items:
$ref: '#/components/schemas/MusicResult'
'500':
description: An error occured while getting musics
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: Unable to retrieve release groups.
/discover/trending:
get:
summary: Trending movies and TV
@ -6140,6 +6149,12 @@ paths:
type: string
enum: [added, modified, mediaAdded]
default: added
- in: query
name: type
schema:
type: string
enum: [all,movie,tv,music]
default: all
responses:
'200':
description: Returned media

@ -15,14 +15,17 @@ function getPosterFromMB(
apiKey: lidarrSettings.apiKey,
url: LidarrAPI.buildUrl(lidarrSettings, '/api/v1'),
});
const artist = (lidarr as LidarrAPI).getArtist(element.id);
return LidarrAPI.buildUrl(
lidarrSettings,
(artist.images ?? [{ coverType: 'poster', url: undefined }]).find(
(i) => i.coverType === 'poster'
)?.url
);
try {
const artist = (lidarr as LidarrAPI).getArtist(element.id);
return LidarrAPI.buildUrl(
lidarrSettings,
(artist.images ?? [{ coverType: 'poster', url: undefined }]).find(
(i) => i.coverType === 'poster'
)?.url
);
} catch (e) {
return undefined;
}
}
return `https://coverartarchive.org/${element.media_type}/${element.id}/front-250.jpg`;
}
@ -37,10 +40,14 @@ async function getFanartFromMB(element: mbArtist): Promise<string | undefined> {
apiKey: lidarrSettings.apiKey,
url: LidarrAPI.buildUrl(lidarrSettings, '/api/v1'),
});
const artist = await lidarr.getArtist(element.id);
return (
artist.images ?? [{ coverType: 'fanart', remoteUrl: undefined }]
).filter((i) => i.coverType === 'fanart')[0].remoteUrl;
try {
const artist = lidarr.getArtist(element.id);
return (
artist.images ?? [{ coverType: 'fanart', remoteUrl: undefined }]
).filter((i) => i.coverType === 'fanart')[0].remoteUrl;
} catch (e) {
return undefined;
}
}
export default getPosterFromMB;

@ -168,7 +168,7 @@ class LidarrAPI extends ServarrBase<{ musicId: number }> {
if (result) {
return result;
}
throw new Error(`[Lidarr] Artist not found (using Lidarr Id): ${id}`);
throw new Error(`Artist not found (using Lidarr Id): ${id}`);
}
const result = LidarrAPI.artists.find(
(artist) => artist.foreignArtistId === id
@ -176,9 +176,9 @@ class LidarrAPI extends ServarrBase<{ musicId: number }> {
if (result) {
return result;
}
throw new Error(`[Lidarr] Artist not found (using MusicBrainzId): ${id}`);
throw new Error(`Artist not found (using MusicBrainzId): ${id}`);
} catch (e) {
throw new Error(`[Lidarr] Failed to retrieve artist: ${e.message}`);
throw new Error(`[Lidarr] ${e.message}`);
}
};

@ -267,7 +267,7 @@ export const mapReleaseGroupResult = async (
)
),
tags: releaseGroupResult.tags,
posterPath: await getPosterFromMB(releaseGroupResult),
posterPath: getPosterFromMB(releaseGroupResult),
mediaInfo: media ?? undefined,
};
};

@ -868,25 +868,25 @@ discoverRoutes.get('/musics', async (req, res, next) => {
return res.status(200).json({
page: query.page,
results: await Promise.all(
results.map((result) =>
mapReleaseGroupResult(
results.map((result) => {
return mapReleaseGroupResult(
result,
media.find(
(med) =>
med.mbId === result.id && med.mediaType === MediaType.MUSIC
)
)
)
);
})
),
});
} catch (e) {
logger.debug('Something went wrong retrieving artists', {
logger.debug('Something went wrong retrieving release groups', {
label: 'API',
errorMessage: e.message,
});
return next({
status: 500,
message: 'Unable to retrieve artists.',
message: 'Unable to retrieve release groups.',
});
}
});

@ -64,12 +64,35 @@ mediaRoutes.get('/', async (req, res, next) => {
};
}
let typeFilter: FindOneOptions<Media>['where'] = undefined;
switch (req.query.type) {
case 'movie':
typeFilter = {
mediaType: MediaType.MOVIE,
};
break;
case 'tv':
typeFilter = {
mediaType: MediaType.TV,
};
break;
case 'music':
typeFilter = {
mediaType: MediaType.MUSIC,
};
break;
}
try {
const [media, mediaCount] = await mediaRepository.findAndCount({
order: sortFilter,
where: statusFilter && {
status: statusFilter,
},
status: statusFilter,
} &&
typeFilter && {
...typeFilter,
},
take: pageSize,
skip,
});

@ -8,6 +8,7 @@ import {
prepareFilterValues,
} from '@app/components/Discover/constants';
import FilterSlideover from '@app/components/Discover/FilterSlideover';
import RecentlyAddedSlider from '@app/components/Discover/RecentlyAddedSlider';
import useDiscover from '@app/hooks/useDiscover';
import Error from '@app/pages/_error';
import { FunnelIcon } from '@heroicons/react/24/solid';
@ -20,9 +21,9 @@ const messages = defineMessages({
discovermusics: 'Musics',
activefilters:
'{count, plural, one {# Active Filter} other {# Active Filters}}',
discovermoremusics: 'Discover More Musics',
});
const DiscoverMusics = () => {
const intl = useIntl();
const router = useRouter();
@ -43,7 +44,7 @@ const DiscoverMusics = () => {
);
const [showFilters, setShowFilters] = useState(false);
if (error) {
if (error || !titles) {
return <Error statusCode={500} />;
}
@ -73,6 +74,12 @@ const DiscoverMusics = () => {
</div>
</div>
</div>
<RecentlyAddedSlider type="music" />
<div className="slider-header">
<div className="slider-title">
<span>{intl.formatMessage(messages.discovermoremusics)}</span>
</div>
</div>
<ListView
items={titles}
isEmpty={isEmpty}

@ -11,11 +11,16 @@ const messages = defineMessages({
recentlyAddedMusic: 'Recently Added Music',
});
const RecentlyAddedSlider = () => {
const RecentlyAddedSlider = ({
type = 'all',
}: {
type?: 'all' | 'movie' | 'tv' | 'music';
}) => {
const intl = useIntl();
const { hasPermission } = useUser();
type = type ?? 'all';
const { data: media, error: mediaError } = useSWR<MediaResultsResponse>(
'/api/v1/media?filter=allavailable&take=20&sort=mediaAdded',
`/api/v1/media?filter=allavailable&take=20&sort=mediaAdded&type=${type}`,
{ revalidateOnMount: true }
);
@ -36,42 +41,50 @@ const RecentlyAddedSlider = () => {
);
return (
<>
<div className="slider-header">
<div className="slider-title">
<span>{intl.formatMessage(messages.recentlyAdded)}</span>
</div>
</div>
<Slider
sliderKey="media"
isLoading={!media}
items={videoMedias.map((item) => (
<TmdbTitleCard
key={`media-slider-item-${item.id}`}
id={item.id}
tmdbId={item.tmdbId as number}
tvdbId={item.tvdbId}
type={item.mediaType as 'movie' | 'tv'}
{videoMedias.length > 0 && (
<>
<div className="slider-header">
<div className="slider-title">
<span>{intl.formatMessage(messages.recentlyAdded)}</span>
</div>
</div>
<Slider
sliderKey="media"
isLoading={!media}
items={videoMedias.map((item) => (
<TmdbTitleCard
key={`media-slider-item-${item.id}`}
id={item.id}
tmdbId={item.tmdbId as number}
tvdbId={item.tvdbId}
type={item.mediaType as 'movie' | 'tv'}
/>
))}
/>
))}
/>
<div className="slider-header">
<div className="slider-title">
<span>{intl.formatMessage(messages.recentlyAddedMusic)}</span>
</div>
</div>
</>
)}
{musicMedias.length > 0 && (
<>
<div className="slider-header">
<div className="slider-title">
<span>{intl.formatMessage(messages.recentlyAddedMusic)}</span>
</div>
</div>
<Slider
sliderKey="media"
isLoading={!media}
items={musicMedias.map((item) => (
<MusicTitleCard
key={`media-slider-item-${item.id}`}
id={item.id}
mbId={item.mbId ?? ''}
//type={item.secondaryType as SecondaryType}
<Slider
sliderKey="media"
isLoading={!media}
items={musicMedias.map((item) => (
<MusicTitleCard
key={`media-slider-item-${item.id}`}
id={item.id}
mbId={item.mbId ?? ''}
//type={item.secondaryType as SecondaryType}
/>
))}
/>
))}
/>
</>
)}
</>
);
};

@ -37,9 +37,6 @@ const messages = defineMessages({
markavailable: 'Mark as Available',
showmore: 'Show More',
showless: 'Show Less',
streamingproviders: 'Currently Streaming On',
productioncountries:
'Production {countryCount, plural, one {Country} other {Countries}}',
digitalrelease: 'Digital Release',
physicalrelease: 'Physical Release',
reportissue: 'Report an Issue',
@ -189,9 +186,7 @@ const MusicDetails = ({
{data.mediaType === SecondaryType.ARTIST && (
<CachedImage
alt=""
src={`https://image.tmdb.org/t/p/w1920_and_h800_multi_faces/${
(data as ArtistResult).fanartPath
}`}
src={(data as ArtistResult).fanartPath ?? ''}
layout="fill"
objectFit="cover"
priority
@ -226,7 +221,7 @@ const MusicDetails = ({
alt=""
layout="responsive"
width={600}
height={900}
height={600}
priority
/>
</div>

Loading…
Cancel
Save