v0.3.0
Changes
New Features
fetch: Follow new_feed_url redirects when fetching feeds #17 4e9d62c
fetch: Make podcast slug of fetch cli command optional so it now fetches all by default #16 e046a1c
di: Add
Servicederive macro to simplify service construction across commands e866722
Split
Scrapeinto separateAddandFetchcommands 2e4b893
core: Add rate limiting to
HttpClient. Move cache logic toHttpCacheservice. Remove default implementation fromPathProviderandHttpClientas it neglects the cache path. c16ee13
dioxus: Add an episode download button which triggers a download on the server command runner which in turn sends an event stream back to the web which updates the button icon. Replace Dioxus Lazy init with tokio OnceCell due to returned instances not being consistent. b0e0ccf
Add option for hardlinking from cache to data directory. Fix the automatic determination if it's possible. 8eb00e5
command: Add events subscriber to
CommandMediatorand replace progress implementation with events tracking 57c3a05
command: Revise command macro to work in WebAssembly 7f2e154
command: Track the status of commands by storing a hashmap of
CommandStatus7eb518d
emulate: Only create feeds with episodes e69912f
Implement a generic
CommandRunner1e0bd8a
Revise
DownloadCommandto download each episode individually and call it with aCommandRunner93f6247
Revise
ServiceProviderto construct services on demand eaf14da
Introduce API to retrieve partial structs from db 9f3c842
dioxus: Use Lazy to provide ServiceProvider as global state f39333d
Store metadata as a SQLite db and access using SeaORM d9e01a9
Improve error handling in PodcastsContext 7456e96
Added placeholder AddPodcastPage 9ace784
Setup loading and not found messages for EpisodePage and PodcastPage 5d964a3
Display a SkeletonMediaObject on the index page when loading 228e34a
Added Button component 0afe450
Added Icon component 4b7f6ed
Introduce MediaObject component to remove repetition 68e5487
Introduce previous property to RouteInfo 82c1e8d
Add app bar 7fa1797
Position floating action buttons above navigation bar eeb72f6
Add tabs for navigation 43e235c
Convert HTML to plain text e57e466
Format duration in a human form e015868
Use Uuid for EpisodeInfo.id 0a3cec4
Change anchor background on hover 550dbe2
Add header to PodcastPage 03b5701
Add EpisodePage e9be2d1
Add PodcastPage with episode list f228244
Introduce
PodcastsContext505b4e7
Bug Fixes
emulate: Exclude
new_feed_urlfrom created feeds 426a1e9
fetch: Revise
update_feedso existing episodes are matched and updated rather than being overwritten #1 db74b02
download: Fix progress bar missing queue events in
DownloadCliCommand36f4819
command: Prevent race condition when getting instructions by calling notify at start. Fix off-by-one when creating workers. Wait for workers to start before proceeding. Add additional trace logs 9794e86
http: Overwrite files if they already exist 5b6915e
http: Check if downloaded file is empty 7ab2533
emulate: Skip episodes that have not been downloaded 8a7dc9a
download: Check tag types before removing to avoid APE index out of bounds panic 056bd5a
Fix hover colors on light theme 0c994b9
Copy fonts from npm in Dockerfile 3d5fb72
Support alternative duration formats deab02b
Performance
download: Directly execute the update statement to avoid sea orm returning the updated model 85938b4
Build
Revise dioxus docker to use target volume 915aec0
Dependencies
Update dependencies b60a1b1
Remove unused dependency 5f3be34
Documentation
download: Add inline documentation for
DownloadHandlerand related structs 7cc4bd1
Add comprehensive build and installation guides for CLI and web app c9dc7e0
Code Style
Apply code style with clippy f3cb251
Add .editorconfig 19257c0
Apply code style with clippy 2ee86c7
Apply code style with clippy 1895cdc
Apply code style with clippy 4b3730f
Refactor
core: Relocate
insert_episodesandupdate_feedunder respectiveAddandFetchcommands b009a93
metadata: Split
save_feedintocreate_feedandupdate_feedwith SQL snapshot tests. 35c2822
metadata: Extract reusable functions for podcast and episode operations. Add unit tests and snapshots for SQL generation. 469cb46
core: Add validation methods to UrlWrapper. Replace occurrences of
UrlwithUrlWrapper3afd117
Warning
Breaking Change: di: Replace add_instance with chained with_instance for improved ServiceProvider API fluency #8 934e0a8
command: Create a concrete
CommandEventvia macro with serialization support 1972c10
command: Replace
CommandResultwith explicitResult<CommandSuccess, CommandFailure>681c943
command: Remove unused error d054732
command: Move logic to
CommandMediatorto prevent leaking internal details. Store progress as a struct 0192557
command: Remove unnecessary
Arc85395aa
Introduce episode helpers 9a7e29a
Introduce
UrlWrapper825a7b2
Use explicit
Slugstruct and type aliases ebdbf0f
dioxus: Move logic to dedicated start function c31a74c
dioxus: Reduce logging verbosity for dioxus 06fa5b3
Use explicit selects
FromQueryResultinstead ofDerivePartialModeland reduce number of partials 5cb2099
Warning
Breaking Change: Merge services and commands into core gated by feature c4a6117
Replace
UrlinEpisodeInfoandPodcastInfowith String 21bbbd7
Rename component to
Pagebdb33b6
Fix spacing of main content 3c72a33
Use overlay color for Drawer, AppBar and NavigationBar c4ab86b
Move logic to
NavigationBare528e29
Icons above text in navigation bar c9b0150
Use
Buttonapp bar back ad10a9e
Use
divinstead ofheaderfor MediaObject 42ddbdf
Introduce Main component that handles the AppBar 0edee2c
Replace overly complex flexbox layout with fixed 9e549d8
Move logic to Breadcrumbs component 832a786
Move Drawer to components a64695e
Invert the Drawer implementation to remove nesting. 5f2f1fe
Invert the floating action button implementation to remove nesting. ec63472
Invert the bulma Menu implementation to remove nesting. eeb86ba
Move conversion logic to
alnwick_services41792fd
Move file extension constants to separate module e4fa765
Combine multiple errors correctly 469f064
Remove redundant
take()54a94ab
Move logic to PodcastFeed, PodcastInfo and EpisodeInfo 6ee2ea8
Rename to IndexPage for simplicity 8bb6598
Re-style PodcastsPage to match PodcastPage e576548
Store podcasts as a
HashMap17178a3
Move logic global value setting logic to
use_effecthook dae5ed2
Add
SettingsContext::consume()8b0c7e5
Move logic to
SettingsContext::create()74ef1b7
Tests
Revise emulate and cover tests to use
TestServiceProvider900a4c2
Update test results 889ca05
Ignore example.com tests f0a5342
Use isolated test logger throughout 317a5ff
Add test_logging 31c977e
core: Add test for database structure 95fed6a
Test SQL snapshots of API cde0cad
Add RSS conversion test b7a1d9b
CI
Add
check_argsto CI workflow configuration 0cc1976
Add Homebrew release fe8adeb
Chores
core: Derive
Copy,Eq, andPartialEqfor error types and improve inline documentation 1ddad3a
Reduce the default logging verbosity 8f671b3
Other
Improve consistency of mock database use. Introduce
MockFeedsand removeMetadataRepositoryExample. RenameTestServiceProvidertoMockServices#4 d67cb1e
Use constants for example slugs and url c3c659b
Add
MetadataRepositoryExample901dbbd