import { Feed } from "feed" import { Podcast } from 'podcast'; import getConfig from 'next/config' import { getAllPodcastSeries, getAllPosts, getProjectDetails } from "../external/cms" import fs from "fs" import config from './config' import htmlFindReplaceElementAttrs from "html-find-replace-element-attrs" import Image from "next/legacy/image" export const generateRssFeed = async (filter) => { const project = await getProjectDetails(filter); const posts = typeof filter === "undefined" ? await getAllPosts() : await getAllPosts(project.data[0].attributes.Slug); const siteURL = config.siteURL; const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const date = new Date(); const Title = typeof filter === "undefined" ? "Angry Beanie" : project.data[0].attributes.Title const Description = typeof filter == "undefined" ? "A place for all my thoughts and projects" : project.data[0].attributes.Description const feedTitle = typeof filter === "undefined" ? "Angry-Beanie" : project.data[0].attributes.Slug const author = { name: "James Purser", email: "james@angrybeanie.com", link: "https://twitter.com/purserj", }; const feed = new Feed({ title: Title, description: 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}/feed/${feedTitle}-feed.xml`, json: `${siteURL}/feed/${feedTitle}-feed.json`, atom: `${siteURL}/feed/${feedTitle}-atom.xml`, }, author, }); posts.data.forEach((post) => { const url = `${siteURL}/news/${post.attributes.Slug}`; const body = htmlFindReplaceElementAttrs.replace( post.attributes.FullBody, item => item.parsedUrl, { tag: "img", attr: "src", parseAttrValueAsUrl: true, baseUrl: config.siteURL, urlProtocol: "https", } ) var fullbody; if (post.attributes.FeatureImage.data) { const imagepath = serverRuntimeConfig.media_path + post.attributes.FeatureImage.data.attributes.formats.large.url const featuredImage = console.log(featuredImage) fullbody = "

"+body } else { fullbody = body } feed.addItem({ title: post.attributes.Title, id: url, link: url, description: fullbody, content: fullbody, author: [author], contributor: [author], date: new Date(post.attributes.publishedAt), }); }); fs.mkdirSync("./public/feed", { recursive: true }); fs.writeFileSync(`./public/feed/${feedTitle}-feed.xml`, feed.rss2()); fs.writeFileSync(`./public/feed/${feedTitle}-atom.xml`, feed.atom1()); fs.writeFileSync(`./public/feed/${feedTitle}-feed.json`, feed.json1()); } export const generatePodcastFeeds = async () => { const podcastSeries = await getAllPodcastSeries() const siteURL = config.siteURL; const author = { name: "James Purser", email: "james@angrybeanie.com", link: "https://aus.social/purserj", }; const date = new Date(); podcastSeries.data.forEach((series) => { const feed = new Podcast({ itunesAuthor: "James Purser", itunesOwner: { name: "James Purser", email: "james@angrybeanie.com" }, title: series.attributes.Title, description: series.attributes.Description, id: siteURL + "/podcasts/shows/" + series.attributes.Slug, link: siteURL + "/podcasts/shows/" + series.attributes.Slug, image: `${siteURL}` + series.attributes.Logo.data.attributes.url, itunesImage: `${siteURL}` + series.attributes.Logo.data.attributes.url, 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`, } }); console.log(feed) const episodes = series.attributes.podcast_episodes.data episodes.forEach((episode) => { const url = `${siteURL}/podcasts/shows/${series.attributes.Slug}/${episode.attributes.Slug}`; const media_url = `${siteURL}${episode.attributes.Audio_MP3.data.attributes.url}` const media = { url: media_url, type: episode.attributes.Audio_MP3.data.attributes.mime, length: 0, title: episode.attributes.Audio_MP3.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 }) }) fs.writeFileSync(`./public/feed/${series.attributes.Slug}.xml`, feed.buildXml()); }) }