-
Notifications
You must be signed in to change notification settings - Fork 4
Podcast automation ground work #113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Creates a convenient `npm run setup-local` command that configures public permissions, generates placeholder media, and populates the local Directus database with sample data for testing. The website now renders properly with local Directus instead of requiring production credentials. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Replace yarn with npm in all instructions - Add comprehensive local Directus setup steps - Document the new `npm run setup-local` command - Remove accidentally committed yarn.lock file - Update Node.js version requirements to v20/v22 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add planning fields to podcasts: recording_date, planned_publish_date, publishing_status - Add speaker portal fields: portal_token, portal_token_expires, portal_submission_status, portal_submission_deadline - Create podcast_generated_content collection for AI-generated shownotes and social posts - Add Heise.de integration fields to podcasts: heise_eligible, heise_document_status, heise_sent_at, heise_document - Add migration scripts for API and schema.json updates Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Speaker Portal (Phase 5): - Add /speaker-portal page for guests to submit their info - Add API endpoints for token validation and form submission - Add token generation flow in Directus - Add runtime config for Directus admin token Content Generation (Phase 3): - Add shownotes generation prompt template - Add social media post prompts (LinkedIn, Instagram, Bluesky, Mastodon) Calendar Views (Phase 1): - Add setup-flows script for Directus presets and flows - Create Recording Calendar view preset - Create Publishing Calendar view preset - Create Ready to Publish filter preset Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace text-gray-300 and text-gray-400 (not in theme) with text-white/70 and text-white/60 (opacity modifiers). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix API endpoints to use correct Directus field names (event_image instead of action_image, remove non-existent mastodon_url) - Translate all error messages and UI text to German - Add generate-speaker-tokens.mjs utility script for generating tokens for existing speakers - Add npm script for token generation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add transcript_text, transcript_file, and transcript_uploaded_at fields to podcasts - Create Directus Flow that triggers when transcript is uploaded - Automatically sets publishing_status to 'transcript_ready' - Add 'Transcript Ready' preset view for episodes awaiting content generation This adapts Phase 2 to use Riverside's existing transcripts instead of automated transcription, allowing manual .txt upload to trigger the AI content generation workflow. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add /api/generate-content endpoint that calls Gemini API
- Generate shownotes from transcript using designed prompts
- Generate social media posts for LinkedIn, Instagram, Bluesky, Mastodon
- Store generated content in podcast_generated_content collection
- Update Directus Flow to trigger content generation after transcript upload
- Add NUXT_GEMINI_API_KEY config for API authentication
Flow: Upload transcript → Status becomes 'transcript_ready' →
Content generation triggered → Status becomes 'content_review'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add content-approval hook to copy approved shownotes to podcast description - Update podcast status to 'approved' when all content is approved - Add setup script for O2M relation (generated_content on podcasts) - Add cleanup utility for removing old flow data - Remove Nuxt generate-content endpoint (moved to Directus hook) - Simplify status to just 'generated' and 'approved' states Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Zod schema validation for speaker form data - Add missing mastodon_url to speaker update payload - Add proper error handling for image upload failures - Remove unused runtimeConfig variable - Fix memory leak by revoking object URLs on replacement and unmount Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request implements Phase 3.6, 3.7 (Content Review & Approval) and Phase 4 (Social Media Publishing) for the programmier.bar podcast automation system. The changes include new Directus hooks for content approval workflow, social media publishing to Bluesky and Mastodon, a speaker self-service portal, member matching from transcripts, and various code quality improvements.
Changes:
- Content approval workflow that copies approved shownotes to podcast description and updates publishing status
- Social media publishing hooks with implementations for Bluesky (AT Protocol) and Mastodon (REST API)
- Speaker portal for self-service speaker information submission with token-based authentication
- Member matching logic to automatically identify podcast hosts from transcripts
- Code quality improvements: const/let fixes, Vue directive updates, component organization
Reviewed changes
Copilot reviewed 47 out of 47 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tasks.md | Updated implementation progress tracking for completed automation phases |
| README.md | Updated setup instructions for Node.js v20/22 and local development workflow |
| nuxt-app/server/middleware/rating.ts | Changed let to const for immutable variables |
| nuxt-app/server/api/speaker-portal/*.ts | New API endpoints for speaker portal validation and submission |
| nuxt-app/pages/speaker-portal.vue | New speaker portal page with form validation and image upload |
| nuxt-app/plugins/vue-json-pretty.js | Fixed component name casing |
| nuxt-app/components/*.vue | Vue style guide compliance: v-if placement, @click shorthand |
| directus-cms/schema.json | Added podcast automation fields and podcast_generated_content collection |
| directus-cms/utils/*.mjs | New utility scripts for schema management and local setup |
| directus-cms/extensions/.../content-approval/index.ts | Hook for content approval workflow |
| directus-cms/extensions/.../content-generation/*.ts | AI content generation with Gemini API |
| directus-cms/extensions/.../social-media-publish/*.ts | Bluesky and Mastodon publishing implementations |
| directus-cms/extensions/.../member-matching/*.ts | Automatic member matching from transcripts with tests |
| directus-cms/prompts/*.md | Prompt templates for shownotes and social media posts |
| directus-cms/package.json | Added npm scripts for automation setup |
| directus-cms/.env.example | Added environment variables for Gemini API and social media platforms |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import ConferenceTickets from '~/components/ConferenceTickets.vue'; | ||
| import TestimonialSlider from '~/components/TestimonialSlider.vue'; | ||
| import type { TalkItem, DirectusFileItem } from '~/types'; | ||
| import { TalkItem} from '~/types'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shoud this be also a import type?
Validates that uploaded images meet the minimum 800x800 pixel requirement before accepting them, showing a helpful error message with the actual dimensions if validation fails. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add detailed progress section documenting completed phases: - Phase 1: CMS schema and calendar views - Phase 3: AI content generation and approval workflow - Phase 5: Speaker portal (partial) - Phase 7: Heise fields (partial) Includes key files created and remaining work overview. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create social_media_posts collection with setup script - Add social-media-publish hook for Bluesky and Mastodon - Bluesky: AT Protocol auth with app passwords, facets for rich text - Mastodon: Standard API with access token authentication - Add platform credentials to .env.example - Posts support scheduled publishing via status workflow Platforms not yet implemented: LinkedIn (requires OAuth), Instagram (requires Meta review) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When transcript_text is updated on a podcast, this hook extracts speaker names and fuzzy matches them to members in the database. Supports timestamp format (Name (00:12.534)) and colon format (Name:). Handles hyphen/space normalization for names like "Jan-Gregor". Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
985c493 to
be867ac
Compare
Code Review Summary - Podcast Automation (2026-01-30)
Overview
Implemented Phase 3.6, 3.7 (Content Review & Approval) and Phase 4 (Social Media Publishing) for the programmier.bar podcast automation system.
Changes Made
Directus hook triggered when podcast_generated_content status changes to approved
Copies approved shownotes to podcast description field
Updates podcast publishing_status to approved when all content items are approved
2. Social Media Publishing (src/social-media-publish/)
New hook with implementations for Bluesky and Mastodon
bluesky.ts: AT Protocol auth with app passwords, post creation with facets (URLs, hashtags, mentions via DIDs)
mastodon.ts: Standard REST API with access token auth
Triggered by setting social_media_posts status to publishing
Updates platform_post_id, platform_post_url, published_at on success
3. New Collection: social_media_posts
Setup script: utils/setup-social-media-posts.mjs
Fields: platform, status, post_text, scheduled_for, published_at, platform_post_id, platform_post_url, error_message, tags
Relations to podcasts and podcast_generated_content
O2M field added to podcasts collection
4. Configuration
Added social media credentials to .env.example (Bluesky, Mastodon, LinkedIn, Instagram placeholders)
Registered new hooks in package.json