TTS fixes, Inworld improvements, footer redesign, episodes 15-25, invoice script fix

- Fix TTS text pipeline: new caps handling (spell out unknown acronyms, lowercase
  emphasis words), action-word lookahead for parenthetical stripping, abbreviation
  expansions (US→United States, NM→New Mexico), pronunciation fixes
- Inworld TTS: camelCase API fields, speakingRate per-voice overrides, retry logic
  with exponential backoff (3 attempts)
- Footer redesign: SVG icons for social/podcast links across all pages
- Stats page: show "Rate us on Spotify" instead of "not public" placeholder
- New voices, expanded caller prompts and problem scenarios
- Social posting via Postiz, YouTube upload in publish pipeline
- Episode transcripts 15-25, terms page, sitemap updates
- Fix invoice script: match Timing totals using merged Task+App intervals

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-02 12:38:58 -07:00
parent 08a35bddeb
commit 6eeab58464
34 changed files with 6545 additions and 512 deletions

View File

@@ -684,7 +684,13 @@ async function loadMusic() {
genreOrder.forEach(genre => {
const group = document.createElement('optgroup');
group.label = genre;
genres[genre].forEach(track => {
// Shuffle within each genre group
const genreTracks = genres[genre];
for (let i = genreTracks.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[genreTracks[i], genreTracks[j]] = [genreTracks[j], genreTracks[i]];
}
genreTracks.forEach(track => {
const option = document.createElement('option');
option.value = track.file;
option.textContent = track.name;