diff --git a/.eleventy.js b/.eleventy.js index 864eb8e..47ca8f6 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -30,10 +30,10 @@ module.exports = function(eleventyConfig) { {compile: (inputContent, inputPath)=>{ const parsed = parseSync(inputContent.toString(), {type:'srt'}) return async (data) => { - data.transcript = parsed + data.segments = parsed.map((i,idx)=>({id:idx, ...i.data})) data.layout = "transcript" // data.tags = ['transcript'] - return JSON.stringify(parsed) + return JSON.stringify(parsed.map((i,idx)=>({id:idx, ...i.data}))) } }}) diff --git a/content/episodes/episodes.11tydata.js b/content/episodes/episodes.11tydata.js index ea33996..86d686e 100644 --- a/content/episodes/episodes.11tydata.js +++ b/content/episodes/episodes.11tydata.js @@ -29,9 +29,9 @@ module.exports = { async function podcastData (data) { var file_stem - if (data.season === 1) { + if (data.season == 1) { file_stem = `ep${data.episode}` - } if (data.season === 2) { + } else if (data.season == 2) { file_stem = `${seasonEpisodeFormat(null, {...data, episodePrefix: "ep"}).toLowerCase()}` } else { file_stem = `${seasonEpisodeFormat(null, data).toLowerCase()}` diff --git a/content/episodes/search-transcripts.hbs b/content/episodes/search-transcripts.hbs index e1de6b4..6f986a9 100644 --- a/content/episodes/search-transcripts.hbs +++ b/content/episodes/search-transcripts.hbs @@ -23,14 +23,14 @@ override:eleventyComputed: [] let search_index_promise = fetch('../transcript-index') .then((res)=>res.json()) .then((documents)=>{ - docs = documents.map(({title, episode, season, url, cues})=>cues.map(({startTime, text})=>({title, episode, season, url, startTime, text}))).flat() - console.log(documents) + docs = documents.map(({title, episode, season, url, transcriptPageUrl, segments})=>segments.map(({start, text, id})=>({segment_id:id, title, episode, season, transcriptPageUrl, url, start, text}))).flat() + console.log(docs) idx = lunr(function(){ - this.ref('id') + this.ref('index') this.field('text') this.metadataWhitelist = ['position'] docs.forEach(function (doc, idx) { - doc.id = idx; + doc.index = idx; this.add(doc); }, this) }) @@ -44,14 +44,15 @@ override:eleventyComputed: [] results.forEach(r => { r.title = docs[r.ref].title, r.url = docs[r.ref].url + r.id = docs[r.ref].id }) - console.log('Form submitted!', results) + console.log('Form submitted!', searchQuery, results) const results_ol = document.getElementById("results").querySelector('ol') results_ol.innerHTML = "" results.forEach(r => { const el = document.createElement('li') - const {url, title, text, season, episode, startTime} = docs[r.ref] - el.innerHTML = `${title} (Season ${season}, episode ${episode})

${Duration.fromObject({seconds:startTime}).toFormat("hh:mm:ss")}

${text}

` + const {segment_id, url, title, text, season, episode, start, transcriptPageUrl} = docs[r.ref] + el.innerHTML = `${title} (Season ${season}, episode ${episode})

${Duration.fromObject({seconds:start/1000}).toFormat("hh:mm:ss")}

${text}

` results_ol.appendChild(el) }) } diff --git a/content/episodes/transcript-index.11ty.js b/content/episodes/transcript-index.11ty.js index 9f330b5..02f19cb 100644 --- a/content/episodes/transcript-index.11ty.js +++ b/content/episodes/transcript-index.11ty.js @@ -8,23 +8,20 @@ class SearchIndex { } 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"), + const episodesWithTranscript = data.collections.episode.filter(e=>e.data.podcast?.transcriptPage) + const result = episodesWithTranscript.map((episode)=>{ + const transcriptPage = data.collections.transcript.find(t=>t.data.episode==episode.data.episode && t.data.season == episode.data.season) + if (!transcriptPage) {return null} + return { + transcriptPageUrl: this.url(transcriptPage.url), 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})) - })) + segments: transcriptPage.data.segments + } }) - const result = await Promise.all(promises) - return JSON.stringify(result) + return JSON.stringify(result.filter(r=>r)) } } diff --git a/content/transcripts/transcripts.11tydata.js b/content/transcripts/transcripts.11tydata.js new file mode 100644 index 0000000..2acb303 --- /dev/null +++ b/content/transcripts/transcripts.11tydata.js @@ -0,0 +1,9 @@ +const {extractSeasonEpisode, episodeNumber} = require('../../utils/filters'); + +module.exports = { + "tags":["transcript"], + "eleventyComputed": { + "episode": (data) => extractSeasonEpisode(data.page.fileSlug).episode, + "season": (data) => extractSeasonEpisode(data.page.fileSlug).season || 1, + } +} \ No newline at end of file diff --git a/content/transcripts/transcripts.json b/content/transcripts/transcripts.json deleted file mode 100644 index bab9734..0000000 --- a/content/transcripts/transcripts.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "tags":["transcript"] -} \ No newline at end of file diff --git a/layouts/transcript.hbs b/layouts/transcript.hbs index 9b8c0c1..5067ed4 100644 --- a/layouts/transcript.hbs +++ b/layouts/transcript.hbs @@ -2,10 +2,60 @@ layout: base --- -{{#each transcript}} -
-{{formatDuration this.data.start "hh:mm:ss"}}: {{this.data.text}} + +{{#with (getEpisodeData collections.episode season episode) as |episode_data|}} +

{{#if episode_data.title}}{{{episode_data.title}}}{{else}}Episode {{episode_data.episode}}{{/if}}

+ Season {{episode_data.season}}, Episode {{episode_data.episode}}
+ {{formatDate episode_data.date "MMMM d, yyyy"}}
+
+{{#if episode_data.podcast}} + {{#if episode_data.podcast.enclosureUrl}} + + {{/if}} +{{/if}} +{{/with}} +{{#each segments as |segment|}} +
+

+

+ {{formatDuration segment.start "hh:mm:ss"}} + + +
+ {{segment.text}} +

{{/each}} \ No newline at end of file diff --git a/utils/filters.js b/utils/filters.js index 9ff6175..0e2781f 100644 --- a/utils/filters.js +++ b/utils/filters.js @@ -66,5 +66,22 @@ module.exports = { }, episodeNumber: (s, episode) => { return episode ? Number(episode) : Number(s.replace(/[^0-9]/,'')) + }, + extractSeasonEpisode: (input, property) => { + const regex = /(?:[Ss](?\d{1,2}))?(?:[eE][Pp]?)?(?\d{1,2})/; + const match = input.match(regex); + + if (match) { + const season = match.groups?.season ? parseInt(match.groups.season, 10) : null; + const episode = match.groups?.episode ? parseInt(match.groups.episode, 10) : null; + + const result = { season, episode }; + return property ? result[property] : result; // Return specific property if requested + } + + return property ? null : { season: null, episode: null }; // Return null or full object + }, + getEpisodeData: (episodes, season, episode) => { + return episodes.find((e=>e.data.episode==episode && e.data.season==season))?.data } } \ No newline at end of file