Skip to content

Commit

Permalink
wip from livestream
Browse files Browse the repository at this point in the history
  • Loading branch information
amberleyromo committed Jul 18, 2019
1 parent 6861a65 commit 010a5e1
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 141 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
---
title: '01: Pilot episode'
date: '2019-03-20'
time: '33'
description: We talk about stuff.
episodeLink: abcde-12345
embedUrl: https://hopeinsource.simplecast.com/episodes/1-faith-and-open-source-10d618f0
title: Woof
boop: "https://anchor.fm/fullstack-health/episodes/0-Intro-e4egsi"
ygatsby: eh
---

## Links
Expand Down
8 changes: 7 additions & 1 deletion packages/gatsby-theme-podcast/gatsby-config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const pkg = require("./package.json");

module.exports = () => ({
module.exports = ({ rssSource = "" }) => ({
siteMetadata: {
title: "The podcast title",
author: "Jane Doe & John Doe",
Expand Down Expand Up @@ -31,6 +31,12 @@ module.exports = () => ({
modules: [pkg.name]
}
},
{
resolve: "@amber1ey/gatsby-source-rss-feed",
options: {
rssSource
}
},
{
resolve: "gatsby-source-filesystem",
options: {
Expand Down
141 changes: 12 additions & 129 deletions packages/gatsby-theme-podcast/gatsby-node.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const Parser = require("rss-parser");
const parser = new Parser();

exports.onPreBootstrap = ({ reporter }) => {
const dirs = [
Expand All @@ -20,92 +17,6 @@ exports.onPreBootstrap = ({ reporter }) => {
});
};

const createContentDigest = obj =>
crypto
.createHash("md5")
.update(JSON.stringify(obj))
.digest("hex");

const generateRSSItemSlug = title => {
return (
title
// remove non-alphanumeric characters, except spaces
.replace(/[^\w\s]/gi, "")
.toLowerCase()
.split(" ")
.join("-")
);
};

const durationToMinutes = durationInSeconds => {
return Math.floor(durationInSeconds / 60);
};

// hackity hack. this extracts the first paragraph from the description
const extractFirstParagraph = html => {
return html.match(/<p>(.*?)<\/p>/)[0];
};

async function sourceNodes({ actions }, { rssSource = "" }) {
if (!rssSource) {
console.log(`gatsby-theme-podcast requires an RSS feed`);
return;
}
const { createNode } = actions;
const data = await parser.parseURL(rssSource);

if (!data) {
return;
}

// Create nodes for top-level RSS feed info
const { title, description, link, image, items } = data;

// Prepare RSS item nodes
const preparedRssItemNodes = items.map(rssItem => {
let slug = generateRSSItemSlug(rssItem.title);
let excerpt = extractFirstParagraph(rssItem.content);
let duration = durationToMinutes(rssItem.itunes.duration);
const node = Object.assign({}, rssItem, {
id: rssItem.link,
title: rssItem.title,
content: rssItem.content,
link: rssItem.link,
excerpt,
duration,
slug,
parent: null
});
node.internal = {
type: "rssFeedItem",
contentDigest: createContentDigest(node)
};
return node;
});

const feedInfo = {
id: link,
title,
description,
link,
imageUrl: image.url,
items___NODE: preparedRssItemNodes.map(node => node.id),
parent: null
};

feedInfo.internal = {
type: "rssFeedInfo",
contentDigest: createContentDigest(feedInfo)
};

createNode(feedInfo);

// Actually create nodes for RSS items
preparedRssItemNodes.forEach(rssItemNode => createNode(rssItemNode));
}

exports.sourceNodes = sourceNodes;

exports.createPages = async function createPages({ graphql, actions }) {
const { createPage } = actions;
const rssItemPage = require.resolve("./src/templates/episode-page.js");
Expand Down Expand Up @@ -146,49 +57,21 @@ exports.createPages = async function createPages({ graphql, actions }) {
});
};

// *
// * @TODO this is all now outdated
// * These files should only exist in the site/theme starter
// * Need to be pulled in (if exists) to corresponding episode
// *
let userCreatedOwnEpisodes = false;

exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions;

if (node.internal.type === `Mdx`) {
// create source field
const fileNode = getNode(node.parent);

const source = fileNode.sourceInstanceName;
// Connect mdx notes/transcripts to episode
exports.onCreateNode = async ({ node, actions, getNodesByType }) => {
const { createParentChildLink } = actions;

createNodeField({
node,
name: `source`,
value: source
});

const eligibleEpisodeSources = [
"podcast-demo-episodes",
"podcast-episodes"
];
if (node.internal.type !== `Mdx`) {
return;
}

if (eligibleEpisodeSources.includes(source)) {
if (source === "podcast-episodes") {
userCreatedOwnEpisodes = true;
}
const rssItemNodes = getNodesByType(`rssFeedItem`);

if (userCreatedOwnEpisodes && source === "podcast-demo-episodes") {
return;
}
const filtered = rssItemNodes.find(rssItemNode => {
return rssItemNode.link === node.frontmatter.boop;
});

// create slug for episode pages
const value = path.parse(node.fileAbsolutePath).name;
createNodeField({
name: `slug`,
node,
value
});
}
if (filtered) {
createParentChildLink({ parent: filtered, child: node });
}
};
1 change: 1 addition & 0 deletions packages/gatsby-theme-podcast/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"main": "index.js",
"license": "MIT",
"dependencies": {
"@amber1ey/gatsby-source-rss-feed": "*",
"@mdx-js/mdx": "^1.0.4",
"@mdx-js/react": "^1.0.2",
"gatsby-image": "^2.0.34",
Expand Down
10 changes: 5 additions & 5 deletions packages/gatsby-theme-podcast/src/templates/episode-page.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Link, graphql } from "gatsby";
import get from "lodash.get";
import PodcastPlayer from "syntax-podcast-player";

// import { MDXRenderer } from "gatsby-plugin-mdx";
import { MDXRenderer } from "gatsby-plugin-mdx";
import Layout from "../components/Layout";
import Support from "../components/Support";
import SEO from "../components/SEO";
Expand Down Expand Up @@ -66,10 +66,7 @@ class RssItemPageTemplate extends React.Component {
}}
/>

<p>
@TODO: Need to create a way to add additional episode/show content,
like transcripts and show notes
</p>
<MDXRenderer>{rssItem.childMdx.body}</MDXRenderer>

<p>
<a href={discussUrl} target="_blank" rel="noopener noreferrer">
Expand Down Expand Up @@ -144,6 +141,9 @@ export const query = graphql`
}
excerpt
duration
childMdx {
body
}
}
}
`;
92 changes: 92 additions & 0 deletions packages/wip-gatsby-source-rss-feed/gatsby-node.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
const crypto = require("crypto");
const Parser = require("rss-parser");
const parser = new Parser();

// Based on and extended from https://github.com/rheajt/gatsby-source-rss/blob/master/src/gatsby-node.js

const createContentDigest = obj =>
crypto
.createHash("md5")
.update(JSON.stringify(obj))
.digest("hex");

const generateRSSItemSlug = title => {
return (
title
// remove non-alphanumeric characters, except spaces
.replace(/[^\w\s]/gi, "")
.toLowerCase()
.split(" ")
.join("-")
);
};

const durationToMinutes = durationInSeconds => {
return Math.floor(durationInSeconds / 60);
};

// hackity hack. this extracts the first paragraph from the description
const extractFirstParagraph = html => {
return html.match(/<p>(.*?)<\/p>/)[0];
};

async function sourceNodes({ actions }, { rssSource = "" }) {
if (!rssSource) {
console.log(`gatsby-theme-podcast requires an RSS feed`);
return;
}
const { createNode } = actions;
const data = await parser.parseURL(rssSource);

if (!data) {
return;
}

// Create nodes for top-level RSS feed info
const { title, description, link, image, items } = data;

// Prepare RSS item nodes
const preparedRssItemNodes = items.map(rssItem => {
let slug = generateRSSItemSlug(rssItem.title);
let excerpt = extractFirstParagraph(rssItem.content);
let duration = durationToMinutes(rssItem.itunes.duration);
const node = Object.assign({}, rssItem, {
id: rssItem.link,
title: rssItem.title,
content: rssItem.content,
link: rssItem.link,
excerpt,
duration,
slug,
parent: null,
children: []
});
node.internal = {
type: "rssFeedItem",
contentDigest: createContentDigest(node)
};
return node;
});

const feedInfo = {
id: link,
title,
description,
link,
imageUrl: image.url,
items___NODE: preparedRssItemNodes.map(node => node.id),
parent: null
};

feedInfo.internal = {
type: "rssFeedInfo",
contentDigest: createContentDigest(feedInfo)
};

createNode(feedInfo);

// Actually create nodes for RSS items
preparedRssItemNodes.forEach(rssItemNode => createNode(rssItemNode));
}

exports.sourceNodes = sourceNodes;
1 change: 1 addition & 0 deletions packages/wip-gatsby-source-rss-feed/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// boop
10 changes: 10 additions & 0 deletions packages/wip-gatsby-source-rss-feed/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "@amber1ey/gatsby-source-rss-feed",
"private": true,
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"rss-parser": "^3.7.2"
}
}
34 changes: 34 additions & 0 deletions packages/wip-gatsby-source-rss-feed/yarn.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


entities@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==

rss-parser@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.7.2.tgz#9f5b7d4944d4f7a190b469e31a8353aedb17c052"
integrity sha512-kx0VIFelgwBk5qA4n32U6cx40anAU7TwlRXjyxLDFgMlg8/UcJ64x+Hj5oRX1Kjos+OeFGOmnd5YXH5ES+bmzg==
dependencies:
entities "^1.1.1"
xml2js "^0.4.19"

sax@>=0.6.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==

xml2js@^0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
dependencies:
sax ">=0.6.0"
xmlbuilder "~9.0.1"

xmlbuilder@~9.0.1:
version "9.0.7"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
Loading

0 comments on commit 010a5e1

Please sign in to comment.