Skip to content

v0.4.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Mar 22:34
cd9ecbe

Changes

New Features

http: Remove MP3 files from cache after download cd9ecbe

download: Add `--replace` flag to re-download existing episodes 8c02679
  • Add replace: bool to DownloadRequest and --replace CLI flag to DownloadOptions
  • Add delete_existing_step to remove old files before re-downloading
  • Deletion is best-effort (warns on failure) since the pipeline will overwrite or fail anyway
  • Handles naming convention changes by deleting at old path and writing to current path
dioxus: Add podcast from UI with form and server function #20 859aa74
  • Add form with slug and feed URL fields to AddPodcastPage
  • Add server function to trigger add command via AddHandler
  • Refactor Field component: remove Copy bound, make unit optional, replace use_effect with direct validation in oninput
  • Add e2e tests for add podcast page including full integration test
  • Pass typed Slug and UrlWrapper directly to server function instead of raw strings
  • Use #[expect] with reasons for lint suppression attributes
  • Remove unnecessary waitForTimeout calls in e2e tests
dioxus: Add release Docker build target #21 40020b8

Unify dev and release Dockerfiles into a single multi-stage build with
two targets (dev, release). The release target builds an optimized
production image using a minimal Debian runtime.

Bug Fixes

Use miette `.render()` for `Report` error logging instead of `Debug` 743f77f
  • Enable studiole-report/render feature behind the server feature gate
  • Replace {error:?} with error.render() in CLI and server error logging
  • Non-Report errors (DbErr, io::Error, channel errors) left unchanged
migration: Escape literal `%` in SQL `LIKE` clauses of episode path migration #19 58ba547
  • Use ESCAPE '!' syntax so % matches literally instead of as wildcard
  • Add clean episode to test to verify unaffected rows are unchanged
Remove # and % from episode file paths #19 a52991e
  • Add # and % to restricted characters in Sanitizer
    • Add migration to rename existing files and update database paths
    • Inject PathProvider into migrations via static OnceLock
    • Add edit_podcast/edit_episode callbacks to MockFeedsFactory

Performance

metadata: Enable SQLite WAL journal mode to reduce write contention c9cd8a5

Concurrent episode downloads were blocking on SQLite's default rollback
journal, causing UPDATE statements to take 2-4 seconds. WAL mode allows
concurrent writes without file-level lock contention.

Dependencies

Upgrade workspace dependencies and fix breaking changes d11b1a0
  • Upgrade lofty 0.22 to 0.23 (replace set_year with set_date using Timestamp)
  • Upgrade fast_image_resize, sea-orm, dioxus, and other dependencies
  • Bump DX_VERSION in docker/dioxus/Dockerfile to 0.7.3
  • Fix clippy if_then_some_else_none warning in actions.rs

Refactor

di: Migrate to `studiole-di` v0.3, `studiole-command` v0.2, `studiole-report` v0.4 90ae72f
  • Replace Service trait with FromServices/FromServicesAsync split
  • Replace ServiceProvider::new() with ServiceBuilder::new().with_core().build()
  • Replace get_service::<T>() with get::<T>() (sync) or get_async::<T>() (async)
  • Replace ServiceError variants with ResolveError equivalents
  • Add with_core.rs for explicit ServiceBuilder registration of all core services
  • Remove attach_path from CustomReportExt (now provided by studiole-report v0.4)
  • Pin studiole-* dependency versions to exact semver
Replace `error-stack` with `studiole-report` and extract `command`, `di`, `di-macros` to separate crates 6144f5e
  • Remove in-tree packages/command, packages/di, packages/di-macros
  • Add studiole-command, studiole-di, studiole-report as workspace dependencies
  • Migrate attach(format!("Key: {val}")) to structured attach("Key", val)
  • Replace bail! with explicit return Err(Report::new(...))
  • Replace downcast_ref with current_context in EmulateCommand
  • Split CustomResultExt into CustomReportExt and CustomResultExt for Report and Result respectively

Tests

e2e: Centralise timeouts and fix flaky `podcast.spec.ts` test 88ae7b2
  • Add shared TIMEOUTS config in playwright.config.ts for hydration and UI waits
  • Replace magic number timeouts in add.spec.ts with named constants
  • Remove waitForLoadState("networkidle") from podcast.spec.ts which times out when the podcast has many episodes
  • Remove unreachable 120s webServer.timeout and always reuse existing server

Other

dioxus: Add Playwright frontend tests #12 83ccff5
  • Add e2e/ directory with Playwright configuration
  • Write tests covering index, podcast, episode, and settings pages
core: Use mock RSS feed for add/fetch handler tests #4 4dc0d29
  • Add MockServices::with_rss_feed() to prime HTTP cache with mock data
    • Generate RSS XML from MockFeeds using PodcastToRss
    • Export PodcastToRss from emulate module
    • Remove example_rss_url constant (replaced by MockServices::rss_url())
    • Update add_handler, fetch_feed_rss, and fetch_handler tests
    • Add snapshot test for fetch_feed_rss