Skip to content

Instantly share code, notes, and snippets.

@nestarz
Created February 15, 2019 13:49
Show Gist options
  • Save nestarz/1d7a9c150cf858bc18f8e317d570c9ed to your computer and use it in GitHub Desktop.
Save nestarz/1d7a9c150cf858bc18f8e317d570c9ed to your computer and use it in GitHub Desktop.
Populate MDX node from frontmatter MusicBrainz IDs
const {
default_musicBrainzReleaseFields,
queryMusicBrainzRelease
} = require("./src/fragments/musicbrainz");
exports.onCreateNode = async ({
node,
actions,
getNode,
createNodeId,
store,
cache
}) => {
const { createNodeField, createNode } = actions;
switch (node.internal.type) {
case `JavascriptFrontmatter`:
case `Mdx`:
createNodeField({
name: `slug`,
node,
value: createFilePath({ node, getNode })
});
const fileNode = getNode(node.parent);
createNodeField({
name: "sourceInstanceName",
node,
value: fileNode.sourceInstanceName
});
let release_fields = [];
let covers = [];
if (fileNode.sourceInstanceName == `playlist`) {
// Retrieve MusicBrainz Ids from frontmatter post
const mbids = Array.isArray(node.frontmatter.mbid)
? node.frontmatter.mbid
: [node.frontmatter.mbid];
// Query MusicBrainz API to source album information for each ID
await mbids.forEach(async mbid => {
const { result } = await wrapper(queryMusicBrainzRelease(mbid));
// Download covers and create dedicated node
const coverFileNode = await createRemoteFileNode({
url: result.lookup.release.coverArtArchive.front,
store,
cache,
createNode,
createNodeId
});
// Add results to a field of Mdx node + a link to cover file
covers.push(coverFileNode.id);
release_fields.push({
...default_musicBrainzReleaseFields,
...result.lookup.release,
cover___NODE: coverFileNode.id
});
});
}
// Add everything into a node field named graphbrainz__release
createNodeField({
name: "graphbrainz__release",
node,
value: release_fields
});
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment