Major update to bring it inline with the new Strapi CMS.

This commit is contained in:
James Purser 2022-06-12 15:12:28 +10:00
parent 1ab30f580c
commit 9141c18579
31 changed files with 10334 additions and 211 deletions

View file

@ -272,3 +272,7 @@
font-size: 2rem; font-size: 2rem;
font-weight: bold; font-weight: bold;
} }
.featuredFlickr {
padding-top: 30px
}

View file

@ -4,7 +4,7 @@ import Link from 'next/link'
const EpisodePager = ({ episodedata, config, showdata }) => { const EpisodePager = ({ episodedata, config, showdata }) => {
const router = useRouter() const router = useRouter()
console.log(episodedata)
const handlePagination = page => { const handlePagination = page => {
const path = router.pathname const path = router.pathname
const query = router.query const query = router.query
@ -18,16 +18,16 @@ const EpisodePager = ({ episodedata, config, showdata }) => {
return ( return (
<div className="episode_pages col-xs-12"> <div className="episode_pages col-xs-12">
<div className="show_episodes"> <div className="show_episodes">
{episodedata.episodes.map((episode) => ( {episodedata.map((episode) => (
<div key={episode.slug} className="episode"> <div key={episode.attributes.Slug} className="episode">
<div className="episode_title" id ={episode.episode_slug}> <div className="episode_title" id ={episode.Title}>
<Link href={episode.show_slug + "/" + episode.episode_slug}>{episode.title}</Link> <Link href={episode.attributes.podcast_sery.data.attributes.Slug + "/" + episode.attributes.Slug}>{episode.attributes.Title}</Link>
</div> </div>
<div className="content-date"> <div className="content-date">
{episode.episode_published} {episode.attributes.publishedAt}
</div> </div>
<div className="episode_body" dangerouslySetInnerHTML={{ __html: episode.episode_lead}}></div> <div className="episode_body" dangerouslySetInnerHTML={{ __html: episode.attributes.Description}}></div>
</div> </div>
))} ))}
</div> </div>
@ -37,7 +37,7 @@ const EpisodePager = ({ episodedata, config, showdata }) => {
previousLabel={"previous"} previousLabel={"previous"}
nextLabel={"next"} nextLabel={"next"}
breakLabel={"..."} breakLabel={"..."}
initialPage={episodedata.curPage - 1} initialPage={1} //{episodedata.curPage - 1}
pageCount={2} pageCount={2}
onPageChange={handlePagination} onPageChange={handlePagination}
/> />

View file

@ -4,7 +4,7 @@ const EpisodeSideBar = (epdata) => (
<div className="side_content col-md-3"> <div className="side_content col-md-3">
<h2>Latest Episodes</h2> <h2>Latest Episodes</h2>
<hr /> <hr />
{epdata.epdata.episodes.map((episode) => ( {epdata.map((episode) => (
<div key={episode.episode_slug}> <div key={episode.episode_slug}>
<h2><Link href="/podcasts/shows/[show_slug]/[slug]" as={"/podcasts/shows/" + episode.show_slug + "/" + episode.episode_slug}>{episode.title}</Link></h2> <h2><Link href="/podcasts/shows/[show_slug]/[slug]" as={"/podcasts/shows/" + episode.show_slug + "/" + episode.episode_slug}>{episode.title}</Link></h2>
<div dangerouslySetInnerHTML={{__html: episode.episode_lead}} /> <div dangerouslySetInnerHTML={{__html: episode.episode_lead}} />

View file

@ -1,11 +1,13 @@
import Image from 'next/image'; import Image from 'next/image';
const FeatureImage = ({ imagedata, basepath }) => ( const FeatureImage = ({ imagedata, basepath }) => (
<div className="featuredimage"> <div className="featuredimage">
<Image <Image
src={basepath + imagedata.src} src={"http://localhost:1337"+imagedata.attributes.url}
height={imagedata.height} height={imagedata.attributes.height}
width={imagedata.width} width={imagedata.attributes.width}
priority={true} priority={true}
/> />
</div> </div>

View file

@ -12,6 +12,9 @@ const Layout = (props) => (
<Head> <Head>
<title>{props.pagedata.title}</title> <title>{props.pagedata.title}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"></meta> <meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
<meta name="description" content="Angry Beanie"></meta>
<meta charSet="utf-8" />
<meta property="og-title" content={props.pagedata.pageTitle}></meta>
</Head> </Head>
<Header /> <Header />
<div className="container"> <div className="container">

View file

@ -17,19 +17,9 @@ const NavBar = (props, sections) => {
<Nav className="m-auto"> <Nav className="m-auto">
<NavLink href="/">Home</NavLink> <NavLink href="/">Home</NavLink>
</Nav> </Nav>
<Nav className="m-auto">
<NavLink href="/podcasts">Podcasts</NavLink>
</Nav>
<NavItem className="m-auto"> <NavItem className="m-auto">
<NavLink href="/news">News and such</NavLink> <NavLink href="/news">News and such</NavLink>
</NavItem> </NavItem>
{props.sections.sections.map((section) => (
<NavDropdown className="m-auto" title={section.title}>
{section.pages.map((page) => (
<NavDropdown.Item key={page.page_slug} href={"/sections/" + page.page_slug}>{page.page_title}</NavDropdown.Item>
))}
</NavDropdown>
))}
</Navbar.Collapse> </Navbar.Collapse>
</Navbar> </Navbar>

View file

@ -4,11 +4,12 @@ import Link from 'next/link'
const StoryPager = ({ storydata }) => { const StoryPager = ({ storydata }) => {
const router = useRouter() const router = useRouter()
console.log(storydata.meta)
const handlePagination = page => { const handlePagination = page => {
const path = router.pathname const path = router.pathname
const query = router.query const query = router.query
query.page = page.selected + 1 query.page = page.selected + 2
router.push({ router.push({
pathname: path, pathname: path,
query: query, query: query,
@ -18,12 +19,12 @@ const StoryPager = ({ storydata }) => {
return ( return (
<div className="episode_pages col-sm-12"> <div className="episode_pages col-sm-12">
<div className="show_episodes"> <div className="show_episodes">
{storydata.articles.map((story) => ( {storydata.data.map((story) => (
<div key={story.slug}> <div key={story.slug}>
<div className="episode_title"> <div className="episode_title">
<Link href="/news/[slug]" as={"/news/" + story.slug}>{story.title}</Link> <Link href="/news/[slug]" as={"/news/" + story.attributes.Slug}>{story.attributes.Title}</Link>
</div> </div>
<div className="article_body" dangerouslySetInnerHTML={{ __html: story.lead }} /> <div className="article_body" dangerouslySetInnerHTML={{ __html: story.attributes.Abstract }} />
</div> </div>
))} ))}
<ReactPaginate <ReactPaginate
@ -32,8 +33,8 @@ const StoryPager = ({ storydata }) => {
previousLabel={"previous"} previousLabel={"previous"}
nextLabel={"next"} nextLabel={"next"}
breakLabel={"..."} breakLabel={"..."}
initialPage={storydata.page - 1} initialPage={storydata.page}
pageCount={storydata.total / 5} pageCount={storydata.meta.pagination.pageCount}
onPageChange={handlePagination} /> onPageChange={handlePagination} />
</div> </div>
</div> </div>

View file

@ -1,13 +1,13 @@
import Link from 'next/link' import Link from 'next/link'
const StorySideBar = (storydata) => ( const StorySideBar = ({ stories }) => (
<div className="side_content col-md-3"> <div className="side_content col-md-3">
<h2>Latest Stories</h2> <h2>Latest Stories</h2>
<hr /> <hr />
{storydata.stories.articles.map((article) => ( {stories.map((article) => (
<div key={article.slug}> <div key={article.attributes.Slug}>
<h2><Link href="/news/[slug]" as={"/news/" + article.slug}>{article.title}</Link></h2> <h2><Link href="/news/[slug]" as={"/news/" + article.attributes.Slug}>{article.attributes.Title}</Link></h2>
<div dangerouslySetInnerHTML={{__html: article.lead}} /> <div dangerouslySetInnerHTML={{__html: article.attributes.Lead}} />
<hr></hr> <hr></hr>
</div> </div>
))} ))}

52
data/external/cms.js vendored Executable file
View file

@ -0,0 +1,52 @@
import getConfig from 'next/config'
export const getAllPosts = async (filter) => {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const qs = require('qs')
const qVal = []
const query = qs.stringify({
sort: ['publishedAt:desc'],
filters: {
tags: {
Slug: {
$contains: filter
}
}
} }, {
encodeValuesOnly: true,
})
const res = await fetch(serverRuntimeConfig.base_path + `articles?${query}`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
return await res.json()
}
export const getAllPodcastSeries = async () => {
const { serverRuntimeConfig } = getConfig()
const qs = require('qs')
const query = qs.stringify({
populate: {
podcast_episodes: {
populate:['Audio']
}
}
}, {
encodeValuesOnly: true,
})
const res = await fetch(serverRuntimeConfig.base_path + `podcast-series?${query}`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
return await res.json()
}

8
data/internal/config.js Executable file
View file

@ -0,0 +1,8 @@
export const config = {
siteName: "AngryBeanie",
siteDescription: "A place for all my projects, thoughts and ramblings",
siteLogo: "",
siteURL: "https://www.angrybeanie.com"
}
export default config

190
data/internal/feed-generator.js Executable file
View file

@ -0,0 +1,190 @@
import { Feed } from "feed"
import { getAllPodcastSeries, getAllPosts } from "../external/cms"
import fs from "fs"
import config from './config'
export const generateRssFeed = async (filter) => {
const posts = await getAllPosts(filter);
const siteURL = config.siteURL;
const date = new Date();
const Title = typeof filter === "undefined" ? "Angry Beanie" : filter
const feedTitle = typeof filter === "undefined" ? "Angry-Beanie" : filter
const author = {
name: "James Purser",
email: "james@angrybeanie.com",
link: "https://twitter.com/purserj",
};
const feed = new Feed({
title: Title,
description: "A place for all my thoughts and projects",
id: siteURL,
link: siteURL,
image: `${siteURL}/public/images/logo.svg`,
favicon: `${siteURL}/public/images/favicon.png`,
copyright: `All rights reserved ${date.getFullYear()}, James Purser`,
updated: date,
generator: "Feed for Node.js",
feedLinks: {
rss2: `${siteURL}/feeds/${feedTitle}-feed.xml`,
json: `${siteURL}/feeds/${feedTitle}-feed.json`,
atom: `${siteURL}/feeds/${feedTitle}-atom.xml`,
},
author,
});
posts.data.forEach((post) => {
const url = `${siteURL}/news/${post.attributes.Slug}`;
feed.addItem({
title: post.attributes.Title,
id: url,
link: url,
description: post.attributes.Abstract,
content: post.attributes.Abstract,
author: [author],
contributor: [author],
date: new Date(post.attributes.publishedAt),
});
});
fs.mkdirSync("./public/feeds", { recursive: true });
fs.writeFileSync(`./public/feeds/${feedTitle}-feed.xml`, feed.rss2());
fs.writeFileSync(`./public/feeds/${feedTitle}-atom.xml`, feed.atom1());
fs.writeFileSync(`./public/feeds/${feedTitle}-feed.json`, feed.json1());
}
export const generatePodcastFeeds = async () => {
const podcastSeries = await getAllPodcastSeries()
const siteURL = config.siteURL;
console.log(config)
const author = {
name: "James Purser",
email: "james@angrybeanie.com",
link: "https://twitter.com/purserj",
};
const date = new Date();
podcastSeries.data.forEach((series) => {
const feed = new Feed({
title: series.attributes.Title,
description: series.attributes.Description,
id: siteURL,
link: siteURL,
image: `${siteURL}/public/images/logo.svg`,
favicon: `${siteURL}/public/images/favicon.png`,
copyright: `All rights reserved ${date.getFullYear()}, James Purser`,
updated: date,
generator: "Feed for Node.js",
feedLinks: {
rss2: `${siteURL}/feeds/${series.attributes.Slug}.xml`,
},
author,
});
const episodes = series.attributes.podcast_episodes.data
episodes.forEach((episode) => {
const url = `${siteURL}/shows/${series.attributes.Slug}/${episode.attributes.Slug}`;
const media_url = `${siteURL}${episode.attributes.Audio.data.attributes.url}`
const media = {
url: media_url,
type: episode.attributes.Audio.data.attributes.mime,
length: 0,
title: episode.attributes.Audio.data.attributes.name,
duration: 0,
}
feed.addItem({
title: episode.attributes.Title,
id: url,
link: url,
description: episode.attributes.Description,
content: episode.attributes.Description,
author: [author],
contributor: [author],
date: new Date(episode.attributes.publishedAt),
enclosure: media
})
})
console.log(feed.rss2())
fs.writeFileSync(`./public/feeds/${series.attributes.Slug}.xml`, feed.rss2());
})
}

View file

View file

@ -8,8 +8,9 @@ module.exports = withPlugins([withCSS, withFonts, withImages])
module.exports = { module.exports = {
serverRuntimeConfig: { serverRuntimeConfig: {
// Will only be available on the server side // Will only be available on the server side
base_path: 'http://cms.local.angrybeanie.com:8000', base_path: 'http://localhost:1337/api/',
audio_path: 'https://audio.angrybeanie.com/' audio_path: 'https://audio.angrybeanie.com/',
strapi_token: 'Bearer e555abdbe49a73a84241acdbe90fb18c9d314987f4752e63ce340a307ff07c40a086edb043ef6b8325b46a1dc2d2f0806c507bdbd99b005438c479223388e6997f49bac856df3b9f1a55e159ee15c6e97030e3ac09ec87f8ff411fe14a9a11ae409b034db64fae121e1eada8db9839765555c0c06b341e986be65bb8b2e91eb9'
}, },
images: { images: {
domains: ['www.angrybeanie.com', 'localhost', 'cms.local.angrybeanie.com'] domains: ['www.angrybeanie.com', 'localhost', 'cms.local.angrybeanie.com']

5319
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -14,6 +14,7 @@
"@zeit/next-css": "^1.0.1", "@zeit/next-css": "^1.0.1",
"@zeit/next-less": "^1.0.1", "@zeit/next-less": "^1.0.1",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"feed": "^4.2.2",
"less": "^3.13.1", "less": "^3.13.1",
"mdbreact": "^5.1.0", "mdbreact": "^5.1.0",
"next": "^10.2.3", "next": "^10.2.3",
@ -21,6 +22,7 @@
"next-fonts": "^1.5.1", "next-fonts": "^1.5.1",
"next-images": "^1.8.1", "next-images": "^1.8.1",
"postcss": "^8.3.6", "postcss": "^8.3.6",
"qs": "^6.10.3",
"react": "^16.14.0", "react": "^16.14.0",
"react-bootstrap": "^1.6.1", "react-bootstrap": "^1.6.1",
"react-dom": "^16.14.0", "react-dom": "^16.14.0",

View file

@ -5,15 +5,39 @@ import getConfig from 'next/config'
import Head from 'next/head' import Head from 'next/head'
import Image from 'next/image'; import Image from 'next/image';
import { FEEDS, getFeed } from "../lib/rss" import { FEEDS, getFeed } from "../lib/rss"
import { generatePodcastFeeds, generateRssFeed } from "../data/internal/feed-generator"
export async function getServerSideProps(context) { export async function getStaticProps(context) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() generateRssFeed()
const res = await fetch(serverRuntimeConfig.base_path +`/api/collections/1`) generateRssFeed('tech-and-disability')
generatePodcastFeeds()
const { serverRuntimeConfig, publicRuntimeConfig, strapiConfig } = getConfig()
console.log(serverRuntimeConfig.strapi_token)
const qs = require('qs')
const query = qs.stringify({
pagination: {
limit: 1
},
sort: ['publishedAt:desc'],
fields: ['Title', 'Slug', 'Abstract']
}, {
encodeValuesOnly: true,
})
console.log(query)
const res = await fetch(serverRuntimeConfig.base_path +`articles?${query}`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const artdata = await res.json() const artdata = await res.json()
const article = artdata.articles[0]
const epres = await fetch(serverRuntimeConfig.base_path + '/api/podcasts/episodes/latest/0/1') const article = artdata.data[0].attributes
const epdata = await epres.json()
console.log(article)
// const epres = await fetch(serverRuntimeConfig.base_path + '/api/podcasts/episodes/latest/0/1')
// const epdata = await epres.json()
const flickr = await fetch('https://www.flickr.com/services/feeds/photos_public.gne?id=25875680@N05&lang=en-us&format=json&nojsoncallback=1') const flickr = await fetch('https://www.flickr.com/services/feeds/photos_public.gne?id=25875680@N05&lang=en-us&format=json&nojsoncallback=1')
const flickrdata = await flickr.json() const flickrdata = await flickr.json()
@ -21,12 +45,12 @@ export async function getServerSideProps(context) {
const pagedata = {'title': 'Angry Beanie'} const pagedata = {'title': 'Angry Beanie'}
const tadfeed = FEEDS.find((tadfeed) => tadfeed.name === "tad"); // const tadfeed = FEEDS.find((tadfeed) => tadfeed.name === "tad");
const tadfullfeed = await getFeed(tadfeed.url) // const tadfullfeed = await getFeed(tadfeed.url)
const tadfirstitem = tadfullfeed.items[0] // const tadfirstitem = tadfullfeed.items[0]
return { return {
props: { article, pagedata, episodedata: epdata.episodes, config: serverRuntimeConfig, tadfirstitem, firstimage}, // will be passed to the page component as props props: { article, pagedata, config: serverRuntimeConfig, firstimage}, // will be passed to the page component as props
} }
} }
@ -35,35 +59,69 @@ function HomePage (props) {
<div> <div>
<Head> <Head>
<title>{props.pagedata.title}</title> <title>{props.pagedata.title}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
<meta name="description" content="Angry Beanie"></meta>
<meta charSet="utf-8" />
<meta property="og-title" content="Angry Beanie - Home"></meta>
</Head> </Head>
<div className="container"> <div className="container">
<div className="frontPageImage"> <div className="frontPageImage">
<img className="header_image img-fluid" src="/images/logo.png" alt="Angry Beanie" /> <img className="header_image img-fluid" src="/images/logo.png" alt="Angry Beanie" />
</div> </div>
<div className="card col-sm-3"> <div className="row">
<h3>Latest Blog Post</h3> <div className="col-sm-4">
<Link href="/news/[slug]" as={"/news/" + props.article.slug}>{props.article.title}</Link> <div className="card">
{props.article.abstract} <div className="card-img-top">
</div> </div>
{props.episodedata.map((episode) => ( <div className="card-title">
<div className="card col-sm-3"> <h3>Latest Blog Post</h3>
<h3>Latest Podcast</h3> </div>
<Link href={episode.show_slug + "/" + episode.episode_slug}>{episode.title}</Link> <div className="card-body">
<Link href="/news/[slug]" as={"/news/" + props.article.Slug}>{props.article.Title}</Link>
<div dangerouslySetInnerHTML={{ __html:props.article.Abstract}}></div>
</div>
</div>
</div>
{/* {props.episodedata.map((episode) => (
<div className="col-sm-4">
<div className="card">
<div className="card-img-top">
<Image <Image
src={props.config.base_path + "/" + episode.logo.src} src={props.config.base_path + "/" + episode.logo.src}
alt={episode.show}
layout="fixed"
height={episode.logo.height} height={episode.logo.height}
width="100%" width={episode.logo.width}
srcSet={episode.logo.srcset}
className="card-img-top"
></Image> ></Image>
</div>
<div className="card-title">
<h3>Latest Podcast</h3>
</div>
<div className="card-body">
<Link href={"/podcasts/shows/" + episode.show_slug + "/" + episode.episode_slug}>{episode.title}</Link>
<div dangerouslySetInnerHTML={{ __html: episode.episode_lead}}></div> <div dangerouslySetInnerHTML={{ __html: episode.episode_lead}}></div>
</div> </div>
))}
<div className="card col-sm-3">
<h3>Latest Tech And Disability Post</h3>
<a href={props.tadfirstitem.link} target="_blank">{props.tadfirstitem.title}</a>
</div> </div>
<div className="card col-sm-3"> </div>
<h3>Latest Photo</h3> ))} */}
<img src={ props.firstimage.media.m } height="100" width="100"></img> <div className="col-sm-4">
<div className="card">
<div className="card-img-top">
<a href={props.firstimage.link} target="_blank">
<img className="featuredFlickr" src={ props.firstimage.media.m }></img>
</a>
</div>
<div className="card-title">
<h3>Latest Photo (clicking on the above will take you to Flickr)</h3>
</div>
<div className="card-body">
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -2,6 +2,11 @@ import "../components/main"
import getConfig from 'next/config' import getConfig from 'next/config'
import Layout from "../components/main" import Layout from "../components/main"
import StoryPager from "../components/storypager" import StoryPager from "../components/storypager"
//import { popStoryPager } from "../data/external/cms"
async function popStoryPager(page) {
}
export async function getServerSideProps(context) { export async function getServerSideProps(context) {
if(context.query.page == null || context.query.page == '0') { if(context.query.page == null || context.query.page == '0') {
@ -11,9 +16,26 @@ export async function getServerSideProps(context) {
} }
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const qs = require('qs')
const query = qs.stringify({
pagination: {
page: page,
pageSize: 5
},
sort: ['publishedAt:desc']
}, {
encodeValuesOnly: true,
})
console.log(query)
const res = await fetch(serverRuntimeConfig.base_path + `articles?${query}`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const res = await fetch(serverRuntimeConfig.base_path + `/api/documents/`+ page + `/5`) const artdata = await res.json()
const articles = await res.json() const articles = artdata
const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`) const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`)
const secdata = await secres.json() const secdata = await secres.json()

View file

@ -3,41 +3,87 @@ import "../../components/main.js"
import Layout from "../../components/main.js" import Layout from "../../components/main.js"
import FeatureImage from "../../components/featureimage.js" import FeatureImage from "../../components/featureimage.js"
import StorySideBar from '../../components/storysidebar.js' import StorySideBar from '../../components/storysidebar.js'
import { getAllPosts } from '../../data/external/cms'
import * as gtag from "../../lib/gtag" import * as gtag from "../../lib/gtag"
import Image from 'next/image'; import Image from 'next/image';
import Head from 'next/head'
export async function getServerSideProps(context) { const Article = ({article_obj, sections, pagedata, stories, serverRuntimeConfig}) => {
if (!article_obj) return null
return ( <Layout sections={sections} pagedata={pagedata}>
<Head>
<meta name="twitter:card" content="summary" key="twcard" />
<meta name="twitter:creator" content="angrybeanie" key="twhandle" />
</Head>
<div className="main_content col-md-9 col-sm-12">
{ article_obj.FeatureImage.data != null &&
<FeatureImage imagedata = {article_obj.FeatureImage.data} basepath = {serverRuntimeConfig.base_path} ></FeatureImage>
}
<h1>{ article_obj.Title }</h1>
<div className="article_body" dangerouslySetInnerHTML={{ __html: article_obj.Body }}></div>
</div>
<StorySideBar stories={stories} />
</Layout>
)
}
export default Article
export async function getStaticPaths() {
const posts = await getAllPosts()
const paths = posts.data.map((post) => ({
params: { slug: post.attributes.Slug },
}))
return {
paths,
fallback: true // false or 'blocking'
};
}
export async function getStaticProps({params}) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const slug = context.params.slug const slug = params.slug
const url = serverRuntimeConfig.base_path + '/api/document/' + slug const url = serverRuntimeConfig.base_path + 'articles?filters[Slug][$eq]=' + slug + '&populate=*'
const res = await fetch(url) const res = await fetch(url, {
const article_obj = await res.json() headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const artdata = await res.json()
const article_obj = artdata.data[0].attributes
const stories = await fetch(serverRuntimeConfig.base_path + `/api/documents/0/5`) const qs = require('qs')
const storydata = await stories.json() const query = qs.stringify({
pagination: {
limit: 5
},
sort: ['publishedAt:desc']
}, {
encodeValuesOnly: true,
})
const storiesQuery = await fetch(serverRuntimeConfig.base_path + `articles?${query}`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const storydata = await storiesQuery.json()
const stories = storydata.data
const pagedata = { const pagedata = {
'title': "Angry Beanie - " + article_obj.title 'title': "Angry Beanie - " + article_obj.Title
} }
const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections') const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections')
const secdata = await secres.json() const secdata = await secres.json()
return { return {
props: { article_obj, sections: secdata, pagedata, storydata, serverRuntimeConfig}, // will be passed to the page component as props props: { article_obj, sections: secdata, pagedata, stories, serverRuntimeConfig }, // will be passed to the page component as props
} }
} }
const Article = ({article_obj, sections, pagedata, storydata, serverRuntimeConfig}) => (
<Layout sections={sections} pagedata={pagedata}>
<div className="main_content col-md-9 col-sm-12">
<FeatureImage imagedata = {article_obj.image} basepath = {serverRuntimeConfig.base_path} ></FeatureImage>
<h1>{article_obj.title}</h1>
<div className="article_body" dangerouslySetInnerHTML={{ __html: article_obj.body }}></div>
</div>
<StorySideBar stories={storydata} />
</Layout>
)
export default Article

View file

@ -9,44 +9,62 @@ export async function getServerSideProps(context) {
const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`) const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`)
const secdata = await secres.json() const secdata = await secres.json()
const currpodcastres = await fetch(serverRuntimeConfig.base_path + `/api/podcasts/bystatus/1`) const currpodcastres = await fetch(serverRuntimeConfig.base_path + `podcast-series?filters[PodcastSeriesStatus][$eq]=Current`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const currpodcastdata = await currpodcastres.json() const currpodcastdata = await currpodcastres.json()
const currpodcastlist = currpodcastdata.data
const archpodcastres = await fetch(serverRuntimeConfig.base_path + `/api/podcasts/bystatus/0`) console.log(currpodcastlist)
const archpodcastres = await fetch(serverRuntimeConfig.base_path + `podcast-series?filters[PodcastSeriesStatus][$eq]=Archived`, {
headers: new Headers({
'Authorization': serverRuntimeConfig.strapi_token,
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const archpodcastdata = await archpodcastres.json() const archpodcastdata = await archpodcastres.json()
const archpodcastlist = archpodcastdata.data
const episodedata = "hi there" const episodedata = "hi there"
const pagedata = {'title': 'Angry Beanie - Current Podcast Projects'} const pagedata = {'title': 'Angry Beanie - Current Podcast Projects'}
return { return {
props: { sections : secdata, currpodcastdata, archpodcastdata, episodedata, pagedata, serverRuntimeConfig }, // will be passed to the page component as props props: { sections : secdata, currpodcastlist, archpodcastlist, episodedata, pagedata, serverRuntimeConfig }, // will be passed to the page component as props
} }
} }
const Podcasts = ({sections, currpodcastdata, archpodcastdata, episodedata, pagedata, serverRuntimeConfig}) => ( const Podcasts = ({sections, currpodcastlist, archpodcastlist, episodedata, pagedata, serverRuntimeConfig}) => (
<Layout sections={sections} episodedata={episodedata} pagedata={pagedata} serverRuntimeConfig> <Layout sections={sections} episodedata={episodedata} pagedata={pagedata} serverRuntimeConfig>
<h1>Podcasts</h1> <h1>Podcasts</h1>
<div className="page_body">Over the years I have made a number of podcasts.</div> <div className="page_body">Over the years I have made a number of podcasts.</div>
<div className="row"> <div className="row">
<div className="col-sm-6"> <div className="col-sm-6">
<h2>Current Podcasts</h2> <h2>Current Podcasts</h2>
{currpodcastdata.shows.map((podcast) => ( {currpodcastlist.map((podcast) => (
<div><Image <div>
{/* <Image
src={serverRuntimeConfig.base_path + "/" + podcast.logo.src} src={serverRuntimeConfig.base_path + "/" + podcast.logo.src}
height={podcast.logo.height} height={podcast.logo.height}
width={podcast.logo.width} width={podcast.logo.width}
></Image><Link href={"/podcasts/shows/" + podcast.slug}>{podcast.title}</Link></div> ></Image> */}
<Link href={"/podcasts/shows/" + podcast.attributes.Slug}>{podcast.attributes.Title}</Link></div>
))} ))}
</div> </div>
<div className="col-sm-6"> <div className="col-sm-6">
<h2>Archived Podcasts</h2> <h2>Archived Podcasts</h2>
{archpodcastdata.shows.map((podcast) => ( {archpodcastlist.map((podcast) => (
<div><Image <div>
{/* <Image
src={serverRuntimeConfig.base_path + "/" + podcast.logo.src} src={serverRuntimeConfig.base_path + "/" + podcast.logo.src}
height={podcast.logo.height} height={podcast.logo.height}
width={podcast.logo.width} width={podcast.logo.width}
></Image><Link href={"/podcasts/shows/" + podcast.slug}>{podcast.title}</Link></div> ></Image> */}
<Link href={"/podcasts/shows/" + podcast.Slug}>{podcast.Title}</Link></div>
))} ))}
</div> </div>
</div> </div>

View file

@ -1,36 +0,0 @@
import "../../components/main.js"
import Layout from "../../components/main.js"
import Link from 'next/link'
import getConfig from 'next/config'
import Image from "next/image"
export async function getServerSideProps(context) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`)
const secdata = await secres.json()
const podcastres = await fetch(serverRuntimeConfig.base_path + `/api/podcasts/bystatus/0`)
const podcastdata = await podcastres.json()
const pagedata = {'title': 'Angry Beanie - Archived Podcast Projects'}
return {
props: { sections : secdata, podcastdata, pagedata }, // will be passed to the page component as props
}
}
const PodcastArchived = ({sections, podcastdata, pagedata}) => (
<Layout sections={sections} pagedata={pagedata}>
<h1>Archived Podcasts</h1>
{podcastdata.shows.map((podcast) => (
<h1><Image
src="https://www.angrybeanie.com/uploads/media/default/0001/01/thumb_185_default_small.png"
height=""
width=""
></Image><Link href={"/podcasts/shows/" + podcast.slug}>{podcast.title}</Link></h1>
))}
</Layout>
)
export default PodcastArchived

View file

@ -1,38 +0,0 @@
import "../../components/main.js"
import Layout from "../../components/main.js"
import Link from 'next/link'
import getConfig from 'next/config'
import Image from 'next/image';
export async function getServerSideProps(context) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const secres = await fetch(serverRuntimeConfig.base_path + `/api/sections`)
const secdata = await secres.json()
const podcastres = await fetch(serverRuntimeConfig.base_path + `/api/podcasts/bystatus/1`)
const podcastdata = await podcastres.json()
const episodedata = "hi there"
const pagedata = {'title': 'Angry Beanie - Current Podcast Projects'}
return {
props: { sections : secdata, podcastdata, episodedata, pagedata }, // will be passed to the page component as props
}
}
const PodcastCurrent = ({sections, podcastdata, episodedata, pagedata}) => (
<Layout sections={sections} episodedata={episodedata} pagedata={pagedata}>
<h1>Current Podcasts</h1>
{podcastdata.shows.map((podcast) => (
<h1><Image
src={"https://www.angrybeanie.com/uploads/media/default/0001/01/thumb_185_default_small.png"}
height=""
width=""
></Image><Link href={"/podcasts/shows/" + podcast.slug}>{podcast.title}</Link></h1>
))}
</Layout>
)
export default PodcastCurrent

View file

@ -11,28 +11,39 @@ export async function getServerSideProps(context) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const slug = context.params.episode const slug = context.params.episode
console.log(serverRuntimeConfig.base_path)
const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections') const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections')
const secdata = await secres.json() const secdata = await secres.json()
const epres = await fetch(serverRuntimeConfig.base_path + "/api/podcast/episode/"+slug[1]) const epres = await fetch(serverRuntimeConfig.base_path + 'podcast-episodes?filters[Slug][$eq]='+slug[1]+'&populate=*', {
headers: new Headers({
'Authorization': 'Bearer 77df3f9be0a33ee3e91e4314e99fe649348fe15e66348fa53cc335e936345661bea7eb3c826475bc8605037d9753e334061f579aa864a5c5a7436dc3b6853ee4712c822b462156d445cebe08b3e298967829ceccb4c4aa7c61c674527ddf66514a9879b36b15732fc4f505945fbe9e23e65c0525fce834b3858936ab2ab671b7',
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const epdata = await epres.json() const epdata = await epres.json()
const episode = epdata.data[0]
console.log(epdata.data[0].attributes.Audio.data.attributes)
const sepres = await fetch(serverRuntimeConfig.base_path + "/api/podcasts/episodes/"+epdata.episode_show+"/0/5") const sepres = await fetch(serverRuntimeConfig.base_path + 'podcast-episodes?filters[podcast_sery][slug][$eq]='+slug[0], {
headers: new Headers({
'Authorization': 'Bearer 77df3f9be0a33ee3e91e4314e99fe649348fe15e66348fa53cc335e936345661bea7eb3c826475bc8605037d9753e334061f579aa864a5c5a7436dc3b6853ee4712c822b462156d445cebe08b3e298967829ceccb4c4aa7c61c674527ddf66514a9879b36b15732fc4f505945fbe9e23e65c0525fce834b3858936ab2ab671b7',
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const sepdata = await sepres.json() const sepdata = await sepres.json()
const sepisodes = sepdata.data
const audiodata = { const audiodata = {
audio_path: serverRuntimeConfig.audio_path, audio_path: serverRuntimeConfig.audio_path,
audio_mp3: epdata.audio_mp3 audio_mp3: epdata.data[0].attributes.Audio.data.attributes
} }
const pagedata = { const pagedata = {
'title': 'Angry Beanie - ' + epdata.episode_title 'title': 'Angry Beanie - ' + episode.attributes.Title
} }
return { return {
props: { pagedata, sections: secdata, episode: epdata, audiodata, sepdata } props: { pagedata, sections: secdata, episode, audiodata, sepisodes }
} }
} }
@ -42,18 +53,18 @@ const Episode = ( props ) => {
sections={props.sections} sections={props.sections}
episode={props.episode} episode={props.episode}
audiodata={props.audiodata} audiodata={props.audiodata}
sepdata={props.sepdata}> sepdata={props.sepisodes}>
<h1>{props.episode.episode_title}</h1> <h1>{props.episode.attributes.Title}</h1>
<div className="main_content col-md-9 col-sm-12"> <div className="main_content col-md-9 col-sm-12">
<AudioPlayer <AudioPlayer
src={props.audiodata.audio_path + props.audiodata.audio_mp3} src={props.audiodata.audio_path + props.audiodata.audio_mp3.url}
onPlay={e => gtag.event({action: "play", category:"audio", label: "audio started", value: props.audiodata.audio_mp3})} onPlay={e => gtag.event({action: "play", category:"audio", label: "audio started", value: props.audiodata.audio_mp3})}
onPause={e => gtag.event({action: "pause", category:"audio", label: "audio paused", value: props.audiodata.audio_mp3})} onPause={e => gtag.event({action: "pause", category:"audio", label: "audio paused", value: props.audiodata.audio_mp3})}
onEnded={e => gtag.event({action: "end", category:"audio", label: "audio ended", value: props.audiodata.audio_mp3})} onEnded={e => gtag.event({action: "end", category:"audio", label: "audio ended", value: props.audiodata.audio_mp3})}
/> />
<div className="article_body" dangerouslySetInnerHTML={{ __html: props.episode.episode_body}} /> <div className="article_body" dangerouslySetInnerHTML={{ __html: props.episode.episode_body}} />
</div> </div>
<EpisodeSideBar epdata={props.sepdata}></EpisodeSideBar> {/* <EpisodeSideBar epdata={props.sepisodes}></EpisodeSideBar> */}
</Layout>) </Layout>)
} }

View file

@ -6,8 +6,13 @@ import EpisodePager from "../../../components/episodepager.js"
export async function getServerSideProps(context) { export async function getServerSideProps(context) {
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
const slug = context.params.podcast const slug = context.params.podcast
const url = serverRuntimeConfig.base_path + '/api/podcasts/series/' + slug const url = serverRuntimeConfig.base_path + '/api/podcast-serie?filters[Slug][$eq]=' + slug
const showres = await fetch(url) const showres = await fetch(url, {
headers: new Headers({
'Authorization': 'Bearer 77df3f9be0a33ee3e91e4314e99fe649348fe15e66348fa53cc335e936345661bea7eb3c826475bc8605037d9753e334061f579aa864a5c5a7436dc3b6853ee4712c822b462156d445cebe08b3e298967829ceccb4c4aa7c61c674527ddf66514a9879b36b15732fc4f505945fbe9e23e65c0525fce834b3858936ab2ab671b7',
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const showdata = await showres.json() const showdata = await showres.json()
if(context.query.page == null || context.query.page == '0') { if(context.query.page == null || context.query.page == '0') {
@ -15,8 +20,14 @@ export async function getServerSideProps(context) {
} else { } else {
var page = Number(context.query.page) - 1 var page = Number(context.query.page) - 1
} }
const epres = await fetch(serverRuntimeConfig.base_path + "/api/podcasts/episodes/"+slug+"/"+page+"/10") const epres = await fetch(serverRuntimeConfig.base_path + "podcast-episodes?filters[podcast_sery][slug][$eq]="+slug+"&populate=*", {
headers: new Headers({
'Authorization': 'Bearer 77df3f9be0a33ee3e91e4314e99fe649348fe15e66348fa53cc335e936345661bea7eb3c826475bc8605037d9753e334061f579aa864a5c5a7436dc3b6853ee4712c822b462156d445cebe08b3e298967829ceccb4c4aa7c61c674527ddf66514a9879b36b15732fc4f505945fbe9e23e65c0525fce834b3858936ab2ab671b7',
'Content-Type': 'application/x-www-form-urlencoded'
})
})
const epdata = await epres.json() const epdata = await epres.json()
console.log(epdata.data)
const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections') const secres = await fetch(serverRuntimeConfig.base_path + '/api/sections')
const secdata = await secres.json() const secdata = await secres.json()
@ -31,7 +42,7 @@ export async function getServerSideProps(context) {
const Podcast = (props) => ( const Podcast = (props) => (
<Layout pagedata={props.pagedata} sections={props.sections} showdata={props.showdata}> <Layout pagedata={props.pagedata} sections={props.sections} showdata={props.showdata}>
<h1>{props.showdata.title}</h1> <h1>{props.showdata.title}</h1>
<EpisodePager episodedata={props.epdata} config={props.serverRuntimeConfig} showdata={props.showdata}/> <EpisodePager episodedata={props.epdata.data} config={props.serverRuntimeConfig} showdata={props.showdata}/>
</Layout> </Layout>
) )

View file

@ -0,0 +1,368 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://www.angrybeanie.com</id>
<title>Angry Beanie</title>
<updated>2022-06-12T02:41:56.148Z</updated>
<generator>Feed for Node.js</generator>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<link rel="alternate" href="https://www.angrybeanie.com"/>
<link rel="self" href="https://www.angrybeanie.com/feeds/Angry-Beanie-atom.xml"/>
<subtitle>A place for all my thoughts and projects</subtitle>
<logo>https://www.angrybeanie.com/public/images/logo.svg</logo>
<icon>https://www.angrybeanie.com/public/images/favicon.png</icon>
<rights>All rights reserved 2022, James Purser</rights>
<entry>
<title type="html"><![CDATA[Tech and Disability test]]></title>
<id>https://www.angrybeanie.com/news/tech-and-disability-test</id>
<link href="https://www.angrybeanie.com/news/tech-and-disability-test"/>
<updated>2022-06-12T02:22:08.447Z</updated>
<summary type="html"><![CDATA[<p>sdfasdfasfd</p>]]></summary>
<content type="html"><![CDATA[<p>sdfasdfasfd</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A return to Art?]]></title>
<id>https://www.angrybeanie.com/news/A-return-to-Art-</id>
<link href="https://www.angrybeanie.com/news/A-return-to-Art-"/>
<updated>2020-12-04T15:41:10.000Z</updated>
<summary type="html"><![CDATA[<p>Three blog posts in one year! This is getting to be a regular thing!</p>]]></summary>
<content type="html"><![CDATA[<p>Three blog posts in one year! This is getting to be a regular thing!</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A status update]]></title>
<id>https://www.angrybeanie.com/news/A-status-update</id>
<link href="https://www.angrybeanie.com/news/A-status-update"/>
<updated>2020-02-09T18:59:36.000Z</updated>
<summary type="html"><![CDATA[<p>Okay so here's what's been happening for the last four months</p>]]></summary>
<content type="html"><![CDATA[<p>Okay so here's what's been happening for the last four months</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A trip to the zoo]]></title>
<id>https://www.angrybeanie.com/news/A-trip-to-the-zoo</id>
<link href="https://www.angrybeanie.com/news/A-trip-to-the-zoo"/>
<updated>2020-01-19T22:29:27.000Z</updated>
<summary type="html"><![CDATA[<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>]]></summary>
<content type="html"><![CDATA[<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[So, that happened]]></title>
<id>https://www.angrybeanie.com/news/So-that-happened</id>
<link href="https://www.angrybeanie.com/news/So-that-happened"/>
<updated>2019-07-13T23:36:40.000Z</updated>
<summary type="html"><![CDATA[<p>In which i take a weeks leave and return to the office four months later</p>]]></summary>
<content type="html"><![CDATA[<p>In which i take a weeks leave and return to the office four months later</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[2019 Projects]]></title>
<id>https://www.angrybeanie.com/news/2019-Projects</id>
<link href="https://www.angrybeanie.com/news/2019-Projects"/>
<updated>2019-01-05T16:03:06.000Z</updated>
<summary type="html"><![CDATA[<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>]]></summary>
<content type="html"><![CDATA[<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[That was 2018, let us never speak of it again]]></title>
<id>https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again</id>
<link href="https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again"/>
<updated>2018-12-28T15:48:13.000Z</updated>
<summary type="html"><![CDATA[<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>]]></summary>
<content type="html"><![CDATA[<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A rose by any other name]]></title>
<id>https://www.angrybeanie.com/news/A-rose-by-any-other-name</id>
<link href="https://www.angrybeanie.com/news/A-rose-by-any-other-name"/>
<updated>2018-11-03T13:56:03.000Z</updated>
<summary type="html"><![CDATA[<p>Is radio actually radio if there&#39;s no radio waves involved?</p>]]></summary>
<content type="html"><![CDATA[<p>Is radio actually radio if there&#39;s no radio waves involved?</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Snap happy]]></title>
<id>https://www.angrybeanie.com/news/Snap-happy</id>
<link href="https://www.angrybeanie.com/news/Snap-happy"/>
<updated>2018-10-13T14:08:23.000Z</updated>
<summary type="html"><![CDATA[<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>]]></summary>
<content type="html"><![CDATA[<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Angry Beanie Weekly]]></title>
<id>https://www.angrybeanie.com/news/Angry-Beanie-Weekly</id>
<link href="https://www.angrybeanie.com/news/Angry-Beanie-Weekly"/>
<updated>2018-08-25T19:36:31.000Z</updated>
<summary type="html"><![CDATA[<p>Because announcing it means I have to do it!</p>]]></summary>
<content type="html"><![CDATA[<p>Because announcing it means I have to do it!</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Piwiking the Mastodon]]></title>
<id>https://www.angrybeanie.com/news/Piwiking-the-Mastodon</id>
<link href="https://www.angrybeanie.com/news/Piwiking-the-Mastodon"/>
<updated>2018-08-18T18:03:10.000Z</updated>
<summary type="html"><![CDATA[<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>]]></summary>
<content type="html"><![CDATA[<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A quick site update]]></title>
<id>https://www.angrybeanie.com/news/A-quick-site-update</id>
<link href="https://www.angrybeanie.com/news/A-quick-site-update"/>
<updated>2018-08-02T19:17:59.000Z</updated>
<summary type="html"><![CDATA[<p>Added AMP support to the blog. Just for myself really.</p>]]></summary>
<content type="html"><![CDATA[<p>Added AMP support to the blog. Just for myself really.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Sooo, blogging? Oh and actual podcast ideas]]></title>
<id>https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas</id>
<link href="https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas"/>
<updated>2018-07-20T17:51:32.000Z</updated>
<summary type="html"><![CDATA[<p>Yeah of course it didn&#39;t happen</p>]]></summary>
<content type="html"><![CDATA[<p>Yeah of course it didn&#39;t happen</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[A return to blogging]]></title>
<id>https://www.angrybeanie.com/news/A-return-to-blogging</id>
<link href="https://www.angrybeanie.com/news/A-return-to-blogging"/>
<updated>2018-04-27T19:05:31.000Z</updated>
<summary type="html"><![CDATA[<p>Just when you thought it was safe</p>]]></summary>
<content type="html"><![CDATA[<p>Just when you thought it was safe</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Women In STEMM Success!]]></title>
<id>https://www.angrybeanie.com/news/Women-In-STEMM-Success-</id>
<link href="https://www.angrybeanie.com/news/Women-In-STEMM-Success-"/>
<updated>2018-02-09T20:05:52.000Z</updated>
<summary type="html"><![CDATA[<p>Yes, that&#39;s right!</p>
<p>Success!</p>
<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>]]></summary>
<content type="html"><![CDATA[<p>Yes, that&#39;s right!</p>
<p>Success!</p>
<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[First stream, and it was alright]]></title>
<id>https://www.angrybeanie.com/news/First-stream-and-it-was-alright</id>
<link href="https://www.angrybeanie.com/news/First-stream-and-it-was-alright"/>
<updated>2018-01-29T23:25:02.000Z</updated>
<summary type="html"><![CDATA[<p>The first Angry Beanie Game Day stream happened on Sunday.</p>]]></summary>
<content type="html"><![CDATA[<p>The first Angry Beanie Game Day stream happened on Sunday.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[2018 - The Year Ahead]]></title>
<id>https://www.angrybeanie.com/news/2018-The-Year-Ahead</id>
<link href="https://www.angrybeanie.com/news/2018-The-Year-Ahead"/>
<updated>2018-01-01T10:48:20.000Z</updated>
<summary type="html"><![CDATA[<p>What will the new year bring for the Angry Beanie?</p>]]></summary>
<content type="html"><![CDATA[<p>What will the new year bring for the Angry Beanie?</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[Getting over that hump]]></title>
<id>https://www.angrybeanie.com/news/Getting-over-that-hump</id>
<link href="https://www.angrybeanie.com/news/Getting-over-that-hump"/>
<updated>2017-12-02T13:18:19.000Z</updated>
<summary type="html"><![CDATA[<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>]]></summary>
<content type="html"><![CDATA[<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
<entry>
<title type="html"><![CDATA[So, yet another new site?]]></title>
<id>https://www.angrybeanie.com/news/So-yet-another-new-site-</id>
<link href="https://www.angrybeanie.com/news/So-yet-another-new-site-"/>
<updated>2017-10-28T21:54:29.000Z</updated>
<summary type="html"><![CDATA[<p>Well yes. Isn&#39;t it, minimalist?</p>]]></summary>
<content type="html"><![CDATA[<p>Well yes. Isn&#39;t it, minimalist?</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
</feed>

View file

@ -0,0 +1,242 @@
{
"version": "https://jsonfeed.org/version/1",
"title": "Angry Beanie",
"home_page_url": "https://www.angrybeanie.com",
"feed_url": "https://www.angrybeanie.com/feeds/Angry-Beanie-feed.json",
"description": "A place for all my thoughts and projects",
"icon": "https://www.angrybeanie.com/public/images/logo.svg",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
},
"items": [
{
"id": "https://www.angrybeanie.com/news/tech-and-disability-test",
"content_html": "<p>sdfasdfasfd</p>",
"url": "https://www.angrybeanie.com/news/tech-and-disability-test",
"title": "Tech and Disability test",
"summary": "<p>sdfasdfasfd</p>",
"date_modified": "2022-06-12T02:22:08.447Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-return-to-Art-",
"content_html": "<p>Three blog posts in one year! This is getting to be a regular thing!</p>",
"url": "https://www.angrybeanie.com/news/A-return-to-Art-",
"title": "A return to Art?",
"summary": "<p>Three blog posts in one year! This is getting to be a regular thing!</p>",
"date_modified": "2020-12-04T15:41:10.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-status-update",
"content_html": "<p>Okay so here's what's been happening for the last four months</p>",
"url": "https://www.angrybeanie.com/news/A-status-update",
"title": "A status update",
"summary": "<p>Okay so here's what's been happening for the last four months</p>",
"date_modified": "2020-02-09T18:59:36.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-trip-to-the-zoo",
"content_html": "<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>",
"url": "https://www.angrybeanie.com/news/A-trip-to-the-zoo",
"title": "A trip to the zoo",
"summary": "<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>",
"date_modified": "2020-01-19T22:29:27.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/So-that-happened",
"content_html": "<p>In which i take a weeks leave and return to the office four months later</p>",
"url": "https://www.angrybeanie.com/news/So-that-happened",
"title": "So, that happened",
"summary": "<p>In which i take a weeks leave and return to the office four months later</p>",
"date_modified": "2019-07-13T23:36:40.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/2019-Projects",
"content_html": "<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>",
"url": "https://www.angrybeanie.com/news/2019-Projects",
"title": "2019 Projects",
"summary": "<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>",
"date_modified": "2019-01-05T16:03:06.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again",
"content_html": "<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>",
"url": "https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again",
"title": "That was 2018, let us never speak of it again",
"summary": "<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>",
"date_modified": "2018-12-28T15:48:13.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-rose-by-any-other-name",
"content_html": "<p>Is radio actually radio if there&#39;s no radio waves involved?</p>",
"url": "https://www.angrybeanie.com/news/A-rose-by-any-other-name",
"title": "A rose by any other name",
"summary": "<p>Is radio actually radio if there&#39;s no radio waves involved?</p>",
"date_modified": "2018-11-03T13:56:03.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Snap-happy",
"content_html": "<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>",
"url": "https://www.angrybeanie.com/news/Snap-happy",
"title": "Snap happy",
"summary": "<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>",
"date_modified": "2018-10-13T14:08:23.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Angry-Beanie-Weekly",
"content_html": "<p>Because announcing it means I have to do it!</p>",
"url": "https://www.angrybeanie.com/news/Angry-Beanie-Weekly",
"title": "Angry Beanie Weekly",
"summary": "<p>Because announcing it means I have to do it!</p>",
"date_modified": "2018-08-25T19:36:31.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Piwiking-the-Mastodon",
"content_html": "<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>",
"url": "https://www.angrybeanie.com/news/Piwiking-the-Mastodon",
"title": "Piwiking the Mastodon",
"summary": "<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>",
"date_modified": "2018-08-18T18:03:10.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-quick-site-update",
"content_html": "<p>Added AMP support to the blog. Just for myself really.</p>",
"url": "https://www.angrybeanie.com/news/A-quick-site-update",
"title": "A quick site update",
"summary": "<p>Added AMP support to the blog. Just for myself really.</p>",
"date_modified": "2018-08-02T19:17:59.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas",
"content_html": "<p>Yeah of course it didn&#39;t happen</p>",
"url": "https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas",
"title": "Sooo, blogging? Oh and actual podcast ideas",
"summary": "<p>Yeah of course it didn&#39;t happen</p>",
"date_modified": "2018-07-20T17:51:32.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/A-return-to-blogging",
"content_html": "<p>Just when you thought it was safe</p>",
"url": "https://www.angrybeanie.com/news/A-return-to-blogging",
"title": "A return to blogging",
"summary": "<p>Just when you thought it was safe</p>",
"date_modified": "2018-04-27T19:05:31.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Women-In-STEMM-Success-",
"content_html": "<p>Yes, that&#39;s right!</p>\r\n\r\n<p>Success!</p>\r\n\r\n<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>",
"url": "https://www.angrybeanie.com/news/Women-In-STEMM-Success-",
"title": "Women In STEMM Success!",
"summary": "<p>Yes, that&#39;s right!</p>\r\n\r\n<p>Success!</p>\r\n\r\n<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>",
"date_modified": "2018-02-09T20:05:52.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/First-stream-and-it-was-alright",
"content_html": "<p>The first Angry Beanie Game Day stream happened on Sunday.</p>",
"url": "https://www.angrybeanie.com/news/First-stream-and-it-was-alright",
"title": "First stream, and it was alright",
"summary": "<p>The first Angry Beanie Game Day stream happened on Sunday.</p>",
"date_modified": "2018-01-29T23:25:02.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/2018-The-Year-Ahead",
"content_html": "<p>What will the new year bring for the Angry Beanie?</p>",
"url": "https://www.angrybeanie.com/news/2018-The-Year-Ahead",
"title": "2018 - The Year Ahead",
"summary": "<p>What will the new year bring for the Angry Beanie?</p>",
"date_modified": "2018-01-01T10:48:20.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/Getting-over-that-hump",
"content_html": "<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>",
"url": "https://www.angrybeanie.com/news/Getting-over-that-hump",
"title": "Getting over that hump",
"summary": "<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>",
"date_modified": "2017-12-02T13:18:19.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
},
{
"id": "https://www.angrybeanie.com/news/So-yet-another-new-site-",
"content_html": "<p>Well yes. Isn&#39;t it, minimalist?</p>",
"url": "https://www.angrybeanie.com/news/So-yet-another-new-site-",
"title": "So, yet another new site?",
"summary": "<p>Well yes. Isn&#39;t it, minimalist?</p>",
"date_modified": "2017-10-28T21:54:29.000Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
}
]
}

View file

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Angry Beanie</title>
<link>https://www.angrybeanie.com</link>
<description>A place for all my thoughts and projects</description>
<lastBuildDate>Sun, 12 Jun 2022 02:41:56 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>Feed for Node.js</generator>
<image>
<title>Angry Beanie</title>
<url>https://www.angrybeanie.com/public/images/logo.svg</url>
<link>https://www.angrybeanie.com</link>
</image>
<copyright>All rights reserved 2022, James Purser</copyright>
<item>
<title><![CDATA[Tech and Disability test]]></title>
<link>https://www.angrybeanie.com/news/tech-and-disability-test</link>
<guid>https://www.angrybeanie.com/news/tech-and-disability-test</guid>
<pubDate>Sun, 12 Jun 2022 02:22:08 GMT</pubDate>
<description><![CDATA[<p>sdfasdfasfd</p>]]></description>
<content:encoded><![CDATA[<p>sdfasdfasfd</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A return to Art?]]></title>
<link>https://www.angrybeanie.com/news/A-return-to-Art-</link>
<guid>https://www.angrybeanie.com/news/A-return-to-Art-</guid>
<pubDate>Fri, 04 Dec 2020 15:41:10 GMT</pubDate>
<description><![CDATA[<p>Three blog posts in one year! This is getting to be a regular thing!</p>]]></description>
<content:encoded><![CDATA[<p>Three blog posts in one year! This is getting to be a regular thing!</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A status update]]></title>
<link>https://www.angrybeanie.com/news/A-status-update</link>
<guid>https://www.angrybeanie.com/news/A-status-update</guid>
<pubDate>Sun, 09 Feb 2020 18:59:36 GMT</pubDate>
<description><![CDATA[<p>Okay so here's what's been happening for the last four months</p>]]></description>
<content:encoded><![CDATA[<p>Okay so here's what's been happening for the last four months</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A trip to the zoo]]></title>
<link>https://www.angrybeanie.com/news/A-trip-to-the-zoo</link>
<guid>https://www.angrybeanie.com/news/A-trip-to-the-zoo</guid>
<pubDate>Sun, 19 Jan 2020 22:29:27 GMT</pubDate>
<description><![CDATA[<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>]]></description>
<content:encoded><![CDATA[<p>In which I visit Sydney Zoo (the one near Rooty Hill)</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[So, that happened]]></title>
<link>https://www.angrybeanie.com/news/So-that-happened</link>
<guid>https://www.angrybeanie.com/news/So-that-happened</guid>
<pubDate>Sat, 13 Jul 2019 23:36:40 GMT</pubDate>
<description><![CDATA[<p>In which i take a weeks leave and return to the office four months later</p>]]></description>
<content:encoded><![CDATA[<p>In which i take a weeks leave and return to the office four months later</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[2019 Projects]]></title>
<link>https://www.angrybeanie.com/news/2019-Projects</link>
<guid>https://www.angrybeanie.com/news/2019-Projects</guid>
<pubDate>Sat, 05 Jan 2019 16:03:06 GMT</pubDate>
<description><![CDATA[<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>]]></description>
<content:encoded><![CDATA[<p>Women In STEMM, Interesting People, Exploring the World, How To Media and more</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[That was 2018, let us never speak of it again]]></title>
<link>https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again</link>
<guid>https://www.angrybeanie.com/news/That-was-2018-let-us-never-speak-of-it-again</guid>
<pubDate>Fri, 28 Dec 2018 15:48:13 GMT</pubDate>
<description><![CDATA[<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>]]></description>
<content:encoded><![CDATA[<p>2018 was basically a complete wash when it came to Angry Beanie foo. I&#39;m planning/hoping for 2019 to be better.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A rose by any other name]]></title>
<link>https://www.angrybeanie.com/news/A-rose-by-any-other-name</link>
<guid>https://www.angrybeanie.com/news/A-rose-by-any-other-name</guid>
<pubDate>Sat, 03 Nov 2018 13:56:03 GMT</pubDate>
<description><![CDATA[<p>Is radio actually radio if there&#39;s no radio waves involved?</p>]]></description>
<content:encoded><![CDATA[<p>Is radio actually radio if there&#39;s no radio waves involved?</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Snap happy]]></title>
<link>https://www.angrybeanie.com/news/Snap-happy</link>
<guid>https://www.angrybeanie.com/news/Snap-happy</guid>
<pubDate>Sat, 13 Oct 2018 14:08:23 GMT</pubDate>
<description><![CDATA[<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>]]></description>
<content:encoded><![CDATA[<p>A picture tells a thousand words. A thousand pictures tells a life time.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Angry Beanie Weekly]]></title>
<link>https://www.angrybeanie.com/news/Angry-Beanie-Weekly</link>
<guid>https://www.angrybeanie.com/news/Angry-Beanie-Weekly</guid>
<pubDate>Sat, 25 Aug 2018 19:36:31 GMT</pubDate>
<description><![CDATA[<p>Because announcing it means I have to do it!</p>]]></description>
<content:encoded><![CDATA[<p>Because announcing it means I have to do it!</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Piwiking the Mastodon]]></title>
<link>https://www.angrybeanie.com/news/Piwiking-the-Mastodon</link>
<guid>https://www.angrybeanie.com/news/Piwiking-the-Mastodon</guid>
<pubDate>Sat, 18 Aug 2018 18:03:10 GMT</pubDate>
<description><![CDATA[<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>]]></description>
<content:encoded><![CDATA[<p>Got inspired and installed a couple of FOSS projects this weekend. Mastodon and Piwik/Mamoto</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A quick site update]]></title>
<link>https://www.angrybeanie.com/news/A-quick-site-update</link>
<guid>https://www.angrybeanie.com/news/A-quick-site-update</guid>
<pubDate>Thu, 02 Aug 2018 19:17:59 GMT</pubDate>
<description><![CDATA[<p>Added AMP support to the blog. Just for myself really.</p>]]></description>
<content:encoded><![CDATA[<p>Added AMP support to the blog. Just for myself really.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Sooo, blogging? Oh and actual podcast ideas]]></title>
<link>https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas</link>
<guid>https://www.angrybeanie.com/news/Sooo-blogging-Oh-and-actual-podcast-ideas</guid>
<pubDate>Fri, 20 Jul 2018 17:51:32 GMT</pubDate>
<description><![CDATA[<p>Yeah of course it didn&#39;t happen</p>]]></description>
<content:encoded><![CDATA[<p>Yeah of course it didn&#39;t happen</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[A return to blogging]]></title>
<link>https://www.angrybeanie.com/news/A-return-to-blogging</link>
<guid>https://www.angrybeanie.com/news/A-return-to-blogging</guid>
<pubDate>Fri, 27 Apr 2018 19:05:31 GMT</pubDate>
<description><![CDATA[<p>Just when you thought it was safe</p>]]></description>
<content:encoded><![CDATA[<p>Just when you thought it was safe</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Women In STEMM Success!]]></title>
<link>https://www.angrybeanie.com/news/Women-In-STEMM-Success-</link>
<guid>https://www.angrybeanie.com/news/Women-In-STEMM-Success-</guid>
<pubDate>Fri, 09 Feb 2018 20:05:52 GMT</pubDate>
<description><![CDATA[<p>Yes, that&#39;s right!</p>
<p>Success!</p>
<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>]]></description>
<content:encoded><![CDATA[<p>Yes, that&#39;s right!</p>
<p>Success!</p>
<p>Last week I finally did an interview for an episode of Women In&nbsp; STEMM.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[First stream, and it was alright]]></title>
<link>https://www.angrybeanie.com/news/First-stream-and-it-was-alright</link>
<guid>https://www.angrybeanie.com/news/First-stream-and-it-was-alright</guid>
<pubDate>Mon, 29 Jan 2018 23:25:02 GMT</pubDate>
<description><![CDATA[<p>The first Angry Beanie Game Day stream happened on Sunday.</p>]]></description>
<content:encoded><![CDATA[<p>The first Angry Beanie Game Day stream happened on Sunday.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[2018 - The Year Ahead]]></title>
<link>https://www.angrybeanie.com/news/2018-The-Year-Ahead</link>
<guid>https://www.angrybeanie.com/news/2018-The-Year-Ahead</guid>
<pubDate>Mon, 01 Jan 2018 10:48:20 GMT</pubDate>
<description><![CDATA[<p>What will the new year bring for the Angry Beanie?</p>]]></description>
<content:encoded><![CDATA[<p>What will the new year bring for the Angry Beanie?</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[Getting over that hump]]></title>
<link>https://www.angrybeanie.com/news/Getting-over-that-hump</link>
<guid>https://www.angrybeanie.com/news/Getting-over-that-hump</guid>
<pubDate>Sat, 02 Dec 2017 13:18:19 GMT</pubDate>
<description><![CDATA[<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>]]></description>
<content:encoded><![CDATA[<p>One of my biggest problems isn&#39;t sourcing ideas, it&#39;s convincing myself that I can do them justice.</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
<item>
<title><![CDATA[So, yet another new site?]]></title>
<link>https://www.angrybeanie.com/news/So-yet-another-new-site-</link>
<guid>https://www.angrybeanie.com/news/So-yet-another-new-site-</guid>
<pubDate>Sat, 28 Oct 2017 21:54:29 GMT</pubDate>
<description><![CDATA[<p>Well yes. Isn&#39;t it, minimalist?</p>]]></description>
<content:encoded><![CDATA[<p>Well yes. Isn&#39;t it, minimalist?</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
</channel>
</rss>

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://www.angrybeanie.com</id>
<title>tech-and-disability</title>
<updated>2022-06-12T02:41:56.172Z</updated>
<generator>Feed for Node.js</generator>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<link rel="alternate" href="https://www.angrybeanie.com"/>
<link rel="self" href="https://www.angrybeanie.com/feeds/tech-and-disability-atom.xml"/>
<subtitle>A place for all my thoughts and projects</subtitle>
<logo>https://www.angrybeanie.com/public/images/logo.svg</logo>
<icon>https://www.angrybeanie.com/public/images/favicon.png</icon>
<rights>All rights reserved 2022, James Purser</rights>
<entry>
<title type="html"><![CDATA[Tech and Disability test]]></title>
<id>https://www.angrybeanie.com/news/tech-and-disability-test</id>
<link href="https://www.angrybeanie.com/news/tech-and-disability-test"/>
<updated>2022-06-12T02:22:08.447Z</updated>
<summary type="html"><![CDATA[<p>sdfasdfasfd</p>]]></summary>
<content type="html"><![CDATA[<p>sdfasdfasfd</p>]]></content>
<author>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</author>
<contributor>
<name>James Purser</name>
<email>james@angrybeanie.com</email>
<uri>https://twitter.com/purserj</uri>
</contributor>
</entry>
</feed>

View file

@ -0,0 +1,26 @@
{
"version": "https://jsonfeed.org/version/1",
"title": "tech-and-disability",
"home_page_url": "https://www.angrybeanie.com",
"feed_url": "https://www.angrybeanie.com/feeds/tech-and-disability-feed.json",
"description": "A place for all my thoughts and projects",
"icon": "https://www.angrybeanie.com/public/images/logo.svg",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
},
"items": [
{
"id": "https://www.angrybeanie.com/news/tech-and-disability-test",
"content_html": "<p>sdfasdfasfd</p>",
"url": "https://www.angrybeanie.com/news/tech-and-disability-test",
"title": "Tech and Disability test",
"summary": "<p>sdfasdfasfd</p>",
"date_modified": "2022-06-12T02:22:08.447Z",
"author": {
"name": "James Purser",
"url": "https://twitter.com/purserj"
}
}
]
}

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>tech-and-disability</title>
<link>https://www.angrybeanie.com</link>
<description>A place for all my thoughts and projects</description>
<lastBuildDate>Sun, 12 Jun 2022 02:41:56 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>Feed for Node.js</generator>
<image>
<title>tech-and-disability</title>
<url>https://www.angrybeanie.com/public/images/logo.svg</url>
<link>https://www.angrybeanie.com</link>
</image>
<copyright>All rights reserved 2022, James Purser</copyright>
<item>
<title><![CDATA[Tech and Disability test]]></title>
<link>https://www.angrybeanie.com/news/tech-and-disability-test</link>
<guid>https://www.angrybeanie.com/news/tech-and-disability-test</guid>
<pubDate>Sun, 12 Jun 2022 02:22:08 GMT</pubDate>
<description><![CDATA[<p>sdfasdfasfd</p>]]></description>
<content:encoded><![CDATA[<p>sdfasdfasfd</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
</item>
</channel>
</rss>

27
public/feeds/women-in-stemm.xml Executable file
View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Women In STEMM</title>
<link>https://www.angrybeanie.com</link>
<description>&lt;p&gt;Women In STEMM&lt;/p&gt;</description>
<lastBuildDate>Sun, 12 Jun 2022 02:41:56 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>Feed for Node.js</generator>
<image>
<title>Women In STEMM</title>
<url>https://www.angrybeanie.com/public/images/logo.svg</url>
<link>https://www.angrybeanie.com</link>
</image>
<copyright>All rights reserved 2022, James Purser</copyright>
<item>
<title><![CDATA[Dr Alice Gorman]]></title>
<link>https://www.angrybeanie.com/shows/women-in-stemm/dr-alice-gorman</link>
<guid>https://www.angrybeanie.com/shows/women-in-stemm/dr-alice-gorman</guid>
<pubDate>Sun, 12 Jun 2022 01:30:05 GMT</pubDate>
<description><![CDATA[<p>adfadfasdfd</p>]]></description>
<content:encoded><![CDATA[<p>adfadfasdfd</p>]]></content:encoded>
<author>james@angrybeanie.com (James Purser)</author>
<enclosure length="0" type="audio/mpeg" url="https://www.angrybeanie.com/uploads/women_in_stemm_dr_Alice_Gorman_294d9c6c80.mp3" title="women_in_stemm_-_dr_Alice_Gorman.mp3" duration="0"/>
</item>
</channel>
</rss>

3580
yarn.lock Executable file

File diff suppressed because it is too large Load diff