2021-04-16 04:34:29 +00:00
|
|
|
import { resolveLookup } from '../../resolvers.js';
|
2017-10-19 08:00:21 +00:00
|
|
|
|
|
|
|
|
const SIZES = new Map([
|
|
|
|
|
[null, null],
|
|
|
|
|
[250, 250],
|
|
|
|
|
[500, 500],
|
|
|
|
|
['FULL', null],
|
|
|
|
|
['SMALL', 250],
|
2021-04-16 04:34:29 +00:00
|
|
|
['LARGE', 500],
|
|
|
|
|
]);
|
2017-10-19 08:00:21 +00:00
|
|
|
|
2017-11-07 05:54:56 +00:00
|
|
|
function resolveImage(coverArt, args, { loaders }, info) {
|
2017-10-19 08:00:21 +00:00
|
|
|
// Since migrating the schema to an extension, we lost custom enum values
|
|
|
|
|
// for the time being. Translate any incoming `size` arg to the old enum
|
|
|
|
|
// values.
|
2021-04-16 04:34:29 +00:00
|
|
|
const size = SIZES.get(args.size);
|
2017-10-19 08:00:21 +00:00
|
|
|
// Field should be `front` or `back`.
|
2021-04-16 04:34:29 +00:00
|
|
|
const field = info.fieldName;
|
2017-10-19 08:00:21 +00:00
|
|
|
if (coverArt.images) {
|
2021-04-16 04:34:29 +00:00
|
|
|
const matches = coverArt.images.filter((image) => image[field]);
|
2017-10-19 08:00:21 +00:00
|
|
|
if (!matches.length) {
|
2021-04-16 04:34:29 +00:00
|
|
|
return null;
|
2017-10-19 08:00:21 +00:00
|
|
|
} else if (matches.length === 1) {
|
2021-04-16 04:34:29 +00:00
|
|
|
const match = matches[0];
|
2017-10-19 08:00:21 +00:00
|
|
|
if (size === 250) {
|
2021-04-16 04:34:29 +00:00
|
|
|
return match.thumbnails.small;
|
2017-10-19 08:00:21 +00:00
|
|
|
} else if (size === 500) {
|
2021-04-16 04:34:29 +00:00
|
|
|
return match.thumbnails.large;
|
2017-10-19 08:00:21 +00:00
|
|
|
} else {
|
2021-04-16 04:34:29 +00:00
|
|
|
return match.image;
|
2017-10-19 08:00:21 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-04-16 04:34:29 +00:00
|
|
|
const entityType = coverArt._entityType;
|
|
|
|
|
const id = coverArt._id;
|
|
|
|
|
const releaseID = coverArt._releaseID;
|
2017-10-19 08:00:21 +00:00
|
|
|
if (entityType === 'release-group' && field === 'front') {
|
|
|
|
|
// Release groups only have an endpoint to retrieve the front image.
|
|
|
|
|
// If someone requests the back of a release group, return the back of the
|
|
|
|
|
// release that the release group's cover art response points to.
|
2021-04-16 04:34:29 +00:00
|
|
|
return loaders.coverArtArchiveURL.load(['release-group', id, field, size]);
|
2017-10-19 08:00:21 +00:00
|
|
|
} else {
|
2021-04-16 04:34:29 +00:00
|
|
|
return loaders.coverArtArchiveURL.load(['release', releaseID, field, size]);
|
2017-10-19 08:00:21 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
CoverArtArchiveImage: {
|
2021-04-16 04:34:29 +00:00
|
|
|
fileID: (image) => image.id,
|
2017-10-19 08:00:21 +00:00
|
|
|
},
|
|
|
|
|
CoverArtArchiveRelease: {
|
|
|
|
|
front: resolveImage,
|
|
|
|
|
back: resolveImage,
|
2021-04-16 04:34:29 +00:00
|
|
|
images: (coverArt) => coverArt.images,
|
|
|
|
|
artwork: (coverArt) => coverArt.images.length > 0,
|
|
|
|
|
count: (coverArt) => coverArt.images.length,
|
2017-10-19 08:00:21 +00:00
|
|
|
release: (coverArt, args, context, info) => {
|
2021-04-16 04:34:29 +00:00
|
|
|
const mbid = coverArt._releaseID;
|
2017-10-19 08:00:21 +00:00
|
|
|
if (mbid) {
|
2021-04-16 04:34:29 +00:00
|
|
|
return resolveLookup(coverArt, { mbid }, context, info);
|
2017-10-19 08:00:21 +00:00
|
|
|
}
|
2021-04-16 04:34:29 +00:00
|
|
|
return null;
|
|
|
|
|
},
|
2017-10-19 08:00:21 +00:00
|
|
|
},
|
|
|
|
|
Release: {
|
|
|
|
|
coverArtArchive: (release, args, { loaders }) => {
|
2021-04-16 04:34:29 +00:00
|
|
|
return loaders.coverArtArchive.load(['release', release.id]);
|
|
|
|
|
},
|
2017-10-19 08:00:21 +00:00
|
|
|
},
|
|
|
|
|
ReleaseGroup: {
|
|
|
|
|
coverArtArchive: (releaseGroup, args, { loaders }) => {
|
2021-04-16 04:34:29 +00:00
|
|
|
return loaders.coverArtArchive.load(['release-group', releaseGroup.id]);
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|