Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
03d324c
refactor(ui): move components to feature folders and remove duplicates
therobbiedavis Jan 23, 2026
c0c636c
Refactor modals to use shared ModalBody component
therobbiedavis Jan 24, 2026
9dc8b99
Refactor settings UI and add comprehensive tests
therobbiedavis Jan 30, 2026
229310c
Revert "Refactor settings UI and add comprehensive tests"
therobbiedavis Jan 30, 2026
a6fd197
Reapply "Refactor settings UI and add comprehensive tests"
therobbiedavis Jan 30, 2026
63b57ba
Remove release notes and temporary utility scripts
therobbiedavis Jan 30, 2026
1bc553a
Remove structural improvements documentation
therobbiedavis Jan 30, 2026
c75e958
Reorganize UI components and add base UI
therobbiedavis Feb 2, 2026
881f6cc
Bump Listenarr.Api version to 0.2.47
therobbiedavis Feb 2, 2026
5e11c48
Merge branch 'canary' into feature/prowlarr-integration
therobbiedavis Feb 2, 2026
a6e4217
Improve credential handling and UI styles
therobbiedavis Feb 2, 2026
6e24a6c
Add search tests, helpers & UI refactor
therobbiedavis Feb 4, 2026
82f37fe
Revamp audiobook modals; add Calendar nav
therobbiedavis Feb 4, 2026
b6ec50b
Add dual file naming patterns (single/multi-file)
therobbiedavis Feb 9, 2026
099db8e
Add hardlink/copy move support and volume check
therobbiedavis Feb 10, 2026
8353e80
Add Prowlarr import, download history, UI tweaks
therobbiedavis Feb 13, 2026
61643fa
Add failed-download handling and UI tweaks
therobbiedavis Feb 14, 2026
6f0bfab
Use EFVersion property for EF packages
therobbiedavis Feb 14, 2026
2a3faf5
Improve download metadata handling and EF comparer
therobbiedavis Feb 14, 2026
5ee9a47
Polish card styles and tighten layout spacing
therobbiedavis Feb 14, 2026
7b4b7b6
Enhance dropdowns, author covers, and caching
therobbiedavis Feb 15, 2026
9cd4cba
Adjust audiobooks layout and scroll height
therobbiedavis Feb 15, 2026
f25bc29
Adjust audiobooks layout spacing and scroll height
therobbiedavis Feb 15, 2026
bc0cd9e
Cleaning up documentation
therobbiedavis Feb 15, 2026
f321a7c
Simplify wanted flag; fix deletion & tests
therobbiedavis Feb 15, 2026
96ea68d
Tests: add FileUtils batch collision test
therobbiedavis Feb 15, 2026
1b082c2
Unskip test and adjust seeded orphaned download
therobbiedavis Feb 15, 2026
3fdb0c0
Mock IFfmpegService in TestServiceFactory
therobbiedavis Feb 15, 2026
ee45e5e
Add test web factory and make DB path configurable
therobbiedavis Feb 16, 2026
468c830
Use 'Test' environment name instead of 'Testing'
therobbiedavis Feb 16, 2026
9c78f12
Honor test SQLite path and disable hosted services
therobbiedavis Feb 16, 2026
6d237fc
Fallback to copy if hardlink fails
therobbiedavis Feb 16, 2026
9cd583b
Improve logging and file import safety
therobbiedavis Feb 16, 2026
26a84a9
Normalize folder path separators
therobbiedavis Feb 17, 2026
6c5e4aa
Use multi-file naming pattern for imports
therobbiedavis Feb 17, 2026
5775ca4
Use injected HttpClient for qBittorrent auth
therobbiedavis Feb 17, 2026
e05274e
Add QBittorrentHelpers and improve adapters
therobbiedavis Feb 17, 2026
42d272f
Prefer IHttpClientFactory; fallback to cookie client
therobbiedavis Feb 18, 2026
c762ca3
Clarify qBittorrent auth error message
therobbiedavis Feb 18, 2026
3b417ed
Bump dependencies and regenerate lockfiles
therobbiedavis Feb 18, 2026
1633901
Prefer cached author images via stored ASIN
therobbiedavis Feb 18, 2026
bc0860f
Probe DB for author ASIN when cached NotFound
therobbiedavis Feb 18, 2026
b5c1b6a
Prefetch routes, UI/overlay tweaks, and type fixes
therobbiedavis Feb 18, 2026
82bdd79
Add loading indicators and tests
therobbiedavis Feb 18, 2026
bf09764
Mock GetAuthorAsinByNameAsync in tests
therobbiedavis Feb 18, 2026
147eaf9
Update CHANGELOG for 0.2.48
therobbiedavis Feb 19, 2026
48332a0
Case-insensitive DDL, runtime normalization
therobbiedavis Feb 19, 2026
0ffb01f
Enhance test setup, clearFilters, and tests
therobbiedavis Feb 19, 2026
774fa7e
Persist per-group sort state; adjust UI
therobbiedavis Feb 19, 2026
7b2c24e
Redesign CustomFilterModal UI and styles
therobbiedavis Feb 19, 2026
18a55bf
Validate and sanitize image paths; improve moves
therobbiedavis Feb 19, 2026
8e8df78
Reject rooted paths and symlink images
therobbiedavis Feb 19, 2026
3267637
Potential fix for code scanning alert no. 327: User-controlled bypass…
therobbiedavis Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
35 changes: 31 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,36 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.2.48] - 2026-01-14

