summaryrefslogtreecommitdiff
path: root/Biz/PodcastItLater
AgeCommit message (Collapse)Author
2025-11-22Merge task t-rWbMpxaBk: Metrics view in Admin dashboardBen Sima
2025-11-22Merge task t-1rf15iH: Audio crossfadingBen Sima
2025-11-22Merge task t-1neWD8r: Worker error handling testsBen Sima
2025-11-22Merge task t-1neWyaO: Admin dashboard testsBen Sima
2025-11-22Merge task t-1fbElKv: Implement change email address functionalityBen Sima
2025-11-22Merge task t-1fbDyr2: Implement delete account functionalityBen Sima
2025-11-22Merge task t-1f9Td4U: Navbar Styling CleanupBen Sima
2025-11-22Merge task t-1f9SnU7: Queue Status ImprovementsBen Sima
2025-11-22feat: implement t-1neWyaOBen Sima
2025-11-22feat: implement t-1fbElKvBen Sima
2025-11-22feat: implement t-1fbDyr2Ben Sima
2025-11-22feat: implement t-1f9Td4UBen Sima
2025-11-22Fix form method to POST for upgrade actionOmni Worker
2025-11-22Fix syntax error in UI.py (missing closing parenthesis)Omni Worker
2025-11-22Add type ignore to html.form in UI.pyOmni Worker
2025-11-22Fix mypy errors in Biz/PodcastItLater/UI.pyOmni Worker
Amp-Thread-ID: https://ampcode.com/threads/T-9e42644b-2a21-40e9-923c-e63f9026b0a6 Co-authored-by: Amp <amp@ampcode.com>
2025-11-22task: claim t-rWbMpxaBkOmni Worker
2025-11-22task: claim t-rWbMpxaBkOmni Worker
2025-11-22task: claim t-rWbMpxaBkOmni Worker
2025-11-22task: claim t-rWbMpxaBkOmni Worker
2025-11-22task: sync databaseOmni Worker
2025-11-21feat: implement t-1rf15iHBen Sima
2025-11-21feat: implement t-1neWD8rBen Sima
2025-11-20feat: implement t-144gQryBen Sima
2025-11-20feat: implement t-1f9SnU7Ben Sima
2025-11-20feat: implement t-1f9RIzdBen Sima
2025-11-20Implement Account Management PageBen Sima
Amp-Thread-ID: https://ampcode.com/threads/T-51eb1377-abce-430c-bde5-ef909ac79444 Co-authored-by: Amp <amp@ampcode.com>
2025-11-20feat: implement t-1f9RIzdBen Sima
2025-11-20feat: implement t-144gQryBen Sima
2025-11-20Merge branch 'task/t-PpYZt2' into liveBen Sima
2025-11-20doc: add design docs for open epicsBen Sima
- Omni/Task/DESIGN.md: Task manager improvements - Biz/PodcastItLater/DESIGN.md: Architecture and features - Biz/PodcastItLater/TESTING.md: Test strategy - Network/Wai/Middleware/Braid/DESIGN.md: Keep-alive design
2025-11-20feat: implement t-PpYZt2Ben Sima
2025-11-19Implement usage tracking and limits enforcementBen Sima
- Fix get_usage() to count from user_episodes table instead of episodes.user_id - Now correctly tracks when episodes are added to user's feed - Handles shared/existing episodes properly (count against the user who added them) - Add comprehensive test suite for usage limits (TestUsageLimits): - test_usage_counts_episodes_added_to_feed - test_usage_counts_existing_episodes_correctly - test_free_tier_limit_enforcement (10 articles) - test_can_submit_blocks_at_limit - test_paid_tier_unlimited - Billing.can_submit() now properly enforces 10 article limit for free tier - Usage tracking via user_episodes.added_at ensures accurate billing Completes t-144eKR1
2025-11-18Change RSS feed URLs from .xml to .rss with backwards compatibilityBen Sima
- Change primary feed URLs to use .rss extension (more semantically correct) - /feed/{token}.xml -> /feed/{token}.rss - /public.rss stays the same - Add .xml aliases for backwards compatibility - /feed/{token}.xml redirects to .rss handler - /public.xml redirects to .rss handler - Add tests to verify both extensions work and return identical content - Update all references in UI and tests to use .rss This provides consistency (.rss everywhere) while maintaining backwards compatibility for existing feed subscribers using .xml URLs. Amp-Thread-ID: https://ampcode.com/threads/T-6d73d458-3d80-44e5-865f-358a69e5b2bf Co-authored-by: Amp <amp@ampcode.com>
2025-11-18Fix homepage auto-refresh and add test coverage for admin workflowsBen Sima
- Fix dashboard-updates endpoint to return Response with both components concatenated as HTML strings, preventing episodes from disappearing after HTMX innerHTML swap - Add viewing_own_feed flag to EpisodeList to hide 'In your feed' button when users are viewing their own feed on homepage - Add test coverage for admin adding user episodes to own feed - Add test coverage for admin adding user episodes to public feed Amp-Thread-ID: https://ampcode.com/threads/T-6d73d458-3d80-44e5-865f-358a69e5b2bf Co-authored-by: Amp <amp@ampcode.com>
2025-11-18Add 'Add to my feed' button to public feed for logged-in usersBen Sima
When viewing the public feed (or any episode list), logged-in users now see: - 'Add to my feed' button if episode is not in their feed - 'In your feed' button (disabled) if they already have it Implementation: - Added user_button logic to EpisodeList component - Checks Core.Database.user_has_episode() for each episode - Shows blue outline button for add action - Shows gray disabled button when already added - Buttons displayed in flex row with admin buttons Updated add_episode_to_feed endpoint: - Changed to redirect back to referer page after adding - Uses HX-Redirect to reload the page showing updated state - This allows the button to change from 'Add to my feed' to 'In your feed' All tests passing (48 tests)
2025-11-18Fix type mismatch in track_episode_metric loggingBen Sima
Changed logger format from %d to %s for episode_id to handle cases where the ID might be passed as a string from route parameters. Error was: Message: 'Tracked %s event for episode %d (user: %s)' Arguments: ('added', '2', 1) Using %s is more flexible and works with both int and str types.
2025-11-16Improve privacy and UX for public feed controlsBen Sima
Privacy improvements: - Removed email address from episode page signup banner - Changed 'This episode was created by <email>' to 'This episode was created using PodcastItLater' - Protects user privacy while still showing the signup prompt Admin UI improvements: - Removed floating Public/Private toggle button (was confusing) - Added '+ Add to public feed' button at bottom of episode cards - Button only visible to admin users - Shows 'Added to public feed' with checkmark when already public - Shows '+ Add to public feed' with plus icon when private - Clearer and more actionable UX for managing public feed content All tests passing (48 tests)
2025-11-16Fix public feed display and admin access issuesBen Sima
Issue #1: demo@example.com admin status - Confirmed demo@example.com IS in ADMIN_EMAILS (working as intended) - Both Core.py and UI.py have demo@example.com in whitelist Issue #2: /public page auto-refresh causing disappearing articles - Created PublicFeedPage component without auto-refresh - Separated from HomePage which has dashboard auto-updates - /public route now uses PublicFeedPage instead of HomePage Issue #3: Homepage missing public feed for logged-out users - Updated HomePage to show public feed when user is not logged in - Shows login form with public episodes below - Includes marketing message: 'Sign up to create your own personal feed!' - Public episodes are fetched and displayed prominently Additional improvements: - Added 'Public Feed' link to navbar for easy access - PublicFeedPage shows RSS feed link for public.rss - Clear separation between user dashboard (auto-refresh) and public feed (static) All tests passing (48 tests)
2025-11-16Add admin@example.com to admin whitelistBen Sima
- Added admin@example.com to ADMIN_EMAILS in Core.py and UI.py - This provides a demo admin account for testing - Public/Private toggle badge already checks for admin status correctly - All tests passing
2025-11-16Add admin metrics dashboardBen Sima
- Added Core.Database.get_metrics_summary() for aggregate stats - Added Core.Database.get_episode_metric_events() for raw event data - Created MetricsDashboard component with summary cards and top episodes tables - Added /admin/metrics route with admin authentication - Added metrics link to admin dropdown menu - Added comprehensive tests for metrics functionality - Fixed type errors in Admin.py by adding MetricCardAttrs - All tests passing (48 tests total in Web.py) - Completed epic t-ga8V8O (24/24 tasks)
2025-11-16Add audio intro/outro and comprehensive testsBen Sima
- Enhanced Worker.py to extract publication date and author from articles - Added intro TTS with metadata (title, author, publication date) - Added outro TTS with attribution - Combined intro, pauses, content, and outro in Worker.py - Added comprehensive tests for public feed, deduplication, metrics, and intro/outro All tests passing (Worker: 30 tests, Web: 43 tests) Tasks completed: - t-gcNemK: Extract metadata in Worker.py - t-gcPraJ: Add intro TTS generation - t-gcRCzw: Add outro TTS generation - t-gcTPQn: Combine audio segments - t-gcW6zN: Tests for public feed - t-gdlWtu: Tests for deduplication - t-gdoeYo: Tests for metrics tracking - t-gdqsl7: Tests for audio intro/outro
2025-11-16Add metrics tracking endpoint and JavaScript for play eventsBen Sima
- Added POST /episode/{id}/track endpoint to track play/download events - Added JavaScript to audio player to track first play event - JavaScript sends fetch request to tracking endpoint on play - Tracks user_id if logged in, otherwise anonymous - Added main() function to Episode.py for test compatibility Tasks completed: t-gcdFSb, t-gcfTnG
2025-11-16Add 'Add to feed' button on episode pages and fix typecheck.shBen Sima
- Episode pages now show 'Add to feed' button for logged-in users who don't have the episode - Added POST /episode/{id}/add-to-feed endpoint - Tracks 'added' metric when user adds episode to their feed - Added Database.track_episode_metric() function for metrics tracking - Fixed typecheck.sh to use bild instead of broken repl.sh approach Tasks completed: t-gc9aud, t-gcbqDl
2025-11-16Add admin toggle for episode public/private statusBen Sima
- Add toggle button to episode cards (admins only) - Button shows globe icon for public, lock icon for private - Toggle endpoint at POST /admin/episode/{id}/toggle-public - Updates episode is_public status and redirects to home Tasks completed: t-gcbqDl, t-gc6Vrk (partially - admin toggle complete)
2025-11-16Fix pre-existing test failures in Web.pyBen Sima
- test_session_persistence: Check for navbar links instead of removed 'Logged in as:' text - test_delete_action: Add referer header to trigger HX-Redirect response
2025-11-16Fix test failures by adding episodes to user_episodes junction tableBen Sima
When tests create episodes directly, they must also add them to the user_episodes junction table for them to appear in user feeds. This maintains the new many-to-many relationship architecture. Test suite now has same 2 pre-existing failures as before (unrelated to this work): - test_session_persistence (expects 'Logged in as:' text that doesn't exist) - test_delete_action (expects HX-Redirect header from admin delete) All new functionality tests pass.
2025-11-15Add public feed routes and update home pageBen Sima
- Add /public route showing public episodes - Add /public.rss RSS feed for public episodes - Update home page to show public feed when not logged in - Use user_episodes junction table instead of user_id filtering - All tests passing
2025-11-15Implement episode deduplication in submission flowBen Sima
- Check for existing episodes by URL hash before processing - Reuse existing episodes when user submits duplicate URL - Add episode to user's feed if they don't have it - Track 'added' metrics when episode added to feed - Worker now creates user_episodes link and tracks metrics - Show appropriate messages for already-in-feed vs newly-added episodes
2025-11-15Add database migrations for public feed, metrics, and deduplicationBen Sima
- Add is_public column to episodes table - Add user_episodes junction table for many-to-many relationship - Add episode_metrics table for tracking engagement - Add original_url_hash column for deduplication - Add Core.py functions for public episodes (mark_public, get_public_episodes) - Add Core.py functions for user_episodes (add_episode_to_user, user_has_episode, get_user_episodes) - Add Core.py functions for metrics tracking (track_episode_event, get_episode_metrics) - Add URL normalization and hashing utilities - All tests passing