Skip to content

add podcast player#224

Open
SpkArtZen wants to merge 4 commits intoopenhome-dev:devfrom
SpkArtZen:feature/podcast_player
Open

add podcast player#224
SpkArtZen wants to merge 4 commits intoopenhome-dev:devfrom
SpkArtZen:feature/podcast_player

Conversation

@SpkArtZen
Copy link

What does this Ability do?

Suggested Trigger Words

Type

  • New community Ability
  • Improvement to existing Ability
  • Bug fix
  • Documentation update

External APIs

  • No external APIs
  • Uses external API(s):

Testing

  • Tested in OpenHome Live Editor
  • All exit paths tested (said "stop", "exit", etc.)
  • Error scenarios tested (API down, bad input, etc.)

Checklist

  • Files are in community/my-ability-name/
  • main.py follows SDK pattern (extends MatchingCapability, has register_capability + call)
  • README.md included with description, suggested triggers, and setup
  • resume_normal_flow() called on every exit path
  • No print() — using editor_logging_handler
  • No hardcoded API keys — using placeholders
  • No blocked imports (redis, connection_manager, user_config)
  • No asyncio.sleep() or asyncio.create_task() — using session_tasks
  • Error handling on all external calls
  • Tested in OpenHome Live Editor

Anything else?

@SpkArtZen SpkArtZen requested a review from a team as a code owner March 23, 2026 13:01
@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 2026

🔀 Branch Merge Check

PR direction: feature/podcast_playerdev

Passedfeature/podcast_playerdev is a valid merge direction

@github-actions github-actions bot added the community-ability Community-contributed ability label Mar 23, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 2026

✅ Ability Validation Passed

📋 Validating: community/podcast-player
  ✅ All checks passed!

@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 2026

✅ Community PR Path Check — Passed

All changed files are inside the community/ folder. Looks good!

@github-actions
Copy link
Contributor

github-actions bot commented Mar 23, 2026

🔍 Lint Results

__init__.py — Empty as expected

Files linted: community/podcast-player/main.py

✅ Flake8 — Passed

✅ All checks passed!

@abubakar4360
Copy link
Contributor

Hey @SpkArtZen! The idea is great. Just a few things to fix before this can go through:

  1. This ability has a textbook menu-driven flow problem. The podcast path runs: speak 3 podcast names one by one → "Choose 1, 2, or 3" → speak 5 episode titles one by one → "Choose 1, 2, 3, 4, or 5" — that's 10 sequential spoken items plus two numbered-choice prompts with no LLM routing between them. Per the QA guide this must go through a manual voice test before approval. Run through it out loud and confirm it doesn't feel like a phone tree. The likely fix is collapsing both levels into a single open-ended prompt — "I found a few podcasts matching that. Which sounds right: The Daily, Crime Junkie, or Serial?" — and letting the LLM match the user's reply to the best option rather than forcing them to say a number.

  2. EXIT_WORDS = {"stop", "pause", "exit", "quit", "cancel"} is missing too many natural spoken exits. Add: "forget it", "never mind", "nevermind", "done", "bye", "that's all", "no thanks", "actually", "leave it". "pause" probably shouldn't be in this set at all — a user saying "pause" likely wants to pause playback, not exit the ability entirely.

  3. All five word-set checks — SURPRISE_WORDS, SEARCH_WORDS, ELSE_WORDS, WHATS_PLAYING_WORDS, and if "podcast" in text — are brittle in lower substring matches that will miss natural phrasing. A user saying "play something random", "I want to hear a podcast about true crime", "what's on right now", or "got anything else?" will fall through silently. Replace all five with a single LLM intent classifier that returns structured JSON — this ability is simple enough that one classifier handles the whole command space cleanly.

  4. The numbered list reading pattern — f"{i}. {ep['title']}" spoken one item per speak() call — produces stiff TTS output. "One. The Daily Monday Episode. Two. Up First from NPR. Three..." sounds like an IVR system. Collapse the list into a single natural sentence: "I found three options: The Daily, Up First from NPR, and Crime Junkie Weekly. Which one?"

  5. await self.capability_worker.speak(f"Error streaming audio: {e}") — a raw exception string is going directly to the user's speaker. Change to: "Had trouble loading that episode. Want to try a different one?"

  6. "What would you like to listen to? You can search for an episode, a podcast, or say surprise me." — 22 words. The second sentence is a menu read-out that front-loads options the user didn't ask for. Change to: "What do you want to listen to?"

  7. "Here are the latest five episodes of {selected_podcast['title']}:" followed by five separate speak() calls — same issue as point 4. Collapse to: "Here are the latest five from {title}: [episode 1], [episode 2]... Which one?" in a single speak call.

  8. "No podcasts found." and "No episodes found." are terse to the point of feeling broken. Change to: "Couldn't find any podcasts for that — try a different search." and "That podcast doesn't seem to have any episodes available."

Copy link
Contributor

@uzair401 uzair401 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @SpkArtZen, please address the issues pointed out by @abubakar4360. Once these are resolved, we will proceed further with approval.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community-ability Community-contributed ability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants