diff --git a/.gitignore b/.gitignore index 7722e70..3c94ab5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ dist .env .DS_Store */.vscode +.cache \ No newline at end of file diff --git a/.vscode/markdown.code-snippets b/.vscode/markdown.code-snippets new file mode 100644 index 0000000..8d9a369 --- /dev/null +++ b/.vscode/markdown.code-snippets @@ -0,0 +1,39 @@ +{ +"Season 5 Show Notes": { + "prefix": ";s5", + "body":[ + "---", + "title: ${title}", + "date: ${date}", + "---", + "{% prologue %}", + "${newspaperName}", + "===", + "${newspaperTagline}", + "{% timeTag date %}", + "\n## ${newspaperHeadline}", + "${newspaperSubheadline}\n", + "${article}" + "{% endprologue%}", + "\n{% alternateTitles%}", + "\n${alternateTitles}\n", + "{% endalternateTitles%}", + ] + }, + "Season 1 Show Notes": { + "prefix": ";s1", + "body":[ + "---", + "title: ${title}", + "date: ${date}", + "---", + "# Prologue", + "
", + "\n# Episode {{episode}}", + "\n## ${headline}", + "**${subHeadline}**", + "\n${content}\n", + "
" + ] + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 0d91422..50bb5fe 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,18 +1,22 @@ { "files.exclude": { - // "dist/": true - "**/.obsidian/": true + "dist/": false, + "**/.obsidian/": true, + "node_modules":true }, "files.associations": { "*.md": "markdown-eleventy" }, - "terminal.integrated.env.osx": { "VSCODE_HISTFILE": "${workspaceFolder}/.vscode/.zsh_history", }, "[markdown-eleventy]": { "editor.wordWrap": "on", "editor.wordWrapColumn": 80, // Optional: Set to your preferred wrap column - "editor.quickSuggestions": false // Optional: Disable suggestions for Markdown + "editor.quickSuggestions": { + "comments": "off", + "strings": "off", + "other": "off" + } // Optional: Disable suggestions for Markdown } } \ No newline at end of file diff --git a/content/episodes/episodes.11tydata.js b/content/episodes/episodes.11tydata.js index 00d5b9f..2bd4cd6 100644 --- a/content/episodes/episodes.11tydata.js +++ b/content/episodes/episodes.11tydata.js @@ -39,7 +39,6 @@ async function podcastData (data) { 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) { @@ -56,7 +55,6 @@ async function podcastData (data) { 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) { diff --git a/content/episodes/image.jpg b/content/episodes/image.jpg new file mode 100755 index 0000000..f8c94a8 Binary files /dev/null and b/content/episodes/image.jpg differ diff --git a/content/episodes/s05/e32.md b/content/episodes/s05/e32.md index 1134512..3f7e7ff 100644 --- a/content/episodes/s05/e32.md +++ b/content/episodes/s05/e32.md @@ -2,7 +2,6 @@ title: I'm A Little Mindfreak date: 2024-12-16 --- - {% prologue %} Mindflayer Monday === diff --git a/content/episodes/search-index.11ty.js b/content/episodes/search-index.11ty.js index 86a5ef2..8261685 100644 --- a/content/episodes/search-index.11ty.js +++ b/content/episodes/search-index.11ty.js @@ -1,6 +1,4 @@ -import markdownit from 'markdown-it'; -import { convert } from 'html-to-text'; -const md = markdownit({html: true}) +const { convert } = require('html-to-text'); class SearchIndex { data() { @@ -12,7 +10,12 @@ class SearchIndex { return { url:`${this.url(episode.url)}`, title: episode.data.title, - text: convert (episode.content), + text: convert (episode.content, { + selectors: [ + { selector: 'hr', format: 'skip' }, + { selector: 'img', format: 'skip'} + ] + }), season: episode.data.season, episode: episode.data.episode }}) @@ -20,4 +23,4 @@ class SearchIndex { } } -export default SearchIndex \ No newline at end of file +module.exports = SearchIndex \ No newline at end of file diff --git a/content/episodes/search-transcripts.hbs b/content/episodes/search-transcripts.hbs new file mode 100644 index 0000000..e1de6b4 --- /dev/null +++ b/content/episodes/search-transcripts.hbs @@ -0,0 +1,60 @@ +--- +layout: base-with-heading +title: Search Transcripts +eleventyExcludeFromCollections: ["episode"] +override:tags: [] +override:eleventyComputed: [] +--- + + + +
+
+ + +
+
+
    +
    +
    + \ No newline at end of file diff --git a/content/episodes/transcript-index.11ty.js b/content/episodes/transcript-index.11ty.js new file mode 100644 index 0000000..9f330b5 --- /dev/null +++ b/content/episodes/transcript-index.11ty.js @@ -0,0 +1,31 @@ +import {parseText} from 'media-captions'; +import Fetch from "@11ty/eleventy-fetch"; +import path from 'path'; + +class SearchIndex { + data() { + return {eleventyExcludeFromCollections:["episode"], layout: null} + } + + async render (data) { + const episodesWithTranscript = data.collections.episode.filter(e=>e.data.podcast?.transcriptUrl) + const promises = episodesWithTranscript.map((episode)=>{ + const {transcriptUrl} = episode.data.podcast + return Fetch(transcriptUrl, {type:'text', duration: "1d"}) + .then(srt_buffer=>parseText(srt_buffer.toString(), {type:'srt'})) + .then(({cues})=>cues) + .then((cues)=>({ + name: path.basename(transcriptUrl,".srt"), + episode: episode.data.episode, + season: episode.data.season, + title: episode.data.title, + url: `${this.url(episode.url)}`, + cues: cues.map(({id, startTime, text})=>({id,startTime,text})) + })) + }) + const result = await Promise.all(promises) + return JSON.stringify(result) + } +} + +export default SearchIndex \ No newline at end of file diff --git a/content/members/index.hbs b/content/members/index.hbs index bb57271..c89195c 100644 --- a/content/members/index.hbs +++ b/content/members/index.hbs @@ -8,6 +8,9 @@ links: - name: Discord url: discord iconClasses: bi bi-discord + - name: Search Episodes (Beta) + url: /episodes/search + iconClasses: bi bi-binoculars - name: GM Tools url: gm-tools iconClasses: bi bi-journal-bookmark diff --git a/layouts/episode.hbs b/layouts/episode.hbs index da83724..75a5844 100644 --- a/layouts/episode.hbs +++ b/layouts/episode.hbs @@ -13,12 +13,20 @@ eleventyComputed: {{#if podcast}} Download {{#if podcast.transcriptUrl}}| Transcript{{/if}} +
    + {{/if}}
    {{#each tags}} diff --git a/package-lock.json b/package-lock.json index 9e756b8..cb75d6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@11ty/eleventy-fetch": "^5.0.1", "@11ty/eleventy-navigation": "^0.3.5", "@11ty/eleventy-plugin-handlebars": "^1.0.0", "@11ty/eleventy-plugin-rss": "^2.0.2", @@ -22,12 +23,33 @@ "htmlparser2": "^9.1.0", "luxon": "^3.5.0", "markdown-it": "^14.1.0", + "media-captions": "^0.0.18", "music-metadata": "^10.5.1", "npx": "^10.2.2", "podcast": "^2.0.1", "sass": "^1.80.3" } }, + "node_modules/@11ty/eleventy-fetch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.0.1.tgz", + "integrity": "sha512-n79UhOAWG7XcJkRIoV8cZBpKgGln6mn+2UgsZkP6Xjgg8BqiMfxlYMJrNobSDdw3utyRAs8w/ZAPXoc18qrvMw==", + "license": "MIT", + "dependencies": { + "@rgrove/parse-xml": "^4.2.0", + "debug": "^4.3.7", + "flat-cache": "^6.1.1", + "graceful-fs": "^4.2.11", + "p-queue": "6.6.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@11ty/eleventy-navigation": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@11ty/eleventy-navigation/-/eleventy-navigation-0.3.5.tgz", @@ -103,6 +125,15 @@ "node": ">= 6" } }, + "node_modules/@keyv/serialize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -405,6 +436,15 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rgrove/parse-xml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rgrove/parse-xml/-/parse-xml-4.2.0.tgz", + "integrity": "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==", + "license": "ISC", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -899,6 +939,26 @@ "node": ">=0.10.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -950,6 +1010,30 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -970,6 +1054,16 @@ "node": ">=0.10.0" } }, + "node_modules/cacheable": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.6.tgz", + "integrity": "sha512-RNBnqNhWBtgYNe4mF4395e6260Q9loh6zT2CDFia9LSJor5+vOsvkxhd7GAtg3U4m8i38adn1Q3jiCU1N33/gg==", + "license": "MIT", + "dependencies": { + "hookified": "^1.5.1", + "keyv": "^5.2.1" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1471,6 +1565,12 @@ "node": ">= 8" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1632,6 +1732,23 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.4.tgz", + "integrity": "sha512-Km+tVF9BLnxaYqX2R9OKLkwSPvGjDXXlciDC8oBr/nSM4xMCNO8X9s0w5i6lNoE8E/6BEzSJBUF5Bar+TXmKJQ==", + "license": "MIT", + "dependencies": { + "cacheable": "^1.8.6", + "flatted": "^3.3.2", + "hookified": "^1.5.1" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "license": "ISC" + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1791,6 +1908,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/gulp-header": { "version": "1.8.12", "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", @@ -2226,6 +2349,12 @@ "node": "*" } }, + "node_modules/hookified": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.6.0.tgz", + "integrity": "sha512-se7cpwTA+iA/eY548Bu03JJqBiEZAqU2jnyKdj5B5qurtBg64CZGHTgqCv4Yh7NWu6FGI09W61MCq+NoPj9GXA==", + "license": "MIT" + }, "node_modules/html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -2552,6 +2681,15 @@ "node": ">=0.10.0" } }, + "node_modules/keyv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz", + "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.2" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2721,6 +2859,15 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" }, + "node_modules/media-captions": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/media-captions/-/media-captions-0.0.18.tgz", + "integrity": "sha512-JW18P6FuHdyLSGwC4TQ0kF3WdNj/+wMw2cKOb8BnmY6vSJGtnwJ+vkYj+IjHOV34j3XMc70HDeB/QYKR7E7fuQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -7588,6 +7735,43 @@ "node": ">=0.10.0" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", diff --git a/package.json b/package.json index d2e08b3..fd033b9 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "author": "", "license": "ISC", "dependencies": { + "@11ty/eleventy-fetch": "^5.0.1", "@11ty/eleventy-navigation": "^0.3.5", "@11ty/eleventy-plugin-handlebars": "^1.0.0", "@11ty/eleventy-plugin-rss": "^2.0.2", @@ -25,6 +26,7 @@ "htmlparser2": "^9.1.0", "luxon": "^3.5.0", "markdown-it": "^14.1.0", + "media-captions": "^0.0.18", "music-metadata": "^10.5.1", "npx": "^10.2.2", "podcast": "^2.0.1",