### Added
- **Prowlarr compatibility improvements**: `POST /api/v1/indexers`, `POST /api/v1/indexer` and `PUT /api/v1/indexer/{id}` now accept varied payload shapes (nested `settings`, `fields` arrays and multiple property name variants) and return standard DTOs with non-null `fields` and `tags` for better interoperability.
- **Toast suppression**: Global message-level and per-indexer toast suppression to reduce notification noise during rapid indexer imports (default suppression window: 5 seconds).
- **Settings — loading UI**: Added visible loading indicators and a `LoadingState` placeholder to Settings tab components (`QualityProfilesTab`, `NotificationsTab`, `RootFoldersSettings`, `IndexersTab`, `DownloadClientsTab`). Inline header spinners and unit tests were added to improve perceived responsiveness during async loads.


### Changed
- **`ProwlarrCompatController` behavior**:
- `PUT /api/v1/indexer/{id}` implements upsert semantics (creates when missing) and **deduplicates** by normalized URL + API key. Deduplication runs client-side (pulls results with `AsNoTracking().ToList()` then normalizes) to avoid EF translation issues.
- Removed early create-time broadcast in `PUT` and compute `created` after dedupe so `IndexersUpdated` is broadcast once (prevents duplicate broadcasts/toasts).
- `DELETE /api/v1/indexer/{id}` tolerates `id == 0` from external clients and returns an empty JSON object with a warning log to avoid noisy caller errors.
- **General Settings — API Key control**: Improved the API key input in the General Settings tab—input is full width with an inline visibility toggle and the regenerate/copy buttons placed inside the input (order: visibility, regenerate, copy). The regenerate button uses a red hue to indicate the key will be invalidated, and the copy button uses a blue hue. Functionality is unchanged and unit tests pass locally.
- **PasswordInput component**: Added a named `append` slot to `PasswordInput.vue` so callers can inject inline controls (e.g., copy/regenerate buttons) without relying on deep CSS overrides. `ApiKeyControl` now uses the slot, improving layout robustness and accessibility. Unit tests updated and pass locally.
- **Frontend — route prefetch**: Added route prefetch in `main.ts` to improve perceived navigation performance.
- **Images / Author ASIN**: Prefer stored author ASIN for author image lookup and probe the DB when a cached image lookup returns NotFound; this reduces unnecessary Audnexus calls and improves cache hit rates.
- **qBittorrent adapter**: Prefer `IHttpClientFactory` with a cookie-client fallback, use injected `HttpClient` for auth requests, and clarified auth failure messages; added `QBittorrentHelpers` and robustness improvements in the adapter.
- **Dependencies**: Bumped frontend/backend dependencies and regenerated lockfiles.

