Files
rpg-static-site/content/episodes/episodes.11tydata.js
Anthony Correa 385694fb75 feat: enhance podcast functionality and build pipeline
- Dynamically resolve image paths for podcast episodes in `episodes.11tydata.js`
- Add podcast metadata handling with inferred URLs for MP3 and transcripts
- Introduce search functionality with Lunr.js and a search index generator
- Update Eleventy path prefix handling to support environment variable override
- Add `.mp4` files to `.gitignore`
- Expand VSCode settings to include Markdown-Eleventy support and improved terminal history
- Add deployment script (`deploy.sh`) with remote rsync-based deployment and permission handling
- Adjust episode layout to use dynamic image paths and updated podcast metadata
- Add search and members page updates, including new URLs and search integration
- Update dependencies to include `html-to-text` and related packages for search indexing
2024-12-23 13:30:22 -06:00

83 lines
2.4 KiB
JavaScript

const {seasonEpisodeFormat, episodeNumber} = require('../../utils/filters');
const fs = require('fs/promises');
path = require('path')
module.exports = {
"layout": "episode",
"tags":['episode'],
"eleventyComputed": {
"episode": "{{page.fileSlug | episodeNumber: episode}}",
"image": async (data) => {
const image_locations_promises = [
data.image,
`${data.page.filePathStem}.jpg`,
`${data.page.filePathStem}.png`,
'../image.jpg',
'../image.png',
'../../image.jpg',
'../../image.png'
].filter(image_path=>image_path).map((image_path)=>
fs.access(path.resolve(data.page.inputPath, image_path))
.then(()=>path.resolve(data.page.filePathStem, image_path))
.catch(()=>null)
)
return (await Promise.all(image_locations_promises)).find(i=>i)
},
"podcast": podcastData
}
}
async function podcastData (data) {
var file_stem
if (data.season === 1) {
file_stem = `ep${data.episode}`
} else {
file_stem = `${seasonEpisodeFormat(null, data).toLowerCase()}`
}
const mp3_exists_promise = new Promise ((resolve, reject) => {
if (data.podcast.enclosureUrl) {
resolve(data.podcast.enclosureUrl)
} else {
const url = `${data.site.cdn}/${file_stem}.mp3`
console.log(`Inferring URL @ ${url} for ${data.page.url}`)
fetch(url, { method: "HEAD" })
.then((res)=>{
if (res.ok) {
resolve(`${url}`)
} else {
reject(new Error(`No file at ${url}`));
}
})
}
}).catch((e)=>{return null})
const transcript_exists_promise = new Promise ((resolve, reject) => {
if (data.podcast.transcriptUrl) {
resolve(data.podcast.transcriptUrl)
} else {
const url = `${data.site.cdn}/${file_stem}.srt`
console.log(`Inferring URL @ ${url}`)
fetch(url, { method: "HEAD" })
.then((res)=>{
if (res.ok) {
resolve(`${url}`)
} else {
reject(new Error(`No file at ${url}`));
}
})
}
}).catch((e)=>{return null})
const result = {
"enclosureUrl": await mp3_exists_promise,
"transcriptUrl": await transcript_exists_promise,
"title": data.podcast.title || `${seasonEpisodeFormat(null, data)}: ${data.title || "Episode " + data.episode}`,
"image" : data.podcast.image || data.image
}
if (result.enclosureUrl != null) {
return result
} else {
return false
}
}