Initial commit: Dick Show Index pipeline with install script and docs

This commit is contained in:
n3wk
2026-08-24 15:47:21 +02:00
commit 6234c6bf55
25 changed files with 10459 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
env/
.env
# Logs
*.log
# Data files (too large for git, share via other means)
audio/
transcripts/
data/analysis/
data/index.db
data/index.db-wal
data/index.db-shm
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Local config
config.py
+138
View File
@@ -0,0 +1,138 @@
# Dick Show Index
A complete pipeline to download, transcribe, analyze, and search all episodes of **The Dick Show** podcast.
## What This Does
1. **Downloads** all episodes from the official RSS feed (Libsyn)
2. **Transcribes** audio locally using Whisper (faster-whisper, CPU/GPU)
3. **Analyzes** each episode with an LLM (via opencode) to extract:
- Talking points with timestamps
- Arguments, ideas, and notable quotes
- Transgression Index (TI) 0-10 scoring
- Speaker attribution and content warnings
4. **Fact-checks** analyses against a verified research dossier
5. **Indexes** everything in SQLite FTS5 for instant search
5. **Exports** a master JSON (`data/dickshow_analysis.json`) for web apps
## Quick Start
```bash
# 1. Clone and install
git clone https://kode.hannesahlin.se/n3wk/dickshow-index.git
cd dickshow-index
./install.sh
# 2. (Optional) Authenticate opencode for higher rate limits
opencode auth login
# 3. Run the Rekieta arc (28 episodes):
python pipeline_all.py --eps 84 87 89 93 96 121 124 152 166 176 198 209 213 275 285 299 321 344 352 368 376 412 416 424 425 435 439 455
# Or run the full backlog (520 episodes):
python pipeline_all.py
```
## What You Get
After running, you'll have:
```
data/
├── episodes.jsonl # Episode metadata (title, date, audio URL, duration)
├── index.db # SQLite FTS5 search index
├── dickshow_analysis.json # Master analysis JSON (for web apps)
└── analysis/
├── ep0084.json # Per-episode analysis + fact-check
└── ...
transcripts/
├── ep0084.json # Raw transcript with timestamps
└── ...
```
## Search Examples
```bash
# Simple search
python search.py "isom trademark"
# Filter by tag
python search.py maddox --tag lolsuit
# Phonetic search (Whisper mangles names)
python search.py "raketa OR riketa OR rakita" --tag nick_rekieta
# Date range + tag
python search.py maddox --from 2017-01-01 --to 2018-12-31 --tag lolsuit
# Context around matches
python search.py "pull up" --tag eric_july --context 2
```
Output includes **timestamps** for deep-linking:
```
[Ep 373 | Mon, 28 Aug 2023] 00:25:32-00:25:35 #nick_rekieta
"I was on Nick's show, Busting Balls, Nick Riketa."
-> https://dick.show/episode-373/
mp3: https://traffic.libsyn.com/.../The_Dick_Show_373.mp3
```
## Configuration
Set via environment variables or edit `config.py`:
| Variable | Default | Description |
|----------|---------|-------------|
| `OPENCODE_ANALYZE_MODEL` | `opencode/nemotron-3-ultra-free` | LLM for analysis |
| `DS_ANALYZE_PAUSE` | `45` | Seconds between analysis calls |
| `DS_ANALYZE_TIMEOUT` | `600` | Analysis timeout (seconds) |
| `DS_MIN_FREE_RAM` | `1073741824` (1GB) | Pause if RAM below this |
| `DS_MODEL` | `small` | Whisper model: `tiny`, `base`, `small`, `medium`, `large-v3` |
| `DS_DEVICE` | `cpu` | `cpu` or `cuda` |
| `DS_COMPUTE` | `int8` | `int8`, `float16`, `float32` |
| `DS_KEEP_AUDIO` | `0` | Keep MP3s after transcription (`1` to keep) |
## Resuming / Sharing Work
The pipeline is **fully resumable**:
- Re-run the same command → skips completed episodes
- Only missing transcripts/analyses are processed
- Share `transcripts/`, `data/analysis/`, and `data/index.db` to collaborate
## Requirements
- **Python 3.10+**
- **ffmpeg** (for audio processing - usually auto-installed with faster-whisper)
- **opencode CLI** (installed by `./install.sh`)
- **~50 GB free disk** for full backlog (MP3s auto-deleted after transcription by default)
## Architecture
```
download.py → fetches MP3s from Libsyn RSS (resumable, size-verified)
preprocess.py → converts MP3 → clean 16kHz mono WAV (handles Libsyn quirks)
transcribe.py → faster-whisper, chunked (10-min windows, no OOM)
analyze.py → opencode subprocess with timeout + retries
verify.py → second-pass fact-check against research dossier
index.py → SQLite FTS5 index with hashtags
search.py → CLI search with timestamps + context
pipeline_all.py → orchestrates everything with resume logic
```
## For Contributors
The pipeline is designed for distributed workloads:
1. Each user runs a subset of episodes (`--eps 84 87 89 ...`)
2. Results are merged via `data/analysis/` JSON files and `index.db`
3. Master JSON (`data/dickshow_analysis.json`) aggregates everything
## License
Private research tool over public broadcasts. Content is adult/extreme — use responsibly.
## Support
- Issues: https://kode.hannesahlin.se/n3wk/dickshow-index/issues
- Pipeline logs: `rekieta_run.log`, `backlog_run.log`
- Analysis logs: `analyze_run.log`, `analyze_err.log`
+123
View File
@@ -0,0 +1,123 @@
"""Merge per-episode analyses into ONE master JSON:
data/dickshow_analysis.json
Contents:
meta counts, generated_at, rubric reference
episodes full per-episode analyses, sorted by ep_num
indexes derived views for fast lookup:
by_person, by_tag_topic, edginess_ranking, saga_map
"""
import json
import os
from datetime import datetime, timezone
from config import DATA_DIR
from analyze import ANALYSIS_DIR, MASTER_JSON
from feed import load_episodes
def load_analyses() -> list[dict]:
out = []
if not os.path.isdir(ANALYSIS_DIR):
return out
for f in sorted(os.listdir(ANALYSIS_DIR)):
if not f.endswith(".json"):
continue
try:
with open(os.path.join(ANALYSIS_DIR, f), encoding="utf-8") as fh:
out.append(json.load(fh))
except (json.JSONDecodeError, OSError) as e:
print(f"warning: skipping bad analysis file {f}: {e}")
return out
def aggregate() -> None:
analyses = load_analyses()
eps_meta = {e["ep_num"]: e for e in load_episodes() if e["ep_num"]}
# attach runtime from episode metadata when available + verification status
for a in analyses:
m = eps_meta.get(a.get("ep_num"))
if m and m.get("duration_sec"):
a["runtime_minutes"] = round(m["duration_sec"] / 60)
v = a.get("_verification") or {}
a["verified"] = v.get("verdict") if isinstance(v, dict) else None
analyses.sort(key=lambda a: (a.get("ep_num") is None,
a.get("ep_num") or 0))
by_person: dict[str, list] = {}
by_topic: dict[str, list] = {}
quotes_ranked = []
ti_scores = []
for a in analyses:
epn = a.get("ep_num")
label = f"Ep {epn}" if epn else (a.get("title") or "?")[:20]
seen_p = set()
seen_t = set()
for tp in a.get("talking_points", []):
for p in tp.get("people", []):
key = p.lower().strip()
seen_p.add(key)
by_person.setdefault(key, []).append(
{"episode": epn, "topic": tp.get("topic"),
"ts": tp.get("start_ts")})
topic = (tp.get("topic") or "").strip().lower()
if topic:
seen_t.add(topic)
for t in sorted(seen_t):
by_topic.setdefault(t, []).append(epn)
for q in a.get("notable_quotes", []):
quotes_ranked.append({
"episode": epn, "ts": q.get("ts"), "ti": q.get("ti", 0),
"quote": q.get("quote"), "why": q.get("why"),
})
tg = a.get("transgression", {})
if isinstance(tg.get("overall_ti"), int):
ti_scores.append({"episode": epn, "overall_ti": tg["overall_ti"],
"sincerity": tg.get("sincerity"),
"targets": tg.get("targets", [])})
quotes_ranked.sort(key=lambda q: -q.get("ti", 0))
ti_scores.sort(key=lambda s: -s.get("overall_ti", 0))
n_verified = sum(1 for a in analyses if a.get("verified") in ("pass", "fix"))
master = {
"meta": {
"generated_at": datetime.now(timezone.utc).isoformat(),
"podcast": "The Dick Show",
"feed": "https://thedickshow.com/feed/podcast/",
"episodes_analyzed": len(analyses),
"episodes_factchecked": n_verified,
"total_runtime_minutes": sum(a.get("runtime_minutes") or 0
for a in analyses),
"scale": "Transgression Index 0-10, see rubric.py / README",
"note": ("Companion file for routine opencode access. "
"Per-episode analyst files live in data/analysis/, "
"raw transcripts in transcripts/. Each episode carries "
"'verified': pass|fix|null from the dossier fact-check "
"pass (verify.py). Treat verified=null as unconfirmed."),
},
"episodes": analyses,
"indexes": {
"by_person": {k: v for k, v in sorted(by_person.items())},
"topics_by_episode": {k: sorted(set(x for x in v if x))
for k, v in sorted(by_topic.items())},
"edginess_ranking": {
"top_overall_ti": ti_scores[:25],
"top_quotes": quotes_ranked[:50],
},
},
}
tmp = MASTER_JSON + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(master, f, ensure_ascii=False, indent=1)
os.replace(tmp, MASTER_JSON)
print(f"master -> {MASTER_JSON} "
f"({len(analyses)} episodes, {len(quotes_ranked)} ranked quotes)")
if __name__ == "__main__":
aggregate()
+289
View File
@@ -0,0 +1,289 @@
"""Analyze episodes via the local `opencode run` CLI.
For each transcript:
1. export readable timestamped txt (export_txt.py)
2. call: opencode run -f <txt> "<prompt with rubric + schema>"
3. parse/validate the returned JSON (retry up to 3x on bad output)
4. save data/analysis/epXXXX.json
Then aggregate all analyses into one master file for routine opencode access:
data/dickshow_analysis.json (run aggregate.py, or it runs automatically
after each new analysis in this script)
Resumable: existing per-episode analyses are skipped unless --force.
"""
import argparse
import json
import os
import re
import subprocess
import sys
import time
from datetime import datetime, timezone
from config import DATA_DIR, BASE_DIR
from feed import load_episodes
from download import slug as ep_slug, audio_path
from transcribe import transcript_path as tpath
from export_txt import export_txt, txt_path
from rubric import RUBRIC, SCHEMA_EXAMPLE
from facts import CAST_SHEET
ANALYSIS_DIR = os.path.join(DATA_DIR, "analysis")
MASTER_JSON = os.path.join(DATA_DIR, "dickshow_analysis.json")
OPENCODE = os.environ.get(
"OPENCODE_BIN", os.path.expanduser(r"~\.opencode\bin\opencode.exe"))
# analyzer model override, e.g. opencode/x-preview-f-free
OPENCODE_MODEL = os.environ.get("OPENCODE_ANALYZE_MODEL", "").strip()
OPENCODE_TIMEOUT = int(os.environ.get("DS_ANALYZE_TIMEOUT", "900")) # 15 min
PROMPT_TEMPLATE = """You are the show archivist for The Dick Show podcast. Attached is the FULL transcript of one episode (timestamped lines like [HH:MM:SS]).
Your job: produce a structured analyst file for this episode. Read the ENTIRE transcript carefully, then reconstruct what was talked about, the arguments made, ideas/bits coined, and rate how edgy/transgressive the content is using the rubric below. The show contains extreme adult language; analyze it dispassionately like a content researcher - do not sanitize quotes, do not editorialize morally.
IMPORTANT - speaker attribution rules:
{cast}
Base attributions on what voices actually say (self-identifications, direct address) - never on famous-name pattern matching.
{rubric}
OUTPUT RULES:
- Output ONLY one valid JSON object. No markdown fences, no commentary before or after.
- Match exactly these keys (extra keys not allowed): {schema}
- All timestamps are SECONDS (number), converted from the [HH:MM:SS] markers.
- talking_points: cover every distinct topic IN ORDER of appearance
(5-15 items; summaries max ~40 words each).
- notable_quotes: the most characteristic/extreme/funny verbatim lines (5-10 items).
- If a field would be empty, use [] or "".
- ep_num and title must be taken from the transcript header comments.
Begin now."""
FENCES_RE = re.compile(r"^```(?:json)?\s*|\s*```$", re.MULTILINE)
def build_prompt() -> str:
return PROMPT_TEMPLATE.format(cast=CAST_SHEET.strip(),
rubric=RUBRIC.strip(),
schema=SCHEMA_EXAMPLE.strip())
def _repair(text: str) -> str:
"""Common LLM-JSON repairs: fences, trailing commas, stray text, missing commas."""
text = FENCES_RE.sub("", text.strip()).strip()
start = text.find("{")
end = text.rfind("}")
if start > 0 or end < len(text) - 1:
if start != -1 and end > start:
text = text[start:end + 1]
# trailing commas before } or ]
text = re.sub(r",(\s*[}\]])", r"\1", text)
# missing commas between object members: "key": "value" "key2": "value2" -> add comma
text = re.sub(r'"\s+"', '", "', text)
# missing commas between array elements: "value1" "value2" -> add comma
text = re.sub(r'"\s*\n\s*"', '",\n"', text)
# missing commas after closing brace/bracket followed by opening brace/bracket
text = re.sub(r'(\]|\})\s*(\[|\{)', r'\1,\2', text)
return text
def strip_to_json(text: str):
# strict=False: tolerate raw newlines/tabs inside strings (common LLM slip)
return json.loads(_repair(text), strict=False)
REPAIR_PREAMBLE = (
"IMPORTANT: Your reply must be ONE valid strict JSON object matching the "
"schema below. Double-quoted keys/strings, escape quotes inside strings "
"(\\\"), no trailing commas, no markdown fences, no commentary.\n\n"
)
def ensure_content_match(obj: dict, attach_txt: str) -> None:
"""Guard against cross-episode contamination: the analysis must reference
words that actually occur in this episode's transcript."""
import json as _json
with open(attach_txt, encoding="utf-8") as f:
lines = [ln for ln in f if ln.startswith("[")]
if not lines:
return
sample = lines[:40] + lines[len(lines)//2:len(lines)//2+40] + lines[-20:]
stop = {"there", "about", "would", "because", "really", "going", "gonna",
"know", "like", "that", "this", "with", "what", "when", "they",
"them", "then", "than", "have", "been", "were", "just", "yeah"}
words = {w.strip(".,!?\"':;()[]").lower()
for ln in sample for w in ln.split()
if len(w) > 4 and w.strip(".,!?\"':;()[]").lower() not in stop}
blob = _json.dumps(obj, ensure_ascii=False).lower()
hits = {w for w in words if w in blob}
if len(hits) < 5:
raise ValueError(
f"content mismatch: analysis shares only {len(hits)} vocabulary "
f"items with this transcript - likely wrong-session output")
def validate(obj: dict) -> None:
required_top = ["ep_num", "title", "one_line_summary", "guests",
"talking_points", "arguments", "ideas", "notable_quotes",
"transgression"]
missing = [k for k in required_top if k not in obj]
if missing:
raise ValueError(f"missing keys: {missing}")
tg = obj["transgression"]
for k in ["overall_ti", "profanity", "slur_usage",
"harassment_or_cruelty", "sincerity"]:
if k not in tg or not isinstance(tg[k], int) or not 0 <= tg[k] <= 10:
raise ValueError(f"transgression.{k} must be int 0-10")
for q in obj.get("notable_quotes", []):
if not isinstance(q.get("ti"), int) or not 0 <= q["ti"] <= 10:
raise ValueError("quote ti must be int 0-10")
def run_opencode(prompt: str, attach: str) -> str:
# NOTE: deliberately NO `-c`/`-s` session reuse: `run -c` continues the
# globally-last session, which under concurrent pipelines cross-pollinates
# analyses between episodes. Every call is a fresh session.
# --auto: headless runs must not stall on permission prompts (the model
# sometimes Reads attached files for more context); scope is our own data.
cmd = [OPENCODE, "run", "--auto", "-f", attach,
"--dir", BASE_DIR]
if OPENCODE_MODEL:
cmd += ["-m", OPENCODE_MODEL]
cmd.append(prompt)
proc = subprocess.run(cmd, capture_output=True, text=True,
encoding="utf-8", errors="replace",
cwd=BASE_DIR, timeout=OPENCODE_TIMEOUT)
out = proc.stdout or ""
err = proc.stderr or ""
combined = (out + err).lower()
if "rate limit" in combined or "429" in combined:
raise RateLimitError("provider rate limit exceeded")
if not out.strip():
raise RuntimeError(f"opencode produced no stdout: {err[-400:]}")
return out
class RateLimitError(RuntimeError):
pass
# When the provider quota dries up, stop *attempting* analyses pipeline-wide
# for a while; transcription (local) keeps running. Probe again after cooldown.
_RATE_COOLDOWN = {"until": 0.0}
COOLDOWN_SECONDS = int(os.environ.get("DS_RATE_COOLDOWN", "900"))
def analyze_episode(ep: dict, force: bool = False, retries: int = 3) -> dict | None:
os.makedirs(ANALYSIS_DIR, exist_ok=True)
apath = os.path.join(ANALYSIS_DIR, f"{ep_slug(ep)}.json")
if os.path.exists(apath) and not force:
return None
if time.time() < _RATE_COOLDOWN["until"]:
print(f" (analysis cooldown {int(_RATE_COOLDOWN['until'] - time.time())}s "
f"- will catch up later)", flush=True)
return None
if not os.path.exists(tpath(ep)):
print(f" no transcript for {ep['title']}; skipping", flush=True)
return None
attach = export_txt(ep)
prompt = build_prompt()
last_err = None
# escalating waits; rate limits need minutes, not seconds
waits = [10, 60, 180, 420, 600, 900]
attempt = 0
while attempt < len(waits):
attempt += 1
t0 = time.time()
try:
raw = run_opencode(
(REPAIR_PREAMBLE + prompt) if attempt > 1 else prompt, attach)
obj = strip_to_json(raw)
validate(obj)
ensure_content_match(obj, attach)
obj["ep_num"] = ep["ep_num"] if ep["ep_num"] else obj.get("ep_num")
obj["title"] = obj.get("title") or ep["title"]
obj["pub_date"] = ep["pub_date"]
obj["_analyzed_at"] = datetime.now(timezone.utc).isoformat()
obj["_source_transcript"] = os.path.basename(tpath(ep))
with open(apath + ".tmp", "w", encoding="utf-8") as f:
json.dump(obj, f, ensure_ascii=False, indent=1)
os.replace(apath + ".tmp", apath)
dt = time.time() - t0
ti = obj["transgression"]["overall_ti"]
n_tp = len(obj.get("talking_points", []))
n_q = len(obj.get("notable_quotes", []))
print(f" OK {os.path.basename(apath)} in {dt:.0f}s "
f"(TI={ti}, {n_tp} points, {n_q} quotes)", flush=True)
return obj
except RateLimitError as e:
last_err = e
wait = waits[min(attempt, len(waits) - 1)]
print(f" rate-limited (attempt {attempt}); "
f"sleeping {wait}s ...", flush=True)
time.sleep(wait)
except Exception as e: # noqa: BLE001
last_err = e
wait = waits[min(attempt - 1, len(waits) - 1)]
print(f" attempt {attempt} failed: {e}; retry in {wait}s",
flush=True)
time.sleep(wait)
print(f" GIVING UP on {ep['title']} after {attempt} attempts: "
f"{last_err}", flush=True)
if isinstance(last_err, RateLimitError):
_RATE_COOLDOWN["until"] = time.time() + COOLDOWN_SECONDS
print(f" entering analysis cooldown for {COOLDOWN_SECONDS}s "
f"(transcription continues; analyses catch up later)",
flush=True)
return None
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("eps", nargs="*", type=int)
ap.add_argument("--force", action="store_true")
ap.add_argument("--no-verify", action="store_true",
help="skip the dossier fact-check second pass")
args = ap.parse_args()
eps = load_episodes()
todo = [e for e in eps
if (not args.eps or e["ep_num"] in args.eps)
and os.path.exists(tpath(e))]
print(f"analyzing {len(todo)} episode(s) with {os.path.basename(OPENCODE)}",
flush=True)
# lazy import: verify.py imports this module at its own top level
from verify import verify_episode
done = 0
for i, ep in enumerate(todo, 1):
label = f"Ep {ep['ep_num']}" if ep["ep_num"] else ep["title"][:40]
existing = os.path.exists(os.path.join(
ANALYSIS_DIR, f"{ep_slug(ep)}.json"))
if not existing:
print(f"[{i}/{len(todo)}] analyzing {label} ...", flush=True)
if analyze_episode(ep, force=args.force) is not None:
done += 1
# ALWAYS fact-check fresh analyses against the dossier
if not args.no_verify:
print(f" fact-checking {label} ...", flush=True)
verify_episode(ep)
elif not args.no_verify:
# already analyzed -> run/refresh the dossier fact-check
vpath = os.path.join(ANALYSIS_DIR, f"{ep_slug(ep)}.json")
with open(vpath, encoding="utf-8") as f:
already = "_verification" in json.load(f)
if args.force or not already:
print(f"[{i}/{len(todo)}] verifying (existing) {label} ...",
flush=True)
verify_episode(ep)
# keep the master file fresh after every run
from aggregate import aggregate
aggregate()
print(f"analyzed={done} total_files="
f"{len([f for f in os.listdir(ANALYSIS_DIR) if f.endswith('.json')])}",
flush=True)
if __name__ == "__main__":
main()
+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env python3
"""Check which episodes are already transcribed/analyzed."""
import os
import json
from pathlib import Path
TRANSCRIPT_DIR = "transcripts"
ANALYSIS_DIR = "data/analysis"
def check_progress():
print("=" * 60)
print("Dick Show Index - Progress Check")
print("=" * 60)
# All episodes from the feed
all_episodes = set()
# Load from episodes.jsonl if available
if os.path.exists("data/episodes.jsonl"):
with open("data/episodes.jsonl", "r") as f:
for line in f:
ep = json.loads(line)
if ep.get("ep_num"):
all_episodes.add(ep["ep_num"])
# Check transcripts
transcript_files = set()
if os.path.exists("transcripts"):
for f in os.listdir("transcripts"):
if f.startswith("ep") and f.endswith(".json"):
try:
ep_num = int(f[2:6])
transcript_files.add(ep_num)
except ValueError:
pass
# Check analyses
analysis_files = set()
if os.path.exists("data/analysis"):
for f in os.listdir("data/analysis"):
if f.startswith("ep") and f.endswith(".json"):
try:
ep_num = int(f[2:6])
analysis_files.add(ep_num)
except ValueError:
pass
# Check verified analyses
verified = set()
if os.path.exists("data/analysis"):
for f in os.listdir("data/analysis"):
if f.startswith("ep") and f.endswith(".json"):
try:
ep_num = int(f[2:6])
path = f"data/analysis/{f}"
with open(path, "r") as f:
data = json.load(f)
if data.get("_verification", {}).get("verdict") in ("pass", "fix"):
verified.add(ep_num)
except Exception:
pass
all_eps = sorted(all_episodes)
if not all_eps:
all_eps = sorted(transcript_files | analysis_files)
print(f"\n{'Ep':>4} {'Title':<45} {'Transcript':^10} {'Analysis':^10} {'Verified':^8}")
print("-" * 85)
stats = {"total": 0, "transcript": 0, "analysis": 0, "verified": 0}
for ep in all_eps:
has_t = ep in transcript_files
has_a = ep in analysis_files
has_v = ep in verified
stats["total"] += 1
if has_t: stats["transcript"] += 1
if has_a: stats["analysis"] += 1
if has_v: stats["verified"] += 1
t_status = "✓" if has_t else " "
a_status = "✓" if has_a else " "
v_status = "✓" if has_v else " "
# Try to get title
title = ""
try:
with open(f"transcripts/ep{ep:04d}.json", "r") as f:
data = json.load(f)
title = data.get("title", "")[:43]
except:
pass
print(f"{ep:>4} {title:<45} {t_status:^10} {a_status:^10} {v_status:^8}")
print("-" * 85)
print(f"Total episodes in feed: {stats['total']}")
print(f"Transcripts complete: {stats['transcript']}/{stats['total']}")
print(f"Analyses complete: {stats['analysis']}/{stats['total']}")
print(f"Verified: {stats['verified']}/{stats['total']}")
# Missing
missing_t = [ep for ep in all_eps if ep not in transcript_files]
missing_a = [ep for ep in all_eps if ep not in analysis_files]
missing_v = [ep for ep in all_eps if ep not in verified]
if missing_t:
print(f"\nMissing transcripts ({len(missing_t)}): {missing_t[:20]}{'...' if len(missing_t) > 20 else ''}")
if missing_a:
print(f"Missing analyses ({len(missing_a)}): {missing_a[:20]}{'...' if len(missing_a) > 20 else ''}")
if missing_v:
print(f"Unverified ({len(missing_v)}): {missing_v[:20]}{'...' if len(missing_v) > 20 else ''}")
if __name__ == "__main__":
check_progress()
+118
View File
@@ -0,0 +1,118 @@
# Dick Show Index - Configuration Template
# Copy to config.py and customize
import os
# ============================================================================
# Base Paths
# ============================================================================
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# Data directories
AUDIO_DIR = os.path.join(BASE_DIR, "audio")
TRANSCRIPT_DIR = os.path.join(BASE_DIR, "transcripts")
DATA_DIR = os.path.join(BASE_DIR, "data")
DB_PATH = os.path.join(DATA_DIR, "index.db")
EPISODES_JSONL = os.path.join(DATA_DIR, "episodes.jsonl")
# RSS Feed
FEED_URL = "https://thedickshow.com/feed/podcast/"
# ============================================================================
# Whisper Settings
# ============================================================================
# Model: tiny, base, small, medium, large-v3
# smaller = faster, less accurate
WHISPER_MODEL = os.environ.get("DS_MODEL", "small")
# Device: cpu, cuda
DEVICE = os.environ.get("DS_DEVICE", "cpu")
# Compute type: int8, float16, float32
# int8 = fastest, lowest memory (CPU)
# float16 = GPU with tensor cores
COMPUTE_TYPE = os.environ.get("DS_COMPUTE", "int8")
# Language
LANGUAGE = "en"
# VAD filter removes silence/music - big speed win
VAD_FILTER = True
# Beam size (1 = greedy, 5 = better accuracy, slower)
BEAM_SIZE = 1
# Word timestamps (slower, more detailed)
WORD_TIMESTAMPS = False
# Condition on previous text (can propagate errors on long audio)
CONDITION_ON_PREVIOUS_TEXT = False
# ============================================================================
# Audio Processing
# ============================================================================
TARGET_RATE = 16000 # Whisper expects 16kHz
# HTTP settings
DOWNLOAD_TIMEOUT = (15, 120) # (connect, read) seconds
CHUNK_SIZE = 1 << 20 # 1 MiB
MAX_FEED_RETRIES = 3
# Disk policy: delete MP3 after transcription (saves ~75GB for full backlog)
KEEP_AUDIO = os.environ.get("DS_KEEP_AUDIO", "0") == "1"
# ============================================================================
# Analysis (opencode/LLM)
# ============================================================================
# Path to opencode binary
OPENCODE = os.environ.get("OPENCODE_BIN", os.path.expanduser(r"~\.opencode\bin\opencode.exe"))
# Model for analysis (see: opencode models)
OPENCODE_MODEL = os.environ.get("OPENCODE_ANALYZE_MODEL", "opencode/nemotron-3-ultra-free")
# Timeout for analysis (seconds)
OPENCODE_TIMEOUT = int(os.environ.get("DS_ANALYZE_TIMEOUT", "600"))
# Pause between analysis calls (seconds) - be nice to the provider
ANALYSIS_PAUSE = int(os.environ.get("DS_ANALYZE_PAUSE", "45"))
# ============================================================================
# Memory / Rate Limit Guards
# ============================================================================
# Minimum free RAM before pausing transcription (bytes)
MIN_FREE_RAM = int(os.environ.get("DS_MIN_FREE_RAM", str(1024 * 1024 * 1024))) # 1 GB
# Cooldown after rate limit hit (seconds)
RATE_COOLDOWN_SECONDS = int(os.environ.get("DS_RATE_COOLDOWN", "900")) # 15 min
# ============================================================================
# HTTP / Feed
# ============================================================================
DOWNLOAD_TIMEOUT = (15, 120) # (connect, read)
CHUNK_SIZE = 1 << 20 # 1 MiB
MAX_FEED_RETRIES = 3
# Ensure directories exist
os.makedirs(AUDIO_DIR, exist_ok=True)
os.makedirs(TRANSCRIPT_DIR, exist_ok=True)
os.makedirs(os.path.join(os.path.dirname(__file__), "data"), exist_ok=True)
# ============================================================================
# Analysis Timeout (seconds)
# ============================================================================
ANALYSIS_TIMEOUT = int(os.environ.get("DS_ANALYZE_TIMEOUT", "600"))
# Analysis pause between calls
ANALYSIS_PAUSE = int(os.environ.get("DS_ANALYZE_PAUSE", "45"))
# Minimum free RAM (bytes)
MIN_FREE_RAM = int(os.environ.get("DS_MIN_FREE_RAM", str(1024 * 1024 * 1024)))
# Rate cooldown seconds
RATE_COOLDOWN_SECONDS = int(os.environ.get("DS_RATE_COOLDOWN", "900"))
# ============================================================================
# Directory Setup (auto-create)
# ============================================================================
for d in [AUDIO_DIR, TRANSCRIPT_DIR, os.path.join(os.path.dirname(__file__), "data")]:
os.makedirs(d, exist_ok=True)
File diff suppressed because it is too large Load Diff
+520
View File
@@ -0,0 +1,520 @@
{"ep_num": 1, "title": "Episode 1 – Dick in Mexico", "pub_date": "Tue, 07 Jun 2016 09:50:06 +0000", "guid": "http://test.thedickshow.com/?p=13", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_001.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 93777920, "duration_sec": 3900, "page_link": "http://test.thedickshow.com/?p=13"}
{"ep_num": 2, "title": "Episode 2 – Dick on Fathers Day", "pub_date": "Tue, 14 Jun 2016 18:34:31 +0000", "guid": "http://dickshow.wpengine.com/?p=47", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_002.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 89753600, "duration_sec": 3717, "page_link": "http://dickshow.wpengine.com/?p=47"}
{"ep_num": 3, "title": "Episode 3 – Dick on Movies", "pub_date": "Tue, 21 Jun 2016 08:20:06 +0000", "guid": "http://dickshow.wpengine.com/?p=77", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_003.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 84285440, "duration_sec": 3413, "page_link": "http://dickshow.wpengine.com/?p=77"}
{"ep_num": 4, "title": "Episode 4 – Dick on Wrestling", "pub_date": "Tue, 28 Jun 2016 17:42:38 +0000", "guid": "http://dickshow.wpengine.com/?p=98", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_004.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 106847977, "duration_sec": 4361, "page_link": "http://dickshow.wpengine.com/?p=98"}
{"ep_num": 5, "title": "Episode 5 – Dick on Sex Robots", "pub_date": "Tue, 05 Jul 2016 16:10:25 +0000", "guid": "http://dickshow.wpengine.com/?p=119", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_005.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 69068800, "duration_sec": 4204, "page_link": "http://dickshow.wpengine.com/?p=119"}
{"ep_num": 6, "title": "Episode 6 – Dick on Trans", "pub_date": "Tue, 12 Jul 2016 05:54:07 +0000", "guid": "http://dickshow.wpengine.com/?p=141", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_006.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 79632384, "duration_sec": 4904, "page_link": "http://dickshow.wpengine.com/?p=141"}
{"ep_num": 7, "title": "Episode 7 – Dick on Guns", "pub_date": "Tue, 19 Jul 2016 07:36:45 +0000", "guid": "http://dickshow.wpengine.com/?p=177", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_007.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126272866, "duration_sec": 6255, "page_link": "http://dickshow.wpengine.com/?p=177"}
{"ep_num": 8, "title": "Episode 8 – Dick on Sean", "pub_date": "Tue, 26 Jul 2016 14:50:14 +0000", "guid": "http://dickshow.wpengine.com/?p=210", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_008.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 97463256, "duration_sec": 6066, "page_link": "http://dickshow.wpengine.com/?p=210"}
{"ep_num": 9, "title": "Episode 9 – Dick on the DNC", "pub_date": "Tue, 02 Aug 2016 16:09:27 +0000", "guid": "http://dickshow.wpengine.com/?p=224", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_009.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 69296128, "duration_sec": 4280, "page_link": "http://dickshow.wpengine.com/?p=224"}
{"ep_num": 10, "title": "Episode 10 – Dick on The Olympics", "pub_date": "Tue, 09 Aug 2016 08:50:13 +0000", "guid": "http://dickshow.wpengine.com/?p=244", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_010.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 94254148, "duration_sec": 5882, "page_link": "http://dickshow.wpengine.com/?p=244"}
{"ep_num": 11, "title": "Episode 11 – Dick on Magic", "pub_date": "Tue, 16 Aug 2016 14:42:47 +0000", "guid": "http://dickshow.wpengine.com/?p=264", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_011.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 89808047, "duration_sec": 5583, "page_link": "http://dickshow.wpengine.com/?p=264"}
{"ep_num": 12, "title": "Episode 12 – Dick on Hunks", "pub_date": "Tue, 23 Aug 2016 16:29:51 +0000", "guid": "http://dickshow.wpengine.com/?p=277", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_012.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 86184836, "duration_sec": 5351, "page_link": "http://dickshow.wpengine.com/?p=277"}
{"ep_num": 13, "title": "Episode 13 – Dick on Fat Rock", "pub_date": "Tue, 30 Aug 2016 16:00:00 +0000", "guid": "http://dickshow.wpengine.com/?p=287", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The20Dick20Show20013.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 91218480, "duration_sec": 5682, "page_link": "http://dickshow.wpengine.com/?p=287"}
{"ep_num": 14, "title": "Episode 14 – Dick on Drugs", "pub_date": "Tue, 06 Sep 2016 21:20:36 +0000", "guid": "http://dickshow.wpengine.com/?p=298", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_014.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 59367545, "duration_sec": 3685, "page_link": "http://dickshow.wpengine.com/?p=298"}
{"ep_num": 15, "title": "Episode 15 – Dick on Bill Burr", "pub_date": "Tue, 13 Sep 2016 09:08:12 +0000", "guid": "http://dickshow.wpengine.com/?p=311", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_015.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 89343834, "duration_sec": 5560, "page_link": "http://dickshow.wpengine.com/?p=311"}
{"ep_num": 16, "title": "Episode 16 – Dick on School", "pub_date": "Tue, 20 Sep 2016 13:27:55 +0000", "guid": "http://thedickshow.com/?p=341", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_016.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 93570818, "duration_sec": 5802, "page_link": "http://thedickshow.com/?p=341"}
{"ep_num": 17, "title": "Episode 17 – Dick on Clegg", "pub_date": "Tue, 27 Sep 2016 15:57:03 +0000", "guid": "http://thedickshow.com/?p=354", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_017.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 106600097, "duration_sec": 6661, "page_link": "http://thedickshow.com/?p=354"}
{"ep_num": 18, "title": "Episode 18 – Dick on Maddox", "pub_date": "Mon, 03 Oct 2016 05:24:20 +0000", "guid": "http://thedickshow.com/?p=363", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The20Dick20Show20018.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 109071269, "duration_sec": 6777, "page_link": "http://thedickshow.com/?p=363"}
{"ep_num": 19, "title": "Episode 19 – Dick on San Francisco", "pub_date": "Tue, 11 Oct 2016 08:45:46 +0000", "guid": "http://thedickshow.com/?p=370", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_019.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 97180926, "duration_sec": 6073, "page_link": "http://thedickshow.com/?p=370"}
{"ep_num": 20, "title": "Episode 20 – Dick on Cernovich", "pub_date": "Tue, 18 Oct 2016 04:33:19 +0000", "guid": "http://thedickshow.com/?p=378", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_020.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 97298781, "duration_sec": 6079, "page_link": "http://thedickshow.com/?p=378"}
{"ep_num": 21, "title": "Episode 21 – Dick on Asterios", "pub_date": "Tue, 25 Oct 2016 15:37:02 +0000", "guid": "http://thedickshow.com/?p=387", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_021.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 119493670, "duration_sec": 7422, "page_link": "http://thedickshow.com/?p=387"}
{"ep_num": 22, "title": "Episode 22 – Dick on Voting", "pub_date": "Tue, 01 Nov 2016 14:55:38 +0000", "guid": "http://thedickshow.com/?p=421", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_022.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156238851, "duration_sec": 9763, "page_link": "http://thedickshow.com/?p=421"}
{"ep_num": 23, "title": "Episode 23 – Dick on Results", "pub_date": "Tue, 08 Nov 2016 14:38:57 +0000", "guid": "http://thedickshow.com/?p=435", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_023.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 111783318, "duration_sec": 6983, "page_link": "http://thedickshow.com/?p=435"}
{"ep_num": 24, "title": "Episode 24 – Dick on Gloating", "pub_date": "Tue, 15 Nov 2016 06:21:29 +0000", "guid": "http://thedickshow.com/?p=447", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_024.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 106036843, "duration_sec": 4417, "page_link": "http://thedickshow.com/?p=447"}
{"ep_num": 25, "title": "Episode 25 – Dick on One Million Downloads", "pub_date": "Tue, 22 Nov 2016 06:52:43 +0000", "guid": "http://thedickshow.com/?p=464", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_025.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 78000125, "duration_sec": 4873, "page_link": "http://thedickshow.com/?p=464"}
{"ep_num": 26, "title": "Episode 26 – Dick on Santa", "pub_date": "Tue, 29 Nov 2016 06:58:16 +0000", "guid": "http://thedickshow.com/?p=493", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_026.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 99120314, "duration_sec": 6194, "page_link": "http://thedickshow.com/?p=493"}
{"ep_num": 27, "title": "Episode 27 – Dick on Moving", "pub_date": "Tue, 06 Dec 2016 05:54:10 +0000", "guid": "http://thedickshow.com/?p=499", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_027.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 87602204, "duration_sec": 5473, "page_link": "http://thedickshow.com/?p=499"}
{"ep_num": 28, "title": "Episode 28 – Dick on The Toilet", "pub_date": "Tue, 13 Dec 2016 08:36:10 +0000", "guid": "http://thedickshow.com/?p=519", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_028.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 97183902, "duration_sec": 6073, "page_link": "http://thedickshow.com/?p=519"}
{"ep_num": 29, "title": "Episode 29 – Dick on World Peace", "pub_date": "Tue, 20 Dec 2016 09:10:25 +0000", "guid": "http://thedickshow.com/?p=528", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_029.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 117664423, "duration_sec": 7352, "page_link": "http://thedickshow.com/?p=528"}
{"ep_num": 30, "title": "Episode 30 – Dick on Ruining Christmas", "pub_date": "Tue, 27 Dec 2016 15:08:49 +0000", "guid": "http://thedickshow.com/?p=541", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_030.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 62301958, "duration_sec": 3893, "page_link": "http://thedickshow.com/?p=541"}
{"ep_num": 31, "title": "Episode 31 – Dick on Dreams", "pub_date": "Tue, 03 Jan 2017 07:20:28 +0000", "guid": "http://thedickshow.com/?p=555", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_031.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 103184036, "duration_sec": 6448, "page_link": "http://thedickshow.com/?p=555"}
{"ep_num": 32, "title": "Episode 32 – Dick on Accidental Pornography", "pub_date": "Tue, 10 Jan 2017 08:12:11 +0000", "guid": "http://thedickshow.com/?p=587", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_032.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 105480031, "duration_sec": 6591, "page_link": "http://thedickshow.com/?p=587"}
{"ep_num": 33, "title": "Episode 33 – Dick on Shaved Ice", "pub_date": "Tue, 17 Jan 2017 08:19:46 +0000", "guid": "http://thedickshow.com/?p=598", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_033.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 134924010, "duration_sec": 8431, "page_link": "http://thedickshow.com/?p=598"}
{"ep_num": 34, "title": "Episode 34 – Dick on Credit Card Chips", "pub_date": "Tue, 24 Jan 2017 06:44:26 +0000", "guid": "http://thedickshow.com/?p=610", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_034.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126619535, "duration_sec": 7913, "page_link": "http://thedickshow.com/?p=610"}
{"ep_num": 35, "title": "Episode 35 – Dick on Peach", "pub_date": "Tue, 31 Jan 2017 14:49:51 +0000", "guid": "http://thedickshow.com/?p=625", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_035.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 120289869, "duration_sec": 7517, "page_link": "http://thedickshow.com/?p=625"}
{"ep_num": 36, "title": "Episode 36 – Dick on Cables", "pub_date": "Tue, 07 Feb 2017 07:11:54 +0000", "guid": "http://thedickshow.com/?p=639", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_036.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 140576572, "duration_sec": 8703, "page_link": "http://thedickshow.com/?p=639"}
{"ep_num": 37, "title": "Episode 37 – Dick on Skating", "pub_date": "Mon, 13 Feb 2017 19:23:14 +0000", "guid": "http://thedickshow.com/?p=649", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_037.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 91413460, "duration_sec": 5712, "page_link": "http://thedickshow.com/?p=649"}
{"ep_num": 38, "title": "Episode 38 – Dick on Harmful Opinions", "pub_date": "Tue, 21 Feb 2017 06:50:10 +0000", "guid": "http://thedickshow.com/?p=666", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_038.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 131661172, "duration_sec": 8169, "page_link": "http://thedickshow.com/?p=666"}
{"ep_num": 39, "title": "Episode 39 – Dick on Santa Cuck", "pub_date": "Tue, 28 Feb 2017 07:47:09 +0000", "guid": "http://thedickshow.com/?p=677", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_039.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 114120833, "duration_sec": 7131, "page_link": "http://thedickshow.com/?p=677"}
{"ep_num": 40, "title": "Episode 40 – Dick on Women on Strike", "pub_date": "Tue, 07 Mar 2017 07:41:04 +0000", "guid": "http://thedickshow.com/?p=694", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_040.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 122597422, "duration_sec": 7543, "page_link": "http://thedickshow.com/?p=694"}
{"ep_num": 41, "title": "Episode 41 – Dick on Madcucks", "pub_date": "Tue, 14 Mar 2017 06:54:40 +0000", "guid": "http://thedickshow.com/?p=706", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_041.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 112770026, "duration_sec": 7047, "page_link": "http://thedickshow.com/?p=706"}
{"ep_num": 42, "title": "Episode 42 – Dick on Timeout", "pub_date": "Tue, 21 Mar 2017 09:17:35 +0000", "guid": "http://thedickshow.com/?p=718", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_042.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 108498491, "duration_sec": 6743, "page_link": "http://thedickshow.com/?p=718"}
{"ep_num": 43, "title": "Episode 43 – Dick on Pranks", "pub_date": "Tue, 28 Mar 2017 06:29:28 +0000", "guid": "http://thedickshow.com/?p=730", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_043.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 125332927, "duration_sec": 7832, "page_link": "http://thedickshow.com/?p=730"}
{"ep_num": 44, "title": "Episode 44 – Dick on Talent Shows", "pub_date": "Tue, 04 Apr 2017 15:35:54 +0000", "guid": "http://thedickshow.com/?p=741", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_044.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 106167964, "duration_sec": 6635, "page_link": "http://thedickshow.com/?p=741"}
{"ep_num": 45, "title": "Episode 45 - Dick on Opening Day", "pub_date": "Tue, 11 Apr 2017 02:54:12 +0000", "guid": "5b52d132e687add03c1e78fb35ef0af7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_045.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 105923298, "duration_sec": 6591, "page_link": "http://dick.show/episode-45/"}
{"ep_num": 46, "title": "Episode 46 - Dick on Camping", "pub_date": "Tue, 18 Apr 2017 05:00:00 +0000", "guid": "110c9411700bfdd3875d7886610a4e3c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_046.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 92469066, "duration_sec": 5710, "page_link": "http://dick.show/episode-46"}
{"ep_num": 47, "title": "Episode 47 - Dick on Road Rage: Philly", "pub_date": "Tue, 25 Apr 2017 04:50:20 +0000", "guid": "17abd344c6fd1422c4c9f67d70fd90b3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_047.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 116891363, "duration_sec": 7303, "page_link": "http://dick.show/episode-47/"}
{"ep_num": 48, "title": "Episode 48 - Dick on Saving the World", "pub_date": "Tue, 02 May 2017 04:25:47 +0000", "guid": "b174c4f95123d1ddcb4f600b62236d45", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_048.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 109246283, "duration_sec": 6784, "page_link": "http://dick.show/episode-48/"}
{"ep_num": 49, "title": "Episode 49 - Dick on Interrupting", "pub_date": "Tue, 09 May 2017 03:53:18 +0000", "guid": "73db7351609354a5c9d64ebe940f934e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_049.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 129510261, "duration_sec": 8092, "page_link": "http://dick.show/episode-49/"}
{"ep_num": 50, "title": "Episode 50 - Dick on Fighting", "pub_date": "Tue, 16 May 2017 06:40:21 +0000", "guid": "255bd2969dfa7308202a3e666ec806a0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_050.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 111449304, "duration_sec": 6964, "page_link": "http://dick.show/episode-50/"}
{"ep_num": 51, "title": "Episode 51 - Dick on Bear Spray", "pub_date": "Tue, 23 May 2017 04:22:31 +0000", "guid": "b50680f52c88fe040ba75f93e0fa7f18", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_051.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 108506370, "duration_sec": 6679, "page_link": "http://dick.show/episode-51/"}
{"ep_num": 52, "title": "Episode 52 - Dick on Waut3rgate", "pub_date": "Tue, 30 May 2017 02:53:38 +0000", "guid": "bfd3647e18d32a677c3c0574563d266c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_052.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 115834448, "duration_sec": 7210, "page_link": "http://dick.show/episode-52/"}
{"ep_num": 53, "title": "Episode 53 - Dick on Pulling Teeth", "pub_date": "Tue, 06 Jun 2017 06:09:25 +0000", "guid": "1ba1e0d4752722d6a5c1ae1afa8e2b31", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_053.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 117585091, "duration_sec": 7322, "page_link": "http://dick.show/episode-53/"}
{"ep_num": 54, "title": "Episode 54 - Dick on Graduating", "pub_date": "Tue, 13 Jun 2017 06:26:47 +0000", "guid": "c0e7c6e55f8c33462500ad4bb252ae98", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_054.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133468335, "duration_sec": 8321, "page_link": "http://dick.show/episode-54/"}
{"ep_num": 55, "title": "Episode 55 - Dick on Court", "pub_date": "Tue, 20 Jun 2017 05:01:39 +0000", "guid": "da93d53532c9104dcfec79ce97da0837", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_055.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 124922344, "duration_sec": 7786, "page_link": "http://dick.show/episode-55/"}
{"ep_num": 56, "title": "Episode 56 - Dick on Crosswords", "pub_date": "Tue, 27 Jun 2017 09:22:55 +0000", "guid": "0676af2323734bd3b95ca0ca453b89db", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_056.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 121808151, "duration_sec": 7600, "page_link": "http://dick.show/episode-56/"}
{"ep_num": 57, "title": "Episode 57 - Dick on Ghost Guns", "pub_date": "Tue, 04 Jul 2017 02:38:47 +0000", "guid": "7fcae516a3f04d52b216bae48b380fd5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_057.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 121616705, "duration_sec": 7600, "page_link": "http://dick.show/episode-57"}
{"ep_num": 58, "title": "Episode 58 - Dick on Pumping Gas", "pub_date": "Tue, 11 Jul 2017 06:46:49 +0000", "guid": "b57f72703992cb22c6c6d16854ec7d9e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_058.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 103440871, "duration_sec": 6461, "page_link": "http://dick.show/episode-58/"}
{"ep_num": 59, "title": "Episode 59 - Dick on Souvenir Cups", "pub_date": "Tue, 18 Jul 2017 09:00:42 +0000", "guid": "af535b1f5d69ec798091d329cb91cd5e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_059.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 110244390, "duration_sec": 6767, "page_link": "http://dick.show/episode-59/"}
{"ep_num": 60, "title": "Episode 60 - Dick on Nazi Pugs", "pub_date": "Tue, 25 Jul 2017 06:11:26 +0000", "guid": "a98996ca1e3a2c1aee3de2307327c8d3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_060.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 167827193, "duration_sec": 10331, "page_link": "http://dick.show/episode-60/"}
{"ep_num": 61, "title": "Episode 61 - Dick on Mister Metokur", "pub_date": "Tue, 01 Aug 2017 11:54:34 +0000", "guid": "cc9b9e4ebf3ed13442da4f00fa9cd9a0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_061.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 106916118, "duration_sec": 6677, "page_link": "http://dick.show/episode-61"}
{"ep_num": 62, "title": "Episode 62 - Dick on Fractions", "pub_date": "Tue, 08 Aug 2017 06:11:44 +0000", "guid": "1d0f08eced7f90e0398b0fb6b6315039", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_062.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 79945922, "duration_sec": 4995, "page_link": "http://dick.show/episode-62"}
{"ep_num": 63, "title": "Episode 63 - Dick on Fake Police", "pub_date": "Tue, 15 Aug 2017 04:10:03 +0000", "guid": "c8b0bb09ea35a01b78dcc50616178fbf", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_063.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147974656, "duration_sec": 9171, "page_link": "http://dick.show/episode-63"}
{"ep_num": 64, "title": "Episode 64 - Dick on Platitudes", "pub_date": "Tue, 22 Aug 2017 06:25:58 +0000", "guid": "48e80d17457aeaea641954651951671c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_064.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 108386478, "duration_sec": 6742, "page_link": "http://dick.show/episode-64/"}
{"ep_num": 65, "title": "Episode 65 - Dick on Back to School", "pub_date": "Tue, 29 Aug 2017 05:23:45 +0000", "guid": "f55f1b5ba305d1cccd3ca55a00ba31b2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_065.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139143552, "duration_sec": 8688, "page_link": "http://dick.show/episode-65"}
{"ep_num": 66, "title": "Episode 66 - Dick on False Alarms", "pub_date": "Tue, 05 Sep 2017 03:57:23 +0000", "guid": "fd2f72481365532a8eca01099d7f604f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_066.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138891272, "duration_sec": 8430, "page_link": "http://dick.show/episode-66/"}
{"ep_num": 67, "title": "Episode 67 - Dick on The Devil", "pub_date": "Tue, 12 Sep 2017 06:30:06 +0000", "guid": "9f3194892f74e96fe2caa32fa626fe80", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_067.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133461504, "duration_sec": 8120, "page_link": "http://dick.show/episode-67/"}
{"ep_num": 68, "title": "Episode 68 - Dick on Phony Lollers", "pub_date": "Tue, 19 Sep 2017 05:31:34 +0000", "guid": "61de054a6da4c75236b6ee86924807b1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_068.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154977664, "duration_sec": 9672, "page_link": "http://dick.show/episode-68"}
{"ep_num": 69, "title": "Episode 69 - Dick on Dick", "pub_date": "Tue, 26 Sep 2017 06:13:59 +0000", "guid": "37996ee3878207137ab8f46f7c4db64c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_069.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 124052736, "duration_sec": 7743, "page_link": "http://dick.show/episode-69"}
{"ep_num": 70, "title": "Episode 70 - Dick on Turning Japanese", "pub_date": "Tue, 03 Oct 2017 06:09:24 +0000", "guid": "d82a921ee2e2f355755ddf06e3fb42c1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_070.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 150210688, "duration_sec": 9386, "page_link": "http://dick.show/episode-70/"}
{"ep_num": 71, "title": "Episode 71 - Dick on Being Toxic", "pub_date": "Tue, 10 Oct 2017 06:33:15 +0000", "guid": "ad19bafe262c488624da4d5c1c440609", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_071.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 98348800, "duration_sec": 6024, "page_link": "http://dick.show/episode-71/"}
{"ep_num": 72, "title": "Episode 72 - Dick on Road Rage: Los Angeles", "pub_date": "Tue, 17 Oct 2017 14:16:44 +0000", "guid": "c8ddf31062582a6f6d1054f3710abd2a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_072.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 131505024, "duration_sec": 8195, "page_link": "http://dick.show/episode-72"}
{"ep_num": 73, "title": "Episode 73 - Dick on F*ck Whales", "pub_date": "Tue, 24 Oct 2017 07:12:12 +0000", "guid": "2b8802a842e9587b2ff3bba67cbf1aa4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_073.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 95990912, "duration_sec": 5971, "page_link": "http://dick.show/episode-73"}
{"ep_num": 74, "title": "Episode 74 - Dick on Exile", "pub_date": "Tue, 31 Oct 2017 07:34:17 +0000", "guid": "1ae12d901bd67a789fe54beaaf069603", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_074.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 103828480, "duration_sec": 6282, "page_link": "http://dick.show/episode-74/"}
{"ep_num": 75, "title": "Episode 75 - Dick on LA Phil", "pub_date": "Tue, 07 Nov 2017 07:01:47 +0000", "guid": "0fabd87988922e77167b23a257807808", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_075.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138980608, "duration_sec": 8685, "page_link": "http://dick.show/episode-75"}
{"ep_num": 76, "title": "Episode 76 - Dick on Bashing Women", "pub_date": "Tue, 14 Nov 2017 05:58:04 +0000", "guid": "46f6745c9ef580ab347cd4afd27d8f7c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_076.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 136331334, "duration_sec": 8484, "page_link": "http://dick.show/episode-76/"}
{"ep_num": 77, "title": "Episode 77 - Dick on Unimaginable Stress", "pub_date": "Mon, 20 Nov 2017 10:42:58 +0000", "guid": "f649488b5ebc38da060a619d32f3dcb6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_077.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 100998784, "duration_sec": 6167, "page_link": "http://dick.show/episode-77"}
{"ep_num": 78, "title": "Episode 78 - Dick on Stealing Shows", "pub_date": "Tue, 28 Nov 2017 07:28:08 +0000", "guid": "29df556a87f0046c37e2b3f72580bf54", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_078.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 103835776, "duration_sec": 6474, "page_link": "http://dick.show/episode-78/"}
{"ep_num": 79, "title": "Episode 79 - Dick on Road Rage: Chicago", "pub_date": "Tue, 05 Dec 2017 11:12:42 +0000", "guid": "828b51e756b5580cd79358f6b4dcaa1e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_079.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 118565376, "duration_sec": 7366, "page_link": "http://dick.show/episode-79"}
{"ep_num": 80, "title": "Episode 80 - Dick on The Sounds of Spite", "pub_date": "Tue, 12 Dec 2017 05:36:55 +0000", "guid": "f91438da9c666fdaaa59892a04a5eb20", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_080.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 125223808, "duration_sec": 7800, "page_link": "http://dick.show/episode-80"}
{"ep_num": 81, "title": "Episode 81 - Dick on Eating Expenses", "pub_date": "Tue, 19 Dec 2017 07:46:04 +0000", "guid": "ca6a9ab3da8e6a2a0283a616ff79b8ad", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_081.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 142194816, "duration_sec": 8733, "page_link": "http://dick.show/episode-81"}
{"ep_num": 82, "title": "Episode 82 - Dick on Number Three in Space", "pub_date": "Sat, 23 Dec 2017 21:00:36 +0000", "guid": "c4a4af63a3204911199aeca7148b9fec", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_082.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 127717376, "duration_sec": 7909, "page_link": "http://dick.show/episode-82/"}
{"ep_num": 83, "title": "Episode 83 - Dick on Policing Language", "pub_date": "Tue, 02 Jan 2018 16:22:06 +0000", "guid": "78fa5d9798d48ed6714411ed3c24afee", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_083.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 115519488, "duration_sec": 7099, "page_link": "http://dick.show/episode-83/"}
{"ep_num": 84, "title": "Episode 84 - Dick on Nuttin", "pub_date": "Tue, 09 Jan 2018 02:11:25 +0000", "guid": "2997bccc30512ff93b478a599fc48803", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_084.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139842304, "duration_sec": 8429, "page_link": "https://thedickshow.libsyn.com/episode-84-dick-on-nuttin"}
{"ep_num": 85, "title": "Episode 85 - Dick on Do-Overs", "pub_date": "Tue, 16 Jan 2018 08:34:43 +0000", "guid": "067c0f495dff995f77dc93b6ca8cac65", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_085.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 123757696, "duration_sec": 7573, "page_link": "http://dick.show/episode-85"}
{"ep_num": 86, "title": "Episode 86 - Dick on Dickels", "pub_date": "Tue, 23 Jan 2018 14:57:19 +0000", "guid": "e2b2a74dacc518288499b247485c1f0c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_086.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 124596224, "duration_sec": 7714, "page_link": "http://dick.show/episode-86/"}
{"ep_num": 87, "title": "Episode 87 - Dick on The Ultimate Douchebag Machine", "pub_date": "Tue, 30 Jan 2018 04:53:52 +0000", "guid": "997e5daef31ba278f11ba282fb9d9387", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_087.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138473088, "duration_sec": 8615, "page_link": "http://dick.show/episode-87/"}
{"ep_num": 88, "title": "Episode 88 - Dick on Blue Balls", "pub_date": "Tue, 06 Feb 2018 02:00:00 +0000", "guid": "120e3bb9947d705b95053e50d515b472", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_088.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 105516032, "duration_sec": 6444, "page_link": "http://dick.show/episode-88/"}
{"ep_num": 89, "title": "Episode 89 - Dick on Getting Caught", "pub_date": "Tue, 13 Feb 2018 05:09:12 +0000", "guid": "04b1b04874583ba659541cc90290fae1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_089.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133572480, "duration_sec": 8283, "page_link": "http://dick.show/episode-89/"}
{"ep_num": 90, "title": "Episode 90 - Dick on The Dick Show Album", "pub_date": "Tue, 20 Feb 2018 14:45:45 +0000", "guid": "499aa390eb5d60dca366b9b5fdd4c9ca", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_090.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144270464, "duration_sec": 8984, "page_link": "http://dick.show/episode-90"}
{"ep_num": 91, "title": "Episode 91 - Dick on Road Rage: Portland", "pub_date": "Tue, 27 Feb 2018 14:26:13 +0000", "guid": "c02af9d9563a8a2e09ddc3963e759340", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_091.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 129249280, "duration_sec": 7979, "page_link": "http://dick.show/episode-91/"}
{"ep_num": 92, "title": "Episode 92 - Dick on Suppositories", "pub_date": "Tue, 06 Mar 2018 04:54:52 +0000", "guid": "313d175afb862edc1efc4e47c03be74f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_092.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138822528, "duration_sec": 8651, "page_link": "http://dick.show/episode-92"}
{"ep_num": 93, "title": "Episode 93 - Dick on Heather S", "pub_date": "Mon, 12 Mar 2018 19:23:02 +0000", "guid": "e59832b7761c12980cb28e4d12c20e17", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_093.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 132684544, "duration_sec": 7981, "page_link": "http://dick.show/episode-93/"}
{"ep_num": 94, "title": "Episode 94 - Dick on Doubling Down", "pub_date": "Tue, 20 Mar 2018 04:06:19 +0000", "guid": "9c42c0ab06eace63f7d325c282349063", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_094.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 132601728, "duration_sec": 8167, "page_link": "http://dick.show/episode-94/"}
{"ep_num": 95, "title": "Episode 95 - Dick on Chutzpah", "pub_date": "Tue, 27 Mar 2018 03:52:39 +0000", "guid": "f7554a25f60471ccfc0a15753bd86f09", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_095.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126852864, "duration_sec": 7667, "page_link": "http://dick.show/episode-95/"}
{"ep_num": 96, "title": "Episode 96 - Dick on The Status Quo", "pub_date": "Tue, 03 Apr 2018 14:30:02 +0000", "guid": "e4ef013a63de0230d7a927be0270f3c5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_096.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 164860800, "duration_sec": 10279, "page_link": "http://dick.show/episode-96/"}
{"ep_num": 97, "title": "Episode 97 - Dick on Big Red", "pub_date": "Tue, 10 Apr 2018 04:10:46 +0000", "guid": "78b46353952027dab3ba781bb44caa40", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_097.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165828096, "duration_sec": 10177, "page_link": "http://dick.show/episode-97/"}
{"ep_num": 98, "title": "Episode 98 - Dick on The Trademark", "pub_date": "Tue, 17 Apr 2018 03:18:10 +0000", "guid": "adece504c6387d1ca90ee3d1d69b8ca5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_098.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149839744, "duration_sec": 9262, "page_link": "http://dick.show/episode-98/"}
{"ep_num": 99, "title": "Episode 99 - Dick on Happy Accidents", "pub_date": "Tue, 24 Apr 2018 05:38:34 +0000", "guid": "d9c6f623962a6b4597d4a7a2010fc1f7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_099.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160874112, "duration_sec": 9994, "page_link": "http://dick.show/episode-99/"}
{"ep_num": 100, "title": "Episode 100 - Dick on Keeping it 100", "pub_date": "Tue, 01 May 2018 08:03:04 +0000", "guid": "e71ab3c8c295b8fb38b23d2b56999049", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_100.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165810432, "duration_sec": 10273, "page_link": "http://dick.show/episode-100"}
{"ep_num": 101, "title": "Episode 101 - Dick on Supreme Gentlemen", "pub_date": "Tue, 08 May 2018 04:58:24 +0000", "guid": "1313051e746b6b495aab755e3429df5d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_101.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 131037568, "duration_sec": 8119, "page_link": "http://dick.show/episode-101"}
{"ep_num": 102, "title": "Episode 102 - Dick on Birthday Overhead", "pub_date": "Sun, 13 May 2018 15:14:08 +0000", "guid": "921afec70a2c970e6f2599ec3244a820", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_102.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149077120, "duration_sec": 9302, "page_link": "https://thedickshow.libsyn.com/episode-102-dick-on-birthday-overhead"}
{"ep_num": 103, "title": "Episode 103 - Dick on Maddox Lost", "pub_date": "Tue, 22 May 2018 15:15:20 +0000", "guid": "91d6beee2d304547a4e525c151414ac3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_103.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 130898048, "duration_sec": 7881, "page_link": "http://dick.show/episode-103/"}
{"ep_num": 104, "title": "Episode 104 - Dick on Damages", "pub_date": "Tue, 29 May 2018 02:06:19 +0000", "guid": "687e951e49d449128de6cbaced5b7f92", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_104.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139906688, "duration_sec": 8730, "page_link": "https://thedickshow.libsyn.com/episode-104-dick-on-damages"}
{"ep_num": 105, "title": "Episode 105 - Dick on Caught Cheating", "pub_date": "Tue, 05 Jun 2018 02:28:04 +0000", "guid": "fa837e4dc406480883fae9fe4cf8d6fb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_105.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 117306368, "duration_sec": 7234, "page_link": "http://dick.show/episode-105/"}
{"ep_num": 106, "title": "Episode 106 - Dick on Going to Greenland", "pub_date": "Tue, 12 Jun 2018 06:31:56 +0000", "guid": "7f4dd2f85a2a408998b464b6e39945d4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_106.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175019008, "duration_sec": 10776, "page_link": "http://dick.show/episode-106/"}
{"ep_num": 107, "title": "Episode 107 - Dick on Milking Dad", "pub_date": "Tue, 19 Jun 2018 06:04:38 +0000", "guid": "d9d1a9a687b940778f2de462b659d0ec", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_107.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 135781376, "duration_sec": 8462, "page_link": "http://dick.show/episode-107/"}
{"ep_num": 108, "title": "Episode 108 - Dick on The Sean Show", "pub_date": "Wed, 27 Jun 2018 03:59:00 +0000", "guid": "124b64ef21d14e6885019ee19a867fff", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_108.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154837602, "duration_sec": 9626, "page_link": "http://dick.show/episode-108"}
{"ep_num": 109, "title": "Episode 109 - Dick on Road Rage: Dallas", "pub_date": "Tue, 03 Jul 2018 06:55:03 +0000", "guid": "a92aa087dd024332b196bdf19c193f94", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_109.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 120548352, "duration_sec": 7513, "page_link": "https://thedickshow.libsyn.com/episode-109-dick-on-road-rage-dallas"}
{"ep_num": 110, "title": "Episode 110 - Dick on Avoiding Holes", "pub_date": "Tue, 10 Jul 2018 03:41:48 +0000", "guid": "1f2518d085134b68a9c7c9c9200b3f69", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_110.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 128205952, "duration_sec": 7969, "page_link": "https://thedickshow.libsyn.com/episode-110-dick-on-avoiding-holes"}
{"ep_num": 111, "title": "Episode 111 - Dick on Moon Lasers", "pub_date": "Tue, 17 Jul 2018 08:02:47 +0000", "guid": "e9ebe73c6da348f9bd0e4225b9592360", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_111.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 130805248, "duration_sec": 8143, "page_link": "http://dick.show/episode-111/"}
{"ep_num": 112, "title": "Episode 112 - Dick on The Bride Catcher", "pub_date": "Tue, 24 Jul 2018 06:43:11 +0000", "guid": "0c25afe01b5a474da78da5541440d672", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_112.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 131859200, "duration_sec": 7934, "page_link": "http://dick.show/episode-112/"}
{"ep_num": 113, "title": "Episode 113 - Dick on Green Eggs and Body Dysmorphia", "pub_date": "Tue, 31 Jul 2018 05:16:42 +0000", "guid": "f2852deb5afa4cf5aeb18ddc3da907e7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_113.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 119328384, "duration_sec": 7379, "page_link": "http://dick.show/episode-113/"}
{"ep_num": 114, "title": "Episode 114 - Dick on Road Rage: Atlanta", "pub_date": "Tue, 07 Aug 2018 13:09:49 +0000", "guid": "5eee9aabe218487abd9958529028ffa9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_114.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 103117824, "duration_sec": 6395, "page_link": "http://dick.show/episode-114"}
{"ep_num": 115, "title": "Episode 115 - Dick on The Bro Economy", "pub_date": "Tue, 14 Aug 2018 14:21:04 +0000", "guid": "8241c9e9ac9d4dfda6f814eaf7e7a99c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_115.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143764480, "duration_sec": 8968, "page_link": "http://dick.show/episode-115"}
{"ep_num": 116, "title": "Episode 116 - Dick on The Stolen RSS Feed", "pub_date": "Tue, 21 Aug 2018 06:41:57 +0000", "guid": "9a56b483e82846eda276305a1398d7ea", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_116.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139451520, "duration_sec": 8679, "page_link": "http://dick.show/episode-116"}
{"ep_num": 117, "title": "Episode 117 - Dick on Memory Rot", "pub_date": "Tue, 28 Aug 2018 06:44:14 +0000", "guid": "c7631234b0ac4d0792ddba7df60608c3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_117.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138111360, "duration_sec": 8545, "page_link": "http://dick.show/episode-117/"}
{"ep_num": 118, "title": "Episode 118 - Dick on Paying Maddox's Rent", "pub_date": "Tue, 04 Sep 2018 13:36:40 +0000", "guid": "6ab69f2a484d4cbfb2dcd08c38560580", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_118.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156133376, "duration_sec": 9710, "page_link": "http://dick.show/episode-118/"}
{"ep_num": 119, "title": "Episode 119 - Dick on Nachos on Dick", "pub_date": "Tue, 11 Sep 2018 05:25:37 +0000", "guid": "652fbf2f40674013bb17144738ed49f6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_119.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152287360, "duration_sec": 9442, "page_link": "http://dick.show/episode-119/"}
{"ep_num": 120, "title": "Episode 120 - Dick on Earthworm Jim", "pub_date": "Tue, 18 Sep 2018 06:37:55 +0000", "guid": "4c986cc175e7466283157cac608e47e9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_120.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144657408, "duration_sec": 9018, "page_link": "http://dick.show/episode-120/"}
{"ep_num": 121, "title": "Episode 121 - Dick on Unintended Consequences", "pub_date": "Tue, 25 Sep 2018 14:45:26 +0000", "guid": "5aa9fd21225e4a4d9e6e1b9a9c3829b7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_121.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 137366784, "duration_sec": 8450, "page_link": "http://dick.show/episode-121/"}
{"ep_num": 122, "title": "Episode 122 - Dick on The Mustard Song", "pub_date": "Tue, 02 Oct 2018 06:05:46 +0000", "guid": "11d89930dcb44554bd29203d7382c0df", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_122.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165910784, "duration_sec": 10228, "page_link": "http://dick.show/episode-122"}
{"ep_num": 123, "title": "Episode 123 - Dick on Getting the Band Back Together", "pub_date": "Tue, 09 Oct 2018 06:30:46 +0000", "guid": "38bfd63b25134f0682a368e6eb327138", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_123.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161344000, "duration_sec": 10038, "page_link": "http://dick.show/episode-123/"}
{"ep_num": 124, "title": "Episode 124 - Dick on Proper Grooming", "pub_date": "Tue, 16 Oct 2018 06:29:45 +0000", "guid": "19fc885f60a44a55b572d91f23f839c2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_124.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160750208, "duration_sec": 9908, "page_link": "http://dick.show/episode-124/"}
{"ep_num": 125, "title": "Episode 125 - Dick on Lengthening", "pub_date": "Tue, 23 Oct 2018 06:57:39 +0000", "guid": "2a098d6bd305494fb629164422ca2de1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_125.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156199552, "duration_sec": 9630, "page_link": "http://dick.show/episode-125"}
{"ep_num": 126, "title": "Episode 126 - Dick on Staying off the Internet", "pub_date": "Tue, 30 Oct 2018 08:23:33 +0000", "guid": "354616e4a29448a195d4a40be675e70a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_126.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 173432576, "duration_sec": 10756, "page_link": "http://dick.show/episode-126/"}
{"ep_num": 127, "title": "Episode 127 - Dick on Killing Kids", "pub_date": "Tue, 06 Nov 2018 14:15:31 +0000", "guid": "91799a8a370044b4a0543f20351767be", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_127.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133277568, "duration_sec": 8289, "page_link": "http://dick.show/episode-127"}
{"ep_num": 128, "title": "Episode 128 - Dick on Bigger Balls", "pub_date": "Tue, 13 Nov 2018 06:40:16 +0000", "guid": "af743ca59df84e578adaf24703c10d0b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_128.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149351808, "duration_sec": 9306, "page_link": "http://dick.show/episode-128/"}
{"ep_num": 129, "title": "Episode 129 - Dick on The Crying Game", "pub_date": "Tue, 20 Nov 2018 07:56:16 +0000", "guid": "4c2a26bbc5ba4d84977edfc1fc78ff2e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_129.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 271246998, "duration_sec": 11248, "page_link": "http://dick.show/episode-129"}
{"ep_num": 130, "title": "Episode 130 - Dick on Taxing Women", "pub_date": "Tue, 27 Nov 2018 07:29:19 +0000", "guid": "80327b2ca1d14bf7ac550eb01d634892", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_130.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 131370112, "duration_sec": 8103, "page_link": "http://dick.show/episode-130"}
{"ep_num": 131, "title": "Episode 131 - Dick on The Last Minute Rush", "pub_date": "Tue, 04 Dec 2018 05:39:51 +0000", "guid": "60efc7b320f44a49b53a50fda576ccd7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_131.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 162200960, "duration_sec": 9994, "page_link": "http://dick.show/episode-131"}
{"ep_num": 132, "title": "Episode 132 - Dick on Deplatforming Jesus", "pub_date": "Tue, 11 Dec 2018 08:31:11 +0000", "guid": "e0d7e2e03c974b7e993b18fc8a08dc8c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_132.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 168248064, "duration_sec": 10467, "page_link": "http://dick.show/episode-132"}
{"ep_num": 133, "title": "Episode 133 - Dick on Underwater Hamsters", "pub_date": "Tue, 18 Dec 2018 09:24:20 +0000", "guid": "bf89a244b6604b189282526b271c0daa", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_133.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 137062400, "duration_sec": 8555, "page_link": "http://dick.show/episode-133"}
{"ep_num": 134, "title": "Episode 134 - Dick on Revenge of the Apostrophe", "pub_date": "Tue, 25 Dec 2018 05:50:40 +0000", "guid": "22d7eaede36e4af3a0075520fa682087", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_134.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 130932352, "duration_sec": 7924, "page_link": "http://dick.show/episode-134/"}
{"ep_num": 135, "title": "Episode 135 - Dick on The Asterios Muppet", "pub_date": "Tue, 01 Jan 2019 08:53:57 +0000", "guid": "b7413cae8648477cb9c50a4f2075594e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_135.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 136211072, "duration_sec": 8485, "page_link": "http://dick.show/episode-135/"}
{"ep_num": 136, "title": "Episode 136 - Dick on Chokepoints", "pub_date": "Mon, 07 Jan 2019 17:05:48 +0000", "guid": "d9c15b80544b4a6682518f1a1005d26d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_136.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144392704, "duration_sec": 8980, "page_link": "http://dick.show/episode-135/"}
{"ep_num": 137, "title": "Episode 137 - Dick on Thinkery", "pub_date": "Tue, 15 Jan 2019 08:51:17 +0000", "guid": "566483afbbe7473e8aeeda54bee92e3b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_137.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 198899200, "duration_sec": 12399, "page_link": "http://dick.show/episode-137"}
{"ep_num": 138, "title": "Episode 138 - Dick on Hat Crimes", "pub_date": "Tue, 22 Jan 2019 08:30:55 +0000", "guid": "d5da9f87f5334d719da12ed4aa733707", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_138.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 203704960, "duration_sec": 12695, "page_link": "http://dick.show/episode-138/"}
{"ep_num": 139, "title": "Episode 139 - Dick on Cheating Yourself", "pub_date": "Tue, 29 Jan 2019 14:04:06 +0000", "guid": "1d057574df264a2bb227924921ac636b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_139.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143997312, "duration_sec": 8981, "page_link": "http://dick.show/episode-139"}
{"ep_num": 140, "title": "Episode 140 - Dick on The Devil's Rectangle", "pub_date": "Tue, 05 Feb 2019 08:31:52 +0000", "guid": "4fcbff377c02447a9458c909e1431163", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_140.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149094784, "duration_sec": 9242, "page_link": "http://dick.show/episode-140/"}
{"ep_num": 141, "title": "Episode 141 - Dick on Learning to Code", "pub_date": "Tue, 12 Feb 2019 07:47:54 +0000", "guid": "5219a65512a841ecac45b0caf00ad6c3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_141.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161149184, "duration_sec": 10050, "page_link": "https://dick.show/episode-141/"}
{"ep_num": 142, "title": "Episode 142 - Dick on The Butt Conspiracy", "pub_date": "Tue, 19 Feb 2019 06:39:23 +0000", "guid": "aabbf740894f437cb9543921c5db5c6d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_142.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 166392576, "duration_sec": 10350, "page_link": "https://dick.show/episode-142"}
{"ep_num": 143, "title": "Episode 143 - Dick on Wet Jeans", "pub_date": "Tue, 26 Feb 2019 06:44:52 +0000", "guid": "1d0788904a8040419b50112cc8d28fa4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_143.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141341056, "duration_sec": 8793, "page_link": "http://dick.show/episode-143"}
{"ep_num": 144, "title": "Episode 144 - Dick on War Porn", "pub_date": "Tue, 05 Mar 2019 07:41:13 +0000", "guid": "6cc98934cc6643a4890c74249d17bc07", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_144.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152339968, "duration_sec": 9482, "page_link": "http://dick.show/episode-144/"}
{"ep_num": 145, "title": "Episode 145 - Dick on Kicking Up a Stink", "pub_date": "Tue, 12 Mar 2019 07:50:16 +0000", "guid": "5f89412f31174ae9be93246cbb8935be", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_145.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155780992, "duration_sec": 9653, "page_link": "http://dick.show/episode-145/"}
{"ep_num": 146, "title": "Episode 146 - Dick on Tickle Day", "pub_date": "Tue, 19 Mar 2019 05:59:14 +0000", "guid": "7845757bb87d42c9bbf55c5077f2b43d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_146.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 137892096, "duration_sec": 8597, "page_link": "http://dick.show/episode-146/"}
{"ep_num": 147, "title": "Episode 147 - Dick on The ISS", "pub_date": "Tue, 26 Mar 2019 06:03:52 +0000", "guid": "07dc17ccc602490e9009d77c6480dde3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_147.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180572672, "duration_sec": 11266, "page_link": "http://dick.show/episode-147"}
{"ep_num": 148, "title": "Episode 148 - Dick on Short Straws", "pub_date": "Tue, 02 Apr 2019 07:13:58 +0000", "guid": "696bc8aff2e348499a78b3ec28eacc1c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_148.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 122378240, "duration_sec": 7475, "page_link": "http://dick.show/episode-148"}
{"ep_num": 149, "title": "Episode 149 - Dick on Meat Dreams", "pub_date": "Tue, 09 Apr 2019 06:57:35 +0000", "guid": "af2ad524e3a244bdaeaac8b3ae9d3f52", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_149.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126855040, "duration_sec": 7881, "page_link": "Http://dick.show/episode-149/"}
{"ep_num": 150, "title": "Episode 150 - Dick on Bad Assumptions", "pub_date": "Tue, 16 Apr 2019 14:24:41 +0000", "guid": "7f770148f0cb4d179c639fa961f8303c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_150.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 298744987, "duration_sec": 9261, "page_link": "http://dick.show/episode-150"}
{"ep_num": 151, "title": "Episode 151 - Dick on Life Subscriptions", "pub_date": "Wed, 24 Apr 2019 03:59:00 +0000", "guid": "650fe2dcd4424931b02e2bc5624065c9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_151.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 111238144, "duration_sec": 6942, "page_link": "http://dick.show/episode-151/"}
{"ep_num": 152, "title": "Episode 152 - Dick on a Mission from God", "pub_date": "Tue, 30 Apr 2019 05:50:10 +0000", "guid": "593aa7b414d64c3380354b97ba973506", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_152.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154020096, "duration_sec": 9588, "page_link": "http://dick.show/episode-152/"}
{"ep_num": 153, "title": "Episode 153 - Dick on Bad Reviews", "pub_date": "Tue, 07 May 2019 07:32:21 +0000", "guid": "28f71a197ad74baaa92b36a04ee6d7df", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_153.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 167959296, "duration_sec": 10480, "page_link": "http://dick.show/episode-153"}
{"ep_num": 154, "title": "Episode 154 - Dick on a Fat Load of Good", "pub_date": "Tue, 14 May 2019 07:49:32 +0000", "guid": "fdf0f95554ed443995eb1b1572d29178", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_154.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 142693376, "duration_sec": 8732, "page_link": "https://dick.show/episode-154"}
{"ep_num": 155, "title": "Episode 155 - Dick on Five Years in Podcasting", "pub_date": "Mon, 20 May 2019 14:57:38 +0000", "guid": "04ca188cd79f45ec9bdd189cd542649a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_155.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 214763426, "duration_sec": 13330, "page_link": "http://dick.show/episode-155"}
{"ep_num": 156, "title": "Episode 156 - Dick on Being Fair", "pub_date": "Tue, 28 May 2019 06:14:38 +0000", "guid": "0118cc898b354dc68b68b759fda11e88", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_156.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144014592, "duration_sec": 8980, "page_link": "http://dick.show/episode-156/"}
{"ep_num": 157, "title": "Episode 157 - Dick on Maddox's Debt", "pub_date": "Tue, 04 Jun 2019 14:37:56 +0000", "guid": "854225c44549455db2b2bdf56e9bd4f8", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_157.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 162474240, "duration_sec": 10044, "page_link": "https://dick.show/episode-157"}
{"ep_num": 158, "title": "Episode 158 - Dick on Derailment", "pub_date": "Tue, 11 Jun 2019 07:01:43 +0000", "guid": "56246071c05748ad8c96e849e8933e6f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_158.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 219019234, "duration_sec": 9070, "page_link": "https://dick.show/episode-158/"}
{"ep_num": 159, "title": "Episode 159 - Dick on Gunplay", "pub_date": "Tue, 18 Jun 2019 01:59:11 +0000", "guid": "52bdb2f2c23740eaad5eec8e68cd2e79", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_159.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 148046208, "duration_sec": 9111, "page_link": "https://dick.show/episode-159"}
{"ep_num": 160, "title": "Episode 160 - Dick on Road Rage: Las Vegas", "pub_date": "Tue, 25 Jun 2019 07:01:06 +0000", "guid": "476626ae85954eb599acd9ef35c79f47", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_160.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141109504, "duration_sec": 8582, "page_link": "https://dick.show/episode-160"}
{"ep_num": 161, "title": "Episode 161 - Dick on The End of Shows", "pub_date": "Tue, 02 Jul 2019 05:20:07 +0000", "guid": "2e1c0bd2605d47cd9ccf25c24cd30a98", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_161.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165422464, "duration_sec": 10226, "page_link": "https://thedickshow.libsyn.com/episode-161-dick-on-the-end-of-shows"}
{"ep_num": 162, "title": "Episode 162 - Dick on Parasites", "pub_date": "Tue, 09 Jul 2019 07:10:11 +0000", "guid": "2849b142712449c98dbe4634820a5854", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_162.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161119232, "duration_sec": 10014, "page_link": "https://dick.show/episode-162"}
{"ep_num": 163, "title": "Episode 163 - Dick on Party Crashing", "pub_date": "Tue, 16 Jul 2019 07:15:42 +0000", "guid": "ed2b0183eb8a4ce8b6bee6187d164d2c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_163.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 191395968, "duration_sec": 11906, "page_link": "https://dick.show/episode-163"}
{"ep_num": 164, "title": "Episode 164 - Dick on Full Moons", "pub_date": "Tue, 23 Jul 2019 06:52:06 +0000", "guid": "c3b39de2faeb424f84df641dd30cb484", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_164.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163784960, "duration_sec": 9950, "page_link": "https://dick.show/episode-164"}
{"ep_num": 165, "title": "Episode 165 - Dick on Hugging the Cactus", "pub_date": "Tue, 30 Jul 2019 07:04:54 +0000", "guid": "ff98ea2838a44708818f1f304e2e76d9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_165.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146181888, "duration_sec": 9065, "page_link": "https://dick.show/episode-165"}
{"ep_num": 166, "title": "Episode 166 - Dick on How to Start a Cult", "pub_date": "Tue, 06 Aug 2019 07:58:14 +0000", "guid": "ae8ca476e73e4e9688db45dbb9962afd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_166.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 159466496, "duration_sec": 9937, "page_link": "https://dick.show/episode-166/"}
{"ep_num": 167, "title": "Episode 167 - Dick on Plot Holes", "pub_date": "Tue, 13 Aug 2019 14:44:41 +0000", "guid": "1183fd7682d94960bab82b46e65a24ec", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_167.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 158658048, "duration_sec": 9860, "page_link": "https://dick.show/episode-167"}
{"ep_num": 168, "title": "Episode 168 - Dick on Road Rage: Minneapolis", "pub_date": "Tue, 20 Aug 2019 07:06:52 +0000", "guid": "c017102dc289412eb4b235122223ebc5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_168.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 123543552, "duration_sec": 7708, "page_link": "https://dick.show/episode-168/"}
{"ep_num": 169, "title": "Episode 169 - Dick on Lost Dogs", "pub_date": "Mon, 26 Aug 2019 22:59:58 +0000", "guid": "cb5e62f8aa3c4da1918224bf2f72767e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_169.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 113084544, "duration_sec": 6840, "page_link": "https://dick.show/episode-169"}
{"ep_num": 170, "title": "Episode 170 - Dick on Losing Drugs", "pub_date": "Tue, 03 Sep 2019 15:12:53 +0000", "guid": "e3fee023fdcc4442a18766fe3b8c067e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_170.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 118378274, "duration_sec": 4827, "page_link": "https://dick.show/episode-170/"}
{"ep_num": 171, "title": "Episode 171 - Dick on The Autoblow", "pub_date": "Tue, 10 Sep 2019 00:49:53 +0000", "guid": "370680d514cb4014a6b967ce8f87df71", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_171.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186449440, "duration_sec": 9236, "page_link": "https://dick.show/episode-171/"}
{"ep_num": 172, "title": "Episode 172 - Dick on Nude Figure Drawing", "pub_date": "Tue, 17 Sep 2019 13:27:17 +0000", "guid": "8720696fc56b4489ad6fc0f6841b45e4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_172.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 199677056, "duration_sec": 9904, "page_link": "https://dick.show/episode-172/"}
{"ep_num": 173, "title": "Episode 173 - Dick on Lost Balls", "pub_date": "Tue, 24 Sep 2019 06:49:59 +0000", "guid": "0497d6fe618e49049e7e14ad691d5876", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_173.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 183030688, "duration_sec": 9093, "page_link": "https://thedickshow.libsyn.com/episode-173-dick-on-lost-balls"}
{"ep_num": 174, "title": "Episode 174 - Dick on Credible Threats", "pub_date": "Tue, 01 Oct 2019 03:07:34 +0000", "guid": "fd717548b50344f28392985811941fef", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_174.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 207265024, "duration_sec": 10069, "page_link": "https://dick.show/episode-174/"}
{"ep_num": 175, "title": "Episode 175 - Dick on Inappropriate Laughter", "pub_date": "Tue, 08 Oct 2019 07:08:04 +0000", "guid": "ee49c5b90be54a2499fe1aa9ba2eaf04", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_175.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161743520, "duration_sec": 8010, "page_link": "https://dick.show/episode-175"}
{"ep_num": 176, "title": "Episode 176 - Dick on Sh*t Eating Grins", "pub_date": "Tue, 15 Oct 2019 06:28:31 +0000", "guid": "4b4f1e4d905f4edea504565424543258", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_176.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 197242912, "duration_sec": 9825, "page_link": "https://dick.show/episode-176/"}
{"ep_num": 177, "title": "Episode 177 - Dick on Men Being Emotional", "pub_date": "Tue, 22 Oct 2019 07:09:03 +0000", "guid": "030247e6ec444cd785042831fd691dd2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_177.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 169693632, "duration_sec": 8447, "page_link": "https://dick.show/episode-177/"}
{"ep_num": 178, "title": "Episode 178 - Dick on The Dr. Phil Tapes", "pub_date": "Tue, 29 Oct 2019 13:19:43 +0000", "guid": "6164d8aa5de04701b7287912bf8ebd10", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_178.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 169288704, "duration_sec": 8419, "page_link": "https://dick.show/episode-178/"}
{"ep_num": 179, "title": "Episode 179 - Dick on Breaking the Bank", "pub_date": "Tue, 05 Nov 2019 15:03:43 +0000", "guid": "f4b301198ae24edd81d94dc2699b4401", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_179.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170323936, "duration_sec": 8477, "page_link": "https://dick.show/episode-179"}
{"ep_num": 180, "title": "Episode 180 - Dick on The Price of Speech", "pub_date": "Tue, 12 Nov 2019 07:14:33 +0000", "guid": "9473c282b03148738d53890b5dc33d79", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_180.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180176842, "duration_sec": 8955, "page_link": "https://dick.show/episode-180/"}
{"ep_num": 181, "title": "Episode 181 - Dick on Autistic Screenings", "pub_date": "Tue, 19 Nov 2019 01:45:44 +0000", "guid": "00b51e46-9198-493c-a095-654ea78576f6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_181.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 177251616, "duration_sec": 8811, "page_link": "https://dick.show/episode-181/"}
{"ep_num": 182, "title": "Episode 182 - Dick on The Flat Holocaust", "pub_date": "Tue, 26 Nov 2019 05:29:53 +0000", "guid": "f2b75bc1-8761-4adc-9d23-263587983279", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_182.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 162289152, "duration_sec": 8040, "page_link": "https://dick.show/episode-182/"}
{"ep_num": 183, "title": "Episode 183 - Dick on Viral Loads", "pub_date": "Tue, 03 Dec 2019 15:22:14 +0000", "guid": "4624fb56-0ac2-4d46-839f-03ddce96c0ba", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_183.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180444352, "duration_sec": 8973, "page_link": "https://dick.show/episode-183/"}
{"ep_num": 184, "title": "Episode 184 - Dick on Fatsmas Carols", "pub_date": "Tue, 10 Dec 2019 01:14:59 +0000", "guid": "e11691dd-0d5e-4305-812e-7582fc72b1f0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_184.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175759904, "duration_sec": 8773, "page_link": "https://dick.show/episode-184/"}
{"ep_num": 185, "title": "Episode 185 - Dick on the Broken Pint Glass Fallacy", "pub_date": "Tue, 17 Dec 2019 05:04:01 +0000", "guid": "0d8c0621-f8ad-491f-bd37-e68eda4d960f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_185.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 176493248, "duration_sec": 8763, "page_link": "https://dick.show/episode-185/"}
{"ep_num": 186, "title": "Episode 186 - Dick on Hunting Hitomi", "pub_date": "Tue, 24 Dec 2019 07:37:41 +0000", "guid": "1c4de4dc-4416-4616-8fa5-72638880e63a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_186.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 173746582, "duration_sec": 8675, "page_link": "https://dick.show/episode-186"}
{"ep_num": 187, "title": "Episode 187 - Dick on Turned Japanese", "pub_date": "Wed, 01 Jan 2020 02:04:57 +0000", "guid": "da393d84-3fb2-45a9-a6db-9b51f43721a2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_187.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 120490368, "duration_sec": 5769, "page_link": "https://thedickshow.libsyn.com/episode-187-dick-on-turning-japanese"}
{"ep_num": 188, "title": "Episode 188 - Dick on Wh*re Island", "pub_date": "Tue, 07 Jan 2020 08:03:25 +0000", "guid": "5d0a8c9c-4590-45f0-88fc-16134a1b565a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_188.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 136025248, "duration_sec": 6714, "page_link": "https://dick.show/episode-188/"}
{"ep_num": 189, "title": "Episode 189 - Dick on Whang!", "pub_date": "Tue, 14 Jan 2020 04:34:35 +0000", "guid": "6847441a-4b83-4bc5-92da-ae54bd9a8945", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_189.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 199270304, "duration_sec": 9917, "page_link": "https://dick.show/episode-189"}
{"ep_num": 190, "title": "Episode 190 - Dick on Getting Robbed", "pub_date": "Tue, 21 Jan 2020 07:32:04 +0000", "guid": "be06fd83-9700-4f12-9cd4-133108a19fa3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_190.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 184368544, "duration_sec": 8956, "page_link": "https://dick.show/episode-190/"}
{"ep_num": 191, "title": "Episode 191 - Dick on Exposure", "pub_date": "Tue, 28 Jan 2020 04:45:16 +0000", "guid": "d36b53d9-53b0-4787-b9d5-ea7d69352b75", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_191.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 171206432, "duration_sec": 8541, "page_link": "https://dick.show/episode-191/"}
{"ep_num": 192, "title": "Episode 192 - Dick on Pirate Radio", "pub_date": "Tue, 04 Feb 2020 08:01:48 +0000", "guid": "b4d63b0e-ee90-4c99-b457-0a225c6a6044", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_192.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180976544, "duration_sec": 9008, "page_link": "https://dick.show/episode-192/"}
{"ep_num": 193, "title": "Episode 193 - Dick on Somewhat Activewear", "pub_date": "Tue, 11 Feb 2020 05:32:49 +0000", "guid": "276d2654-1a5a-4ccd-b4e7-e5bc37edbf37", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_193.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 142835584, "duration_sec": 7074, "page_link": "https://thedickshow.libsyn.com/episode-193-dick-on-somewhat-activewear"}
{"ep_num": 194, "title": "Episode 194 - Dick on Mad Hoes", "pub_date": "Tue, 18 Feb 2020 05:13:47 +0000", "guid": "2f57f39f-4280-4b78-bcdd-f1d2d03b1093", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_194.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 209305840, "duration_sec": 10269, "page_link": "https://dick.show/episode-194"}
{"ep_num": 195, "title": "Episode 195 - Dick on Blowing Up", "pub_date": "Tue, 25 Feb 2020 10:24:34 +0000", "guid": "68745c36-fcf3-4aa3-b94c-cf2fe609905a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_195.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 191954858, "duration_sec": 9497, "page_link": "https://thedickshow.libsyn.com/episode-195-dick-on-blowing-up"}
{"ep_num": 196, "title": "Episode 196 - Dick on Cam Wars", "pub_date": "Tue, 03 Mar 2020 05:41:38 +0000", "guid": "9af9352d-7a60-4c51-b350-2757044af4ea", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_196.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 200191084, "duration_sec": 9983, "page_link": "https://dick.show/episode-196/"}
{"ep_num": 197, "title": "Episode 197 - Dick on Molyneux", "pub_date": "Tue, 10 Mar 2020 06:47:56 +0000", "guid": "d21c36f1-b7c2-458c-a156-732760de0b21", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_197.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187927278, "duration_sec": 9382, "page_link": "https://dick.show/episode-197/"}
{"ep_num": 198, "title": "Episode 198 - Dick on The Broken Meth Pipe Fallacy", "pub_date": "Tue, 17 Mar 2020 05:05:13 +0000", "guid": "bc80dfb6-8bf4-47b6-b275-db4ea1cc4e89", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_198.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 232473444, "duration_sec": 11254, "page_link": "https://dick.show/episode-198/"}
{"ep_num": 199, "title": "Episode 199 - Dick on Troll Hair", "pub_date": "Tue, 24 Mar 2020 07:21:29 +0000", "guid": "0b3ac263-8862-4b51-90e1-f6ebf875ffa8", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_199.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 183157440, "duration_sec": 9118, "page_link": "https://dick.show/episode-199/"}
{"ep_num": 200, "title": "Episode 200 - Dick on The Wh*re Economy", "pub_date": "Tue, 31 Mar 2020 07:26:02 +0000", "guid": "4be85be6-9a52-404c-90e3-2b2924c858ba", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_200.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 277814774, "duration_sec": 13369, "page_link": "https://dick.show/episode-200/"}
{"ep_num": 201, "title": "Episode 201 - Dick on Chris Hansen's Emmy", "pub_date": "Tue, 07 Apr 2020 06:49:11 +0000", "guid": "d2f977ec-5aea-4271-8291-52a0dbce016f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_201.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 212600782, "duration_sec": 10582, "page_link": "https://dick.show/episode-201"}
{"ep_num": 202, "title": "Episode 202 - Dick on Martial LOL", "pub_date": "Tue, 14 Apr 2020 05:58:35 +0000", "guid": "0df806c3-a8c3-43f5-9c81-846e492d78f5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_202.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180265774, "duration_sec": 8698, "page_link": "https://dick.show/episode-202/"}
{"ep_num": 203, "title": "Episode 203 - Dick on Mad Libs", "pub_date": "Tue, 21 Apr 2020 04:28:55 +0000", "guid": "060dd53f-9749-472a-ab05-a5db98dc14eb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_203.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186472260, "duration_sec": 9284, "page_link": "https://dick.show/episode-203/"}
{"ep_num": 204, "title": "Episode 204 - Dick on Wiener Crossing", "pub_date": "Tue, 28 Apr 2020 05:19:35 +0000", "guid": "a52cc942-7336-4a71-baf1-3685f3d6a1e2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_204.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 222410614, "duration_sec": 11082, "page_link": "https://dick.show/episode-204/"}
{"ep_num": 205, "title": "Episode 205 - Dick on Multiple Women", "pub_date": "Tue, 05 May 2020 06:28:38 +0000", "guid": "9f9aa77e-d03a-4a6b-bed1-ab8060122daa", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_205.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 221590978, "duration_sec": 11038, "page_link": "https://dick.show/episode-205"}
{"ep_num": 206, "title": "Episode 206 - Dick on Legacy Issues", "pub_date": "Tue, 12 May 2020 07:38:37 +0000", "guid": "b3578d45-2c0e-4bc1-8212-f37169539d06", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_206.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 256118392, "duration_sec": 12614, "page_link": "https://dick.show/episode-206"}
{"ep_num": 207, "title": "Episode 207 - Dick on Premature Celebrations", "pub_date": "Tue, 19 May 2020 06:40:52 +0000", "guid": "065ad517-1a6e-4470-adfa-2f77da36c64d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_207.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 171220276, "duration_sec": 8487, "page_link": "https://dick.show/episode-207/"}
{"ep_num": 208, "title": "Episode 208 - Dick on Cuck Throat", "pub_date": "Tue, 26 May 2020 05:28:11 +0000", "guid": "c23e3704-ae34-476b-8af4-ba87fcba1061", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_208.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 181668722, "duration_sec": 9053, "page_link": "https://dick.show/episode-208/"}
{"ep_num": 209, "title": "Episode 209 - Dick on the LA Riots", "pub_date": "Tue, 02 Jun 2020 07:30:35 +0000", "guid": "b9ec4a9f-e37e-41cb-8c77-cfb691eebcc4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_209.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 198842860, "duration_sec": 9928, "page_link": "https://dick.show/episode-209/"}
{"ep_num": 210, "title": "Episode 210 - Dick on Calling the Police", "pub_date": "Tue, 09 Jun 2020 06:07:25 +0000", "guid": "62a072c0-bdf1-45a9-ba37-530825500d53", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_210.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 136813774, "duration_sec": 6750, "page_link": "https://thedickshow.libsyn.com/episode-210-dick-on-appropriating-victim-culture"}
{"ep_num": 211, "title": "Episode 211 - Dick on Criminalizing Sobriety", "pub_date": "Tue, 16 Jun 2020 05:25:50 +0000", "guid": "cf79c19b-a218-4482-ada5-be943eab3dbb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_211.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 208414342, "duration_sec": 10293, "page_link": "https://thedickshow.libsyn.com/episode-211-dick-on-criminalizing-sobriety"}
{"ep_num": 212, "title": "Episode 212 - Dick on Plantation Simulator", "pub_date": "Tue, 23 Jun 2020 07:47:41 +0000", "guid": "7311ef24-cb6b-4f38-8544-3c2842f1a6b4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_212.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 204898556, "duration_sec": 10234, "page_link": "https://dick.show/episode-212/"}
{"ep_num": 213, "title": "Episode 213 - Dick on Something Awful", "pub_date": "Tue, 30 Jun 2020 05:35:22 +0000", "guid": "5efd869a-9f4a-493d-bfc1-517d97fa292e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_213.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 226986262, "duration_sec": 11259, "page_link": "https://dick.show/episode-213/"}
{"ep_num": 214, "title": "Episode 214 - Dick on Stupid Games", "pub_date": "Tue, 07 Jul 2020 14:47:07 +0000", "guid": "a459886f-110c-40e1-a7b6-f8e3cb6bcd02", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_214.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 205608156, "duration_sec": 10189, "page_link": "https://thedickshow.libsyn.com/episode-214-dick-on-stupid-games"}
{"ep_num": 215, "title": "Episode 215 - Dick on Generation NARC", "pub_date": "Tue, 14 Jul 2020 05:40:46 +0000", "guid": "2b58b85a-2d83-4516-9cc0-8b152f066baa", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_215.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186294100, "duration_sec": 9247, "page_link": "https://dick.show/episode-215/"}
{"ep_num": 216, "title": "Episode 216 - Dick on Victim Envy", "pub_date": "Tue, 21 Jul 2020 05:17:07 +0000", "guid": "c819c2a0-fb48-4463-a98a-56cae45f07ad", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_216.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 219093188, "duration_sec": 10953, "page_link": "https://dick.show/episode-216/"}
{"ep_num": 217, "title": "Episode 217 - Dick on Wonder Bread", "pub_date": "Tue, 28 Jul 2020 14:28:20 +0000", "guid": "b317b908-b47a-4029-9b5c-f0f9a97bdf05", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_217.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 224897678, "duration_sec": 11210, "page_link": "https://dick.show/episode-217/"}
{"ep_num": 218, "title": "Episode 218 - Dick on Trickle Down Communism", "pub_date": "Tue, 04 Aug 2020 08:26:04 +0000", "guid": "9e8adedf-8227-47b5-bc05-106c401e288b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_218.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 159860402, "duration_sec": 7898, "page_link": "https://dick.show/episode-218/"}
{"ep_num": 219, "title": "Episode 219 - Dick on the Big Countdown to Nothing", "pub_date": "Tue, 11 Aug 2020 05:47:23 +0000", "guid": "d655d6d0-f404-43d4-b00b-960cf31929ae", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_219.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182414086, "duration_sec": 9018, "page_link": "https://dick.show/episode-219/"}
{"ep_num": 220, "title": "Episode 220 - Dick on Sex Tapes", "pub_date": "Tue, 18 Aug 2020 05:29:33 +0000", "guid": "5a5e29b8-f2a7-466b-a3c6-c6d069518172", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_220.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182260534, "duration_sec": 9053, "page_link": "https://dick.show/episode-220/"}
{"ep_num": 221, "title": "Episode 221 - Dick on the Hunt for Waluigi", "pub_date": "Tue, 25 Aug 2020 05:27:35 +0000", "guid": "b9bf772d-b0f5-40a8-8cf1-7c34dd1b6357", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_221.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163311262, "duration_sec": 8099, "page_link": "https://dick.show/episode-221/"}
{"ep_num": 222, "title": "Episode 222 - Dick on The Malarkey-archy", "pub_date": "Tue, 01 Sep 2020 05:40:08 +0000", "guid": "a0901d8f-4e41-45b4-88df-88f23ad34209", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_222.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163993072, "duration_sec": 8108, "page_link": "https://dick.show/episode-222/"}
{"ep_num": 223, "title": "Episode 223 - Dick on the Testicle Hernia", "pub_date": "Mon, 07 Sep 2020 23:11:08 +0000", "guid": "49251405-b26a-4166-8985-c62f67d8c8cb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_223.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180397890, "duration_sec": 8952, "page_link": "https://dick.show/episode-223/"}
{"ep_num": 224, "title": "Episode 224 - Dick on the Preacher Man", "pub_date": "Tue, 15 Sep 2020 05:30:05 +0000", "guid": "01d8f3d8-7c4b-453c-89be-cae11f9ecfa0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_224.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 204530434, "duration_sec": 10184, "page_link": "https://dick.show/episode-224/"}
{"ep_num": 225, "title": "Episode 225 - Dick on Ruth Bader GONESBURG", "pub_date": "Tue, 22 Sep 2020 07:17:05 +0000", "guid": "57df1093-b7c4-4068-b164-9a0bdc13365c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_225.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 201119804, "duration_sec": 10041, "page_link": "https://dick.show/episode-225/"}
{"ep_num": 226, "title": "Episode 226 - Dick on No-Knock Knock Jokes", "pub_date": "Tue, 29 Sep 2020 07:04:19 +0000", "guid": "ab001974-8d23-49aa-a9c8-b822d42e3aef", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_226.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170019582, "duration_sec": 8436, "page_link": "https://dick.show/episode-226"}
{"ep_num": 227, "title": "Episode 227 - Dick on Hassle Doctrine", "pub_date": "Tue, 06 Oct 2020 07:01:06 +0000", "guid": "bff8b91e-3948-4d88-9f0b-a142ca9a6c74", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_227.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155552202, "duration_sec": 7692, "page_link": "https://dick.show/episode-227/"}
{"ep_num": 228, "title": "Episode 228 - Dick on Gender Neutral Jesus", "pub_date": "Tue, 13 Oct 2020 07:51:01 +0000", "guid": "8ad0ec06-12a3-4315-b8cf-0a8431e87a2e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_228.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175472690, "duration_sec": 8685, "page_link": "https://dick.show/episode-228/"}
{"ep_num": 229, "title": "Episode 229 - Dick on the Antifa Horror Movie", "pub_date": "Tue, 20 Oct 2020 06:19:54 +0000", "guid": "ed2d63b1-0ab8-4b47-b370-029a202ba40e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_229.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 158437700, "duration_sec": 7835, "page_link": "https://dick.show/episode-229/"}
{"ep_num": 230, "title": "Episode 230 - Dick on New Diet Coke", "pub_date": "Tue, 27 Oct 2020 06:24:51 +0000", "guid": "d2986977-ecd4-420b-afe4-06ff10f54d2e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_230.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146416180, "duration_sec": 7234, "page_link": "https://dick.show/episode-230/"}
{"ep_num": 231, "title": "Episode 231 - Dick on Turning FFFFFFFF", "pub_date": "Tue, 03 Nov 2020 09:32:06 +0000", "guid": "6e42f4e9-558e-4064-a88c-d5188e0c68ca", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_231.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 201316414, "duration_sec": 9973, "page_link": "https://dick.show/episode-231/"}
{"ep_num": 232, "title": "Episode 232 - Dick on Copium", "pub_date": "Tue, 10 Nov 2020 06:56:03 +0000", "guid": "a23f51b6-6484-476e-9b74-0c0dff02ba6a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_232.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154179496, "duration_sec": 7694, "page_link": "https://dick.show/episode-232"}
{"ep_num": 233, "title": "Episode 233 - Dick on Venture Communism", "pub_date": "Tue, 17 Nov 2020 07:02:21 +0000", "guid": "ed13ef68-cd54-49dc-9dd2-e63d62ae1dde", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_233.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 159421956, "duration_sec": 7894, "page_link": "https://dick.show/episode-233"}
{"ep_num": 234, "title": "Episode 234 - Dick on Black Santa", "pub_date": "Tue, 24 Nov 2020 08:03:10 +0000", "guid": "d5b7f9df-af4f-46ae-b2ac-6ed8ef24f059", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_234.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 177190888, "duration_sec": 8814, "page_link": "https://dick.show/episode-234/"}
{"ep_num": 235, "title": "Episode 235 - Dick on Big Simpin'", "pub_date": "Tue, 01 Dec 2020 07:28:23 +0000", "guid": "8313a9e7-eb89-4831-98e6-185f0b8ba9e3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_235.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 206567602, "duration_sec": 10217, "page_link": "https://dick.show/episode-235"}
{"ep_num": 236, "title": "Episode 236 - Dick on Black Hitler", "pub_date": "Tue, 08 Dec 2020 06:35:15 +0000", "guid": "1c62714a-a568-48fa-a32f-d82207d16495", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_236.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165594956, "duration_sec": 8210, "page_link": "https://dick.show/episode-236"}
{"ep_num": 237, "title": "Episode 237 - Dick on Road Rage: Tampa", "pub_date": "Tue, 15 Dec 2020 09:21:23 +0000", "guid": "9a112e54-8aff-45d4-a504-d9032ef50516", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_237.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172284092, "duration_sec": 8526, "page_link": "https://dick.show/episode-237/"}
{"ep_num": 238, "title": "Episode 238 - Dick on Slow Meat", "pub_date": "Tue, 22 Dec 2020 00:55:46 +0000", "guid": "9ae0a55b-2304-4f49-9d10-914f6e302e53", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_238.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 207543446, "duration_sec": 10289, "page_link": "https://dick.show/episode-238/"}
{"ep_num": 239, "title": "Episode 239 - Dick on Lonely Mouths", "pub_date": "Tue, 29 Dec 2020 07:31:22 +0000", "guid": "c5b5805d-d5de-4500-85bc-c6b69b3ab2d8", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_239.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 164403122, "duration_sec": 8156, "page_link": "https://dick.show/episode-239/"}
{"ep_num": 240, "title": "Episode 240 - Dick on The Big One", "pub_date": "Tue, 05 Jan 2021 04:25:51 +0000", "guid": "c01cf750-fe60-499a-8b7e-8bcf5e4698c2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_240.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141071376, "duration_sec": 6944, "page_link": "https://dick.show/episode-240/"}
{"ep_num": 241, "title": "Episode 241 - Dick on Insurrection", "pub_date": "Tue, 12 Jan 2021 06:42:58 +0000", "guid": "905fca18-1176-41dc-beb3-e4e01e9080da", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_241.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187835570, "duration_sec": 9054, "page_link": "https://dick.show/episode-241"}
{"ep_num": 242, "title": "Episode 242 - Dick on the Fediverse", "pub_date": "Tue, 19 Jan 2021 07:10:34 +0000", "guid": "bb998e27-a0e1-4328-8a49-f71c08e87923", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_242.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 183858776, "duration_sec": 8867, "page_link": "https://dick.show/episode-242/"}
{"ep_num": 243, "title": "Episode 243 - Dick on Space Boobs", "pub_date": "Tue, 26 Jan 2021 06:56:23 +0000", "guid": "714b87ec-0d6d-4106-90fd-ee247585b5f5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_243.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180310828, "duration_sec": 8819, "page_link": "https://dick.show/episode-243"}
{"ep_num": 244, "title": "Episode 244 - Dick on How to Live Forever", "pub_date": "Tue, 02 Feb 2021 06:14:25 +0000", "guid": "9c7ba55f-040b-47ac-aa32-da5097513ee2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_244.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 145680706, "duration_sec": 7154, "page_link": "https://dick.show/episode-244"}
{"ep_num": 245, "title": "Episode 245 - Dick on Big Beans", "pub_date": "Tue, 09 Feb 2021 05:07:36 +0000", "guid": "41a44721-271a-4fa5-b41e-0ee58e600baf", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_245.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141630356, "duration_sec": 7080, "page_link": "https://dick.show/episode-245"}
{"ep_num": 246, "title": "Episode 246 - Dick on Human Milk", "pub_date": "Tue, 16 Feb 2021 08:16:51 +0000", "guid": "f4580ffa-e662-4c7b-acff-f52819a4493e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_246.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 193406260, "duration_sec": 9582, "page_link": "https://dick.show/episode-246"}
{"ep_num": 247, "title": "Episode 247 - Dick on The Dog Show", "pub_date": "Tue, 23 Feb 2021 06:52:47 +0000", "guid": "ef983fa7-d889-4d85-b9f1-666d4b16ed69", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_247.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172258672, "duration_sec": 8567, "page_link": "https://dick.show/episode-247/"}
{"ep_num": 248, "title": "Episode 248 - Dick on The Uniparty", "pub_date": "Mon, 01 Mar 2021 22:47:17 +0000", "guid": "3afb3c6e-165d-496d-8b5a-8d146e16d18c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_248.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144733646, "duration_sec": 7181, "page_link": "https://dick.show/episode-248/"}
{"ep_num": 249, "title": "Episode 249 - Dick on Womxn", "pub_date": "Tue, 09 Mar 2021 01:29:15 +0000", "guid": "07793284-8f5c-4c20-a7dd-2a5cc3b1b9bc", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_249.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 181424344, "duration_sec": 9002, "page_link": "https://dick.show/episode-249"}
{"ep_num": 250, "title": "Episode 250 - Dick on Being Super Straight", "pub_date": "Tue, 16 Mar 2021 03:05:13 +0000", "guid": "69efd129-abb0-4357-82ef-c7ff914b80ff", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_250.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 166312062, "duration_sec": 8220, "page_link": "https://dick.show/episode-250/"}
{"ep_num": 251, "title": "Episode 251 - Dick on the $4,000 Crossover", "pub_date": "Mon, 22 Mar 2021 18:06:46 +0000", "guid": "a318d06f-48d4-42f4-8563-0187631b3b47", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_251.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175109728, "duration_sec": 8647, "page_link": "https://dick.show/episode-251"}
{"ep_num": 252, "title": "Episode 252 - Dick on Unexpected Guests", "pub_date": "Tue, 30 Mar 2021 05:13:37 +0000", "guid": "f0a44614-0784-4441-b629-743626083f0e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_252.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 168033658, "duration_sec": 8360, "page_link": "https://dick.show/episode-252/"}
{"ep_num": 253, "title": "Episode 253 - Dick on the Penis Extension Machine", "pub_date": "Mon, 05 Apr 2021 21:00:56 +0000", "guid": "b39c31af-e844-46ba-9bf3-ac8a265d302f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_253.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133640182, "duration_sec": 6680, "page_link": "https://dick.show/episode-253/"}
{"ep_num": 254, "title": "Episode 254 - Dick on L's", "pub_date": "Tue, 13 Apr 2021 02:50:47 +0000", "guid": "a6e11349-fd23-4a9e-873d-0ae1d1bca8cd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_254.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133713074, "duration_sec": 6649, "page_link": "https://dick.show/episode-254/"}
{"ep_num": 255, "title": "Episode 255 - Dick on $DOGE", "pub_date": "Tue, 20 Apr 2021 05:13:15 +0000", "guid": "b6422b5c-4bd7-4967-9dc7-ff29ed9c8a8c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_255.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155216280, "duration_sec": 7712, "page_link": "https://dick.show/episode-255/"}
{"ep_num": 256, "title": "Episode 256 - Dick on Money Shots", "pub_date": "Mon, 26 Apr 2021 21:38:29 +0000", "guid": "79c69455-4bc4-4f53-8842-00f90d29e448", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_256.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186954046, "duration_sec": 9295, "page_link": "https://dick.show/episode-256/"}
{"ep_num": 257, "title": "Episode 257 - Dick on Wood Inflation", "pub_date": "Mon, 03 May 2021 21:28:18 +0000", "guid": "db1012e7-a848-4aed-a5a1-96272253f26e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_257.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141164840, "duration_sec": 7011, "page_link": "https://dick.show/episode-257"}
{"ep_num": 258, "title": "Episode 258 - Dick on the Jerk Off Ninja", "pub_date": "Tue, 11 May 2021 04:36:49 +0000", "guid": "c9b5cfdc-e186-4a27-84d6-8f1ab8a53cd7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_258.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 153549166, "duration_sec": 7660, "page_link": "https://dick.show/episode-258"}
{"ep_num": 259, "title": "Episode 259 - Dick on Israel", "pub_date": "Tue, 18 May 2021 03:33:02 +0000", "guid": "cf517d8f-45f8-4b28-86b4-4dd73ab91f1c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_259.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139714468, "duration_sec": 6949, "page_link": "https://dick.show/episode-259/"}
{"ep_num": 260, "title": "Episode 260 - Dick on The Biggest Problem Reboot", "pub_date": "Mon, 24 May 2021 23:32:39 +0000", "guid": "9063e042-bed0-4db0-a6c5-a8bc60a3f7a7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_260.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 119148102, "duration_sec": 5899, "page_link": "https://dick.show/episode-260/"}
{"ep_num": 261, "title": "Episode 261 - Dick on Fat Brain", "pub_date": "Tue, 01 Jun 2021 04:13:20 +0000", "guid": "b75c1dd0-2cd3-431c-a1c1-a351d815c4ee", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_261.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138316782, "duration_sec": 6712, "page_link": "https://dick.show/episode-261/"}
{"ep_num": 262, "title": "Episode 262 - Dick on Sex Doll Fingers", "pub_date": "Tue, 08 Jun 2021 05:24:13 +0000", "guid": "9e41f854-cf7e-44c8-af3d-fdf12174421b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_262.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141058112, "duration_sec": 6965, "page_link": "https://dick.show/episode-262/"}
{"ep_num": 263, "title": "Episode 263 - Dick on the Return of Sean", "pub_date": "Mon, 14 Jun 2021 23:27:15 +0000", "guid": "0239d22d-0633-4442-9aea-0501d7185a4e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_263.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 184155450, "duration_sec": 9151, "page_link": "https://dick.show/episode-263"}
{"ep_num": 264, "title": "Episode 264 - Dick on Lifting Cars", "pub_date": "Tue, 22 Jun 2021 05:18:20 +0000", "guid": "8a4e9fff-e21c-41ea-9814-a07e1e7d3890", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_264.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 145323666, "duration_sec": 7211, "page_link": "https://dick.show/episode-264"}
{"ep_num": 265, "title": "Episode 265 - Dick on Private Hookers", "pub_date": "Tue, 29 Jun 2021 03:40:05 +0000", "guid": "77602501-9ff3-4568-aa35-2408c93337d0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_265.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 179667894, "duration_sec": 8928, "page_link": "https://dick.show/episode-265/"}
{"ep_num": 266, "title": "Episode 266 - Dick on the Forever Coof", "pub_date": "Tue, 13 Jul 2021 07:26:01 +0000", "guid": "14a57769-b242-41c5-a863-e1c003a9e6d0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_266.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 127759376, "duration_sec": 6302, "page_link": "https://dick.show/episode-266/"}
{"ep_num": 267, "title": "Episode 267 - Dick on Too Big of Tubes", "pub_date": "Mon, 19 Jul 2021 21:23:31 +0000", "guid": "9dbfd642-dd37-4c45-9645-d0ece4f5522f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_267.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161602600, "duration_sec": 8037, "page_link": "https://dick.show/episode-267/"}
{"ep_num": 268, "title": "Episode 268 - Dick on He-Manbabies", "pub_date": "Mon, 26 Jul 2021 20:31:01 +0000", "guid": "3cdfa57a-c422-4013-9811-600b248d326c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_268.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156121622, "duration_sec": 7748, "page_link": "https://dick.show/episode-268"}
{"ep_num": 269, "title": "Episode 269 - Dick on Motherf*ckers", "pub_date": "Tue, 03 Aug 2021 05:48:41 +0000", "guid": "e39ec66a-ec27-4f4c-a745-673b118a05da", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_269.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138443624, "duration_sec": 6882, "page_link": "https://dick.show/episode-269/"}
{"ep_num": 270, "title": "Episode 270 - Dick on the Weiner Man", "pub_date": "Tue, 10 Aug 2021 03:10:14 +0000", "guid": "2a548906-1278-4a94-ad10-1db5470a948f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_270.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 140150594, "duration_sec": 6987, "page_link": "https://dick.show/episode-270/"}
{"ep_num": 271, "title": "Episode 271 - Dick on Talibants", "pub_date": "Mon, 16 Aug 2021 16:51:08 +0000", "guid": "2e36b7b7-820b-45d3-8ab7-bf37071accc9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_271.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 145069054, "duration_sec": 7210, "page_link": "https://dick.show/episode-271/"}
{"ep_num": 272, "title": "Episode 272 - Dick on Running Out of Beer", "pub_date": "Tue, 24 Aug 2021 04:05:25 +0000", "guid": "5e7d2fa2-d890-40b3-8db9-e4e45e461cf2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_272.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 128793134, "duration_sec": 6342, "page_link": "https://dick.show/episode-272/"}
{"ep_num": 273, "title": "Episode 273 - Dick on WATP Live", "pub_date": "Tue, 31 Aug 2021 05:09:53 +0000", "guid": "91725704-7ade-4e79-b0ed-1eda6569485e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_273.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 118549574, "duration_sec": 5785, "page_link": "https://dick.show/episode-273/"}
{"ep_num": 274, "title": "Episode 274 - Dick on a $6,000 Vet Bill", "pub_date": "Tue, 07 Sep 2021 04:54:48 +0000", "guid": "23e61462-ce1e-440a-bf63-25371db7b725", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_274.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 116648154, "duration_sec": 5820, "page_link": "https://dick.show/episode-274/"}
{"ep_num": 275, "title": "Episode 275 - Dick on the Nick Show", "pub_date": "Tue, 14 Sep 2021 03:40:06 +0000", "guid": "091d6a57-c148-4967-b6a4-9adf32934945", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_275.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155365102, "duration_sec": 7631, "page_link": "https://dick.show/episode-275/"}
{"ep_num": 276, "title": "Episode 276 - Dick on Virginfest", "pub_date": "Tue, 21 Sep 2021 02:29:32 +0000", "guid": "c8f5c73e-c8f3-488e-a854-24338a4272b5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_276.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154704050, "duration_sec": 7664, "page_link": "https://dick.show/episode-276/"}
{"ep_num": 277, "title": "Episode 277 - Dick on Raz0rfist", "pub_date": "Mon, 27 Sep 2021 22:41:37 +0000", "guid": "aadf708a-f764-4ee8-b839-fffafe309f61", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_277.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 185573404, "duration_sec": 9207, "page_link": "https://dick.show/episode-277/"}
{"ep_num": 278, "title": "Episode 278 - Dick on Taxation is Prison", "pub_date": "Tue, 05 Oct 2021 00:16:07 +0000", "guid": "479fe920-10e9-49e3-886a-aa3a0c2795ba", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_278.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138103202, "duration_sec": 6877, "page_link": "https://dick.show/episode-278/"}
{"ep_num": 279, "title": "Episode 279 - Dick on Swallowing Hair", "pub_date": "Tue, 12 Oct 2021 01:01:27 +0000", "guid": "564fa197-ca7a-4adc-8c7d-6d79aa7a8704", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_279.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 197380238, "duration_sec": 9827, "page_link": "https://dick.show/episode-279/"}
{"ep_num": 280, "title": "Episode 280 - Dick on The Designated Virgin", "pub_date": "Tue, 19 Oct 2021 06:54:50 +0000", "guid": "a8236ab7-1928-49f3-a4eb-e64c3afdea0b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_280.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 137089660, "duration_sec": 6812, "page_link": "https://dick.show/episode-280/"}
{"ep_num": 281, "title": "Episode 281 - Dick on Jokes Are Funny", "pub_date": "Tue, 26 Oct 2021 06:17:52 +0000", "guid": "e6c42b4e-0bb1-4bdb-ba91-0715eafb84e0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_281.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147826251, "duration_sec": 7353, "page_link": "https://dick.show/episode-281"}
{"ep_num": 282, "title": "Episode 282 - Dick on the Rooftop Koreans", "pub_date": "Tue, 02 Nov 2021 00:26:05 +0000", "guid": "17daa0d4-8352-40ff-ac45-6ff569b2f893", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_282.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165725360, "duration_sec": 8254, "page_link": "https://dick.show/episode-282/"}
{"ep_num": 283, "title": "Episode 283 - Dick on Fat Body Erasure", "pub_date": "Tue, 09 Nov 2021 00:57:06 +0000", "guid": "3b11f1fd-24d6-4404-b763-6d74b73eef30", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_283.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149170922, "duration_sec": 7393, "page_link": "https://dick.show/episode-283/"}
{"ep_num": 284, "title": "Episode 284 - Dick on Sean's Ding", "pub_date": "Tue, 16 Nov 2021 05:21:14 +0000", "guid": "ed7d3f95-3ba6-4c48-8256-57ddd4126bcf", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_284.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 136368506, "duration_sec": 6770, "page_link": "https://dick.show/episode-284/"}
{"ep_num": 285, "title": "Episode 285 - Dick on Due to Inflation", "pub_date": "Tue, 23 Nov 2021 02:07:40 +0000", "guid": "0941dcfa-2762-44d7-932c-fc7dc240c10b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_285.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 190333512, "duration_sec": 9492, "page_link": "https://dick.show/episode-285/"}
{"ep_num": 286, "title": "Episode 286 - Dick on Strong Times", "pub_date": "Tue, 30 Nov 2021 07:37:20 +0000", "guid": "83932d0f-1745-4559-a698-e1e4e3952581", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_286.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126629320, "duration_sec": 6116, "page_link": "https://dick.show/episode-286/"}
{"ep_num": 287, "title": "Episode 287 - Dick on Human Stop Signs", "pub_date": "Mon, 06 Dec 2021 21:53:26 +0000", "guid": "912c82b1-33fd-44ed-88ca-d003ad9acd04", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_287.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 189784580, "duration_sec": 9391, "page_link": "https://dick.show/episode-287/"}
{"ep_num": 288, "title": "Episode 288 - Dick on the Diarrhea Cake", "pub_date": "Tue, 14 Dec 2021 00:44:26 +0000", "guid": "bdff0c1b-5d9e-4b11-8242-868b42c2be58", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_288.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 167820706, "duration_sec": 8373, "page_link": "https://dick.show/episode-288/"}
{"ep_num": 289, "title": "Episode 289 - Dick on Floydies", "pub_date": "Tue, 21 Dec 2021 06:53:26 +0000", "guid": "97882a5e-1608-43ca-a242-e764ac390d2c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_289.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152918652, "duration_sec": 7627, "page_link": "https://dick.show/episode-289/"}
{"ep_num": 290, "title": "Episode 290 - Dick on Shooting Your Eye Out", "pub_date": "Tue, 28 Dec 2021 06:24:38 +0000", "guid": "3835b0bc-5dbf-4546-b50f-c211ce60094f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_290.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 189757848, "duration_sec": 7873, "page_link": "https://dick.show/episode-290/"}
{"ep_num": 291, "title": "Episode 291 - Dick on The Dry T-Shirt Contest", "pub_date": "Tue, 11 Jan 2022 00:38:11 +0000", "guid": "641ddbd3-8a8b-4710-913d-26cec04aff23", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_291.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 192503328, "duration_sec": 7969, "page_link": "https://dick.show/episode-291"}
{"ep_num": 292, "title": "Episode 292 - Dick on Psychic Fat Bodies", "pub_date": "Tue, 18 Jan 2022 05:46:21 +0000", "guid": "414fc21d-04ed-47ee-b88e-71f1d0df3ccc", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_292.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160091978, "duration_sec": 6595, "page_link": "https://dick.show/episode-292/"}
{"ep_num": 293, "title": "Episode 293 - Dick on Missing Portugal", "pub_date": "Tue, 25 Jan 2022 05:17:44 +0000", "guid": "528110e8-d9c5-45f3-a8ea-4f5d9123bcbf", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_293.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147060355, "duration_sec": 6128, "page_link": "https://dick.show/episode-293/"}
{"ep_num": 294, "title": "Episode 294 - Dick on The Honkening", "pub_date": "Mon, 31 Jan 2022 21:08:16 +0000", "guid": "d098d52b-e581-4b9d-9838-3d11b18dd21e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_294.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 202522703, "duration_sec": 8439, "page_link": "https://dick.show/episode-294/"}
{"ep_num": 295, "title": "Episode 295 - Dick on Eating Bugs", "pub_date": "Tue, 08 Feb 2022 02:28:48 +0000", "guid": "36d52b44-5e08-4a47-99b1-741c96f39546", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_295.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 158071069, "duration_sec": 6587, "page_link": "https://dick.show/episode-295/"}
{"ep_num": 296, "title": "Episode 296 - Dick on Sean's Very Own Album", "pub_date": "Tue, 15 Feb 2022 04:02:15 +0000", "guid": "71c90922-aa2f-4777-b8aa-209f9de90095", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_296.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 148931386, "duration_sec": 6179, "page_link": "https://dick.show/episode-296/"}
{"ep_num": 297, "title": "Episode 297 - Dick on the Healthy Gamer Suicide", "pub_date": "Tue, 22 Feb 2022 06:35:08 +0000", "guid": "fac1a83a-77df-42a0-8f91-d142030d67ab", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_297.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175244127, "duration_sec": 7302, "page_link": "https://dick.show/episode-297/"}
{"ep_num": 298, "title": "Episode 298 - Dick on Three Nukes", "pub_date": "Mon, 28 Feb 2022 17:36:03 +0000", "guid": "92cc0f2d-6d6e-47ff-a92d-239bee9a1d3c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_298.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143684963, "duration_sec": 5987, "page_link": "https://dick.show/episode-298/"}
{"ep_num": 299, "title": "Episode 299 - Dick on Road Rage: Los Angeles 2", "pub_date": "Tue, 08 Mar 2022 05:16:03 +0000", "guid": "0aa80f85-1940-4f8f-bbb8-84f890929e17", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_299.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 203433561, "duration_sec": 8477, "page_link": "https://dick.show/episode-299/"}
{"ep_num": 300, "title": "Episode 300 - Dick on The Underdog", "pub_date": "Tue, 15 Mar 2022 05:10:48 +0000", "guid": "b501a5a6-37b7-4a6d-8de9-2959324754e3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_300.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172111025, "duration_sec": 7172, "page_link": "https://dick.show/episode-300/"}
{"ep_num": 301, "title": "Episode 301 - Dick on Disordered Eating", "pub_date": "Tue, 22 Mar 2022 00:16:24 +0000", "guid": "624e37c3-2cef-403d-b2e4-091d0c775064", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_301.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 168960339, "duration_sec": 7040, "page_link": "https://dick.show/episode-301/"}
{"ep_num": 302, "title": "Episode 302 - Dick on Defining Women", "pub_date": "Tue, 29 Mar 2022 04:11:53 +0000", "guid": "9afebc0b-7671-4b88-8f85-65d154fe8f4c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_302.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 185066721, "duration_sec": 7712, "page_link": "https://dick.show/episode-302/"}
{"ep_num": 303, "title": "Episode 303 - Dick on Bowling Injuries", "pub_date": "Mon, 11 Apr 2022 20:00:48 +0000", "guid": "276be6f1-1f62-4be8-a1c0-71c102879cd5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_303.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 219931763, "duration_sec": 9164, "page_link": "https://dick.show/episode-303/"}
{"ep_num": 304, "title": "Episode 304 - Dick on Vicodin Miracles", "pub_date": "Mon, 18 Apr 2022 20:28:03 +0000", "guid": "231dd3f8-f4f3-4ef0-8fa6-40769913aaee", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_304.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156792777, "duration_sec": 6533, "page_link": "https://dick.show/episode-304/"}
{"ep_num": 305, "title": "Episode 305 - Dick on What Money Can't Buy", "pub_date": "Tue, 26 Apr 2022 05:08:37 +0000", "guid": "f0c02834-fad5-43f0-8684-3389f03bc2be", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_305.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172684284, "duration_sec": 7183, "page_link": "https://dick.show/episode-305/"}
{"ep_num": 306, "title": "Episode 306 - Dick on the Fat Lady Sings", "pub_date": "Mon, 02 May 2022 23:02:10 +0000", "guid": "81f16291-6dc8-4380-b3f2-df9c44ebcac4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_306.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 217672529, "duration_sec": 9070, "page_link": "https://dick.show/episode-306/"}
{"ep_num": 307, "title": "Episode 307 - Super Fit Models", "pub_date": "Tue, 10 May 2022 02:20:34 +0000", "guid": "d3d90f49-f6df-422e-b41a-fc2c3166dbac", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_307.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 201083529, "duration_sec": 8379, "page_link": "https://dick.show/episode-307/"}
{"ep_num": 308, "title": "Episode 308 - Dick on the Horse Sex Doll", "pub_date": "Mon, 16 May 2022 21:09:59 +0000", "guid": "fdbcb288-9f1b-4824-bf15-53d4aff52be4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_308.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144175747, "duration_sec": 6008, "page_link": "https://dick.show/episode-308/"}
{"ep_num": 309, "title": "Episode 309 - Dick on Waifu Watchers", "pub_date": "Mon, 23 May 2022 21:49:57 +0000", "guid": "325a6fb3-85df-4e8a-9d74-da56d3e9ff6a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_309.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186308677, "duration_sec": 7763, "page_link": "http://dick.show/episode-309/"}
{"ep_num": 310, "title": "Episode 310 - Dick on Bad Guys", "pub_date": "Mon, 30 May 2022 17:51:52 +0000", "guid": "7184ca68-da7b-42ba-9487-6e68e3a625a3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_310.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 179249275, "duration_sec": 7469, "page_link": "http://dick.show/episode-310/"}
{"ep_num": 311, "title": "Episode 311 - Dick on Dragging Kids", "pub_date": "Tue, 07 Jun 2022 04:41:52 +0000", "guid": "981d82ca-f5ff-403c-9ec6-4ff8554aba07", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_311.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 158989411, "duration_sec": 6625, "page_link": "https://dick.show/episode-311/"}
{"ep_num": 312, "title": "Episode 312 - Dick on Sudden Adult Death Syndrome", "pub_date": "Tue, 14 Jun 2022 02:30:34 +0000", "guid": "e436e3ac-bed7-4285-adad-6d4740dc9afd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_312.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143671817, "duration_sec": 5987, "page_link": "https://dick.show/episode-312/"}
{"ep_num": 313, "title": "Episode 313 - Dick on Internet Father's Day", "pub_date": "Tue, 21 Jun 2022 05:56:57 +0000", "guid": "f69af3bb-cf6b-4475-a792-ad018a2f3352", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_313.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 194777205, "duration_sec": 8116, "page_link": "https://dick.show/episode-313/"}
{"ep_num": 314, "title": "Episode 314 - Dick on Madder Hoes", "pub_date": "Mon, 27 Jun 2022 22:36:57 +0000", "guid": "61708e4d-31c7-48b0-8fa9-9e846ca0e674", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_314.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 192369609, "duration_sec": 8016, "page_link": "http://dick.show/episode-314/"}
{"ep_num": 315, "title": "Episode 315 - Dick on New Racism", "pub_date": "Tue, 05 Jul 2022 04:59:09 +0000", "guid": "93994bc7-65dc-475b-9f19-041a22e847a9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_315.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163164831, "duration_sec": 6799, "page_link": "https://dick.show/episode-315/"}
{"ep_num": 316, "title": "Episode 316 - Dick on Getting Swatted", "pub_date": "Mon, 11 Jul 2022 23:32:23 +0000", "guid": "4d5ae30d-9767-4b13-9afe-58e74033f595", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_316.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 252651531, "duration_sec": 10528, "page_link": "https://dick.show/episode-316/"}
{"ep_num": 317, "title": "Episode 317 - Dick on the Homophobic Telescope", "pub_date": "Mon, 18 Jul 2022 19:49:34 +0000", "guid": "6da1fe95-ac3e-4bb9-ac04-fa21579e83d5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_317.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 178518107, "duration_sec": 7439, "page_link": "https://dick.show/episode-317/"}
{"ep_num": 318, "title": "Episode 318 - Dick on Chub Rub", "pub_date": "Tue, 26 Jul 2022 15:24:07 +0000", "guid": "e7527f43-d6fc-46da-a483-3fb890de99a7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_318.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 174576811, "duration_sec": 7274, "page_link": "https://dick.show/episode-318/"}
{"ep_num": 319, "title": "Episode 319 - Dick on Swim Thicc", "pub_date": "Tue, 02 Aug 2022 02:34:45 +0000", "guid": "0b030aaf-511f-4e1b-a7a8-c9e85ea04325", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_319.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 173793304, "duration_sec": 7188, "page_link": "https://dick.show/episode-319/"}
{"ep_num": 320, "title": "Episode 320 - Dick on Satirical Guns", "pub_date": "Tue, 09 Aug 2022 06:08:15 +0000", "guid": "7109303f-fb8d-42f6-adc6-f759ac4a1ed4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_320.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182511361, "duration_sec": 7605, "page_link": "https://dick.show/episode-320/"}
{"ep_num": 321, "title": "Episode 321 - Dick on Pegging", "pub_date": "Tue, 16 Aug 2022 15:16:27 +0000", "guid": "cee97246-5c91-4c03-bad1-ce9c848aa19f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_321.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165514018, "duration_sec": 8276, "page_link": "https://dick.show/episode-321/"}
{"ep_num": 322, "title": "Episode 322 - Dick on The Fat C-Section Story", "pub_date": "Mon, 22 Aug 2022 15:59:52 +0000", "guid": "fffc3394-cc46-42cd-bbb8-435ae8904e74", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_322.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144506416, "duration_sec": 6009, "page_link": "https://dick.show/episode-322/"}
{"ep_num": 323, "title": "Episode 323 - Dick on the New Old Truck", "pub_date": "Tue, 06 Sep 2022 14:06:17 +0000", "guid": "ca66ed55-a488-4d04-9d85-08971fbd005d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_323.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170331008, "duration_sec": 4259, "page_link": "https://dick.show/episode-323/"}
{"ep_num": 324, "title": "Episode 324 - Dick on Bang, Zoom, Straight to the Moon", "pub_date": "Tue, 13 Sep 2022 14:27:38 +0000", "guid": "4ee511cc-612f-4385-bc58-befda279f7af", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_324.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 367806848, "duration_sec": 9196, "page_link": "https://dick.show/episode-324/"}
{"ep_num": 325, "title": "Episode 325 - Dick on Shop Class", "pub_date": "Tue, 20 Sep 2022 05:20:27 +0000", "guid": "cb930f19-ee1b-4e1d-bbc2-2f40811f1932", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_325.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 194306772, "duration_sec": 8097, "page_link": "https://dick.show/episode-325/"}
{"ep_num": 326, "title": "Episode 326 - Dick on Near Death Experiences", "pub_date": "Tue, 27 Sep 2022 14:39:38 +0000", "guid": "709cf774-0367-44ac-8918-02df8558f19f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_326.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187632956, "duration_sec": 7768, "page_link": "https://dick.show/episode-326/"}
{"ep_num": 327, "title": "Episode 327 - Dick on Lactating Individuals", "pub_date": "Tue, 04 Oct 2022 14:40:00 +0000", "guid": "f4ac77e1-fb4f-4c97-9b15-fd0b2aa23c91", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_327.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 209842424, "duration_sec": 8708, "page_link": "https://dick.show/episode-327/"}
{"ep_num": 328, "title": "Episode 328 - Dick on Death Con 3", "pub_date": "Tue, 11 Oct 2022 14:39:00 +0000", "guid": "91c4cb44-bc37-4904-a7e3-b2bbc7e5a78c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_328.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 179542252, "duration_sec": 7412, "page_link": "https://dick.show/episode-328/"}
{"ep_num": 329, "title": "Episode 329 - Dick on Hate Speech Time-Outs", "pub_date": "Tue, 18 Oct 2022 14:49:00 +0000", "guid": "be5d53c1-c2e7-4467-933f-aa304a2dd2a1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_329.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 190999666, "duration_sec": 7952, "page_link": "https://dick.show/episode-329/"}
{"ep_num": 330, "title": "Episode 330 - Dick on The Delorean", "pub_date": "Tue, 25 Oct 2022 05:39:00 +0000", "guid": "8331ee25-5de5-4c60-b253-c5c8648b4eb1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_330.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 195712930, "duration_sec": 8141, "page_link": "http://dick.show/episode-330/"}
{"ep_num": 331, "title": "Episode 331 - Dick on Not Body Dysmorphia", "pub_date": "Tue, 01 Nov 2022 18:48:00 +0000", "guid": "f18cde61-0bb0-4eeb-b65c-139c13c50745", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_331.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 157316124, "duration_sec": 7831, "page_link": "https://dick.show/episode-331/"}
{"ep_num": 332, "title": "Episode 332 - Dick on Scammed Again", "pub_date": "Tue, 08 Nov 2022 15:50:00 +0000", "guid": "796ff7cc-c9e2-4488-916a-e06e3baeeac1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_332.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 137193504, "duration_sec": 6773, "page_link": "https://dick.show/episode-332/"}
{"ep_num": 333, "title": "Episode 333 - Dick on Puzzling Injuries", "pub_date": "Tue, 15 Nov 2022 16:28:00 +0000", "guid": "a73e2d6f-542b-4f93-bb26-258c609582d5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_333.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 150523656, "duration_sec": 7440, "page_link": "https://dick.show/episode-333/"}
{"ep_num": 334, "title": "Episode 334 - Death to DEI", "pub_date": "Tue, 22 Nov 2022 18:08:00 +0000", "guid": "bae8a9fb-92dc-4ca8-8aa7-3a72066fb3a9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_334.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 153624122, "duration_sec": 7631, "page_link": "https://dick.show/episode-334/"}
{"ep_num": 335, "title": "Episode 335 - Dick on Butt Deodorant", "pub_date": "Tue, 29 Nov 2022 07:21:00 +0000", "guid": "cf39e86e-9888-4ba7-8f8c-01227a5c2a5b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_335.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172234348, "duration_sec": 8586, "page_link": "https://dick.show/episode-335/"}
{"ep_num": 336, "title": "Episode 336 - Dick on Suicide Marketing", "pub_date": "Tue, 06 Dec 2022 07:04:00 +0000", "guid": "1c9f30e1-11b4-4330-b25b-4496ba5eb0e0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_336.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 127683610, "duration_sec": 6336, "page_link": "https://dick.show/episode-336/"}
{"ep_num": 337, "title": "Episode 337 - Dick on Twitter", "pub_date": "Tue, 13 Dec 2022 09:17:00 +0000", "guid": "9645a0da-6770-4b7c-9654-0c9594bddea9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_337.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146442364, "duration_sec": 7286, "page_link": "https://dick.show/episode-337/"}
{"ep_num": 338, "title": "Episode 338 - Dick on Fireside Chats", "pub_date": "Tue, 20 Dec 2022 04:12:00 +0000", "guid": "316206e3-85bd-4e48-80d6-787fbbe1cd1f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_338.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182636544, "duration_sec": 9052, "page_link": "https://dick.show/episode-338/"}
{"ep_num": 339, "title": "Episode 339 - Dick on Resolutions", "pub_date": "Tue, 27 Dec 2022 23:58:00 +0000", "guid": "6c1aa9db-8ede-43c6-8704-018c0dabc025", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_339.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139459598, "duration_sec": 6958, "page_link": "https://dick.show/episode-339/"}
{"ep_num": 340, "title": "Episode 340 - Dick on Required Reading", "pub_date": "Tue, 03 Jan 2023 16:16:00 +0000", "guid": "4f7420bc-1493-4ab2-a86e-41cc445f17b5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_340.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152147134, "duration_sec": 7536, "page_link": "https://dick.show/episode-340/"}
{"ep_num": 341, "title": "Episode 341 - Dick on backed.by", "pub_date": "Mon, 09 Jan 2023 23:49:00 +0000", "guid": "7407ec7a-5562-4dfa-95bf-ae7125f41b69", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_341.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 193241720, "duration_sec": 9554, "page_link": "https://dick.show/episode-341/"}
{"ep_num": 342, "title": "Episode 342 - Dick on Ralphamania", "pub_date": "Tue, 17 Jan 2023 06:57:00 +0000", "guid": "1b62a6c1-23de-458d-a63e-d278b1cd0604", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_342.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 132654826, "duration_sec": 6618, "page_link": "https://dick.show/episode-342/"}
{"ep_num": 343, "title": "Episode 343 - Dick on Eliza Blue", "pub_date": "Mon, 23 Jan 2023 07:39:00 +0000", "guid": "c8d65ea3-01d7-44ac-9e5d-2eddca0b5186", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_343.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 164303686, "duration_sec": 8201, "page_link": "https://dick.show/episode-343/"}
{"ep_num": 344, "title": "Episode 344 - Dick on Mr. Ice Princess", "pub_date": "Tue, 31 Jan 2023 05:15:00 +0000", "guid": "4ef98877-f7a1-4dae-9d93-c57049a1824c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_344.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160307796, "duration_sec": 7974, "page_link": "https://dick.show/episode-344/"}
{"ep_num": 345, "title": "Episode 345 - Dick on Gay Zombies", "pub_date": "Tue, 07 Feb 2023 02:40:00 +0000", "guid": "a7b6dd2c-23ad-48b0-a154-e786e50223cd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_345.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152161946, "duration_sec": 7594, "page_link": "https://dick.show/episode-345/"}
{"ep_num": 346, "title": "Episode 346 - Dick on DAN", "pub_date": "Tue, 14 Feb 2023 05:35:00 +0000", "guid": "9a99efce-6b20-43c8-b4c5-8ec36ef21df2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_346.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141402540, "duration_sec": 7030, "page_link": "https://dick.show/episode-346/"}
{"ep_num": 347, "title": "Episode 347 - Dick on Fat Censors", "pub_date": "Mon, 20 Feb 2023 18:48:00 +0000", "guid": "f846872c-5227-4816-8fcd-2262da0e7213", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_347.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170406250, "duration_sec": 8491, "page_link": "https://dick.show/episode-347/"}
{"ep_num": 348, "title": "Episode 348 - Dick on Cringe", "pub_date": "Tue, 28 Feb 2023 08:31:00 +0000", "guid": "4eb34efd-73d3-4003-abec-3a840ae761e3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_348.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 125557192, "duration_sec": 6263, "page_link": "https://dick.show/episode-348/"}
{"ep_num": 349, "title": "Episode 349 - Dick on Arts and Crafts", "pub_date": "Tue, 07 Mar 2023 00:53:00 +0000", "guid": "1a1dece4-c819-4d37-bb37-e4b2f2f4d79f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_349.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138096374, "duration_sec": 6878, "page_link": "https://dick.show/episode-349/"}
{"ep_num": 350, "title": "Episode 350 - Dick on the Manosphere", "pub_date": "Tue, 14 Mar 2023 01:53:00 +0000", "guid": "c1f78647-ba12-4d2f-9cb6-ed85c9ed50e2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_350.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 209632520, "duration_sec": 10360, "page_link": "https://dick.show/episode-350/"}
{"ep_num": 351, "title": "Episode 351 - Dick on Gravy Seals", "pub_date": "Tue, 21 Mar 2023 05:07:00 +0000", "guid": "626858be-0e01-4b28-82c2-6973ddeb5c66", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_351.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 157580776, "duration_sec": 7846, "page_link": "https://dick.show/episode-351/"}
{"ep_num": 352, "title": "Episode 352 - Dick on the Contrarian", "pub_date": "Tue, 28 Mar 2023 07:29:00 +0000", "guid": "26dfa51b-2dd0-48eb-9cd6-51a78d073f7b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_352.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 159545680, "duration_sec": 7947, "page_link": "https://dick.show/episode-352/"}
{"ep_num": 353, "title": "Episode 353 - Dick on Mexican Inflation", "pub_date": "Mon, 03 Apr 2023 18:12:00 +0000", "guid": "1aea9578-7857-4767-a6b7-2dbda3069518", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_353.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146276836, "duration_sec": 7247, "page_link": "https://dick.show/episode-353/"}
{"ep_num": 354, "title": "Episode 354 - Dick on The Killing Joke", "pub_date": "Tue, 11 Apr 2023 04:50:00 +0000", "guid": "5d3e868d-1b73-46ae-9d98-8993b4cd5325", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_354.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160908440, "duration_sec": 8002, "page_link": "https://dick.show/episode-354/"}
{"ep_num": 355, "title": "Episode 355 - Dick on Optional Poop", "pub_date": "Tue, 18 Apr 2023 01:05:00 +0000", "guid": "5d698f21-5140-41ee-8b94-792e4c8f233e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_355.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163532814, "duration_sec": 8148, "page_link": "https://dick.show/episode-355/"}
{"ep_num": 356, "title": "Episode 356 - Dick on Vito's Merch", "pub_date": "Mon, 24 Apr 2023 23:14:00 +0000", "guid": "58980612-e794-4ef4-960d-a6a006548271", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_356.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141858902, "duration_sec": 7058, "page_link": "https://dick.show/episode-356/"}
{"ep_num": 357, "title": "Episode 357 - Dick on Slippin' Mickeys", "pub_date": "Tue, 02 May 2023 00:11:00 +0000", "guid": "604c7ecc-69d3-43df-a131-675f88481ed7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_357.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 142263114, "duration_sec": 7076, "page_link": "https://dick.show/episode-357/"}
{"ep_num": 358, "title": "Episode 358 - Dick on Poop River", "pub_date": "Mon, 08 May 2023 22:54:00 +0000", "guid": "7e08bf4e-95d6-49c5-995d-8acf58bab734", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_358.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154573058, "duration_sec": 7718, "page_link": "https://dick.show/episode-358/"}
{"ep_num": 359, "title": "Episode 359 - Dick on Jon from Fishtank", "pub_date": "Tue, 16 May 2023 02:48:00 +0000", "guid": "50d77b18-2c84-4d88-a524-61f4dc5b698d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_359.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163413162, "duration_sec": 8057, "page_link": "https://dick.show/episode-359/"}
{"ep_num": 360, "title": "Episode 360 - Dick on Zeroth Place", "pub_date": "Mon, 22 May 2023 03:58:00 +0000", "guid": "9ac6e696-fc63-4a1f-b34f-01fddc38fb39", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_360.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165060272, "duration_sec": 8047, "page_link": "https://dick.show/episode-360/"}
{"ep_num": 361, "title": "Episode 361 - Dick on Lizard Feet", "pub_date": "Tue, 30 May 2023 06:46:00 +0000", "guid": "c8c48ad1-fcf6-4afc-bb82-0b306d3e543b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_361.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 177399980, "duration_sec": 8804, "page_link": "https://dick.show/episode-361/"}
{"ep_num": 362, "title": "Episode 362 - Dick on Apparently Unfinished", "pub_date": "Mon, 05 Jun 2023 06:17:00 +0000", "guid": "e50474e5-fde5-4290-b9b1-9b65b8d9c78b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_362.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 129629160, "duration_sec": 6436, "page_link": "https://dick.show/episode-362/"}
{"ep_num": 363, "title": "Episode 363 - Dick on the Hater's Book Club", "pub_date": "Tue, 13 Jun 2023 06:13:00 +0000", "guid": "d91a94e7-043e-4d5e-be59-2c796ff1a425", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_363.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 154768350, "duration_sec": 7712, "page_link": "https://dick.show/episode-363/"}
{"ep_num": 364, "title": "Episode 364 - Dick on Face Lasers", "pub_date": "Mon, 19 Jun 2023 21:53:00 +0000", "guid": "9e0ecf67-8fe7-4e80-9a4d-f5d9a3c7ec70", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_364.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 144285268, "duration_sec": 7159, "page_link": "https://dick.show/episode-364/"}
{"ep_num": 365, "title": "Episode 365 - Dick on Charity Scams", "pub_date": "Tue, 27 Jun 2023 05:39:00 +0000", "guid": "fa0b00da-22f8-4d6c-9553-ec4685d66ccf", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_365.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 195641660, "duration_sec": 9550, "page_link": "https://dick.show/episode-365/"}
{"ep_num": 366, "title": "Episode 366 - Dick on The Domain Disaster", "pub_date": "Tue, 04 Jul 2023 06:15:00 +0000", "guid": "3971d678-1dfc-4d46-aef3-c5a378e12001", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_366.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143292522, "duration_sec": 7071, "page_link": "https://dick.show/episode-366/"}
{"ep_num": 367, "title": "Episode 367 - Dick on Expert Gaslighting", "pub_date": "Tue, 11 Jul 2023 07:19:00 +0000", "guid": "9cf7b84b-97bf-4ea1-baa8-9acb7da7c75e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_367.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146683336, "duration_sec": 7332, "page_link": "https://dick.show/episode-367/"}
{"ep_num": 368, "title": "Episode 368 - Dick on The Umbrella Man", "pub_date": "Mon, 17 Jul 2023 20:02:00 +0000", "guid": "8145005d-98b2-4027-a5a9-3028f25c087e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_368.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 195599452, "duration_sec": 9699, "page_link": "https://dick.show/episode-368/"}
{"ep_num": 369, "title": "Episode 369 - Dick on the Return of the King", "pub_date": "Mon, 24 Jul 2023 16:38:00 +0000", "guid": "3750fa6d-2780-458e-8a7c-506f69687b66", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_369.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 234216910, "duration_sec": 11645, "page_link": "http://dick.show/episode-369/"}
{"ep_num": 370, "title": "Episode 370 - Dick on Greece", "pub_date": "Mon, 07 Aug 2023 17:27:00 +0000", "guid": "8b7b87e1-3404-45c4-bfab-5324440c1c7a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_370.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 167519776, "duration_sec": 8330, "page_link": "https://dick.show/episode-370/"}
{"ep_num": 371, "title": "Episode 371 - Dick on Brostronomy", "pub_date": "Tue, 15 Aug 2023 07:12:00 +0000", "guid": "7f91cb52-438d-4c36-b1f6-983bfcb69898", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_371.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143743958, "duration_sec": 7116, "page_link": "https://dick.show/episode-371/"}
{"ep_num": 372, "title": "Episode 372 - Dick on Fake Hurricanes", "pub_date": "Tue, 22 Aug 2023 07:43:00 +0000", "guid": "1776675a-bf49-4b8c-a5c0-3844f5998abe", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_372.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 176096168, "duration_sec": 8790, "page_link": "https://dick.show/episode-372/"}
{"ep_num": 373, "title": "Episode 373 - Dick on Maddox Lives!", "pub_date": "Mon, 28 Aug 2023 04:47:00 +0000", "guid": "bb6944ce-6b33-406c-b87b-585ab0b732ee", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_373.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 249808310, "duration_sec": 12476, "page_link": "https://dick.show/episode-373/"}
{"ep_num": 374, "title": "Episode 374 - Dick on Fake Feds", "pub_date": "Mon, 04 Sep 2023 21:26:00 +0000", "guid": "fff547fc-0fa7-4701-939a-3732b45afaa6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_374.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156574436, "duration_sec": 7798, "page_link": "https://dick.show/episode-374/"}
{"ep_num": 375, "title": "Episode 375 - Dick on Waves of Masculinity", "pub_date": "Mon, 11 Sep 2023 17:34:00 +0000", "guid": "f40672e4-dca1-41b6-a9f3-bf07248aee7b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_375.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 181012378, "duration_sec": 9027, "page_link": "http://dick.show/episode-375/"}
{"ep_num": 376, "title": "Episode 376 - Dick on Bachelorette Party City", "pub_date": "Tue, 19 Sep 2023 06:56:00 +0000", "guid": "d4b29cb7-606d-4909-a02a-a21f928e6971", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_376.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 164663634, "duration_sec": 8092, "page_link": "https://dick.show/episode-376/"}
{"ep_num": 377, "title": "Episode 377 - Dick on Gentrification", "pub_date": "Tue, 26 Sep 2023 04:37:00 +0000", "guid": "3c95fa68-42ea-4850-b711-3bd6715ee2e6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_377.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133521588, "duration_sec": 6661, "page_link": "https://dick.show/episode-377/"}
{"ep_num": 378, "title": "Episode 378 - Dick on Big Magnets", "pub_date": "Mon, 02 Oct 2023 06:31:00 +0000", "guid": "0a417489-1b14-45db-b4f3-297cae19d485", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_378c.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 175109378, "duration_sec": 8560, "page_link": "https://dick.show/episode-378/"}
{"ep_num": 379, "title": "Episode 379 - Dick on World War Wheee!", "pub_date": "Mon, 09 Oct 2023 02:56:00 +0000", "guid": "08bf96a7-7ec4-479d-8729-81201935e112", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_379.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187986016, "duration_sec": 9323, "page_link": "https://dick.show/episode-379/"}
{"ep_num": 380, "title": "Episode 380 - Dick on Grave Desecration", "pub_date": "Mon, 16 Oct 2023 04:33:00 +0000", "guid": "de1c5ecf-9c32-4a18-aa02-ad0c161ac8b3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_380.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 200714584, "duration_sec": 9986, "page_link": "https://dick.show/episode-380/"}
{"ep_num": 381, "title": "Episode 381 - Dick on Your Favorite Part", "pub_date": "Mon, 23 Oct 2023 05:06:00 +0000", "guid": "49fd2c33-7f01-4fdb-8b5a-addb6734455c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_381.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186655794, "duration_sec": 9300, "page_link": "https://dick.show/episode-381/"}
{"ep_num": 382, "title": "Episode 382 - Dick on The Poop Gun", "pub_date": "Mon, 30 Oct 2023 17:16:00 +0000", "guid": "214e58b2-3fd5-4693-b031-fd5815f1fef2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_382.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182376400, "duration_sec": 9018, "page_link": "https://dick.show/episode-382/"}
{"ep_num": 383, "title": "Episode 383 - Dick on Lord Miles", "pub_date": "Mon, 06 Nov 2023 04:51:00 +0000", "guid": "d6f3b170-c903-46a4-8857-5f85b3913e66", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_383.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180935778, "duration_sec": 8920, "page_link": "https://dick.show/episode-383/"}
{"ep_num": 384, "title": "Episode 384 - Dick on Butch Killigan", "pub_date": "Mon, 13 Nov 2023 07:00:00 +0000", "guid": "e2ef874a-4c44-4254-8e0b-79e797d60c2d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_384.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 196515764, "duration_sec": 9811, "page_link": "https://dick.show/episode-384/"}
{"ep_num": 385, "title": "Episode 385 - Dick on Adam22's Birthday Party", "pub_date": "Mon, 20 Nov 2023 06:08:00 +0000", "guid": "4cd30450-cf40-4b60-8ffc-0e3c85d16d17", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_385.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187141678, "duration_sec": 9216, "page_link": "https://dick.show/episode-385/"}
{"ep_num": 386, "title": "Episode 386 - Dick on Afuera!", "pub_date": "Mon, 27 Nov 2023 05:43:00 +0000", "guid": "760cbb2f-38c1-459f-9d40-9fcbfc16aa8c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_386.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163630132, "duration_sec": 8069, "page_link": "https://dick.show/episode-386/"}
{"ep_num": 387, "title": "Episode 387 - Dick on The Line in the Sand", "pub_date": "Mon, 04 Dec 2023 05:59:00 +0000", "guid": "5707c050-0045-49ae-862e-489584ae9bcc", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_387.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170691848, "duration_sec": 8489, "page_link": "https://dick.show/episode-387/"}
{"ep_num": 388, "title": "Episode 388 - Dick on Obsession", "pub_date": "Mon, 11 Dec 2023 05:53:00 +0000", "guid": "a68d4d1a-519a-4dee-962c-869e9d1beada", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_388.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 206379094, "duration_sec": 10278, "page_link": "https://dick.show/episode-388/"}
{"ep_num": 389, "title": "Episode 389 - Dick on Somewhat Salad", "pub_date": "Mon, 18 Dec 2023 06:08:00 +0000", "guid": "fa3526b8-41af-4bcf-8102-8a0074c981cd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_389.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 179254906, "duration_sec": 8871, "page_link": "https://dick.show/episode-389/"}
{"ep_num": 390, "title": "Episode 390 - Dick on America's Next Top Pedophile", "pub_date": "Mon, 25 Dec 2023 05:49:00 +0000", "guid": "0aedfcdd-ca4b-4956-a172-1c80e84fc294", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_390.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126792746, "duration_sec": 6325, "page_link": "https://dick.show/episode-390/"}
{"ep_num": 391, "title": "Episode 391 - Dick on Vinegar Workout Supplements", "pub_date": "Mon, 01 Jan 2024 06:58:00 +0000", "guid": "9511428d-c64e-472c-b712-03555214d99e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_391.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149653788, "duration_sec": 7353, "page_link": "https://dick.show/episode-391/"}
{"ep_num": 392, "title": "Episode 392 - Dick on Fudgers", "pub_date": "Mon, 08 Jan 2024 06:09:00 +0000", "guid": "eba563f5-22cf-474e-ae6e-94eee61152c9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_392.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 197556168, "duration_sec": 9878, "page_link": "https://dick.show/episode-392/"}
{"ep_num": 393, "title": "Episode 393 - Dick on What Makes Your", "pub_date": "Mon, 15 Jan 2024 05:51:00 +0000", "guid": "562936f8-d98e-4978-8785-84cbd1dd5f2f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_393.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182914330, "duration_sec": 9119, "page_link": "https://dick.show/episode-393/"}
{"ep_num": 394, "title": "Episode 394 - Dick on Scotch Earth", "pub_date": "Mon, 22 Jan 2024 07:22:00 +0000", "guid": "5b6083ab-324e-4c3f-b2e0-aaa7f6b92c90", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_394.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 150233094, "duration_sec": 7472, "page_link": "https://dick.show/episode-394/"}
{"ep_num": 395, "title": "Episode 395 - Dick on Stochastic Feet Stuff", "pub_date": "Mon, 29 Jan 2024 18:30:00 +0000", "guid": "d5a07377-c646-4820-a53c-aabc9acda904", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_395.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 205718564, "duration_sec": 10178, "page_link": "https://dick.show/episode-395/"}
{"ep_num": 396, "title": "Episode 396 - Dick on Horse-Man", "pub_date": "Mon, 05 Feb 2024 06:29:00 +0000", "guid": "54122836-6000-4b33-b897-12df645ef101", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_396.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 252620804, "duration_sec": 12497, "page_link": "https://dick.show/episode-396/"}
{"ep_num": 397, "title": "Episode 397 - Dick on Bad Photoshops", "pub_date": "Mon, 12 Feb 2024 07:07:00 +0000", "guid": "75851703-6af6-4498-8e57-b580261f1237", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/1707853395970_The_Dick_Show_397b.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 192558538, "duration_sec": 9589, "page_link": "https://dick.show/episode-397/"}
{"ep_num": 398, "title": "Episode 398 - Dick on Sean's Dog", "pub_date": "Mon, 19 Feb 2024 06:55:00 +0000", "guid": "618b5a2c-f0c1-4210-9282-73527ff158bd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_398.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 190718576, "duration_sec": 9372, "page_link": "https://dick.show/episode-398/"}
{"ep_num": 399, "title": "Episode 399 - Dick on 100% Content", "pub_date": "Mon, 26 Feb 2024 06:37:00 +0000", "guid": "5ea2f693-d51a-4ad2-b65f-701d05a5bb8f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_399.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 200589170, "duration_sec": 9975, "page_link": "https://dick.show/episode-399/"}
{"ep_num": 400, "title": "Episode 400 - Dick on 1984: Part 2", "pub_date": "Mon, 04 Mar 2024 07:35:00 +0000", "guid": "3cb58f8c-30e7-4fd1-9026-7ba815e11c53", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_400.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 143132996, "duration_sec": 7100, "page_link": "https://dick.show/episode-400/"}
{"ep_num": 401, "title": "Episode 401 - Dick on Revenge Bankruptcy", "pub_date": "Mon, 11 Mar 2024 05:25:00 +0000", "guid": "f642147a-82f4-4bcd-bce1-d2387fe300a1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_401.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 166462730, "duration_sec": 8007, "page_link": "https://dick.show/episode-401/"}
{"ep_num": 402, "title": "Episode 402 - Dick on The Meat Intervention", "pub_date": "Mon, 18 Mar 2024 05:29:00 +0000", "guid": "4fc9c4e6-6c14-423c-a1ee-c83cd1925d65", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_402.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 181909602, "duration_sec": 8974, "page_link": "https://dick.show/episode-402/"}
{"ep_num": 403, "title": "Episode 403 - Dick on 89th Place", "pub_date": "Mon, 25 Mar 2024 05:31:00 +0000", "guid": "6e41b518-843f-4d4f-bb6c-1e25f3b11729", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_403.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 216050646, "duration_sec": 10764, "page_link": "https://dick.show/episode-403/"}
{"ep_num": 404, "title": "Episode 404 - Dick on It Get's You Dead", "pub_date": "Tue, 02 Apr 2024 05:55:00 +0000", "guid": "d99189a2-0d7d-40ef-9bf6-8c94841a455e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_404.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 188106344, "duration_sec": 9391, "page_link": "https://dick.show/episode-404/"}
{"ep_num": 405, "title": "Episode 405 - Dick on the Slowpocalypse", "pub_date": "Mon, 08 Apr 2024 05:04:00 +0000", "guid": "3ecdc7c5-cbd7-4fca-bbc4-dad9d625760e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_405.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 193713932, "duration_sec": 9669, "page_link": "https://dick.show/episode-405/"}
{"ep_num": 406, "title": "Episode 406 - Dick on Bums vs. Drones", "pub_date": "Mon, 15 Apr 2024 18:25:00 +0000", "guid": "66027307-168e-4b7f-8c16-c3c4477ebad5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_406.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 226182240, "duration_sec": 11167, "page_link": "https://dick.show/episode-406/"}
{"ep_num": 407, "title": "Episode 407 - Dick on Super Christ", "pub_date": "Mon, 22 Apr 2024 06:01:00 +0000", "guid": "430c01d3-2650-4b81-a1d9-ffd61ad8671b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_407.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 217949478, "duration_sec": 10848, "page_link": "https://dick.show/episode-407/"}
{"ep_num": 408, "title": "Episode 408 - Dick on Real Writer Problems", "pub_date": "Mon, 29 Apr 2024 16:10:00 +0000", "guid": "c260fce7-5ec7-4723-b307-443208183fa1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_408.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 241745640, "duration_sec": 12045, "page_link": "https://dick.show/episode-408/"}
{"ep_num": 409, "title": "Episode 409 - Dick on the Bearllema", "pub_date": "Mon, 06 May 2024 04:39:00 +0000", "guid": "006a997b-dd12-4f48-a5b5-b8a7b348a1a3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_409.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170504902, "duration_sec": 8473, "page_link": "https://dick.show/episode-409/"}
{"ep_num": 410, "title": "Episode 410 - Dick on the Butt Wand", "pub_date": "Tue, 14 May 2024 06:40:00 +0000", "guid": "6fe3d4c3-b0c6-4928-a525-77378f8b44d6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_410.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 194992604, "duration_sec": 9738, "page_link": "https://dick.show/episode-410/"}
{"ep_num": 411, "title": "Episode 411 - Dick on Tankerbelle", "pub_date": "Mon, 20 May 2024 06:41:00 +0000", "guid": "7217a129-c10e-4946-9fd3-1b8aa4b19d72", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_411.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141585138, "duration_sec": 7000, "page_link": "https://dick.show/episode-411/"}
{"ep_num": 412, "title": "Episode 412 - Dick on Hooooo Boy!", "pub_date": "Tue, 28 May 2024 06:44:00 +0000", "guid": "dd12e695-753b-4ece-8ff2-5076d1e5c6a3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_412.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 209931660, "duration_sec": 10433, "page_link": "https://dick.show/episode-412/"}
{"ep_num": 413, "title": "Episode 413 - Dick on Stoplight Sensors", "pub_date": "Tue, 04 Jun 2024 05:44:00 +0000", "guid": "d207a58a-0a38-478c-910c-c79fd663f18b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_413.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152831628, "duration_sec": 7576, "page_link": "https://dick.show/episode-413/"}
{"ep_num": 414, "title": "Episode 414 - Dick on Riley's Arrest", "pub_date": "Mon, 10 Jun 2024 06:26:00 +0000", "guid": "54b15bf6-5bc2-474e-8a23-a5444ace44da", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_414.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 166146848, "duration_sec": 8293, "page_link": "https://dick.show/episode-414/"}
{"ep_num": 415, "title": "Episode 415 - Dick on Rain Man Flag Laws", "pub_date": "Mon, 17 Jun 2024 16:35:00 +0000", "guid": "1af284a4-6a0f-4158-9689-a91d68c380c2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_415.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155204808, "duration_sec": 7703, "page_link": "https://dick.show/episode-415/"}
{"ep_num": 416, "title": "Episode 416 - Dick on the Hair in Your Curse", "pub_date": "Mon, 24 Jun 2024 06:05:00 +0000", "guid": "e0ff0e50-a675-4f7b-a2fd-9cf8c774c4fe", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_416.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 198767008, "duration_sec": 9911, "page_link": "https://dick.show/episode-416/"}
{"ep_num": 417, "title": "Episode 417 - Dick on Hipster Prison", "pub_date": "Mon, 01 Jul 2024 05:03:00 +0000", "guid": "68a13d2d-61ea-461e-ab4c-bd9b7f71ac6c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_417.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 197500560, "duration_sec": 9818, "page_link": "https://dick.show/episode-417/"}
{"ep_num": 418, "title": "Episode 418 - Dick on New Weights", "pub_date": "Mon, 08 Jul 2024 06:20:00 +0000", "guid": "e6041898-3106-4353-b4ad-ffd1b6ef0f2a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_418.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161512030, "duration_sec": 8061, "page_link": "https://dick.show/episode-418/"}
{"ep_num": 419, "title": "Episode 419 - Dick on Big Grrrls Bodyguards", "pub_date": "Mon, 15 Jul 2024 06:08:00 +0000", "guid": "4b2cf909-e7b7-4de7-b157-36d94407c343", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_419.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 165999644, "duration_sec": 8285, "page_link": "https://dick.show/episode-419/"}
{"ep_num": 420, "title": "Episode 420 - Dick on Disney Rash", "pub_date": "Mon, 22 Jul 2024 05:39:00 +0000", "guid": "e87d92a6-14ef-4de3-ad7c-83a548402d35", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_420.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 193268164, "duration_sec": 9607, "page_link": "https://dick.show/episode-420/"}
{"ep_num": 421, "title": "Episode 421 - Dick on Large-Bodied Bicyclers", "pub_date": "Mon, 05 Aug 2024 18:33:00 +0000", "guid": "b5782387-c328-4306-9dbf-ce9f4d28a8cb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_421.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 164988606, "duration_sec": 8091, "page_link": "https://dick.show/episode-421/"}
{"ep_num": 422, "title": "Episode 422 - Dick on B-Dancing", "pub_date": "Mon, 12 Aug 2024 05:41:00 +0000", "guid": "6da84940-f85c-4c2e-b4f4-07555ca113db", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_422.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 214544074, "duration_sec": 10689, "page_link": "https://dick.show/episode-422/"}
{"ep_num": 423, "title": "Episode 423 - Dick on The Infinity Hoop", "pub_date": "Mon, 19 Aug 2024 06:16:00 +0000", "guid": "c07985ec-353a-4224-9d74-c0cfdbb11748", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_423.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 171300104, "duration_sec": 8503, "page_link": "https://dick.show/episode-423/"}
{"ep_num": 424, "title": "Episode 424 - Dick on Kamikaze Scooters", "pub_date": "Mon, 26 Aug 2024 06:03:00 +0000", "guid": "e4f35291-8ec7-4dee-810a-b4d5a5b1c7c0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_424.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147030406, "duration_sec": 7283, "page_link": "https://dick.show/episode-424/"}
{"ep_num": 425, "title": "Episode 425 - Dick on Good Advice", "pub_date": "Mon, 02 Sep 2024 05:55:00 +0000", "guid": "27e6d964-1d61-472d-9216-cf5679a79118", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_425.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 201039996, "duration_sec": 9999, "page_link": "https://dick.show/episode-425/"}
{"ep_num": 426, "title": "Episode 426 - Dick on Oinkamania", "pub_date": "Mon, 09 Sep 2024 05:35:00 +0000", "guid": "35c16d58-0f6a-4c5d-bc80-43a16c77396e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_426.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 270172660, "duration_sec": 13464, "page_link": "https://dick.show/episode-426/"}
{"ep_num": 427, "title": "Episode 427 - Dick on Excuse Me, I'm Speaking", "pub_date": "Mon, 16 Sep 2024 05:49:00 +0000", "guid": "78da5260-10e2-47a8-8a82-95754b050e67", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_427.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 188148496, "duration_sec": 9359, "page_link": "https://dick.show/episode-427/"}
{"ep_num": 428, "title": "Episode 428 - Dick on Character Creation", "pub_date": "Mon, 23 Sep 2024 05:08:00 +0000", "guid": "78f7eff4-b192-4232-8d98-3832f18d175f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_428.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 173030196, "duration_sec": 8600, "page_link": "https://dick.show/episode-428/"}
{"ep_num": 429, "title": "Episode 429 - Dick on \"The Newly Ped\" Game", "pub_date": "Mon, 30 Sep 2024 15:37:00 +0000", "guid": "737447fa-1a0f-4864-842f-51a5a14b30b8", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_429.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 194552834, "duration_sec": 9590, "page_link": "https://dick.show/episode-429/"}
{"ep_num": 430, "title": "Episode 430 - Dick on Bad Bail", "pub_date": "Mon, 07 Oct 2024 05:10:00 +0000", "guid": "d0c46bf2-d4db-4382-b361-f839ece618e6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_430.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 182272312, "duration_sec": 8805, "page_link": "https://dick.show/episode-430/"}
{"ep_num": 431, "title": "Episode 431 - Dick on The Tungsteñera", "pub_date": "Mon, 14 Oct 2024 11:27:00 +0000", "guid": "d0b9db23-ac1b-40d1-998b-0f502ee2b4ab", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_431.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 181781404, "duration_sec": 9079, "page_link": "https://dick.show/episode-431/"}
{"ep_num": 432, "title": "Episode 432 - Dick on Not Spilling Chips in the Car", "pub_date": "Mon, 21 Oct 2024 09:34:00 +0000", "guid": "c49dc6a8-9a05-4fe4-ac33-f8e5bd8caa55", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_432.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 188644650, "duration_sec": 9389, "page_link": "https://dick.show/episode-432/"}
{"ep_num": 433, "title": "Episode 433 - Dick on Guitar Talk", "pub_date": "Mon, 28 Oct 2024 06:03:00 +0000", "guid": "50c72756-3ddd-40b8-9434-ee4ac5386d74", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_433.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 227415722, "duration_sec": 11298, "page_link": "https://dick.show/episode-433/"}
{"ep_num": 434, "title": "Episode 434 - Dick on Dark Romance Reviews", "pub_date": "Mon, 04 Nov 2024 06:02:00 +0000", "guid": "6c0a2241-e21d-47b4-82b9-aa0a11389a45", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_434.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 176026446, "duration_sec": 8783, "page_link": "https://dick.show/episode-434/"}
{"ep_num": 435, "title": "Episode 435 - Dick on More Gloating", "pub_date": "Mon, 11 Nov 2024 05:34:00 +0000", "guid": "fc3958fb-4055-4059-b1fc-9c5ef6b52b7d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_435.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 190877472, "duration_sec": 9509, "page_link": "https://dick.show/episode-435/"}
{"ep_num": 436, "title": "Episode 436 - Dick on Testifying", "pub_date": "Tue, 19 Nov 2024 08:05:00 +0000", "guid": "afb75f6a-0fbb-4259-a939-2927ffcb5bd0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_436.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 176927188, "duration_sec": 8794, "page_link": "https://dick.show/episode-436/"}
{"ep_num": 437, "title": "Episode 437 - Dick on Formal Introductions", "pub_date": "Mon, 25 Nov 2024 06:55:00 +0000", "guid": "b1458669-c129-4d5a-b3ee-37f97515d387", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_437.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 157208120, "duration_sec": 7846, "page_link": "https://dick.show/episode-437/"}
{"ep_num": 438, "title": "Episode 438 - Dick on Good News, Bad News", "pub_date": "Mon, 02 Dec 2024 05:51:00 +0000", "guid": "ea687fbb-40b2-4b87-a214-c35578395919", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_438.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 159870710, "duration_sec": 7933, "page_link": "https://dick.show/episode-438/"}
{"ep_num": 439, "title": "Episode 439 - Dick on Good!", "pub_date": "Mon, 09 Dec 2024 08:01:00 +0000", "guid": "b76eeb7c-453c-44b2-b713-30ae93193c93", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_439b.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 204178498, "duration_sec": 10171, "page_link": "https://dick.show/episode-439/"}
{"ep_num": 440, "title": "Episode 440 - Dick on Follow the Fat", "pub_date": "Mon, 16 Dec 2024 06:33:00 +0000", "guid": "dca72c73-d2bf-4ee8-8836-72f460792ab4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_440.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147998598, "duration_sec": 7289, "page_link": "https://dick.show/episode-440/"}
{"ep_num": 441, "title": "Episode 441 - Dick on Christmas Creeps", "pub_date": "Tue, 24 Dec 2024 00:44:00 +0000", "guid": "417f5f13-3998-4129-a893-05072f74fc37", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_441.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 185400414, "duration_sec": 9217, "page_link": "https://dick.show/episode-441/"}
{"ep_num": 442, "title": "Episode 442 - Dick on The Best and Brightest", "pub_date": "Sun, 29 Dec 2024 23:32:00 +0000", "guid": "c903ab3a-e198-4244-a157-e1ed07ca145a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_442.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 138366336, "duration_sec": 6579, "page_link": "https://dick.show/episode-442"}
{"ep_num": 443, "title": "Episode 443 - Dick on Counting Calories", "pub_date": "Mon, 06 Jan 2025 16:07:00 +0000", "guid": "57f89f2d-b356-42be-8b04-6f6e4b3f262c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_443.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 125888380, "duration_sec": 6267, "page_link": "https://dick.show/episode-443/"}
{"ep_num": 444, "title": "Episode 444 - Dick on Fighting Fires", "pub_date": "Mon, 13 Jan 2025 06:36:00 +0000", "guid": "e49defa1-5257-4748-8832-bace976da473", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_444b.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 153973888, "duration_sec": 7683, "page_link": "https://dick.show/episode-444/"}
{"ep_num": 445, "title": "Episode 445 - Dick on Generational Wealth", "pub_date": "Mon, 20 Jan 2025 18:17:00 +0000", "guid": "fb6d9830-00ba-49ff-adda-4d0aafd9aa7c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_445.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 156371712, "duration_sec": 7783, "page_link": "https://dick.show/episode-445"}
{"ep_num": 446, "title": "Episode 446 - Dick on Eating Paste", "pub_date": "Mon, 27 Jan 2025 07:12:00 +0000", "guid": "9017e9e5-06f4-4d0c-8495-da50a612db5a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_446.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 201718708, "duration_sec": 9998, "page_link": "https://dick.show/episode-446/"}
{"ep_num": 447, "title": "Episode 447 - Dick on Size-Inclusive Cars", "pub_date": "Mon, 03 Feb 2025 03:36:00 +0000", "guid": "aa6e093e-b459-4084-9f4f-29910046db52", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_447.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 149266504, "duration_sec": 7134, "page_link": "https://dick.show/episode-447/"}
{"ep_num": 448, "title": "Episode 448 - Dick on the Sexually Offended", "pub_date": "Mon, 10 Feb 2025 17:55:00 +0000", "guid": "4938ccfe-14f5-4db2-89e3-b06e4bd4580a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_448.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 150884494, "duration_sec": 7421, "page_link": "https://dick.show/episode-448/"}
{"ep_num": 449, "title": "Episode 449 - Dick on Goygamel", "pub_date": "Mon, 17 Feb 2025 15:14:00 +0000", "guid": "efaa49a7-f99b-487c-afdc-4d320e8a55c0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_449.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160858176, "duration_sec": 7968, "page_link": "https://dick.show/episode-449/"}
{"ep_num": 450, "title": "Episode 450 - Dick on Hungry, Hungry Hooters", "pub_date": "Mon, 24 Feb 2025 05:09:00 +0000", "guid": "5fa4887e-6c6d-4352-ba3d-60079c74e3a7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_450.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 174720864, "duration_sec": 8437, "page_link": "https://dick.show/episode-450/"}
{"ep_num": 451, "title": "Episode 451 - Dick on The Horse is Fine", "pub_date": "Mon, 03 Mar 2025 17:27:00 +0000", "guid": "d2376445-8916-4a63-8332-8cfdf06d0397", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_451.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 214582540, "duration_sec": 10691, "page_link": "https://dick.show/episode-451/"}
{"ep_num": 452, "title": "Episode 452 - Dick on Drug-Head", "pub_date": "Mon, 10 Mar 2025 13:00:00 +0000", "guid": "1ffd36c0-3f5a-4636-92c3-a728aa0b91d6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_452.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 189237498, "duration_sec": 9434, "page_link": "https://dick.show/episode-452/"}
{"ep_num": 453, "title": "Episode 453 - Dick on Tasting the Foam", "pub_date": "Tue, 18 Mar 2025 03:31:00 +0000", "guid": "543d95cb-9f72-40cc-b7d0-6c58a306fd45", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_453.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 206169666, "duration_sec": 9937, "page_link": "https://dick.show/episode-453"}
{"ep_num": 454, "title": "Episode 454 - Dick on Slurping it Up", "pub_date": "Mon, 24 Mar 2025 16:02:00 +0000", "guid": "5d1fd18e-b2cd-4339-b783-9b286edaf423", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_454.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 193709266, "duration_sec": 9661, "page_link": "https://dick.show/episode-454/"}
{"ep_num": 455, "title": "Episode 455 - Dick on a Homeless Wedding", "pub_date": "Mon, 31 Mar 2025 16:27:00 +0000", "guid": "dd1fe2b1-dc53-4554-825f-840bf6c5f5d0", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_455.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 118310080, "duration_sec": 5609, "page_link": "https://dick.show/episode-455/"}
{"ep_num": 456, "title": "Episode 456 - Dick on The Liar's Fund", "pub_date": "Mon, 07 Apr 2025 14:50:00 +0000", "guid": "417d257a-6834-44f5-9bdf-58399394fe00", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_456b.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 153550944, "duration_sec": 7585, "page_link": "https://dick.show/episode-456/"}
{"ep_num": 457, "title": "Episode 457 - Dick on Obesity Simulation Suits", "pub_date": "Mon, 14 Apr 2025 02:16:00 +0000", "guid": "000334c3-90b7-49ba-8dd4-ee760679d645", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_457.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 207812472, "duration_sec": 10025, "page_link": "https://dick.show/episode-457/"}
{"ep_num": 458, "title": "Episode 458 - Dick on The Ringer", "pub_date": "Tue, 22 Apr 2025 05:32:00 +0000", "guid": "a2ea5207-2bc3-46ad-a939-db5e40bba257", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_458.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 151663830, "duration_sec": 7547, "page_link": "https://dick.show/episode-458/"}
{"ep_num": 459, "title": "Episode 459 - Dick on Time is a Fat Circle", "pub_date": "Mon, 28 Apr 2025 03:17:00 +0000", "guid": "b628718a-9f50-42f8-8f9f-b7d3fd7fe435", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_459.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172515770, "duration_sec": 8611, "page_link": "https://dick.show/episode-459/"}
{"ep_num": 460, "title": "Episode 460 - Dick on The Fear", "pub_date": "Mon, 12 May 2025 13:08:00 +0000", "guid": "26bc2691-53d1-4ae2-91e9-dd9db519a9ef", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_460.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 128394020, "duration_sec": 6312, "page_link": "https://dick.show/episode-460"}
{"ep_num": 461, "title": "Episode 461 - Dick on High-Fives", "pub_date": "Sun, 18 May 2025 23:10:00 +0000", "guid": "912e1295-5ff9-46b8-ba8b-657118c1c6ec", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_461.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147521559, "duration_sec": 7361, "page_link": "https://dick.show/episode-461/"}
{"ep_num": 462, "title": "Episode 462 - Dick on Breastfeeding Class", "pub_date": "Mon, 26 May 2025 02:08:00 +0000", "guid": "2b35e59b-d33b-4920-ad33-cb696799fbce", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_462.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 203670642, "duration_sec": 9885, "page_link": "https://dick.show/episode-462/"}
{"ep_num": 463, "title": "Episode 463 - Dick on The Grave Digger", "pub_date": "Mon, 02 Jun 2025 02:52:00 +0000", "guid": "15543f40-b522-4226-bca2-bc2bca1e49c4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_463.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 171490632, "duration_sec": 8433, "page_link": "https://dick.show/episode-463"}
{"ep_num": 464, "title": "Episode 464 - Dick on Fat Women Throwing Bicycles", "pub_date": "Mon, 09 Jun 2025 04:52:00 +0000", "guid": "70ada3ca-a6bc-4abc-8561-642aa9ad2ad5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_464.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 172643660, "duration_sec": 8618, "page_link": "https://dick.show/episode-464/"}
{"ep_num": 465, "title": "Episode 465 - Dick on Dadmaxxing", "pub_date": "Mon, 16 Jun 2025 05:21:00 +0000", "guid": "133b8381-4713-47fd-b500-25a19c187ba3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_465.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146154304, "duration_sec": 7136, "page_link": "https://dick.show/episode-465/"}
{"ep_num": 466, "title": "Episode 466 - Dick on The Two-Seater", "pub_date": "Mon, 30 Jun 2025 15:05:00 +0000", "guid": "81dc6adc-7bb8-4413-b4d3-5b45c59175f1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_466.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 139634260, "duration_sec": 6919, "page_link": "https://dick.show/episode-466/"}
{"ep_num": 467, "title": "Episode 467 - Dick on Nitrous Wars", "pub_date": "Mon, 07 Jul 2025 00:54:00 +0000", "guid": "bfa4dd8c-4d67-4c15-b535-630431a046a3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_467.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 180680414, "duration_sec": 8938, "page_link": "https://dick.show/episode-467/"}
{"ep_num": 468, "title": "Episode 468 - Dick on The Family Man", "pub_date": "Mon, 14 Jul 2025 04:10:00 +0000", "guid": "a92a9b39-66a6-4d38-84c0-99febb9e7374", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_468.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 200986708, "duration_sec": 10012, "page_link": "https://dick.show/episode-468"}
{"ep_num": 469, "title": "Episode 469 - Dick on Slender Man's Wife", "pub_date": "Sun, 27 Jul 2025 22:33:00 +0000", "guid": "5b71d742-a71d-4670-9c01-ee48cb521eb3", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_469.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 188399548, "duration_sec": 9285, "page_link": "https://dick.show/episode-469/"}
{"ep_num": 470, "title": "Episode 470 - Dick on Boris Fatenov", "pub_date": "Mon, 04 Aug 2025 05:56:00 +0000", "guid": "6256f954-882b-4801-80a1-5316e5013837", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_470.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 211926834, "duration_sec": 10579, "page_link": "https://dick.show/episode-470/"}
{"ep_num": 471, "title": "Episode 471 - Dick on Walking Into Heaven", "pub_date": "Mon, 11 Aug 2025 02:38:00 +0000", "guid": "9bb04476-35ba-411b-a0e7-da1b6e1f31bb", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_471.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 185320952, "duration_sec": 9251, "page_link": "https://dick.show/episode-471/"}
{"ep_num": 472, "title": "Episode 472 - Dick on ChatGUPTA", "pub_date": "Sun, 17 Aug 2025 23:45:00 +0000", "guid": "a9b4b7b1-fc9c-4db3-8fa0-2d8a033b53d4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_472.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 200896760, "duration_sec": 9823, "page_link": "https://dick.show/episode-472/"}
{"ep_num": 473, "title": "Episode 473 - Dick on Buffy", "pub_date": "Mon, 25 Aug 2025 07:53:00 +0000", "guid": "87bfde42-acfb-4d31-b22a-1318a47382ad", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_473.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 162539306, "duration_sec": 8112, "page_link": "https://dick.show/episode-473"}
{"ep_num": 474, "title": "Episode 474 - Dick on The Stuntaverse", "pub_date": "Sun, 31 Aug 2025 21:33:00 +0000", "guid": "8b769b25-668c-4e94-b1fc-fab127e0f14e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_474.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 163429462, "duration_sec": 8153, "page_link": "https://dick.show/episode-474/"}
{"ep_num": 475, "title": "Episode 475 - Dick on The Windi", "pub_date": "Sun, 07 Sep 2025 22:16:00 +0000", "guid": "ae60bc6b-4fcd-4dda-b685-7d69440d35c6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_475.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 126522790, "duration_sec": 6326, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 476, "title": "Episode 476 - Dick on AI Jesus", "pub_date": "Sun, 14 Sep 2025 23:43:00 +0000", "guid": "9036b2bb-6719-4c6d-9451-5713ccaabec6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_476.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 140070860, "duration_sec": 6989, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 477, "title": "Episode 477 - Dick on Henry Ford Fitness", "pub_date": "Mon, 22 Sep 2025 02:51:00 +0000", "guid": "96652dbf-66f4-4e97-b761-bcb3a301ef6b", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_477.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 145379718, "duration_sec": 7122, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 478, "title": "Episode 478 - Dick on Straight Drop", "pub_date": "Sun, 28 Sep 2025 23:33:00 +0000", "guid": "93a88538-2393-47d1-a4d5-c76b68796681", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_478.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 153683314, "duration_sec": 7416, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 479, "title": "Episode 479 - Dick on The Pie Piper", "pub_date": "Mon, 06 Oct 2025 10:00:00 +0000", "guid": "906ab5c2-13f3-4f1d-b908-f1b231435cdd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_479.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 177008922, "duration_sec": 8731, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 480, "title": "Episode 480 - Dick on The Seattle Fat Mall", "pub_date": "Mon, 13 Oct 2025 14:06:00 +0000", "guid": "baad6a7f-5608-4ea0-94a3-1a960053b11d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_480.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 196995302, "duration_sec": 9581, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 481, "title": "Episode 481 - Dick on The Gooch Seam", "pub_date": "Mon, 20 Oct 2025 02:19:00 +0000", "guid": "4cab0423-f733-4e4d-9681-45c9c7f69c9a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_481.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 179879082, "duration_sec": 8939, "page_link": "https://dick.show/"}
{"ep_num": 482, "title": "Episode 482 - Dick on Sean's Animal Corner: The Game", "pub_date": "Sun, 26 Oct 2025 04:29:00 +0000", "guid": "ffc99462-14de-46b0-8bfa-7fffe6793665", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_482.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161108192, "duration_sec": 7993, "page_link": "https://dick.show/"}
{"ep_num": 483, "title": "Episode 483 - Dick on Goat Milk", "pub_date": "Sun, 02 Nov 2025 01:35:00 +0000", "guid": "560a4100-12fd-4393-854c-c034d86c4725", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_483.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 178358582, "duration_sec": 8525, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 484, "title": "Episode 484 - Dick on HIPPO Violations", "pub_date": "Mon, 10 Nov 2025 02:04:00 +0000", "guid": "4cc7be86-c0e8-4cd5-86ee-de35818dfb7e", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_484.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 166080386, "duration_sec": 8268, "page_link": "https://dick.show/"}
{"ep_num": 485, "title": "Episode 485 - Dick on Quirk Chungus World", "pub_date": "Mon, 17 Nov 2025 00:33:00 +0000", "guid": "45859165-ef78-4186-a6cb-c7f2c19478d1", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_485.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 206814454, "duration_sec": 10051, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 486, "title": "Episode 486 - Dick on Grocery Stars", "pub_date": "Mon, 24 Nov 2025 15:42:00 +0000", "guid": "1e2dd7cb-5de7-470e-a0ff-29216c8d56c9", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_486.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 212096390, "duration_sec": 10490, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 487, "title": "Episode 487 - Dick on Black Krang", "pub_date": "Mon, 01 Dec 2025 02:03:00 +0000", "guid": "ae8a0aa0-a725-4d45-a627-046aaa55b5a4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_487.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 170537264, "duration_sec": 8503, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 488, "title": "Episode 488 - Dick on Cursing on the Moon", "pub_date": "Mon, 08 Dec 2025 15:21:00 +0000", "guid": "23419bef-51ea-4826-97b4-75a0f2e1b0b4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_488.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 202829818, "duration_sec": 10045, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 489, "title": "Episode 489 - Dick on SantaCon", "pub_date": "Mon, 15 Dec 2025 15:35:00 +0000", "guid": "1979bde3-ac36-43b5-9f7b-7617e77167ba", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_489.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 171251618, "duration_sec": 8514, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 490, "title": "Episode 490 - Dick on Christmas Crash-Outs", "pub_date": "Sun, 21 Dec 2025 23:48:00 +0000", "guid": "a2d60d31-f758-4f11-af7b-5fff5a3bb9ed", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_490.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 176319222, "duration_sec": 8708, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 491, "title": "Episode 491 - Dick on Strangest Things", "pub_date": "Sun, 28 Dec 2025 23:39:00 +0000", "guid": "efa90cf9-78c7-44de-8d1f-49a9f24a0bca", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_491.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 191942934, "duration_sec": 9495, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 492, "title": "Episode 492 - Dick on Homeless Surveys", "pub_date": "Mon, 05 Jan 2026 00:47:00 +0000", "guid": "8acb6931-7793-4e23-9a9b-e9493e7f6284", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_492.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 207979964, "duration_sec": 10280, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 493, "title": "Episode 493 - Dick on ICE on Ice", "pub_date": "Sat, 10 Jan 2026 15:58:00 +0000", "guid": "2828b3e9-53eb-49b4-8da1-59169c238b81", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_493.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 146360160, "duration_sec": 7248, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 494, "title": "Episode 494 - Dick on The Final Fat Frontier", "pub_date": "Mon, 19 Jan 2026 18:57:00 +0000", "guid": "17d7cce1-19ed-4c03-b478-5faf971e2536", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_494.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 152270342, "duration_sec": 7532, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 495, "title": "Episode 495 - Dick on Emergency Ribs", "pub_date": "Sun, 25 Jan 2026 23:08:00 +0000", "guid": "09012856-3d0f-498a-879d-395ce6a8c194", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_495.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161000450, "duration_sec": 8035, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 496, "title": "Episode 496 - Dick on Chungucide", "pub_date": "Mon, 09 Feb 2026 01:39:00 +0000", "guid": "e76a3c6e-e486-4c35-92bc-e59c1e540f64", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_496.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 187930188, "duration_sec": 9356, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 497, "title": "Episode 497 - Dick on SomaliaScan.com", "pub_date": "Mon, 16 Feb 2026 05:52:00 +0000", "guid": "fe812d31-b8b6-442c-bfbf-52ddfc24d0cd", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_497.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 188011924, "duration_sec": 9345, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 498, "title": "Episode 498 - Dick on Hitler Ice Cream", "pub_date": "Mon, 23 Feb 2026 00:17:00 +0000", "guid": "ebc45110-595a-47b5-9c28-fac821ced6f7", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_498.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 161265524, "duration_sec": 8036, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 499, "title": "Episode 499 - Dick on More Ayatollahs", "pub_date": "Sun, 01 Mar 2026 23:46:00 +0000", "guid": "08aeaa8d-69dd-4ba8-b9db-1d570623fe35", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_499.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 186698268, "duration_sec": 9268, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 500, "title": "Episode 500 - Dick on Chekov's Nuke", "pub_date": "Sun, 08 Mar 2026 23:40:00 +0000", "guid": "0c7f4b1f-887e-4c1c-8d15-2bef98c1253f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_500.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 196111214, "duration_sec": 9791, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 501, "title": "Episode 501 - Dick on Sol Ringers", "pub_date": "Mon, 16 Mar 2026 18:50:00 +0000", "guid": "3588540b-38ed-443f-8023-b05b7f85074a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_501.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 183911444, "duration_sec": 9119, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 502, "title": "Episode 502 - Dick on The Day the Chungus Died", "pub_date": "Mon, 23 Mar 2026 15:15:00 +0000", "guid": "687fd79a-ea74-495b-b50e-71ce0c27b5a5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_502.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 195143198, "duration_sec": 9747, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 503, "title": "Episode 503 - Dick on Vengeance for All", "pub_date": "Mon, 30 Mar 2026 01:03:00 +0000", "guid": "b0cd99ce-5a8c-4c4f-96fd-4153fbc468d2", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_503.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 155653388, "duration_sec": 7725, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 504, "title": "Episode 504 - Dick on Fat Libs", "pub_date": "Sun, 05 Apr 2026 01:26:00 +0000", "guid": "521e5d35-7b3c-47f8-89b4-1422e8467cc5", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_504.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 177682902, "duration_sec": 8820, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 505, "title": "Episode 505 - Dick on Monkey Noises", "pub_date": "Sun, 12 Apr 2026 01:26:00 +0000", "guid": "9c80eb10-100e-4177-af67-316edc572c9d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_505.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 160970816, "duration_sec": 7994, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 506, "title": "Episode 506 - Dick on One Thing in Common", "pub_date": "Mon, 20 Apr 2026 01:35:00 +0000", "guid": "d979fea7-d622-47b3-bf86-ee4387c656d4", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_506.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141258932, "duration_sec": 7048, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 507, "title": "Episode 507 - Dick on SUPERKILLERs", "pub_date": "Mon, 04 May 2026 02:13:00 +0000", "guid": "7cf25314-8d95-4432-ba1d-752e72ccdf3a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_507.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 230262542, "duration_sec": 11499, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 508, "title": "Episode 508 - Dick on Quitting Social Media", "pub_date": "Mon, 11 May 2026 01:50:00 +0000", "guid": "569cf01d-00d0-4750-b243-3c050b50542c", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_508.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 120187458, "duration_sec": 5995, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 509, "title": "Episode 509 - Dick on Bad Guy Summer", "pub_date": "Mon, 18 May 2026 01:54:00 +0000", "guid": "474b59c4-3ec3-42fd-81da-91fbef39366d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_509.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 147538450, "duration_sec": 7323, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 510, "title": "Episode 510 - Dick on the Ice Cream Song", "pub_date": "Mon, 25 May 2026 01:49:00 +0000", "guid": "48e0f421-ba1e-4e9d-a025-5db20399b5aa", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_510.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 141344838, "duration_sec": 7028, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 511, "title": "Episode 511 - Dick on Imaginary Corporal Punishment", "pub_date": "Mon, 01 Jun 2026 06:36:00 +0000", "guid": "a821a9a6-1b83-4263-a849-9c0ad2034b64", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_511.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 134289434, "duration_sec": 6697, "page_link": "https://patreon.com/TheDickShow"}
{"ep_num": 512, "title": "Episode 512 - Dick on Two Half-Decades", "pub_date": "Mon, 08 Jun 2026 04:42:00 +0000", "guid": "43ac937a-c13e-43dc-8aec-2e5e4f71d19f", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_512.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 294134144, "duration_sec": 7346, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 513, "title": "Episode 513 - Dick on the Food Pyramid", "pub_date": "Mon, 22 Jun 2026 03:58:00 +0000", "guid": "951e7e95-43d9-48f0-8367-a7b343c0a980", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_513.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 151682228, "duration_sec": 7570, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 514, "title": "Episode 514 - Dick on the Torta Takeover", "pub_date": "Mon, 29 Jun 2026 16:00:00 +0000", "guid": "afa7935f-10dc-41fb-9fd6-9816d4d6b973", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_514.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133610588, "duration_sec": 6666, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 515, "title": "Episode 515 - Dick on Fargonauts", "pub_date": "Mon, 06 Jul 2026 03:24:00 +0000", "guid": "1a89d108-6c88-460f-b389-1567f1dd46f6", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_515.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 125325404, "duration_sec": 6252, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 516, "title": "Episode 516 - Dick on The Sandwich Thief", "pub_date": "Mon, 13 Jul 2026 01:06:00 +0000", "guid": "c7dd396f-15f7-45c2-96af-6656dfe0cf73", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_516.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 134980316, "duration_sec": 6734, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 517, "title": "Episode 517 - Dick on the Mexican MMORPG", "pub_date": "Mon, 20 Jul 2026 14:39:00 +0000", "guid": "2f11a8e0-c6db-4b8c-a1d3-82f9669a4831", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_517b.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 124570592, "duration_sec": 6214, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 518, "title": "Episode 518 - Dick on The Women's Professional Baseball League", "pub_date": "Sun, 02 Aug 2026 21:33:00 +0000", "guid": "f04b29d6-ce99-4936-972b-d7fa29d07826", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_518.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 133481132, "duration_sec": 6660, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 519, "title": "Episode 519 - Dick on I, Burrito", "pub_date": "Mon, 10 Aug 2026 14:54:00 +0000", "guid": "9f75e911-5dc6-4f54-b494-5c0fdecfc78a", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_519.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 134272484, "duration_sec": 6699, "page_link": "http://patreon.com/TheDickShow"}
{"ep_num": 520, "title": "Episode 520 - Dick on Male to Fester", "pub_date": "Sun, 16 Aug 2026 02:02:00 +0000", "guid": "209d1c2e-5e56-43ec-884e-3384e923ac5d", "audio_url": "https://traffic.libsyn.com/secure/thedickshow/The_Dick_Show_520.mp3?dest-id=516728", "audio_type": "audio/mpeg", "audio_bytes": 145067444, "duration_sec": 7239, "page_link": "http://patreon.com/TheDickShow"}
+134
View File
@@ -0,0 +1,134 @@
"""Resumable MP3 downloader.
Downloads each episode's enclosure into audio/<epnum or guid>.mp3.
Skips files that already exist with the expected size (HTTP Range resume).
"""
import json
import os
import re
import sys
import time
import requests
from config import AUDIO_DIR, DOWNLOAD_TIMEOUT, CHUNK_SIZE
from feed import load_episodes
def slug(ep: dict) -> str:
if ep.get("ep_num"):
return f"ep{ep['ep_num']:04d}"
g = re.sub(r"[^a-zA-Z0-9-]", "", ep["guid"])[:24]
return f"bonus-{g}"
def audio_path(ep: dict) -> str:
return os.path.join(AUDIO_DIR, slug(ep) + ".mp3")
def expected_size(ep: dict) -> int:
return ep.get("audio_bytes") or 0
def download_episode(ep: dict, force: bool = False) -> str:
"""Download one episode. Returns local path. Raises on hard failure."""
url = ep["audio_url"]
if not url:
raise ValueError(f"no audio_url for {ep['guid']}")
dest = audio_path(ep)
tmp = dest + ".part"
want = expected_size(ep)
if os.path.exists(dest):
if force:
os.remove(dest)
else:
have = os.path.getsize(dest)
if want and have != want:
print(f" size mismatch for {dest} (have {have}, want {want}); "
f"redownloading", file=sys.stderr)
os.remove(dest)
else:
return dest
headers = {"User-Agent": "dickshow-indexer/1.0"}
mode = "wb"
if os.path.exists(tmp):
have = os.path.getsize(tmp)
if want and have == want:
os.replace(tmp, dest)
return dest
if have > 0:
headers["Range"] = f"bytes={have}-"
mode = "ab"
last_err = None
for attempt in range(1, 6):
try:
with requests.get(url, headers=headers, stream=True,
timeout=DOWNLOAD_TIMEOUT, allow_redirects=True) as r:
if r.status_code == 416: # range beyond EOF -> already complete
os.replace(tmp, dest)
return dest
r.raise_for_status()
total = int(r.headers.get("Content-Length", "0") or 0)
if mode == "ab" and r.status_code == 200:
# server ignored Range; restart cleanly
mode = "wb"
with open(tmp, mode) as f:
for chunk in r.iter_content(chunk_size=CHUNK_SIZE):
if chunk:
f.write(chunk)
have = os.path.getsize(tmp)
if want and have < want:
raise IOError(f"incomplete download {have}/{want}")
break
except Exception as e: # noqa: BLE001
last_err = e
print(f" retry {attempt}: {e}", file=sys.stderr)
time.sleep(5 * attempt)
mode = "ab"
headers["Range"] = f"bytes={os.path.getsize(tmp)}-" \
if os.path.exists(tmp) and os.path.getsize(tmp) > 0 else {}
else:
raise IOError(f"download failed for {url}: {last_err}")
os.replace(tmp, dest)
return dest
def main() -> None:
from config import TRANSCRIPT_DIR
from transcribe import transcript_path
eps = load_episodes()
only = set()
for a in sys.argv[1:]:
only.add(int(a))
ok = fail = skip = 0
for ep in eps:
if ep["ep_num"] is not None and only and ep["ep_num"] not in only:
continue
if os.path.exists(transcript_path(ep)):
skip += 1 # already fully transcribed; audio not needed
continue
dest = audio_path(ep)
if os.path.exists(dest) and not (expected_size(ep) and
os.path.getsize(dest) != expected_size(ep)):
skip += 1
continue
label = f"Ep {ep['ep_num']}" if ep["ep_num"] else ep["title"][:40]
try:
p = download_episode(ep)
mb = os.path.getsize(p) / 1e6
print(f"{label}: {mb:.1f} MB")
ok += 1
except Exception as e: # noqa: BLE001
print(f"{label}: FAILED - {e}", file=sys.stderr)
fail += 1
with open(os.path.join(AUDIO_DIR, ".progress.json"), "w") as f:
json.dump({"last_done": ep["guid"]}, f)
print(f"downloaded={ok} skipped={skip} failed={fail}")
if __name__ == "__main__":
main()
+45
View File
@@ -0,0 +1,45 @@
"""Convert transcript JSON into a readable timestamped txt for LLM analysis."""
import json
import os
import sys
from config import TRANSCRIPT_DIR
from feed import load_episodes
from download import slug as ep_slug
TXT_DIR = os.path.join(TRANSCRIPT_DIR, "txt")
def txt_path(ep: dict) -> str:
return os.path.join(TXT_DIR, ep_slug(ep) + ".txt")
def export_txt(ep: dict) -> str:
tp = os.path.join(TRANSCRIPT_DIR, ep_slug(ep) + ".json")
with open(tp, encoding="utf-8") as f:
data = json.load(f)
os.makedirs(TXT_DIR, exist_ok=True)
out = txt_path(ep)
with open(out + ".tmp", "w", encoding="utf-8") as f:
f.write(f"# {data['title']}\n# published: {data['pub_date']}\n"
f"# episode: {data.get('ep_num')}\n\n")
for seg in data["segments"]:
s = int(seg["start"])
stamp = f"{s // 3600:02d}:{(s % 3600) // 60:02d}:{s % 60:02d}"
f.write(f"[{stamp}] {seg['text']}\n")
os.replace(out + ".tmp", out)
return out
if __name__ == "__main__":
eps = load_episodes()
want = {int(a) for a in sys.argv[1:]} if len(sys.argv) > 1 else None
n = 0
for ep in eps:
if want and (ep["ep_num"] not in want):
continue
src = os.path.join(TRANSCRIPT_DIR, ep_slug(ep) + ".json")
if os.path.exists(src):
print(export_txt(ep))
n += 1
print(f"exported {n}")
+30
View File
@@ -0,0 +1,30 @@
"""Ground-truth facts used to keep episode analyses honest.
The dossier file is maintained separately (research project); this module
points at it and carries a compact cast sheet for cheap prompt injection.
"""
import os
from config import BASE_DIR
DOSSIER_PATH = os.path.join(os.path.dirname(BASE_DIR),
"Dax_Herrera_Dick_Masterson_Profile.txt")
# Verified roster with eras - injected into BOTH analyzer and verifier prompts.
CAST_SHEET = """VERIFIED CAST FACTS (from court records, WIPO filings, primary sources):
- DICK MASTERSON (real name Dax Herrera): host of The Dick Show since June 2016.
- MADDOX (George Ouzounian): former BPITU co-host (2014-2016). He and Dick have
been ADVERSARIES since Oct 2016 (the "LOLSUIT", dismissed 2018). Maddox has
NOT been a Dick Show cohost at ANY point and is long gone from Dick's life.
Any analysis attributing a modern-era (2017+) cohost seat to Maddox is WRONG.
- SEAN (a.k.a. Seanie): longtime Dick Show audio engineer/cohost voice,
present across essentially all episodes.
- VITO GESUALDI: game developer/comic creator; frequent Dick Show guest and
cohost of the BPITU REVIVAL (2025+). On modern-era episodes an unnamed second
voice is usually Sean or Vito - not Maddox.
- ASTERIOS KOKKINOS: recurring guest (2016 era onward).
- ERIC JULY / RIPPAVERSE saga: May 2023 onward (Isom review = Ep 361).
- Ethan Ralph, Josh Denny, Nick Rekieta, Null (Kiwi Farms): associates/guests
of the 2017-2023 era.
If a voice cannot be attributed confidently from the transcript itself, label
it "unknown voice" instead of guessing a famous name."""
+127
View File
@@ -0,0 +1,127 @@
"""Parse The Dick Show RSS feed into data/episodes.jsonl (one episode per line)."""
import json
import re
import sys
import time
import xml.etree.ElementTree as ET
import requests
from config import FEED_URL, EPISODES_JSONL, DOWNLOAD_TIMEOUT, MAX_FEED_RETRIES
NS = {
"itunes": "http://www.itunes.com/dtds/podcast-1.0.dtd",
}
EP_NUM_RE = re.compile(r"Episode\s+(\d+)", re.IGNORECASE)
def fetch_feed(url: str = FEED_URL) -> bytes:
last_err = None
for attempt in range(1, MAX_FEED_RETRIES + 1):
try:
r = requests.get(url, timeout=DOWNLOAD_TIMEOUT,
headers={"User-Agent": "dickshow-indexer/1.0"})
r.raise_for_status()
return r.content
except Exception as e: # noqa: BLE001
last_err = e
print(f"feed attempt {attempt}/{MAX_FEED_RETRIES} failed: {e}",
file=sys.stderr)
time.sleep(3 * attempt)
raise SystemExit(f"could not download feed: {last_err}")
def itunes_duration_seconds(text: str | None) -> int:
"""Libsyn uses either HH:MM:SS or plain seconds."""
if not text:
return 0
text = text.strip()
if ":" in text:
parts = [int(p) for p in text.split(":")]
while len(parts) < 3:
parts.insert(0, 0)
h, m, s = parts
return h * 3600 + m * 60 + s
try:
return int(float(text))
except ValueError:
return 0
def parse_feed(xml_bytes: bytes) -> list[dict]:
root = ET.fromstring(xml_bytes)
channel = root.find("channel")
episodes = []
for item in channel.findall("item"):
title_el = item.find("title")
title = (title_el.text or "").strip() if title_el is not None else ""
m = EP_NUM_RE.search(title)
ep_num = int(m.group(1)) if m else None
guid_el = item.find("guid")
guid = (guid_el.text or "").strip() if guid_el is not None else ""
if not guid:
continue # unusable without stable id
pub_el = item.find("pubDate")
pub_date = (pub_el.text or "").strip() if pub_el is not None else ""
enc = item.find("enclosure")
audio_url, audio_type, audio_len = "", "", 0
if enc is not None:
audio_url = enc.get("url", "").strip()
audio_type = enc.get("type", "")
try:
audio_len = int(enc.get("length", "0") or 0)
except ValueError:
audio_len = 0
dur_el = item.find("itunes:duration", NS)
duration_s = itunes_duration_seconds(dur_el.text if dur_el is not None else None)
link_el = item.find("link")
page_link = (link_el.text or "").strip() if link_el is not None else ""
episodes.append({
"ep_num": ep_num,
"title": title,
"pub_date": pub_date,
"guid": guid,
"audio_url": audio_url,
"audio_type": audio_type,
"audio_bytes": audio_len,
"duration_sec": duration_s,
"page_link": page_link,
})
# newest first from feed; store oldest-first for chronological processing
episodes.reverse()
return episodes
def write_episodes(episodes: list[dict]) -> None:
with open(EPISODES_JSONL, "w", encoding="utf-8") as f:
for ep in episodes:
f.write(json.dumps(ep, ensure_ascii=False) + "\n")
def load_episodes() -> list[dict]:
eps = []
with open(EPISODES_JSONL, encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
eps.append(json.loads(line))
return eps
def main() -> None:
xml = fetch_feed()
episodes = parse_feed(xml)
write_episodes(episodes)
numbered = [e["ep_num"] for e in episodes if e["ep_num"]]
print(f"parsed {len(episodes)} episodes "
f"(numbered {min(numbered)}-{max(numbered)}) -> {EPISODES_JSONL}")
if __name__ == "__main__":
main()
+115
View File
@@ -0,0 +1,115 @@
"""Build the SQLite FTS5 index from transcripts + lexicon hashtags.
Schema:
episodes(ep_num, guid, title, pub_date, audio_url, page_link, duration_sec,
model, n_segments, tags_json)
segments(ep_rowid -> episodes.rowid, seg_idx, start_sec, end_sec, text,
tags) [FTS5 external content]
Search examples (via search.py):
python search.py "isom lawsuit"
python search.py maddox --tag lolsuit --from 2018-01-01 --to 2018-12-31
"""
import json
import os
import sqlite3
from config import DB_PATH
from feed import load_episodes
from lexicon import build_lexicon, tags_for_text
SCHEMA = """
PRAGMA journal_mode=WAL;
CREATE TABLE IF NOT EXISTS episodes (
id INTEGER PRIMARY KEY,
ep_num INTEGER UNIQUE,
guid TEXT UNIQUE NOT NULL,
title TEXT,
pub_date TEXT,
audio_url TEXT,
page_link TEXT,
duration_sec REAL,
model TEXT,
n_segments INTEGER,
tags TEXT
);
CREATE VIRTUAL TABLE IF NOT EXISTS segments USING fts5(
text,
tags,
episode_id UNINDEXED,
seg_idx UNINDEXED,
start_sec UNINDEXED,
end_sec UNINDEXED
);
"""
def open_db(path=DB_PATH) -> sqlite3.Connection:
con = sqlite3.connect(path)
con.executescript(SCHEMA)
return con
def index_transcripts() -> None:
from transcribe import transcript_path
lexicon = build_lexicon()
eps = load_episodes()
con = open_db()
cur = con.cursor()
n_eps = n_segs = 0
for ep in eps:
tp = transcript_path(ep)
if not os.path.exists(tp):
continue
with open(tp, encoding="utf-8") as f:
data = json.load(f)
ep_tags = set()
for seg in data["segments"]:
ep_tags.update(tags_for_text(seg["text"], lexicon))
# upsert episode row
cur.execute(
"""INSERT INTO episodes (ep_num, guid, title, pub_date, audio_url,
page_link, duration_sec, model, n_segments, tags)
VALUES (?,?,?,?,?,?,?,?,?,?)
ON CONFLICT(guid) DO UPDATE SET
ep_num=excluded.ep_num, title=excluded.title,
pub_date=excluded.pub_date, audio_url=excluded.audio_url,
page_link=excluded.page_link, duration_sec=excluded.duration_sec,
model=excluded.model, n_segments=excluded.n_segments,
tags=excluded.tags""",
(data.get("ep_num"), data["guid"], data.get("title"),
data.get("pub_date"), data.get("audio_url"), data.get("page_link"),
data.get("duration_sec"), data.get("model"),
len(data["segments"]), json.dumps(sorted(ep_tags))),
)
row_id = cur.execute("SELECT id FROM episodes WHERE guid=?",
(data["guid"],)).fetchone()[0]
# rebuild this episode's segment rows (simplest correct incremental path)
cur.execute("DELETE FROM segments WHERE episode_id=?", (row_id,))
cur.executemany(
"INSERT INTO segments (text, tags, episode_id, seg_idx, start_sec,"
" end_sec) VALUES (?,?,?,?,?,?)",
[(seg["text"],
" ".join("#" + t for t in tags_for_text(seg["text"], lexicon)),
row_id, i, seg["start"], seg["end"])
for i, seg in enumerate(data["segments"])],
)
n_eps += 1
n_segs += len(data["segments"])
label = f"Ep {data.get('ep_num')}" if data.get("ep_num") else data.get("title", "")[:40]
print(f" indexed {label}: {len(data['segments'])} segs, "
f"tags: {' '.join('#' + t for t in sorted(ep_tags)) or '(none)'}")
con.commit()
con.close()
print(f"indexed {n_eps} episodes / {n_segs} segments -> {DB_PATH}")
if __name__ == "__main__":
index_transcripts()
+297
View File
@@ -0,0 +1,297 @@
#!/usr/bin/env bash
# Dick Show Index - Installer
# Installs all dependencies and sets up the pipeline for the Dick Show transcript index.
# Usage: ./install.sh [--skip-opencode] [--skip-python-deps]
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log_info() { echo -e "${BLUE}[INFO]${NC} $*"; }
log_success() { echo -e "${GREEN}[OK]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }
# Configuration
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PYTHON_MIN_VERSION="3.10"
OPENCODE_BIN="${OPENCODE_BIN:-$HOME/.opencode/bin/opencode}"
# Flags
SKIP_OPENCODE=false
SKIP_PYTHON_DEPS=false
for arg in "$@"; do
case $arg in
--skip-opencode) SKIP_OPENCODE=true ;;
--skip-python-deps) SKIP_PYTHON_DEPS=false ;;
--help|-h)
cat <<EOF
Dick Show Index - Installer
Usage: ./install.sh [OPTIONS]
OPTIONS:
--skip-opencode Skip opencode CLI installation
--skip-python-deps Skip Python dependency installation
--help, -h Show this help
Environment variables:
OPENCODE_BIN Path to opencode binary (default: ~/.opencode/bin/opencode)
OPENCODE_ANALYZE_MODEL Model to use for analysis (default: opencode/nemotron-3-ultra-free)
DS_ANALYZE_PAUSE Seconds between analysis calls (default: 45)
DS_ANALYZE_TIMEOUT Analysis timeout in seconds (default: 600)
DS_MIN_FREE_RAM Minimum free RAM in bytes before pausing (default: 1GB)
Examples:
./install.sh # Full install
./install.sh --skip-opencode # Skip opencode install
OPENCODE_ANALYZE_MODEL=opencode/x-preview-f-free ./install.sh
EOF
exit 0
;;
esac
done
# ============================================================================
# Helper functions
# ============================================================================
check_python() {
log_info "Checking Python version..."
if ! command -v python3 &> /dev/null; then
log_error "Python 3 not found. Please install Python ${PYTHON_MIN_VERSION}+"
exit 1
fi
local version=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
local major=$(echo $version | cut -d. -f1)
local minor=$(echo $version | cut -d. -f2)
if [[ $major -lt 3 ]] || [[ $major -eq 3 && $minor -lt 10 ]]; then
log_error "Python ${PYTHON_MIN_VERSION}+ required, found ${version}"
exit 1
fi
log_success "Python ${version} found"
}
install_python_deps() {
log_info "Installing Python dependencies..."
if [[ -f "requirements.txt" ]]; then
pip3 install --upgrade pip
pip3 install -r requirements.txt
log_success "Python dependencies installed"
else
log_warn "requirements.txt not found, skipping"
fi
}
install_opencode() {
if [[ "$SKIP_OPENCODE" == "true" ]]; then
log_info "Skipping opencode installation (--skip-opencode)"
return
fi
log_info "Installing opencode CLI..."
if command -v opencode &> /dev/null; then
log_success "opencode already installed: $(opencode --version)"
return
fi
# Try official installer first
if command -v curl &> /dev/null; then
log_info "Downloading opencode installer..."
if curl -fsSL https://opencode.ai/install.sh | bash; then
log_success "opencode installed via official installer"
return
fi
log_warn "Official installer failed, trying direct download..."
fi
# Fallback: direct binary download from GitHub releases
log_info "Downloading opencode binary from GitHub..."
local arch=$(uname -m)
local os=$(uname -s | tr '[:upper:]' '[:lower:]')
# Normalize arch
case $arch in
x86_64|amd64) arch="x64" ;;
aarch64|arm64) arch="arm64" ;;
esac
# Get latest release
local release_url="https://api.github.com/repos/anomalyco/opencode/releases/latest"
local download_url=$(curl -fsSL "$release_url" | grep "browser_download_url" | grep "${os}-${arch}" | head -1 | cut -d '"' -f 4)
if [[ -z "$download_url" ]]; then
log_warn "Could not find binary for ${os}-${arch}, trying windows-x64.zip..."
download_url=$(curl -fsSL "$release_url" | grep "browser_download_url" | grep "windows-x64.zip" | head -1 | cut -d '"' -f 4)
fi
if [[ -z "$download_url" ]]; then
log_error "Could not find opencode binary for your platform"
log_info "Please install manually from: https://github.com/anomalyco/opencode/releases"
return 1
fi
log_info "Downloading from: $download_url"
mkdir -p "$(dirname "$OPENCODE_BIN")"
curl -fsSL "$download_url" -o /tmp/opencode.zip
if [[ "$download_url" == *.zip ]]; then
unzip -o /tmp/opencode.zip -d "$(dirname "$OPENCODE_BIN")"
else
mv /tmp/opencode.zip "$OPENCODE_BIN"
fi
chmod +x "$OPENCODE_BIN"
# Add to PATH if not already
local bin_dir=$(dirname "$OPENCODE_BIN")
if [[ ":$PATH:" != *":$bin_dir:"* ]]; then
echo "export PATH=\"\$PATH:$bin_dir\"" >> ~/.bashrc
log_info "Added $bin_dir to PATH in ~/.bashrc"
fi
export PATH="$PATH:$bin_dir"
log_success "opencode installed: $(opencode --version)"
}
verify_opencode() {
log_info "Verifying opencode installation..."
if ! command -v opencode &> /dev/null; then
log_error "opencode not found in PATH"
log_info "Add $(dirname "$OPENCODE_BIN") to your PATH and restart your shell"
return 1
fi
log_success "opencode: $(opencode --version)"
# Check available models
log_info "Available models:"
opencode models 2>/dev/null | head -20 || log_warn "Could not list models (may need auth)"
}
check_existing_work() {
log_info "Checking for existing work..."
local transcript_count=0
local analysis_count=0
if [[ -d "transcripts" ]]; then
transcript_count=$(find transcripts -name "ep*.json" 2>/dev/null | wc -l)
fi
if [[ -d "data/analysis" ]]; then
analysis_count=$(find data/analysis -name "ep*.json" 2>/dev/null | wc -l)
fi
log_info "Found $transcript_count existing transcripts"
log_info "Found $analysis_count existing analyses"
if [[ $transcript_count -gt 0 || $analysis_count -gt 0 ]]; then
log_info "Pipeline will resume from existing work (skips completed episodes)"
fi
}
create_dirs() {
log_info "Creating directory structure..."
mkdir -p audio transcripts data/analysis
log_success "Directories created"
}
# ============================================================================
# Main
# ============================================================================
main() {
echo "=========================================="
echo " Dick Show Index - Installer"
echo "=========================================="
echo
cd "$REPO_ROOT"
log_info "Starting installation..."
check_python
create_dirs
if [[ "$SKIP_PYTHON_DEPS" != "true" ]]; then
install_python_deps
fi
install_opencode
verify_opencode
check_existing_work
echo
log_success "Installation complete!"
echo
cat <<EOF
==========================================
Next Steps
==========================================
1. (Optional) Configure opencode authentication:
opencode auth login
2. Set analysis model (optional):
export OPENCODE_ANALYZE_MODEL=opencode/nemotron-3-ultra-free
# Or use your preferred model: opencode models
3. Run the pipeline:
# Full Rekieta arc (28 episodes):
python pipeline_all.py --eps 84 87 89 93 96 121 124 152 166 176 198 209 213 275 285 299 321 344 352 368 376 412 416 424 425 435 439 455
# Full backlog (all 520 episodes):
python pipeline_all.py
# Dry run to see what would be processed:
python pipeline_all.py --dry-run
4. Search the index:
python search.py "isom trademark"
python search.py maddox --tag lolsuit
python search.py "raketa OR rekieta" --tag nick_rekieta
==========================================
Environment Variables
==========================================
OPENCODE_ANALYZE_MODEL Model for analysis (default: opencode/nemotron-3-ultra-free)
DS_ANALYZE_PAUSE Seconds between analysis calls (default: 45)
DS_ANALYZE_TIMEOUT Analysis timeout seconds (default: 600)
DS_MIN_FREE_RAM Min free RAM before pausing (default: 1073741824 = 1GB)
DS_MODEL Whisper model (default: small)
DS_DEVICE Whisper device: cpu|cuda (default: cpu)
DS_COMPUTE Whisper compute type: int8|float16 (default: int8)
DS_KEEP_AUDIO Keep MP3s after transcription (default: 0)
DS_KEEP_AUDIO=1 to keep
==========================================
Resuming / Sharing Work
==========================================
The pipeline is fully resumable - it automatically skips episodes that
already have transcripts and verified analyses. Just re-run the same
command and it will pick up where it left off.
To share progress with others:
1. Commit the transcripts/, data/analysis/, and data/index.db files
2. Others can pull and continue from where you left off
==========================================
EOF
}
main "$@"
+131
View File
@@ -0,0 +1,131 @@
"""Hashtag lexicon: maps aliases -> canonical tag.
Seeded from the research dossier (people, feuds, events, recurring bits).
Extend freely; matching is case-insensitive whole-word on each transcript
segment, then aggregated per episode and per segment in the FTS index.
"""
import re
PEOPLE = {
"maddox": ["maddox", "george ochotsk", "ouzounian"],
"asterios": ["asterios", "asterios kokkinos", "kokkinos"],
"vito": ["vito", "vito gesualdi", "gesualdi"],
"sean": ["sean", "seanie"], # Sean the audio engineer
"eric_july": ["eric july", "rippaverse", "rippa", "isom", "yaira",
"alphacore", "horseman", "backwordz"],
"ethan_van_sciver": ["van sciver", "van schiver", "evs", "cyberfrog",
"comicsgate", "trashcast"],
"razorfist": ["razorfist", "razor fist"],
"yellowflash": ["yellowflash", "yellow flash"],
"clippa": ["clippa", "young clippa", "riley"],
"kevin_landau": ["kevin landau", "landau"],
"nick_rekieta": ["rekieta", "rekieta law", "rackets",
# whisper phonetic variants observed in transcripts
"raketa", "riketa", "rikita", "rakiti", "rakeda",
"rikata", "rikade"],
"ethan_ralph": ["ralph", "the ralph retort", "killstream", "ralphretort"],
"null": ["joshua moon", "kiwi farms", "kiwifarms"],
"mumkey_jones": ["mumkey", "mumkey jones"],
"josh_denny": ["denny", "josh denny"],
"frank_hassle": ["hassle", "frank hassle"],
"destiny": ["destiny", "steven bonnell"],
"justin_whang": ["whang", "justin whang", "whang!"],
"digibro": ["digibro"],
"wauterboi": ["waut3rboi", "wauterboi"],
"andy_lee": ["andy lee", "callofthedeep"],
"cliff_campbell": ["cliff campbell"],
"john_morgan": ["john morgan"],
"mumkey": [],
"greg_boser": ["boser", "greg boser"],
"loren_baker": ["loren baker"],
"tuomas": ["tuomas", "holmburg", "collector crypt"],
"john_mcafee": ["mcafee"],
"bunty_king": ["bunty"],
"jf_gariepy": ["jf garpey", "gariepy", "jfg"],
"sargon": ["sargon"],
"boogie2988": ["boogie", "boogie2988"],
"kraut": ["kraut"],
"andy_warski": ["warski"],
"tony_heller": [],
"stefan_molyneux": ["molyneux"],
"lauren_southern": ["lauren southern", "southern"],
"gavin_mcinnes": ["gavin mcinnes", "mcinnes"],
"milo": ["milo yiannopoulos", "milo"],
"cuck_shack_cast": [],
}
EVENTS = {
"lolsuit": ["lolsuit", "lol suit", "lawsuit", "complaint", "deposition",
"judge ramos", "greenberger", "subpoena", "dismissed with prejudice"],
"isom_lawsuit": ["international school of ministry", "trademark lawsuit",
"night letter", "cease and desist"],
"patreon_drama": ["patreon"],
"deplatforming": ["deplatform", "mastercard", "match list", "visa",
"stripe", "paypal", "banking", "backed.by", "backedby"],
"seanies": ["seanie", "seanies", "seany award"],
"rage_calendar": ["rage calendar", "advent calendar"],
"hot_goss": ["hot goss"],
"rape_list": ["rape list"],
"drunk_sober_high": ["drunk sober high"],
"dick_tips": ["dick tip", "dick tips"],
"voicemail": ["voicemail", "voice mail"],
"rage": ["are you a rage", "the rage"],
"isom_review": ["isom #1", "isom review", "grave digger", "tombstone"],
"charity_accusations": ["charity"],
"new_project2": ["new project 2", "np2"],
"web3": ["web3", "nft", "solana", "crypto", "token", "blockchain",
"wallet", "mint"],
"maddox_book_prank": ["fuck whales", "fuck whales"],
"best_debate": ["best debate in the universe"],
"biggest_problem": ["biggest problem in the universe", "tbpitu"],
}
TOPICS = {
"politics": ["trump", "biden", "obama", "election", "senate", "congress",
"democrat", "republican", "libertarian"],
"gun_policy": ["second amendment", "nra", "gun control"],
"covid": ["covid", "pandemic", "mask", "vaccine", "lockdown", "fauci"],
"ukraine_war": ["ukraine", "zelensky", "putin", "russia"],
"israel": ["israel", "gaza", "hamas", "idf", "antisemitism"],
"ai_tech": ["artificial intelligence", " chatgpt", " openai", " ai ",
"machine learning"],
"gaming": ["video game", "playstation", "nintendo", "xbox", "steam"],
"movies_tv": ["movie", "netflix", "disney", "marvel", "star wars"],
"sports": ["nfl", "nba", "ufc", "boxing", "wnba"],
"relationships": ["girlfriend", "wife", "divorce", "dating", "marriage"],
}
def build_lexicon() -> list[tuple[str, str, "re.Pattern"]]:
"""Returns [(category, canonical_tag, compiled_regex)]."""
import re
out = []
for category, table in (("person", PEOPLE), ("event", EVENTS),
("topic", TOPICS)):
for tag, aliases in table.items():
parts = []
for alias in aliases:
a = alias.strip()
if not a:
continue
esc = re.escape(a)
if a[:1].isalnum():
esc = r"\b" + esc
if a[-1:].isalnum():
esc = esc + r"\b"
parts.append(esc)
if not parts:
continue
rx = re.compile("|".join(parts), re.IGNORECASE)
out.append((category, tag, rx))
return out
def tags_for_text(text: str, lexicon=None) -> list[str]:
if lexicon is None:
lexicon = build_lexicon()
found = []
for _cat, tag, rx in lexicon:
if rx.search(text):
found.append(tag)
return found
+19
View File
@@ -0,0 +1,19 @@
"""Quick peek: grep finished transcripts for saga keywords."""
import json
import sys
KEYS = ["isom", "eric july", "rippa", "comic book", "yellowflash"]
for f in sys.argv[1:] or ["transcripts/ep0361.json", "transcripts/ep0362.json"]:
with open(f, encoding="utf-8") as fh:
d = json.load(fh)
print("===", d["title"])
n = 0
for s in d["segments"]:
t = s["text"].lower()
if any(k in t for k in KEYS):
m, sec = divmod(int(s["start"]), 60)
print(f' [{m:02d}:{sec:02d}] {s["text"][:110]}')
n += 1
if n >= 8:
break
+311
View File
@@ -0,0 +1,311 @@
"""Full-backlog driver: Ep 1 -> latest. One pass, fully resumable, verbose.
Per episode:
1. skip if transcript + verified analysis already exist
2. download mp3 (skipped if present)
3. transcribe (re-does partial transcripts, e.g. old smoke tests)
4. analyze via opencode (fresh session, WITH HARD TIMEOUT) + dossier fact-check
5. every 10 episodes: rebuild FTS index + master JSON
Run: python pipeline_all.py [--eps 84 87 89 ...] [--start-ep N] [--dry-run]
Log: stdout (use with redirection)
"""
import argparse
import json
import os
import sys
import time
import traceback
import subprocess
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
except Exception:
pass
from config import TRANSCRIPT_DIR, KEEP_AUDIO
from feed import load_episodes
from download import audio_path, slug as ep_slug, download_episode
from preprocess import prepare_audio, prepared_path
from transcribe import transcript_path
from lexicon import build_lexicon, tags_for_text
from export_txt import export_txt
# seconds between opencode calls - provider rate limits are real
ANALYSIS_PAUSE = int(os.environ.get("DS_ANALYZE_PAUSE", "45"))
# hard timeout for entire analysis (seconds) - opencode can hang
ANALYSIS_TIMEOUT = int(os.environ.get("DS_ANALYSIS_TIMEOUT", "600")) # 10 minutes
# memory guard threshold (bytes) - pause if available RAM drops below this
MIN_FREE_RAM = int(os.environ.get("DS_MIN_FREE_RAM", str(1024 * 1024 * 1024))) # 1 GB
def has_partial(transcript_file: str) -> bool:
try:
with open(transcript_file, encoding="utf-8") as f:
return json.load(f).get("partial_minutes") is not None
except (OSError, json.JSONDecodeError):
return False
def check_memory() -> bool:
"""Check if we have enough free RAM. Return True if OK, False if low."""
try:
import psutil
avail = psutil.virtual_memory().available
if avail < MIN_FREE_RAM:
return False
except ImportError:
pass # psutil not installed, skip check
except Exception:
pass
return True
def wait_for_memory() -> None:
"""Block until enough RAM is available."""
print(f" [MEM] Low memory (< {MIN_FREE_RAM/1e9:.1f} GB free), waiting...", flush=True)
while not check_memory():
time.sleep(30)
print(f" [MEM] Memory recovered, continuing...", flush=True)
def do_transcribe(model, ep: dict) -> None:
from transcribe import transcribe_episode
from preprocess import load_pcm
src = audio_path(ep)
if not os.path.exists(src):
print(f" [{time.strftime('%H:%M:%S')}] downloading {ep['audio_url'][-40:]} ...", flush=True)
download_episode(ep)
prep = prepared_path(ep)
ok = False
t0 = time.time()
try:
# Check memory before loading episode
wait_for_memory()
print(f" [{time.strftime('%H:%M:%S')}] transcribing Ep {ep['ep_num']} ({ep['title'][:50]})", flush=True)
result = transcribe_episode(model, ep, None)
outp = transcript_path(ep)
with open(outp + ".tmp", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False)
os.replace(outp + ".tmp", outp)
dur = result["duration_sec"] or 1
rate = dur / max(time.time() - t0, 0.001)
lex = build_lexicon()
tags = set()
for seg in result["segments"]:
tags.update(tags_for_text(seg["text"], lex))
print(f" [{time.strftime('%H:%M:%S')}] TRANSCRIBED: {len(result['segments'])} segments, "
f"{dur/60:.0f} min, {rate:.1f}x realtime", flush=True)
print(f" TAGS: {' '.join(sorted('#' + t for t in tags)) or '(none)'}", flush=True)
ok = True
finally:
if os.path.exists(prep):
try:
os.remove(prep)
except OSError:
pass
if not KEEP_AUDIO and ok and os.path.exists(src):
try:
os.remove(src)
except OSError:
pass
def run_analysis_with_timeout(ep: dict) -> tuple:
"""
Run analysis + verification using opencode subprocess with hard timeout.
Returns (success: bool, result: dict | None, error: str | None)
"""
from analyze import ANALYSIS_DIR, OPENCODE, build_prompt, strip_to_json, validate
from verify import verify_episode
from download import slug as ep_slug
from export_txt import txt_path
from config import BASE_DIR
label = f"Ep {ep['ep_num']}"
apath = os.path.join(ANALYSIS_DIR, f"{ep_slug(ep)}.json")
# Check if already analyzed
if os.path.exists(apath):
with open(apath, encoding="utf-8") as f:
existing = json.load(f)
return (True, existing, None)
# Build prompt
prompt = build_prompt()
attach = export_txt(ep)
# Run analysis with timeout + rate-limit retries
cmd = [OPENCODE, "run", "--auto", "-f", attach, "--dir", BASE_DIR, prompt]
# Rate limit retry waits (seconds)
rate_limit_waits = [10, 60, 180, 420, 600]
for attempt, wait_time in enumerate(rate_limit_waits, 1):
try:
print(f" [{time.strftime('%H:%M:%S')}] running analysis (attempt {attempt}, timeout {ANALYSIS_TIMEOUT}s)...", flush=True)
proc = subprocess.run(cmd, capture_output=True, text=True,
encoding="utf-8", errors="replace",
cwd=BASE_DIR, timeout=ANALYSIS_TIMEOUT)
out = proc.stdout or ""
err = proc.stderr or ""
combined = (out + err).lower()
if "rate limit" in combined or "429" in combined:
raise RuntimeError("provider rate limit exceeded")
if not out.strip() and err:
raise RuntimeError(f"opencode produced no stdout: {err[-400:]}")
# Parse result
from analyze import _repair
obj = json.loads(_repair(out), strict=False)
validate(obj)
# Add metadata
obj["ep_num"] = ep["ep_num"] if ep["ep_num"] else obj.get("ep_num")
obj["title"] = obj.get("title") or ep["title"]
obj["pub_date"] = ep["pub_date"]
obj["_analyzed_at"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
obj["_source_transcript"] = os.path.basename(transcript_path(ep))
# Save analysis
from analyze import ANALYSIS_DIR as ANALYSIS_DIR2
from download import slug as ep_slug
apath = os.path.join(ANALYSIS_DIR2, f"{ep_slug(ep)}.json")
with open(apath + ".tmp", "w", encoding="utf-8") as f:
json.dump(obj, f, ensure_ascii=False, indent=1)
os.replace(apath + ".tmp", apath)
# Now run verification
print(f" [{time.strftime('%H:%M:%S')}] fact-checking...", flush=True)
from verify import verify_episode
verify_episode(ep)
return (True, obj, None)
except RuntimeError as e:
if "rate limit" in str(e).lower():
if attempt < len(rate_limit_waits):
wait = rate_limit_waits[attempt]
print(f" [{time.strftime('%H:%M:%S')}] rate limited (attempt {attempt}), sleeping {wait}s...", flush=True)
time.sleep(wait)
continue
else:
return (False, None, f"Rate limit exceeded after {attempt} attempts")
else:
return (False, None, str(e))
except Exception as e:
return (False, None, str(e))
return (False, None, "Max retries exceeded")
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--eps", nargs="*", type=int, default=None,
help="Specific episode numbers to process (default: all from start-ep)")
ap.add_argument("--start-ep", type=int, default=0)
ap.add_argument("--dry-run", action="store_true")
args = ap.parse_args()
from faster_whisper import WhisperModel
from config import WHISPER_MODEL, DEVICE, COMPUTE_TYPE
from analyze import analyze_episode, OPENCODE
from verify import verify_episode
eps = load_episodes()
if args.eps:
eps = [e for e in eps if e["ep_num"] in args.eps]
else:
eps = [e for e in eps if (e["ep_num"] or 0) >= args.start_ep]
print(f"[{time.strftime('%H:%M:%S')}] pipeline over {len(eps)} episodes "
f"(model={WHISPER_MODEL}/{DEVICE}, analyzer={os.path.basename(OPENCODE)})", flush=True)
if args.dry_run:
for e in eps[:20]:
tp = transcript_path(e)
t_exists = os.path.exists(tp) and not has_partial(tp)
a_exists = os.path.exists(os.path.join(
os.path.dirname(TRANSCRIPT_DIR), "analysis", f"{e['ep_num']:04d}.json")) if e["ep_num"] else False
print(f" ep {e['ep_num']}: transcript={'Y' if t_exists else 'N'} analysis={'Y' if a_exists else 'N'}", flush=True)
return
model = None
done_t = done_a = 0
t_start = time.time()
for i, ep in enumerate(eps, 1):
num = ep["ep_num"] if ep["ep_num"] else ep["title"][:30]
tp = transcript_path(ep)
need_transcript = (not os.path.exists(tp)) or has_partial(tp)
if need_transcript and model is None:
print(f"[{time.strftime('%H:%M:%S')}] loading whisper model '{WHISPER_MODEL}'...", flush=True)
model = WhisperModel(WHISPER_MODEL, device=DEVICE, compute_type=COMPUTE_TYPE)
if has_partial(tp):
print(f"[{time.strftime('%H:%M:%S')}] [{i}/{len(eps)}] Ep {num}: redo partial transcript", flush=True)
os.remove(tp)
elif need_transcript:
print(f"[{time.strftime('%H:%M:%S')}] [{i}/{len(eps)}] Ep {num}: transcribing", flush=True)
if need_transcript:
try:
do_transcribe(model, ep)
done_t += 1
# keep the searchable index fresh-ish
if done_t % 10 == 0:
import index as index_mod
print(f" [{time.strftime('%H:%M:%S')}] rebuilding search index...", flush=True)
index_mod.index_transcripts()
except Exception as ex:
print(f" [{time.strftime('%H:%M:%S')}] TRANSCRIBE FAILED, skipping episode: {ex}", flush=True)
traceback.print_exc()
continue
# analysis + fact-check (with hard timeout)
label = f"Ep {num}"
print(f" [{time.strftime('%H:%M:%S')}] analyzing {label} ...", flush=True)
try:
success, result, error = run_analysis_with_timeout(ep)
if success:
done_a += 1
print(f" [{time.strftime('%H:%M:%S')}] analyzed {label} (TI={result['transgression']['overall_ti']}, "
f"{len(result['talking_points'])} points, {len(result['notable_quotes'])} quotes)", flush=True)
print(f" [{time.strftime('%H:%M:%S')}] verified {label}", flush=True)
else:
print(f" [{time.strftime('%H:%M:%S')}] ANALYSIS FAILED {label}: {error}", flush=True)
except Exception as ex:
print(f" [{time.strftime('%H:%M:%S')}] ANALYZE FAILED {label}: {ex}", flush=True)
traceback.print_exc()
# pacing: keep the provider happy
print(f" [{time.strftime('%H:%M:%S')}] pacing pause {ANALYSIS_PAUSE}s ...", flush=True)
time.sleep(ANALYSIS_PAUSE)
if i % 10 == 0:
print(f" [{time.strftime('%H:%M:%S')}] rebuilding search index (periodic)...", flush=True)
import index as index_mod
index_mod.index_transcripts()
from aggregate import aggregate as _agg
_agg()
hrs = (time.time() - t_start) / 3600
rate_eps = i / hrs
remaining = (len(eps) - i) / max(rate_eps, 0.01)
print(f"[{time.strftime('%H:%M:%S')}] == progress: {i}/{len(eps)} eps "
f"({rate_eps:.1f} eps/hr, ~{remaining:.0f} hr left) ==", flush=True)
print(f"[{time.strftime('%H:%M:%S')}] final index rebuild...", flush=True)
import index as index_mod
index_mod.index_transcripts()
from aggregate import aggregate as _agg
_agg()
print(f"[{time.strftime('%H:%M:%S')}] PIPELINE COMPLETE: transcribed={done_t} analyzed={done_a}", flush=True)
if __name__ == "__main__":
main()
+82
View File
@@ -0,0 +1,82 @@
"""Robust audio preprocessing.
Libsyn MP3s confuse faster-whisper's decoder on this box (bogus multi-channel
allocation). We therefore demux+decode ourselves with PyAV in bounded chunks,
downmix to mono, resample to 16 kHz s16, and write a plain WAV that Whisper
ingests instantly.
Full-length prep of a 3 h episode takes ~1 min and ~340 MB; the file is
deleted by transcribe.py afterwards unless DS_PREP_KEEP=1.
"""
import os
import wave
import av
import numpy as np
from config import AUDIO_DIR
from download import slug as ep_slug
PREP_DIR = os.path.join(AUDIO_DIR, "_prep")
TARGET_RATE = 16000
def prepared_path(ep: dict) -> str:
return os.path.join(PREP_DIR, ep_slug(ep) + ".16k.wav")
def prepare_audio(src_mp3: str, dst_wav: str,
max_seconds: float | None = None) -> str:
os.makedirs(PREP_DIR, exist_ok=True)
if os.path.exists(dst_wav):
return dst_wav
resampler = av.AudioResampler(format="s16", layout="mono",
rate=TARGET_RATE)
total_written = 0
limit = int(max_seconds * TARGET_RATE) if max_seconds else None
tmp = dst_wav + ".tmp"
with av.open(src_mp3, metadata_errors="ignore") as container:
# pick the first real audio stream explicitly
streams = [s for s in container.streams.audio]
if not streams:
raise ValueError(f"no audio stream in {src_mp3}")
stream = streams[0]
import wave
wf = wave.open(tmp, "wb")
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(TARGET_RATE)
try:
for frame in container.decode(stream):
resampled = resampler.resample(frame)
for rf in resampled:
arr = rf.to_ndarray()
if arr.ndim == 2: # (1, samples) planar mono
arr = arr[0]
pcm = arr.astype(np.int16).tobytes()
n = len(pcm) // 2
if limit and total_written + n > limit:
n = limit - total_written
pcm = pcm[: n * 2]
wf.writeframes(pcm)
total_written += n
if limit and total_written >= limit:
raise StopIteration
except StopIteration:
pass
finally:
wf.close()
os.replace(tmp, dst_wav)
return dst_wav
def load_pcm(dst_wav: str) -> np.ndarray:
"""Load a prepared 16 kHz s16 mono wav as float32 in [-1, 1]."""
with wave.open(dst_wav, "rb") as wf:
assert wf.getnchannels() == 1 and wf.getframerate() == TARGET_RATE
frames = wf.readframes(wf.getnframes())
return np.frombuffer(frames, dtype=np.int16).astype(np.float32) / 32768.0
+2
View File
@@ -0,0 +1,2 @@
requests>=2.31
faster-whisper>=1.0.0
+80
View File
@@ -0,0 +1,80 @@
"""The Transgression Index (TI): an arbitrary-but-anchored 0-10 scale for how
edgy/transgressive content is. Deliberately opinionated anchors so scores are
comparable across episodes. Shared by analyze.py prompts and aggregate.py.
"""
RUBRIC = """
TRANSGRESSION INDEX (TI) RUBRIC - score each quote and each dimension 0-10:
0 Wholesome/neutral: could air on network morning TV.
1 Mild crudeness: innuendo, toilet humor, light profanity.
2 Frequent profanity, explicit sexual talk, crude insults aimed at public figures.
3 Edgy shock humor: jokes about death/tragedy/disability; mean-spirited roasts.
4 Slurs used (quoted or reclaimed), graphic sexual content, sustained cruelty
toward an individual as a running bit.
5 Dehumanizing generalizations about groups (by race/sex/religion/etc.) played
for laughs; celebration of harassment campaigns.
6 Sincere demeaning rhetoric about protected groups (not clearly ironic);
praising doxxing/deplatforming of enemies; glorifying self-harm or violence
rhetorically.
7 Targeted abuse: encouraging audiences to swarm/threaten a named private
individual; credible threats framed as jokes.
8 Endorsement of political violence or extremism beyond rhetoric; material
support (fundraising) for violent/extremist causes.
9 Direct incitement to violence; non-consensual sexual content endorsement.
10 Planning/praising specific acts of terror or mass violence.
Sub-dimensions (each 0-10, same anchors applied narrowly):
- profanity: raw frequency/intensity of swearing only.
- slur_usage: occurrence of slurs/bigoted epithets (quoted bits count half).
- harassment_or_cruelty: targeted attacks on named individuals.
- sincerity: how sincere vs comedic the worst content is (0 = pure bit,
10 = stated sincerely). NOTE: this measures tone, not severity.
overall_ti is NOT an average - it is the peak sustained level (>=60 seconds
or a defining moment of the episode).
"""
SCHEMA_EXAMPLE = """{
"ep_num": 361,
"title": "Episode 361 - Dick on Lizard Feet",
"pub_date": "2023-05-30",
"runtime_minutes": 147,
"one_line_summary": "...",
"guests": [{"name": "...", "role": "host/cohost/guest/caller", "notes": "..."}],
"talking_points": [
{"topic": "short label",
"summary": "2-3 sentence account of what was said, including positions and punchlines",
"start_ts": 1234.5,
"people": ["maddox", "eric july"],
"controversy_ti": 4}
],
"arguments": [
{"claim": "what the host asserts",
"position": "pro/anti/mockery-of",
"target": "who or what it is against",
"quality": "strong|moderate|weak|trollish",
"evidence_used": "receipts, anecdotes, statistics cited"}
],
"ideas": [
{"concept": "coined term / recurring bit / theory introduced",
"explanation": "what it means",
"first_ts": 1234.5}
],
"notable_quotes": [
{"quote": "verbatim quote (may be lightly cleaned)",
"ts": 1234.5,
"ti": 5,
"why": "one clause explaining the score"}
],
"transgression": {
"overall_ti": 5,
"profanity": 7,
"slur_usage": 3,
"harassment_or_cruelty": 4,
"sincerity": 2,
"targets": ["groups or individuals the edge is aimed at"],
"rationale": "2 sentences justifying overall_ti"
},
"content_warnings": ["slurs", "sexual content"]
}"""
+50
View File
@@ -0,0 +1,50 @@
"""One-command pipeline: feed -> download -> transcribe -> index.
python run_all.py # everything not yet done
python run_all.py --ep 361 # just one episode end-to-end (good first run)
python run_all.py --minutes 5 --ep 520 # 5-minute smoke test
"""
import argparse
import subprocess
import sys
def run(cmd: list[str]) -> int:
print(f"\n=== {' '.join(cmd)} ===\n", flush=True)
return subprocess.call([sys.executable] + cmd)
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--ep", type=int, nargs="*", default=None)
ap.add_argument("--minutes", type=float, default=None)
ap.add_argument("--skip-download", action="store_true")
ap.add_argument("--skip-transcribe", action="store_true")
ap.add_argument("--force", action="store_true")
args = ap.parse_args()
rc = run(["feed.py"])
if rc:
return rc
if not args.skip_download:
cmd = ["download.py"] + ([str(e) for e in args.ep] if args.ep else [])
if run(cmd):
print("download step reported failures; continuing", file=sys.stderr)
if not args.skip_transcribe:
cmd = ["transcribe.py"]
if args.ep:
cmd += [str(e) for e in args.ep]
if args.minutes:
cmd += ["--minutes", str(args.minutes)]
if args.force:
cmd += ["--force"]
if run(cmd):
return 1
return run(["index.py"])
if __name__ == "__main__":
sys.exit(main())
+136
View File
@@ -0,0 +1,136 @@
"""Search the transcript index.
Usage:
python search.py "isom trademark"
python search.py "pull up" --tag eric_july
python search.py "judge ramos" --ep 103 --limit 5
python search.py "rage" --from 2017-01-01 --to 2019-12-31 --report out.txt
Output lines include EPISODE + TIMESTAMP so they can be deep-linked to audio
later: [Ep 373 | 2023-08-29] 01:12:45-01:13:02 "...transcript snippet..."
"""
import argparse
import datetime as dt
import json
import re
import sqlite3
import sys
from config import DB_PATH
from index import open_db
def ts(seconds: float) -> str:
s = int(seconds)
return f"{s // 3600:02d}:{(s % 3600) // 60:02d}:{s % 60:02d}"
def parse_date(s: str):
return dt.date.fromisoformat(s)
def pubdate_year(pub: str):
m = re.search(r"(\d{4})", pub or "")
return int(m.group(1)) if m else None
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("query", help="FTS5 query (supports \"quoted phrases\", AND/OR)")
ap.add_argument("--tag", action="append", default=[],
help="filter by hashtag (repeatable)")
ap.add_argument("--ep", type=int, action="append", default=[],
help="restrict to episode number(s)")
ap.add_argument("--from", dest="date_from", default=None)
ap.add_argument("--to", dest="date_to", default=None)
ap.add_argument("--limit", type=int, default=25)
ap.add_argument("--context", type=int, default=0,
help="include N neighbouring segments")
ap.add_argument("--report", default=None,
help="also write matches to this file")
args = ap.parse_args()
con = open_db(DB_PATH)
q = args.query.strip()
sql = """
SELECT s.rowid, e.ep_num, e.guid, e.title, e.pub_date, e.audio_url,
e.page_link, s.seg_idx, s.start_sec, s.end_sec, s.text, s.tags
FROM segments s JOIN episodes e ON e.id = s.episode_id
WHERE segments MATCH ?
"""
params = [q]
if args.tag:
for t in args.tag:
sql += " AND s.tags LIKE ?"
params.append(f"%#{t}%")
if args.ep:
sql += " AND e.ep_num IN (%s)" % ",".join("?" * len(args.ep))
params += args.ep
if args.date_from:
y = parse_date(args.date_from).year
# crude pub-date year filter; feed dates are RFC2822
sql += " AND CAST(substr(e.pub_date, length(e.pub_date)-3, 4) AS INTEGER) >= ?"
params.append(y)
if args.date_to:
y = parse_date(args.date_to).year
sql += " AND CAST(substr(e.pub_date, length(e.pub_date)-3, 4) AS INTEGER) <= ?"
params.append(y)
sql += " ORDER BY e.pub_date LIMIT ?"
params.append(args.limit)
rows = con.execute(sql, params).fetchall()
if not rows:
print("no matches")
return
lines = []
def parse_tags(raw: str) -> list[str]:
raw = raw or ""
if not raw:
return []
if raw.startswith("["):
try:
return json.loads(raw)
except ValueError:
return []
return [t for t in raw.split() if t]
for r in rows:
(_rid, ep_num, guid, title, pub, audio_url, page_link, seg_idx,
start, end, text, tags) = r
label = f"Ep {ep_num}" if ep_num else title[:30]
taglist = parse_tags(tags)
head = (f"[{label} | {pub}] {ts(start)}-{ts(end)} "
f"{' '.join(taglist)}")
body = f" \"{text}\""
extra = ""
if args.context:
ctx = con.execute(
"""SELECT start_sec, end_sec, text FROM segments
WHERE episode_id=(SELECT id FROM episodes WHERE guid=?)
AND seg_idx BETWEEN ? AND ? ORDER BY seg_idx""",
(guid, max(0, seg_idx - args.context),
seg_idx + args.context)).fetchall()
body = "\n".join(
f" [{ts(a)}-{ts(b)}] {t}" for a, b, t in ctx)
link = page_link or audio_url
extra = f" -> {link}\n mp3: {audio_url}"
lines.append(head + "\n" + body + "\n" + extra)
out = "\n\n".join(lines)
print(out[:20000])
print(f"\n({len(rows)} result(s), limit {args.limit})")
if args.report:
with open(args.report, "a", encoding="utf-8") as f:
f.write(f"\n===== QUERY: {q} tags={args.tag} eps={args.ep} =====\n")
f.write(out + "\n")
print(f"appended to {args.report}")
if __name__ == "__main__":
sys.exit(main())
+14
View File
@@ -0,0 +1,14 @@
"""Print master-file integrity summary."""
import json
m = json.load(open("data/dickshow_analysis.json", encoding="utf-8"))
meta = m["meta"]
print("meta:", {k: meta[k] for k in
("episodes_analyzed", "episodes_factchecked",
"total_runtime_minutes")})
for e in m["episodes"]:
v = e.get("_verification", {})
n_issues = len(v.get("issues", []))
print(f"Ep {e['ep_num']}: TI={e['transgression']['overall_ti']} "
f"verified={v.get('verdict')} issues_fixed={n_issues} "
f"points={len(e['talking_points'])}")
+170
View File
@@ -0,0 +1,170 @@
"""Whisper transcription with segment timestamps.
Reads audio/*.mp3, writes transcripts/<slug>.json:
{
"guid": ..., "ep_num": ..., "title": ..., "pub_date": ...,
"audio_url": ..., "model": ..., "segments": [
{"start": 12.34, "end": 18.90, "text": "..."}, ...
]
}
Fully resumable: finished transcripts are skipped unless --force.
Use --minutes N to transcribe only the first N minutes (testing).
"""
import argparse
import json
import os
import sys
import time
from config import (TRANSCRIPT_DIR, WHISPER_MODEL, DEVICE, COMPUTE_TYPE,
LANGUAGE, VAD_FILTER, BEAM_SIZE, WORD_TIMESTAMPS,
CONDITION_ON_PREVIOUS_TEXT, KEEP_AUDIO)
from feed import load_episodes
from download import audio_path, slug as ep_slug
from preprocess import prepare_audio, prepared_path, load_pcm
from lexicon import build_lexicon, tags_for_text
# faster-whisper runs one giant FFT over the whole input; multi-hour episodes
# blow up RAM (~2.5 GB arrays). Transcribe in fixed windows instead.
CHUNK_SECONDS = 600
def transcript_path(ep: dict) -> str:
return os.path.join(TRANSCRIPT_DIR, ep_slug(ep) + ".json")
def transcribe_episode(model, ep: dict, minutes: float | None) -> dict:
src = audio_path(ep)
prep = prepared_path(ep)
t0 = time.time()
prepare_audio(src, prep, max_seconds=minutes * 60 + 5 if minutes else None)
print(f" prepped audio in {time.time() - t0:.0f}s -> {os.path.basename(prep)}",
flush=True)
pcm = load_pcm(prep)
total_samples = len(pcm)
if minutes:
total_samples = min(total_samples, int(minutes * 60 * 16000))
duration = total_samples / 16000.0
segments = []
n_chunks = (total_samples + CHUNK_SECONDS * 16000 - 1) // (CHUNK_SECONDS * 16000)
for ci in range(n_chunks):
a = ci * CHUNK_SECONDS * 16000
b = min(a + CHUNK_SECONDS * 16000, total_samples)
offset = a / 16000.0
chunk = pcm[a:b]
segs_iter, info = model.transcribe(
chunk,
language=LANGUAGE,
vad_filter=VAD_FILTER,
beam_size=BEAM_SIZE,
word_timestamps=WORD_TIMESTAMPS,
condition_on_previous_text=CONDITION_ON_PREVIOUS_TEXT,
)
for seg in segs_iter:
text = seg.text.strip()
if not text:
continue
segments.append({
"start": round(seg.start + offset, 2),
"end": round(seg.end + offset, 2),
"text": text,
})
print(f" chunk {ci + 1}/{n_chunks} done "
f"(audio {(b - a) / 16000 / 60:.0f}m, "
f"{len(segments)} segs so far)", flush=True)
return {
"guid": ep["guid"],
"ep_num": ep["ep_num"],
"title": ep["title"],
"pub_date": ep["pub_date"],
"audio_url": ep["audio_url"],
"page_link": ep.get("page_link", ""),
"duration_sec": duration,
"model": WHISPER_MODEL,
"language": LANGUAGE,
"partial_minutes": minutes,
"segments": segments,
}
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("eps", nargs="*", type=int,
help="episode numbers; default: all")
ap.add_argument("--minutes", type=float, default=None,
help="only transcribe first N minutes (testing)")
ap.add_argument("--force", action="store_true",
help="re-transcribe even if transcript exists")
args = ap.parse_args()
from faster_whisper import WhisperModel
eps = load_episodes()
todo = []
for ep in eps:
if ep["ep_num"] is not None and args.eps and ep["ep_num"] not in args.eps:
continue
tp = transcript_path(ep)
if os.path.exists(tp) and not args.force and not args.minutes:
continue
if not os.path.exists(audio_path(ep)):
print(f"skip (no audio): {ep['title']}", file=sys.stderr)
continue
todo.append(ep)
model = None # lazy-load after we know there's work
done = 0
for i, ep in enumerate(todo, 1):
label = f"Ep {ep['ep_num']}" if ep["ep_num"] else ep["title"][:40]
if model is None:
print(f"loading whisper model '{WHISPER_MODEL}' "
f"(device={DEVICE}, compute={COMPUTE_TYPE}) ...")
model = WhisperModel(WHISPER_MODEL, device=DEVICE,
compute_type=COMPUTE_TYPE)
t0 = time.time()
src = audio_path(ep)
prep = prepared_path(ep)
ok = False
try:
result = transcribe_episode(model, ep, args.minutes)
outp = transcript_path(ep)
with open(outp + ".tmp", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False)
os.replace(outp + ".tmp", outp)
dur = result["duration_sec"] or 1
rate = dur / max(time.time() - t0, 0.001)
n_seg = len(result["segments"])
lexicon = build_lexicon()
ep_tag_set: set[str] = set()
for seg in result["segments"]:
ep_tag_set.update(tags_for_text(seg["text"], lexicon))
print(f"[{i}/{len(todo)}] {label}: {n_seg} segments, "
f"{dur/60:.0f} min audio, {rate:.1f}x realtime")
print(f" TAGS: {' '.join('#' + t for t in sorted(ep_tag_set)) or '(none)'}")
done += 1
ok = True
except Exception as e: # noqa: BLE001
print(f"{label}: TRANSCRIBE FAILED - {e}", file=sys.stderr)
continue
finally:
# reclaim disk: prepped wav always goes; mp3 unless KEEP_AUDIO
if os.path.exists(prep):
try:
os.remove(prep)
except OSError:
pass
if not KEEP_AUDIO and ok and not args.minutes:
try:
os.remove(src)
except OSError:
pass
print(f"transcribed={done} skipped_existing="
f"{len([e for e in eps if os.path.exists(transcript_path(e))])}")
if __name__ == "__main__":
main()
+177
View File
@@ -0,0 +1,177 @@
"""Second-pass fact-check: verify an episode analysis against the research
dossier (Dax_Herrera_Dick_Masterson_Profile.txt) via a second opencode run.
Spots "strange assumptions" like attributing a 2023 cohost seat to Maddox.
Usage:
python verify.py # verify ALL existing analyses
python verify.py 361 373 # verify specific episodes
"""
import json
import os
import sys
import time
# console-safe output (model errors may contain any unicode)
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
except Exception:
pass
from config import BASE_DIR
from feed import load_episodes
from download import slug as ep_slug
from facts import DOSSIER_PATH, CAST_SHEET
from analyze import (ANALYSIS_DIR, OPENCODE, run_opencode, strip_to_json,
validate)
from export_txt import txt_path
VERIFY_PROMPT = """You are the fact-checking archivist for The Dick Show project. Three files are attached:
FILE 1: the episode transcript (timestamped lines [HH:MM:SS]).
FILE 2: a researched dossier about the host, Dax Herrera aka Dick Masterson (verified court records, timeline, cast roster, feuds).
FILE 3: a candidate ANALYSIS JSON of that episode produced by another analyst pass.
Your job: cross-check FILE 3 against FILE 1 and FILE 2 for FACTUAL consistency only. Do not judge opinions, humor, or TI scores. Check specifically:
- Speaker/role attribution. {cast}
- Names, spellings, and who is who (e.g. Sean vs Vito vs Asterios vs Maddox).
- Timeline claims vs the dossier (what was happening when this episode aired; which feud is active).
- Events/people attributed to the wrong era or wrong person.
- Claims about guests that contradict the transcript itself.
Output ONLY one valid JSON object, no fences, no commentary:
{{
"verdict": "pass" or "fix",
"issues": [
{{"field": "guests|talking_points|arguments|ideas|notable_quotes|transgression",
"claim": "...", "issue": "...", "correction": "..."}}
],
"corrected_analysis": {{ ... full corrected analysis JSON, same schema as FILE 3, or null if verdict=pass ... }}
}}
Rules:
- If everything checks out: verdict="pass", issues=[], corrected_analysis=null.
- If ANY factual issue affects content: verdict="fix" and corrected_analysis MUST contain the complete corrected JSON (not a diff).
- Keep all scores/timestamps unless they are part of an identified error.
Begin now."""
def build_verify_prompt() -> str:
return VERIFY_PROMPT.replace("{cast}", CAST_SHEET.strip())
def verify_episode(ep: dict, force: bool = False) -> dict | None:
apath = os.path.join(ANALYSIS_DIR, f"{ep_slug(ep)}.json")
if not os.path.exists(apath):
return None
with open(apath, encoding="utf-8") as f:
current = json.load(f)
attach_txt = txt_path(ep)
if not os.path.exists(attach_txt):
from export_txt import export_txt
attach_txt = export_txt(ep)
if not os.path.exists(DOSSIER_PATH):
print(f" dossier missing at {DOSSIER_PATH}; cannot verify",
file=sys.stderr)
return None
prompt = build_verify_prompt()
from analyze import RateLimitError
waits = [30, 120, 300, 600]
attempt = 0
last_err = None
while attempt < len(waits):
attempt += 1
try:
raw = run_opencode_multi(prompt, [attach_txt, DOSSIER_PATH, apath])
verdict = strip_to_json(raw)
v = verdict.get("verdict")
if v not in ("pass", "fix"):
raise ValueError(f"bad verdict: {v!r}")
if v == "pass":
current.setdefault("_verification", {
"verdict": "pass", "checked_at": _now(), "issues": []})
_save(apath, current)
print(f" verified OK (no issues)", flush=True)
return current
fixed = verdict.get("corrected_analysis")
if not isinstance(fixed, dict):
raise ValueError("verdict=fix but no corrected_analysis")
validate(fixed)
issues = verdict.get("issues", [])
fixed["_verification"] = {"verdict": "fix", "checked_at": _now(),
"issues": issues}
fixed["ep_num"] = ep["ep_num"] if ep["ep_num"] else fixed.get("ep_num")
_save(apath, fixed)
print(f" FIXED {len(issues)} issue(s):", flush=True)
for i in issues[:6]:
print(f" - [{i.get('field')}] {str(i.get('issue'))[:90]}",
flush=True)
return fixed
except RateLimitError as e:
last_err = e
wait = waits[min(attempt, len(waits) - 1)]
print(f" verify rate-limited (attempt {attempt}); "
f"sleeping {wait}s ...", flush=True)
time.sleep(wait)
except Exception as e: # noqa: BLE001
last_err = e
wait = waits[min(attempt - 1, len(waits) - 1)]
print(f" verify attempt {attempt} failed: {e}; "
f"retry in {wait}s", flush=True)
time.sleep(wait)
print(f" verification FAILED for {ep['title']}: {last_err}", flush=True)
return None
def run_opencode_multi(prompt: str, attachments: list[str]) -> str:
from analyze import OPENCODE_MODEL
cmd = [OPENCODE, "run", "--auto"]
for a in attachments:
cmd += ["-f", a]
cmd += ["--dir", BASE_DIR]
if OPENCODE_MODEL:
cmd += ["-m", OPENCODE_MODEL]
cmd.append(prompt)
import subprocess
proc = subprocess.run(cmd, capture_output=True, text=True,
encoding="utf-8", errors="replace",
cwd=BASE_DIR, timeout=900)
out = proc.stdout or ""
if not out.strip() and proc.stderr:
raise RuntimeError(f"opencode produced no stdout: "
f"{proc.stderr[-400:]}")
return out
def _now() -> str:
from datetime import datetime, timezone
return datetime.now(timezone.utc).isoformat()
def _save(apath: str, obj: dict) -> None:
tmp = apath + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(obj, f, ensure_ascii=False, indent=1)
os.replace(tmp, apath)
def main() -> None:
args = [a for a in sys.argv[1:] if not a.startswith("-")]
eps = load_episodes()
todo = [e for e in eps
if os.path.exists(os.path.join(ANALYSIS_DIR,
f"{ep_slug(e)}.json"))
and (not args or e["ep_num"] in {int(a) for a in args})]
print(f"verifying {len(todo)} analysis file(s)", flush=True)
for i, ep in enumerate(todo, 1):
label = f"Ep {ep['ep_num']}" if ep['ep_num'] else ep['title'][:40]
print(f"[{i}/{len(todo)}] verifying {label} ...", flush=True)
verify_episode(ep)
from aggregate import aggregate
aggregate()
if __name__ == "__main__":
main()