Expand all caller topic pools, add cross-episode topic dedup, publish ep35
Massively expanded all 8 caller topic pools from ~1200 to ~2500 entries to reduce repeat calls. Added persistent topic history (data/used_topics_history.json) with 30-day aging to prevent cross-episode duplicates. Published episode 35. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1347,6 +1347,15 @@ a:hover {
|
||||
box-shadow: 0 4px 24px rgba(232, 121, 29, 0.12);
|
||||
}
|
||||
|
||||
.clip-card-thumb {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.clip-card-inner iframe {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"title": "Nobody's Potato Salad Is Good",
|
||||
"description": "Luke goes OFF on workplace potlucks: 'Nobody's potato salad is f***ing good, alright? Everything at a potluck is gross. Just take everybody to McDonald's.'",
|
||||
"episode_number": 34,
|
||||
"clip_file": "clip-3-nobody-s-potato-salad-is-good.mp4",
|
||||
"youtube_id": "re7C2woMUrA",
|
||||
"featured": false,
|
||||
"thumbnail": "images/clips/clip-3-nobody-s-potato-salad-is-good.jpg"
|
||||
},
|
||||
{
|
||||
"title": "Man Obsessed With Dead Nun Loses Wife",
|
||||
"description": "Rodney couldn't stop talking about a dead nun who shared his wife's name. His wife was NOT amused.",
|
||||
|
||||
@@ -2,24 +2,34 @@ const CLIPS_JSON_URL = '/data/clips.json';
|
||||
|
||||
const clipPlaySVG = '<svg viewBox="0 0 24 24" fill="#fff"><path d="M8 5v14l11-7z"/></svg>';
|
||||
|
||||
function escapeHTML(str) {
|
||||
const el = document.createElement('span');
|
||||
el.textContent = str;
|
||||
return el.innerHTML;
|
||||
}
|
||||
|
||||
function renderClipCard(clip, featured) {
|
||||
const card = document.createElement('div');
|
||||
card.className = 'clip-card' + (featured ? ' clip-card-featured' : '');
|
||||
if (clip.youtube_id) card.dataset.youtubeId = clip.youtube_id;
|
||||
|
||||
const hasVideo = !!clip.youtube_id;
|
||||
const epLabel = clip.episode_number ? `Episode ${clip.episode_number}` : '';
|
||||
const youtubeId = (clip.youtube_id || '').replace(/[^a-zA-Z0-9_-]/g, '');
|
||||
if (youtubeId) card.dataset.youtubeId = youtubeId;
|
||||
const hasVideo = !!youtubeId;
|
||||
const epLabel = clip.episode_number ? `Episode ${Number(clip.episode_number)}` : '';
|
||||
const title = escapeHTML(clip.title || '');
|
||||
const desc = escapeHTML(clip.description || '');
|
||||
|
||||
const thumbStyle = clip.thumbnail
|
||||
? `style="background-image: url('/${clip.thumbnail}'); background-size: cover; background-position: center;"`
|
||||
const thumbImg = clip.thumbnail && /^[\w\/.-]+$/.test(clip.thumbnail)
|
||||
? `<img class="clip-card-thumb" src="/${clip.thumbnail}" alt="${title}" loading="lazy">`
|
||||
: '';
|
||||
|
||||
card.innerHTML = `
|
||||
<div class="clip-card-inner" ${thumbStyle}>
|
||||
<div class="clip-card-inner">
|
||||
${thumbImg}
|
||||
<div class="clip-card-overlay">
|
||||
<span class="clip-episode-label">${epLabel}</span>
|
||||
<h3 class="clip-card-title">${clip.title || ''}</h3>
|
||||
<p class="clip-card-desc">${clip.description || ''}</p>
|
||||
<h3 class="clip-card-title">${title}</h3>
|
||||
<p class="clip-card-desc">${desc}</p>
|
||||
${hasVideo ? `<button class="clip-play-btn" aria-label="Play clip">${clipPlaySVG}</button>` : ''}
|
||||
</div>
|
||||
</div>
|
||||
@@ -29,7 +39,7 @@ function renderClipCard(clip, featured) {
|
||||
card.querySelector('.clip-play-btn').addEventListener('click', (e) => {
|
||||
e.stopPropagation();
|
||||
const inner = card.querySelector('.clip-card-inner');
|
||||
inner.innerHTML = `<iframe src="https://www.youtube-nocookie.com/embed/${clip.youtube_id}?autoplay=1&rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>`;
|
||||
inner.innerHTML = `<iframe src="https://www.youtube-nocookie.com/embed/${youtubeId}?autoplay=1&rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>`;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -246,4 +246,10 @@
|
||||
<changefreq>never</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://lukeattheroost.com/episode.html?slug=episode-35-midnight-confessions-and-unexpected-revelations</loc>
|
||||
<lastmod>2026-03-13</lastmod>
|
||||
<changefreq>never</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
|
||||
Reference in New Issue
Block a user