From 28fc82213230731dfcc34d3c636b14370094d699 Mon Sep 17 00:00:00 2001 From: nmemmert Date: Mon, 12 Oct 2026 08:18:51 -0400 Subject: [PATCH] Podcast workflow steps: read script, record, edit, upload; v2.15.1 Co-Authored-By: Claude Sonnet 5.5 --- package-lock.json | 4 ++-- package.json | 2 +- server/routes/podcast-workflow.js | 5 +---- src/AdminPage.tsx | 31 +++++++++++++++---------------- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3996135..8cc4537 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "siteforge", - "version": "2.15.0", + "version": "2.15.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "siteforge", - "version": "2.15.0", + "version": "2.15.1", "dependencies": { "@aws-sdk/client-s3": "^3.1135.0", "@dnd-kit/core": "^6.3.1", diff --git a/package.json b/package.json index b662fe2..56e4684 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "siteforge", "private": true, - "version": "2.15.0", + "version": "2.15.1", "type": "module", "scripts": { "dev": "vite", diff --git a/server/routes/podcast-workflow.js b/server/routes/podcast-workflow.js index bf93f87..2c7c333 100644 --- a/server/routes/podcast-workflow.js +++ b/server/routes/podcast-workflow.js @@ -9,8 +9,7 @@ import { fetchAllEpisodes } from './episodes.js' const WORKFLOW_FILE = path.join(DATA_DIR, 'podcast-workflow.json') -// Same steps as the Nuggets workflow. -const STEPS = ['listen', 'coldOpen', 'recordColdOpen', 'edit', 'spotify'] +const STEPS = ['readScript', 'record', 'edit', 'upload'] async function load() { try { @@ -26,7 +25,6 @@ const save = data => writeFile(WORKFLOW_FILE, JSON.stringify(data, null, 2), 'ut function emptyState() { return { steps: Object.fromEntries(STEPS.map(s => [s, null])), - coldOpenText: '', notes: '', } } @@ -133,7 +131,6 @@ export function register(app) { } } } - if (typeof body.coldOpenText === 'string') next.coldOpenText = body.coldOpenText.slice(0, 5000) if (typeof body.notes === 'string') next.notes = body.notes.slice(0, 5000) wf.items[key] = next await save(wf) diff --git a/src/AdminPage.tsx b/src/AdminPage.tsx index df75016..c2225c3 100644 --- a/src/AdminPage.tsx +++ b/src/AdminPage.tsx @@ -1799,6 +1799,16 @@ function NuggetsWorkflowAdmin() { ) } +type PodcastStepKey = 'readScript' | 'record' | 'edit' | 'upload' +interface PodcastWorkflowState { steps: Record; notes: string } + +const PODCAST_STEP_DEFS: { key: PodcastStepKey; label: string; hint: string }[] = [ + { key: 'readScript', label: 'Read the script', hint: 'Read it through, mark pacing and emphasis.' }, + { key: 'record', label: 'Record the episode', hint: 'Capture the final take.' }, + { key: 'edit', label: 'Edit the episode', hint: 'Trim, clean up, mix and master.' }, + { key: 'upload', label: 'Upload to Spotify', hint: 'Publish with show notes. It moves to Released once it’s in the feed.' }, +] + // ── Podcast Episode Workflow (Lane A / Lane B) ───────────────────────────── interface PodcastWorkflowItem { key: string @@ -1811,7 +1821,7 @@ interface PodcastWorkflowItem { spotifyUrl?: string hasScript?: boolean planned?: boolean - state: WorkflowState + state: PodcastWorkflowState } function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season?: number }; laneB: { title: string; season?: number } }) { @@ -1856,7 +1866,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season setError(e instanceof Error ? e.message : 'Save failed.') } } - const patchLocal = (key: string, patch: Partial) => + const patchLocal = (key: string, patch: Partial) => setItems(prev => prev.map(i => (i.key === key ? { ...i, state: { ...i.state, ...patch } } : i))) const addPlanned = async () => { @@ -1880,7 +1890,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season } const label = (i: PodcastWorkflowItem) => `${i.episodeNumber ? `Ep ${i.episodeNumber}` : 'Ep'}${i.title ? ` — ${i.title}` : ''}` - const doneCount = (i: PodcastWorkflowItem) => (i.released ? WORKFLOW_STEP_DEFS.length : WORKFLOW_STEP_DEFS.filter(s => i.state.steps[s.key]).length) + const doneCount = (i: PodcastWorkflowItem) => (i.released ? PODCAST_STEP_DEFS.length : PODCAST_STEP_DEFS.filter(s => i.state.steps[s.key]).length) const row = (i: PodcastWorkflowItem) => ( @@ -1961,7 +1971,7 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season

)}
    - {WORKFLOW_STEP_DEFS.map((s, idx) => { + {PODCAST_STEP_DEFS.map((s, idx) => { const completedAt = selected.state.steps[s.key] const checked = selected.released || Boolean(completedAt) return ( @@ -1981,17 +1991,6 @@ function PodcastWorkflowAdmin({ laneA, laneB }: { laneA: { title: string; season - {s.key === 'coldOpen' && ( -