Commit Graph

192 Commits

Author SHA1 Message Date
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
V1ck3s
7e9a6dd72d fix: song order 2025-12-13 18:06:37 +01:00
V1ck3s
bdbafb4669 fix: deduplicate external artists in search results, prioritizing local artists 2025-12-13 18:06:37 +01:00
V1ck3s
55727f206f fix: artist, album, songs image problem fixed with new ID format 2025-12-13 18:06:37 +01:00
V1ck3s
d183853cb2 feat: improve downloaded files organization 2025-12-13 18:06:37 +01:00
V1ck3s
61eb8332ad fix: cover art on albums 2025-12-13 18:06:37 +01:00
V1ck3s
96f6f7f8d4 fix: remote track number is now working, default bitrate for remote songs, remote quality for remote songs 2025-12-13 18:06:37 +01:00
V1ck3s
288613d62b fix: enhance album retrieval by merging local and Deezer songs in search3 2025-12-13 18:06:37 +01:00
V1ck3s
08f43d3c92 feat: add getArtist endpoint with Deezer albums merge and fix getAlbum for external albums
- getArtist now merges local Navidrome albums with Deezer albums
- getAlbum returns complete song metadata for Deezer albums
- Added missing fields (parent, isDir, suffix, contentType, type, isVideo, duration, genre) for Aonsoku compatibility
2025-12-13 18:06:37 +01:00
V1ck3s
6c68ed3ce5 fix: properly serialize JSON arrays and objects in search3 response 2025-12-13 18:06:37 +01:00
V1ck3s
a6db9a35bc fix: relay empty search queries directly to Navidrome for browsing all songs 2025-12-13 18:06:37 +01:00
V1ck3s
a2c0b13c21 fix: getCoverArt now handles album and artist IDs, not just tracks 2025-12-13 18:06:37 +01:00
V1ck3s
93dfcf3c2e fix: use correct 'subsonic-response' key format in JSON responses
ASP.NET Core serializes anonymous objects with camelCase, producing
'subsonicResponse' instead of 'subsonic-response'. Fixed by using
Dictionary with explicit key names for all JSON responses.
2025-12-13 18:06:37 +01:00
V1ck3s
a5e065dd31 fix: remove broken ping endpoint and improve error handling
- Remove custom /ping endpoint that returned non-standard JSON format
- Fix wildcard endpoint to return Subsonic-compatible error responses
- All requests now properly relay to/from the real Subsonic server
2025-12-13 18:06:37 +01:00
V1ck3s
9b398c7484 feat: replace OpenSSL with native Blowfish decryption and add library rescan
- Replace OpenSSL subprocess with BouncyCastle native Blowfish CBC decryption
- Add automatic Subsonic library scan trigger after downloads (with 30s debounce)
- Improve error handling in DeezerMetadataService search methods
- Add comprehensive tests for download service, metadata service, and library service
- Increase test coverage from 13 to 32 tests
2025-12-13 18:06:37 +01:00
V1ck3s
ad15e10ea6 test: add unit tests for DeezerMetadataService and LocalLibraryService
- Add DeezerMetadataServiceTests with mocked HTTP responses
- Add LocalLibraryServiceTests for song ID parsing and registration
- Configure xUnit test project with Moq and MVC Testing packages
2025-12-13 18:06:37 +01:00
V1ck3s
5a317c8de7 feat: implement real search results merging from Subsonic and Deezer
- Parse Subsonic search3 response (JSON and XML formats)
- Merge local results with external Deezer results
- Local results appear first, then external results
- Add isExternal flag to distinguish sources
2025-12-13 18:06:37 +01:00
V1ck3s
8aa9c2d437 feat: implement DeezerDownloadService with Blowfish decryption
- Port JavaScript DeezerDownloader to C#
- Add Deezer API authentication with ARL token
- Implement track download via media.deezer.com API
- Add Blowfish CBC decryption for encrypted chunks (uses OpenSSL)
- Add rate limiting and retry with exponential backoff
- Update config for Deezer ARL tokens
- Configure Subsonic URL to 192.168.1.12:4533
2025-12-13 18:06:37 +01:00
V1ck3s
6b07ac7646 feat: add subsonic proxy architecture with external music services
- Add MusicModels (Song, Artist, Album, SearchResult, DownloadInfo)
- Add IMusicMetadataService and DeezerMetadataService for external search
- Add IDownloadService and DeezspotDownloadService for downloads
- Add LocalLibraryService for managing downloaded songs cache
- Add custom endpoints: search3, stream, getSong, getAlbum, getCoverArt
- Configure dependency injection for all services
2025-12-13 18:06:37 +01:00
V1ck3s
1e8bfd108e fix: move gitignore 2025-12-08 14:33:19 +01:00
V1ck3s
83fdcd2fcc feat: update RelayToSubsonic method to return byte array and adjust content handling 2025-09-21 17:02:31 +02:00
V1ck3s
17769e2c28 feat: add subsonic all in one endpoint, subsonic settings configuration and CORS policy 2025-09-21 16:22:18 +02:00
V1ck3s
25c95a52d9 add SubsonicController and configure HttpClient 2025-09-20 17:48:30 +02:00
V1ck3s
b018ab7cec initial commit 2025-09-20 16:52:41 +02:00
V1ck3s
843ef87da8 initial commit 2025-09-20 16:42:46 +02:00