mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-09 23:55:10 -05:00
Make kept path configurable via web UI
- Added Library:KeptPath to appsettings.json (default: /app/kept) - Added Library Settings card to web UI with DownloadPath and KeptPath - Updated GetDownloads and DeleteDownload endpoints to use configured path - Updated JellyfinController to use configured kept path - Injected IConfiguration into JellyfinController - Users can now customize where favorited tracks are stored
This commit is contained in:
@@ -1450,6 +1450,11 @@ public class AdminController : ControllerBase
|
|||||||
userId = _jellyfinSettings.UserId ?? "(not set)",
|
userId = _jellyfinSettings.UserId ?? "(not set)",
|
||||||
libraryId = _jellyfinSettings.LibraryId
|
libraryId = _jellyfinSettings.LibraryId
|
||||||
},
|
},
|
||||||
|
library = new
|
||||||
|
{
|
||||||
|
downloadPath = _configuration["Library:DownloadPath"] ?? "./downloads",
|
||||||
|
keptPath = _configuration["Library:KeptPath"] ?? "/app/kept"
|
||||||
|
},
|
||||||
deezer = new
|
deezer = new
|
||||||
{
|
{
|
||||||
arl = MaskValue(_deezerSettings.Arl, showLast: 8),
|
arl = MaskValue(_deezerSettings.Arl, showLast: 8),
|
||||||
@@ -3331,7 +3336,7 @@ public class LinkPlaylistRequest
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var keptPath = "/app/kept";
|
var keptPath = _configuration["Library:KeptPath"] ?? "/app/kept";
|
||||||
|
|
||||||
_logger.LogInformation("📂 Checking kept folder: {Path}", keptPath);
|
_logger.LogInformation("📂 Checking kept folder: {Path}", keptPath);
|
||||||
_logger.LogInformation("📂 Directory exists: {Exists}", Directory.Exists(keptPath));
|
_logger.LogInformation("📂 Directory exists: {Exists}", Directory.Exists(keptPath));
|
||||||
@@ -3414,7 +3419,7 @@ public class LinkPlaylistRequest
|
|||||||
return BadRequest(new { error = "Path is required" });
|
return BadRequest(new { error = "Path is required" });
|
||||||
}
|
}
|
||||||
|
|
||||||
var keptPath = "/app/kept";
|
var keptPath = _configuration["Library:KeptPath"] ?? "/app/kept";
|
||||||
var fullPath = Path.Combine(keptPath, path);
|
var fullPath = Path.Combine(keptPath, path);
|
||||||
|
|
||||||
_logger.LogInformation("🗑️ Delete request for: {Path}", fullPath);
|
_logger.LogInformation("🗑️ Delete request for: {Path}", fullPath);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public class JellyfinController : ControllerBase
|
|||||||
private readonly SpotifyLyricsService? _spotifyLyricsService;
|
private readonly SpotifyLyricsService? _spotifyLyricsService;
|
||||||
private readonly LrclibService? _lrclibService;
|
private readonly LrclibService? _lrclibService;
|
||||||
private readonly RedisCacheService _cache;
|
private readonly RedisCacheService _cache;
|
||||||
|
private readonly IConfiguration _configuration;
|
||||||
private readonly ILogger<JellyfinController> _logger;
|
private readonly ILogger<JellyfinController> _logger;
|
||||||
|
|
||||||
public JellyfinController(
|
public JellyfinController(
|
||||||
@@ -55,6 +56,7 @@ public class JellyfinController : ControllerBase
|
|||||||
JellyfinProxyService proxyService,
|
JellyfinProxyService proxyService,
|
||||||
JellyfinSessionManager sessionManager,
|
JellyfinSessionManager sessionManager,
|
||||||
RedisCacheService cache,
|
RedisCacheService cache,
|
||||||
|
IConfiguration configuration,
|
||||||
ILogger<JellyfinController> logger,
|
ILogger<JellyfinController> logger,
|
||||||
ParallelMetadataService? parallelMetadataService = null,
|
ParallelMetadataService? parallelMetadataService = null,
|
||||||
PlaylistSyncService? playlistSyncService = null,
|
PlaylistSyncService? playlistSyncService = null,
|
||||||
@@ -78,6 +80,7 @@ public class JellyfinController : ControllerBase
|
|||||||
_spotifyLyricsService = spotifyLyricsService;
|
_spotifyLyricsService = spotifyLyricsService;
|
||||||
_lrclibService = lrclibService;
|
_lrclibService = lrclibService;
|
||||||
_cache = cache;
|
_cache = cache;
|
||||||
|
_configuration = configuration;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(_settings.Url))
|
if (string.IsNullOrWhiteSpace(_settings.Url))
|
||||||
@@ -3787,8 +3790,8 @@ public class JellyfinController : ControllerBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build kept folder path: /app/kept/Artist/Album/
|
// Build kept folder path: Artist/Album/
|
||||||
var keptBasePath = "/app/kept";
|
var keptBasePath = _configuration["Library:KeptPath"] ?? "/app/kept";
|
||||||
var keptArtistPath = Path.Combine(keptBasePath, PathHelper.SanitizeFileName(song.Artist));
|
var keptArtistPath = Path.Combine(keptBasePath, PathHelper.SanitizeFileName(song.Artist));
|
||||||
var keptAlbumPath = Path.Combine(keptArtistPath, PathHelper.SanitizeFileName(song.Album));
|
var keptAlbumPath = Path.Combine(keptArtistPath, PathHelper.SanitizeFileName(song.Album));
|
||||||
|
|
||||||
@@ -4084,7 +4087,7 @@ public class JellyfinController : ControllerBase
|
|||||||
var song = await _metadataService.GetSongAsync(provider!, externalId!);
|
var song = await _metadataService.GetSongAsync(provider!, externalId!);
|
||||||
if (song == null) return;
|
if (song == null) return;
|
||||||
|
|
||||||
var keptBasePath = "/app/kept";
|
var keptBasePath = _configuration["Library:KeptPath"] ?? "/app/kept";
|
||||||
var keptArtistPath = Path.Combine(keptBasePath, PathHelper.SanitizeFileName(song.Artist));
|
var keptArtistPath = Path.Combine(keptBasePath, PathHelper.SanitizeFileName(song.Artist));
|
||||||
var keptAlbumPath = Path.Combine(keptArtistPath, PathHelper.SanitizeFileName(song.Album));
|
var keptAlbumPath = Path.Combine(keptArtistPath, PathHelper.SanitizeFileName(song.Album));
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
"EnableExternalPlaylists": true
|
"EnableExternalPlaylists": true
|
||||||
},
|
},
|
||||||
"Library": {
|
"Library": {
|
||||||
"DownloadPath": "./downloads"
|
"DownloadPath": "./downloads",
|
||||||
|
"KeptPath": "/app/kept"
|
||||||
},
|
},
|
||||||
"Qobuz": {
|
"Qobuz": {
|
||||||
"UserAuthToken": "your-qobuz-token",
|
"UserAuthToken": "your-qobuz-token",
|
||||||
|
|||||||
@@ -920,6 +920,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<h2>Library Settings</h2>
|
||||||
|
<div class="config-section">
|
||||||
|
<div class="config-item">
|
||||||
|
<span class="label">Download Path (Cache)</span>
|
||||||
|
<span class="value" id="config-download-path">-</span>
|
||||||
|
<button onclick="openEditSetting('LIBRARY_DOWNLOAD_PATH', 'Download Path', 'text')">Edit</button>
|
||||||
|
</div>
|
||||||
|
<div class="config-item">
|
||||||
|
<span class="label">Kept Path (Favorited)</span>
|
||||||
|
<span class="value" id="config-kept-path">-</span>
|
||||||
|
<button onclick="openEditSetting('LIBRARY_KEPT_PATH', 'Kept Path', 'text')">Edit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2>Sync Schedule</h2>
|
<h2>Sync Schedule</h2>
|
||||||
<div class="config-section">
|
<div class="config-section">
|
||||||
@@ -1687,6 +1703,10 @@
|
|||||||
document.getElementById('config-jellyfin-user-id').textContent = data.jellyfin.userId || '(not set)';
|
document.getElementById('config-jellyfin-user-id').textContent = data.jellyfin.userId || '(not set)';
|
||||||
document.getElementById('config-jellyfin-library-id').textContent = data.jellyfin.libraryId || '-';
|
document.getElementById('config-jellyfin-library-id').textContent = data.jellyfin.libraryId || '-';
|
||||||
|
|
||||||
|
// Library settings
|
||||||
|
document.getElementById('config-download-path').textContent = data.library?.downloadPath || './downloads';
|
||||||
|
document.getElementById('config-kept-path').textContent = data.library?.keptPath || '/app/kept';
|
||||||
|
|
||||||
// Sync settings
|
// Sync settings
|
||||||
const syncHour = data.spotifyImport.syncStartHour;
|
const syncHour = data.spotifyImport.syncStartHour;
|
||||||
const syncMin = data.spotifyImport.syncStartMinute;
|
const syncMin = data.spotifyImport.syncStartMinute;
|
||||||
|
|||||||
Reference in New Issue
Block a user