Repository navigation
Releases: BladeWDR/antennapodder
Release list
v0.1.8
Release Notes: v0.1.8
Highlights
Theme Accent Color Customization
• Catppuccin Accent Swatches: Choose from 12 preset Catppuccin accent colors in the Settings dialog: Mauve, Lavender, Blue, Sapphire, Sky, Teal, Green, Yellow, Peach, Maroon, Red, and Pink.
• Custom Color Picker: Select any custom accent color using an interactive color input.
• Instant Live Preview & Persistence: Accent selections take effect immediately across both Mocha (dark) and Latte (light) themes and persist across sessions via the backend API.
Feed & Episode State Fixes
• Accurate Unplayed Counts: Fixed an issue where historical played episode records could cause inaccurate unplayed counts when older episodes roll off an RSS feed. Played status is now properly scoped to active feed episodes by GUID and enclosure URL.
• Strict Publication Date Sorting: Podcasts sorted by "Recently updated" now order strictly by actual episode release date (latest_pub_date) rather than falling back to last_fetched_at.
• Improved Batch Mark As Played: Enhanced mark-all-played resolution to match episodes by both GUID and enclosure URL.
──────
Detailed Changelog
Features
• Support primary accent color in backend configuration and API (db.js, web-api.js)
• Add Catppuccin accent color palette and swatch styles (app.css)
• Implement accent color picker and swatches in Settings UI (index.html, app.js)
Bug Fixes
• Accurately count unplayed episodes when older played episodes roll off feed (db.js)
• Sort podcasts strictly by latest episode publication date (app.js, db.js)
Tests & Performance
• Add index on episodes(podcast_id, enclosure_url) to optimize unplayed episode counts (db.js)
• Add unit and end-to-end tests for theme settings and accent color management (app.test.js, e2e.test.js)
• Add tests for unplayed count accuracy with rolled-off feed items and publication date sorting (favorites-and-sorting.test.js)
Full Changelog: v0.1.7...v0.1.8
v0.1.7
Features
• Play from Beginning Option: Added a dedicated "Play from Beginning" button to the episode details modal (showEpisodeDetailsModal, updateEpisodeDetailPlayBtn), enabling one-click restarts of in-
progress or completed episodes without scrubbing.
Bug Fixes
• Episode Deduplication: Resolved duplicate cards appearing in "Continue Listening" and "Favorites" when podcast feeds update an episode's GUID while keeping the enclosure URL identical
(getInProgressEpisodes, getFavoriteEpisodes).
• Older SQLite Version Compatibility: Rewrote the deduplication subquery in db.js:636-686 using COALESCE with individual subqueries to ensure compatibility across older SQLite versions.
• Playback Error Diagnostics: Added actionable diagnostic toast notifications in app.js:1495 when audio streams fail to load, including detection and helpful hints for ad blockers and DNS shields
(such as Pi-hole or uBlock Origin) blocking third-party podcast tracking redirect domains.
• Safe Position Seeking: Deferred audio and video position seeking until media metadata is fully loaded to prevent playback race conditions.
CI & Automated Testing
• Deduplication Tests: Added unit tests in dedupe-episodes.test.js validating episode state joins across GUID mutations.
• GitHub Actions Workflow: Added automated continuous integration in test.yml running test suites against pull requests and pushes to the main branch.
Full Changelog: v0.1.6...v0.1.7
v0.1.6
Added
• Continue Listening carousel: Replaced multi-row wrapping in Continue Listening with a single-row carousel
featuring left and right navigation buttons.
• Sort direction toggle: Added a toggle button next to the podcast sort dropdown to switch between ascending and
descending order.
Fixed
• Playback state reset on delete/download actions: Fixed an issue where AntennaPod auto-deleting completed episodes
(or downloading files) sent delete/download actions that reset is_played to unplayed and wiped position back to 0.
• Automatic playback reconciliation: Added a startup migration that automatically restores is_played and playback
position for episodes affected by non-playback actions.
• Raw HTML in episode snippets: Resolved an issue where episode descriptions on individual podcast views rendered
raw HTML markup instead of plain text snippets.
• XSS and template attribute sanitization: Implemented HTML sanitization for podcast and episode show notes and
ensured proper attribute escaping to prevent injection vulnerabilities.
• Static file path traversal containment: Added strict filesystem boundary validation for static file routing.
v0.1.5
What's Changed
- Use distinct undo icon for Mark Unplayed button by @FuzzyMistborn in #1
- Speed up opening podcasts with large episode lists by @FuzzyMistborn in #2
New Contributors
- @FuzzyMistborn made their first contribution in #1
Full Changelog: v0.1.4...v0.1.5
v0.1.4
Added
• OPML Import: Added full OPML import support via web-api.js:163-218, Settings, and the Add Podcast modal. Feeds are imported in bulk, immediately queued for background sync, and synchronized across
connected AntennaPod devices.
• Episode Details Modal & Info Button: Added an episode information ("i") button to each episode in the podcast view. Clicking opens a modal displaying episode/season badges, publication date,
duration, playback status, direct Play action, and formatted show notes.
• GitHub Repository Header Link: Added a GitHub button to the top-right navigation bar linking directly to the project repository.
• Multi-Device Sync Test Suite: Added a dedicated test suite in three-way-subscription-sync.test.js verifying two-way delta sync between multiple mobile devices and the Web UI.
• OPML Parser Test Suite: Added comprehensive unit and integration tests in opml-import.test.js validating nested outlines, entity decoding, and edge cases.
Fixed
• Secondary Device Pairing in AntennaPod: Fixed an error where registering a second AntennaPod client failed with no value for subscriptions by including the subscription count in db.js:313-324 for
/api/2/devices/:username.json.
• In-Progress Carousel Unsubscribe Filtering: Fixed a bug where in-progress episodes from unsubscribed podcasts remained visible in the "Continue Listening" carousel by joining active subscriptions
in db.js:571-593.
• Database Parameter Binding: Fixed a SQLite parameter error in db.js:450-474 by defaulting optional metadata fields to null instead of undefined.
• Immediate Subscription Display: Updated db.js:335-358 to use a LEFT JOIN on podcasts so newly subscribed feeds appear in the library immediately even while initial feed downloads are in progress.
Changed
• OPML Settings Section: Updated the Settings backup section to "OPML Backup & Import" with side-by-side Export and Import buttons.
• Button Link Styling: Added text-decoration: none; to base .btn styles in app.css:163-177 to ensure consistent appearance across button elements and anchor tags.
• Documentation: Updated README screenshots and feature descriptions for OPML import and export capabilities.
Full Changelog: v0.1.3...v0.1.4
v0.1.3
Changelog: v0.1.2 → v0.1.3
Added
• Now Playing Modal Navigation: Clicking the podcast name in the Now Playing modal now navigates directly to that podcast's detail page in your library (app.js, index.html, app.css).
• Fullscreen Video Controls: Added an interactive overlay player bar, scrubber, and playback controls to the fullscreen video player (app.js, app.css).
• Theme Color-Schemes: Added native color-scheme: dark and color-scheme: light properties to align browser native form elements, menus, and scrollbars with Catppuccin Mocha and Latte themes (app.css).
Fixed
• Session Persistence & Refresh Login Prompt:
• Fixed an initialization TypeError where a missing DOM element reference (modalBadgeSkipForward) caused app.js to trigger the login modal on page reload (app.js).
• Added session cookie expiration, SameSite=Lax, and dynamic Secure flags, as well as cookie token parsing fixes (web-api.js).
• Fullscreen Video Player:
• Removed default browser white focus outline/border on the fullscreen speed selector dropdown (app.css).
• Decoupled vendor-prefixed :fullscreen and :-webkit-full-screen CSS selectors to avoid cross-browser rule invalidation (app.css).
• Fixed speed selector rendering and option value synchronization across audio and video player bars (app.js).
Full Changelog: v0.1.2...v0.1.3
v0.1.2
Added
• Mark All as Played: Added a "Mark All Played" button in the podcast detail header with an unplayed episode count confirmation prompt (db.js, web-api.js, index.html, app.js).
• Episode Multi-Select and Batch Actions: Added selection mode to the episode list toolbar, selectable episode cards with checkboxes, and a batch action bar with Select All, Deselect All, Mark Selected as Played, and Done actions (index.html, app.css, app.js).
• Batch Played Sync Endpoints: Added POST /api/episodes/mark-played-batch and POST /api/podcasts/:id/mark-all-played endpoints with SQLite transaction handling and delta action logging (action = 'play') for two-way AntennaPod synchronization (web-api.js, db.js).
• OPML Subscription Export: Added GET /api/subscriptions/export.opml endpoint and an "Export OPML" button in the Settings view to export all active subscriptions in standard OPML 2.0 XML format (feed-parser.js, web-api.js, index.html).
• Test Suite: Added unit and integration tests covering batch playback state updates, mark-all-played filtering, and AntennaPod sync action recording (batch-mark-played.test.js).
Fixed
• HTML Entity Decoding: Fixed raw HTML entity escape sequences (such as ', ", &, ’, and numeric character references like ’ or ') rendering literally in podcast titles, episode titles, authors, and show notes (feed-parser.js, db.js, app.js).
Changed
• Documentation: Updated README.md feature list to include OPML export, batch episode actions, and the Mark All Played functionality.
• Assets: Refreshed UI screenshot in screenshot.png to display recent interface elements.
Full Changelog: v0.1.2...v0.1.2
v0.1.1
Added search function.
Updated behavior of continue playing carousel and now playing bar, they will now disappear when not needed.
Full Changelog: v0.1.0...v0.1.1
v0.1.0 - initial release
Initial release of AntennaPodder.