### Fixed
- **qBittorrent Test**: `qBittorrent` client test now attempts authentication when the unauthenticated `/api/v2/app/version` returns `403` and retries the request; valid credentials will now cause the test to succeed (e.g., when behind authentication or proxy).
- **Download client test behavior**: The Test button on the **Download Client** modal now tests the client using the current form input values (unsaved edits), while the Test button on the download client card in the settings tab tests using the saved DB configuration values.
- **qBittorrent Test**: `qBittorrent` client test now attempts authentication when the unauthenticated `/api/v2/app/version` values.
- **Duplicate notifications & race**: Added `NotificationSuppressionSeconds`, `_lastToastTimes`, `_lastToastMessages`, and helper methods `ShouldSendToastForIndexer`/`ShouldSendToastForMessage`. Fixed an edge-case race where the per-indexer check previously updated the global message timestamp causing unintended self-suppression.
- **EF translation error**: Moved normalization/dedupe to in-memory evaluation to avoid EF Core InvalidOperationException when calling `NormalizeIndexerUrl` inside an EF expression.
- **Download client test behavior**: The Test button on the **Download Client** modal uses the current (unsaved) form input values; the Test button on the download client card in the Settings tab tests the saved DB configuration values.
- **Images / Author ASIN tests**: Mocked `IAudiobookRepository.GetAuthorAsinByNameAsync` in ImagesController tests so the stored‑ASIN path is exercised; tests updated accordingly.
- **Frontend — Loading UI & tests**: Added VTU test stubs for `LoadingState` and `PhSpinner` and unit tests covering loading indicators in settings tabs to prevent component-resolution warnings in tests.
- **Tests**: Added and updated unit tests in `tests/Listenarr.Api.Tests` (e.g., `ProwlarrCompatControllerTests`, `ProwlarrEndpointsTests`) to validate broadcasting, idempotent PUT upsert, delete `id==0` tolerance, and toast/message-level dedupe. All API tests pass locally (253 tests).

### Removed
- Removed duplicate/early Broadcast/toast on the create path in the `PUT` flow to avoid double notifications.


## [0.2.47] - 2026-01-13
Expand All @@ -33,8 +60,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Root folder management**: Complete root folder system with named folders, selection when adding/editing audiobooks, move/rename confirmation dialogs, and comprehensive E2E and unit tests.
- **Bulk update endpoint**: Batch update API endpoint for audiobooks with frontend integration for efficient mass updates.
- **Notification system**: Toast messages now also appear as persistent notifications via SignalR, with support for import and deletion broadcasts.
- **Quality profile minimum score threshold**: Added MinimumScore property to quality profiles (similar to Sonarr's MinFormatScore) to reject releases below specified threshold (migration: `20260103235802_AddMinimumScoreToQualityProfile`).
- **Import item resolution service**: Implemented GetImportItemAsync pattern across all download client adapters following Sonarr's approach for accurate post-download path resolution.
- **Quality profile minimum score threshold**: Added MinimumScore property to quality profiles to reject releases below specified threshold (migration: `20260103235802_AddMinimumScoreToQualityProfile`).
- **Import item resolution service**: Implemented GetImportItemAsync pattern across all download client adapters for accurate post-download path resolution.
- **Lazy image loading**: Native browser loading="lazy" for all images with placeholder support, replacing custom lazy loading logic.
- **Advanced search and collection features**: New AdvancedSearchModal with ASIN, author, title, and series search prefixes for precise queries
- **Collection view**: Comprehensive CollectionView for managing audiobook collections with author and series grouping
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<EFVersion>8.0.23</EFVersion>
<EFVersion>8.*</EFVersion>
</PropertyGroup>

<ItemGroup>
Expand Down
147 changes: 0 additions & 147 deletions PR_v0.2.46.md

This file was deleted.

Loading
Loading