Commit Graph

224 Commits

Author SHA1 Message Date
bransoned
12598d17e2 #31 (upstream) Fix iOS client local streaming issues 2026-01-11 18:47:13 -05:00
Branson
714e465996 Update Docker workflow for version tagging 2026-01-10 22:44:26 -05:00
bransoned
45363ebe3b Make prod default behavior 2026-01-10 21:16:07 -05:00
bransoned
74d02db58a Add SquidWTF functionality to subsonic music services 2026-01-10 21:04:05 -05:00
bransoned
81979713ef Update appsettings file and make SquidWTF default service 2026-01-10 21:03:07 -05:00
bransoned
d8d046f6ef Add basic settings file for constants 2026-01-10 21:00:28 -05:00
bransoned
e1db12a165 Add logic to allow for new SquidWTF service 2026-01-10 20:59:16 -05:00
bransoned
ab898ef611 Add startup validation for metadata/download services 2026-01-10 20:58:28 -05:00
bransoned
4a5f2591f7 Add mostly functional metadata service that queries SquidWTF Tidal proxy 2026-01-10 20:56:22 -05:00
bransoned
f3e3c0bfa1 Add download service module to allow for downloading from SquidWTF API 2026-01-10 20:55:37 -05:00
V1ck3s
61a21b0e0c refactor: centralize cache path logic and add TMPDIR documentation 2026-01-11 00:29:25 +01:00
V1ck3s
dbb1964f46 feat: add cache-only storage mode for streaming without library persistence 2026-01-11 00:29:25 +01:00
Vickes
318ce96cbc refactor: implement provider-based service architecture (#40)
Comprehensive refactoring to improve maintainability, reduce code duplication, and facilitate the addition of new music providers.

Key architectural improvements:
- Introduced BaseDownloadService template method pattern, eliminating ~80% code duplication between Deezer and Qobuz services
- Organized services by provider (Services/Deezer/, Services/Qobuz/, Services/Local/, Services/Subsonic/)
- Extracted SubsonicController logic into 4 specialized services, reducing controller size by 43% (1,174 → 666 lines)
- Reorganized Models into domain-driven subdirectories (Domain/, Settings/, Download/, Search/)
- Implemented Result<T> pattern and GlobalExceptionHandler for consistent error handling
- Created unified validation architecture with IStartupValidator interface

Testing & Quality:
- Increased test coverage from ~30 to 127 tests (+323%)
- Added comprehensive test suites for QobuzDownloadService and Subsonic services
- All tests passing, zero build errors

Impact:
- Net reduction of 343 lines while adding more functionality
- No breaking changes - Subsonic API surface unchanged
- Foundation ready for easy addition of new providers (Tidal, Spotify, etc.)
2026-01-08 23:57:09 +01:00
V1ck3s
1c56534e26 ci: split workflows into separate CI and Docker jobs
- Split ci.yml into two workflows for cleaner PR checks
- ci.yml: runs build-and-test on PRs and pushes (no Docker)
- docker.yml: runs build-and-test + Docker build/push on merges, tags, and manual triggers
- Eliminates 'docker: skipping' status on open PRs
2026-01-08 23:51:57 +01:00
V1ck3s
6344198572 docs: update README to reflect refactored service architecture 2026-01-08 23:31:33 +01:00
V1ck3s
5d93af6aa0 test: add comprehensive test suite for QobuzDownloadService
- Add 15 unit tests covering authentication, download logic, and configuration
- Test IsAvailableAsync with various credential combinations
- Test download flow for unsupported providers, existing files, and missing songs
- Test album background download functionality
- Test quality format configuration (FLAC, MP3, default)
- All tests passing (127 total tests)
2026-01-08 22:51:37 +01:00
V1ck3s
9245dac99e refactor: extract subsonic controller logic into specialized services
- Extract SubsonicRequestParser for HTTP parameter extraction
- Extract SubsonicResponseBuilder for XML/JSON response formatting
- Extract SubsonicModelMapper for search result parsing and merging
- Extract SubsonicProxyService for upstream Subsonic server communication
- Add comprehensive test coverage (45 tests) for all new services
- Reduce SubsonicController from 1174 to 666 lines (-43%)

All tests passing. Build succeeds with 0 errors.
2026-01-08 21:47:05 +01:00
V1ck3s
09ee618ac8 refactor: extract PathHelper to Services/Common for reusability
Moved PathHelper from DeezerDownloadService to Services/Common/ to:
- Remove awkward dependency of Qobuz on Deezer namespace
- Make path utilities reusable by all services
- Improve code organization and clarify dependencies

Updated imports in DeezerDownloadService, QobuzDownloadService,
BaseDownloadService, and DeezerDownloadServiceTests.
2026-01-08 20:00:05 +01:00
V1ck3s
ce779b3c8a refactor: reorganize Models into subdirectories by context
Split monolithic MusicModels.cs (177 lines) into separate files:
- Models/Settings/ (DeezerSettings, QobuzSettings, SubsonicSettings)
- Models/Domain/ (Song, Album, Artist)
- Models/Search/ (SearchResult)
- Models/Download/ (DownloadInfo, DownloadStatus)
- Models/Subsonic/ (ScanStatus)

Updated namespaces and imports across 22 files.
Improves navigation and separates models by business context.
2026-01-08 19:57:11 +01:00
V1ck3s
c38291efa3 refactor: extract BaseDownloadService to eliminate code duplication between providers 2026-01-08 19:39:06 +01:00
V1ck3s
43c9a2e808 refactor: add Result<T> pattern and global exception handler for consistent error handling 2026-01-08 19:31:05 +01:00
V1ck3s
cb37c7f69a refactor: implement unified startup validator architecture with IStartupValidator interface 2026-01-08 19:19:45 +01:00
V1ck3s
fe9cb9b758 refactor: organize services by provider and standardize settings pattern 2026-01-08 19:02:44 +01:00
V1ck3s
d0e64bac81 feat: add dev branch to CI/CD pipeline and semver tag support 2026-01-08 18:11:44 +01:00
V1ck3s
651b86694d docs: update README for multi-provider architecture 2026-01-08 00:13:01 +01:00
V1ck3s
275467c5bf feat: add pluggable music service architecture with Qobuz support 2026-01-07 23:55:59 +01:00
V1ck3s
9ec1bb77b5 fix: use AlbumArtist for download folder organization 2026-01-07 22:43:17 +01:00
V1ck3s
853340b0f5 docs: update client compatibility list in README 2026-01-07 13:41:02 +01:00
V1ck3s
5229e2ce54 docs: remove non-working iOS clients from README 2026-01-06 23:49:03 +01:00
V1ck3s
5d03f86872 feat: add download mode option (Track/Album) for Deezer downloads
Closes #10
2026-01-06 22:53:43 +01:00
V1ck3s
3fd98ea3de feat: add explicit content filter for Deezer tracks (#22) 2026-01-06 21:59:00 +01:00
V1ck3s
06f33b8e89 feat: add form-urlencoded body parsing for Feishin compatibility 2026-01-04 22:21:31 +01:00
V1ck3s
2a6191e9db feat: add startup validation for Subsonic and Deezer connectivity 2026-01-04 17:42:49 +01:00
Vickes
b3368d051c docs: add iOS clients (Narjo, Arpeggi) (#16) 2026-01-03 22:50:53 +01:00
Vickes
cf6bc4d862 ci: add ARM64 (linux/arm64) Docker image support (#15) 2026-01-03 22:50:53 +01:00
Vickes
f6536acda7 chore: add GPL-3.0 license (#13)
chore: add GPL-3.0 license
docs: update license to GPL-3.0 in README
2026-01-03 22:04:53 +01:00
V1ck3s
7eb101ea29 feat: add configurable audio quality selection for Deezer downloads 2026-01-03 18:06:24 +01:00
V1ck3s
5b736ea61a security: remove token from log output 2026-01-02 17:45:28 +01:00
V1ck3s
ba2aa98a23 docs: reorganize README, add Docker quick start and tested clients 2026-01-02 17:36:52 +01:00
V1ck3s
7bf8446d8f fix: use correct artist ID for Deezer albums in getArtist response 2026-01-01 20:27:29 +01:00
V1ck3s
5ec4d31e91 ci: trigger on manual dispatch, tags, and merged PRs 2025-12-13 18:28:08 +01:00
V1ck3s
8e1f5035e1 docs: add list of tested clients 2025-12-13 18:21:22 +01:00
V1ck3s
fefd2bf263 docs: add explanation for project name origin 2025-12-13 18:16:14 +01:00
V1ck3s
f48bbabff9 refactor: use pre-built GHCR image instead of local build 2025-12-13 18:06:37 +01:00
V1ck3s
88d8cbb376 fix: address Copilot PR review findings
- Register DeezerDownloadService and DeezerMetadataService as Singleton
  to properly share state across requests (rate limiting, download tracking)
- Fix race condition in LocalLibraryService.LoadMappingsAsync with
  double-check locking pattern
- Dispose HttpRequestMessage objects to prevent memory leaks (4 occurrences)
- Handle fire-and-forget TriggerLibraryScanAsync with proper error logging
- Replace Console.WriteLine with ILogger in SubsonicController
- Fix while loop in DownloadSongAsync to refresh activeDownload state
- Use modern C# range operator syntax for Substring calls
- Clean up appsettings.json template (remove private IP, clear ARL token)
- Add documentation comment for Blowfish decryption key
- Add downloads directory to gitignore
2025-12-13 18:06:37 +01:00
V1ck3s
3a44a5782a feat: add CI/CD workflow for .NET build and Docker containerization 2025-12-13 18:06:37 +01:00
V1ck3s
211f0c617c feat: add Dockerfile and docker-compose.yml for containerization 2025-12-13 18:06:37 +01:00
V1ck3s
3a43196f8a feat: add README.md with project overview, features, installation instructions, and configuration details 2025-12-13 18:06:37 +01:00
V1ck3s
2d69a5c33e refactor: update comments and documentation to English for consistency 2025-12-13 18:06:37 +01:00
V1ck3s
c909458bee feat: add metadatas to file after download 2025-12-13 18:06:37 +01:00