graphbrainz
Version:
A GraphQL schema, Express server, and middleware for querying the MusicBrainz.
81 lines (79 loc) • 2.54 kB
JavaScript
async function resolveMediaWikiImages(source, args, { loaders }) {
const isURL = (relation) => relation['target-type'] === 'url';
let rels = source.relations ? source.relations.filter(isURL) : [];
if (!rels.length) {
rels = await loaders.lookup
.load([source._type, source.id, { inc: 'url-rels' }])
.then((source) => source.relations.filter(isURL));
}
const pages = rels
.filter((rel) => {
if (rel.type === args.type) {
const url = new URL(rel.url.resource);
if (url.pathname.match(/^\/wiki\/(File|Image):/)) {
return true;
}
}
return false;
})
.map((rel) => rel.url.resource);
return Promise.all(pages.map((page) => loaders.mediaWiki.load(page)));
}
export default {
MediaWikiImage: {
descriptionURL: (imageInfo) => imageInfo.descriptionurl,
canonicalTitle: (imageInfo) => imageInfo.canonicaltitle,
objectName: (imageInfo) => {
const data = imageInfo.extmetadata.ObjectName;
return data ? data.value : null;
},
descriptionHTML: (imageInfo) => {
const data = imageInfo.extmetadata.ImageDescription;
return data ? data.value : null;
},
originalDateTimeHTML: (imageInfo) => {
const data = imageInfo.extmetadata.DateTimeOriginal;
return data ? data.value : null;
},
categories: (imageInfo) => {
const data = imageInfo.extmetadata.Categories;
return data ? data.value.split('|') : [];
},
artistHTML: (imageInfo) => {
const data = imageInfo.extmetadata.Artist;
return data ? data.value : null;
},
creditHTML: (imageInfo) => {
const data = imageInfo.extmetadata.Credit;
return data ? data.value : null;
},
licenseShortName: (imageInfo) => {
const data = imageInfo.extmetadata.LicenseShortName;
return data ? data.value : null;
},
licenseURL: (imageInfo) => {
const data = imageInfo.extmetadata.LicenseUrl;
return data ? data.value : null;
},
metadata: (imageInfo) =>
Object.keys(imageInfo.extmetadata).map((key) => {
const data = imageInfo.extmetadata[key];
return { ...data, name: key };
}),
},
MediaWikiImageMetadata: {
value: (obj) => (obj.value == null ? obj.value : `${obj.value}`),
},
Artist: {
mediaWikiImages: resolveMediaWikiImages,
},
Instrument: {
mediaWikiImages: resolveMediaWikiImages,
},
Label: {
mediaWikiImages: resolveMediaWikiImages,
},
Place: {
mediaWikiImages: resolveMediaWikiImages,
},
};