diff --git a/overseerr-api.yml b/overseerr-api.yml index c5ffea343..b75ca5867 100644 --- a/overseerr-api.yml +++ b/overseerr-api.yml @@ -6101,7 +6101,7 @@ paths: /music/artist/{artistId}: get: summary: Get artist details - description: Returns full artist details in a JSON object. + description: Returns artist details in a JSON object. tags: - music parameters: @@ -6111,6 +6111,12 @@ paths: schema: type: string example: 87f17f8a-c0e2-406c-a149-8c8e311bf330 + - in: query + name: full + schema: + type: boolean + example: false + default: false responses: '200': description: Artist details @@ -6118,6 +6124,46 @@ paths: application/json: schema: $ref: '#/components/schemas/ArtistResult' + /music/release/{releaseId}: + get: + summary: Get release details + description: Returns full release details in a JSON object. + tags: + - music + parameters: + - in: path + name: releaseId + required: true + schema: + type: string + example: 87f17f8a-c0e2-406c-a149-8c8e311bf330 + responses: + '200': + description: Release details + content: + application/json: + schema: + $ref: '#/components/schemas/ReleaseResult' + /music/release-group/{releaseGroupId}: + get: + summary: Get release group details + description: Returns full release group details in a JSON object. + tags: + - music + parameters: + - in: path + name: releaseGroupId + required: true + schema: + type: string + example: 87f17f8a-c0e2-406c-a149-8c8e311bf330 + responses: + '200': + description: Release Group details + content: + application/json: + schema: + $ref: '#/components/schemas/ReleaseGroupResult' /media: get: summary: Get media diff --git a/server/models/Search.ts b/server/models/Search.ts index 455e51780..40aaf654b 100644 --- a/server/models/Search.ts +++ b/server/models/Search.ts @@ -8,7 +8,7 @@ import type { mbWork, } from '@server/api/musicbrainz/interfaces'; import getPosterFromMB, { - getFanartFromMB, + cachedFanartFromMB, } from '@server/api/musicbrainz/poster'; import type { TmdbCollectionResult, @@ -305,7 +305,7 @@ export const mapArtistResult = async ( tags: artist.tags, mediaInfo: media ?? undefined, posterPath: await getPosterFromMB(artist), - fanartPath: await getFanartFromMB(artist), + fanartPath: await cachedFanartFromMB(artist), }); export const mapReleaseResult = async ( diff --git a/server/routes/music.ts b/server/routes/music.ts index 076697c62..342e7b0b5 100644 --- a/server/routes/music.ts +++ b/server/routes/music.ts @@ -2,7 +2,11 @@ import MusicBrainz from '@server/api/musicbrainz'; import { MediaType } from '@server/constants/media'; import Media from '@server/entity/Media'; import logger from '@server/logger'; -import { mapArtistResult } from '@server/models/Search'; +import { + mapArtistResult, + mapReleaseGroupResult, + mapReleaseResult, +} from '@server/models/Search'; import { Router } from 'express'; const musicRoutes = Router(); @@ -11,7 +15,9 @@ musicRoutes.get('/artist/:id', async (req, res, next) => { const mb = new MusicBrainz(); try { - const artist = await mb.getArtist(req.params.id); + const artist = req.query.full + ? await mb.getFullArtist(req.params.id) + : await mb.getArtist(req.params.id); const media = await Media.getMedia(artist.id, MediaType.MUSIC); @@ -29,4 +35,50 @@ musicRoutes.get('/artist/:id', async (req, res, next) => { } }); +musicRoutes.get('/release/:id', async (req, res, next) => { + const mb = new MusicBrainz(); + + try { + const release = await mb.getRelease(req.params.id); + + const media = await Media.getMedia(release.id, MediaType.MUSIC); + + return res.status(200).json(await mapReleaseResult(release, media)); + } catch (e) { + logger.debug('Something went wrong retrieving release', { + label: 'API', + errorMessage: e.message, + releaseId: req.params.id, + }); + return next({ + status: 500, + message: 'Unable to retrieve release.', + }); + } +}); + +musicRoutes.get('/release-group/:id', async (req, res, next) => { + const mb = new MusicBrainz(); + + try { + const releaseGroup = await mb.getReleaseGroup(req.params.id); + + const media = await Media.getMedia(releaseGroup.id, MediaType.MUSIC); + + return res + .status(200) + .json(await mapReleaseGroupResult(releaseGroup, media)); + } catch (e) { + logger.debug('Something went wrong retrieving release group', { + label: 'API', + errorMessage: e.message, + releaseGroupId: req.params.id, + }); + return next({ + status: 500, + message: 'Unable to retrieve release group.', + }); + } +}); + export default musicRoutes;