feat: add artist tag mode setting with split Vorbis support and improve library scan progress

- Add artist_tag_mode setting (joined / split_vorbis) for FLAC/Opus multi-artist tags
- Split 'Artist A, Artist B' into separate ARTIST= Vorbis comments when split mode is enabled
- Join repeated ARTIST/ALBUMARTIST Vorbis comments when reading metadata
- Propagate artistTagMode through download pipeline, re-enrich, and metadata editor
- Improve library scan progress: separate polling intervals, finalizing state, indeterminate progress
- Add initial progress snapshot on library scan stream connect
- Use req.ArtistName consistently for Qobuz downloads instead of track.Performer.Name
- Add l10n keys for artist tag mode, library files unit, and scan finalizing status
This commit is contained in:
zarzet
2026-04-13 23:32:12 +07:00
parent fd3a34303e
commit 120ecaa0e5
37 changed files with 1274 additions and 158 deletions
+5
View File
@@ -4906,6 +4906,7 @@ class _QueueTabState extends ConsumerState<QueueTab> {
lowerPath.endsWith('.opus') ||
lowerPath.endsWith('.ogg');
final artistTagMode = ref.read(settingsProvider).artistTagMode;
String? ffmpegResult;
if (isMp3) {
ffmpegResult = await FFmpegService.embedMetadataToMp3(
@@ -4924,6 +4925,7 @@ class _QueueTabState extends ConsumerState<QueueTab> {
opusPath: ffmpegTarget,
coverPath: effectiveCoverPath,
metadata: metadata,
artistTagMode: artistTagMode,
);
}
@@ -4958,11 +4960,13 @@ class _QueueTabState extends ConsumerState<QueueTab> {
Future<bool> _reEnrichQueueLocalTrack(LocalLibraryItem item) async {
final durationMs = (item.duration ?? 0) * 1000;
final artistTagMode = ref.read(settingsProvider).artistTagMode;
final request = <String, dynamic>{
'file_path': item.filePath,
'cover_url': '',
'max_quality': true,
'embed_lyrics': true,
'artist_tag_mode': artistTagMode,
'spotify_id': '',
'track_name': item.trackName,
'artist_name': item.artistName,
@@ -5663,6 +5667,7 @@ class _QueueTabState extends ConsumerState<QueueTab> {
bitrate: bitrate,
metadata: metadata,
coverPath: coverPath,
artistTagMode: settings.artistTagMode,
deleteOriginal: !isSaf,
);