fix(reenrich): preserve release identity in batch actions

This commit is contained in:
zarzet
2026-07-26 12:28:00 +07:00
parent b93ebc1e8d
commit 5f5186a23e
8 changed files with 41 additions and 6 deletions
+3 -3
View File
@@ -43,9 +43,9 @@ type reEnrichRequest struct {
DurationMs int64 `json:"duration_ms"`
SearchOnline bool `json:"search_online"`
UpdateFields []string `json:"update_fields,omitempty"`
// ReplaceReleaseMetadata lets an explicit user re-enrich action repair a
// stale album identity (for example, a playlist name stored as ALBUM).
// Older callers keep the conservative mismatch-preservation behavior.
// ReplaceReleaseMetadata lets a deliberate single-file re-enrich action
// repair a stale album identity (for example, a playlist name stored as
// ALBUM). Batch and older callers keep the conservative mismatch guard.
ReplaceReleaseMetadata bool `json:"replace_release_metadata,omitempty"`
}
+4 -1
View File
@@ -14,6 +14,7 @@ import 'package:spotiflac_android/utils/file_access.dart';
import 'package:spotiflac_android/utils/image_cache_utils.dart';
import 'package:spotiflac_android/utils/lyrics_metadata_helper.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/re_enrich_release_policy.dart';
import 'package:spotiflac_android/services/library_database.dart';
import 'package:spotiflac_android/services/batch_track_actions.dart';
import 'package:spotiflac_android/models/unified_library_item.dart';
@@ -454,7 +455,9 @@ class _LocalAlbumScreenState extends ConsumerState<LocalAlbumScreen>
'copyright': '',
'duration_ms': durationMs,
'search_online': true,
'replace_release_metadata': true,
'replace_release_metadata': allowsReleaseIdentityReplacement(
ReEnrichOperationScope.batch,
),
// ignore: use_null_aware_elements
if (updateFields != null) 'update_fields': updateFields,
};
+1
View File
@@ -10,6 +10,7 @@ import 'package:spotiflac_android/l10n/l10n.dart';
import 'package:spotiflac_android/utils/adaptive_layout.dart';
import 'package:spotiflac_android/utils/app_bar_layout.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/re_enrich_release_policy.dart';
import 'package:spotiflac_android/widgets/settings_group.dart';
import 'package:spotiflac_android/utils/ffmpeg_reenrich.dart';
import 'package:spotiflac_android/utils/file_access.dart';
+3 -1
View File
@@ -30,7 +30,9 @@ extension _QueueTabBatchActions on _QueueTabState {
'copyright': '',
'duration_ms': durationMs,
'search_online': true,
'replace_release_metadata': true,
'replace_release_metadata': allowsReleaseIdentityReplacement(
ReEnrichOperationScope.batch,
),
// ignore: use_null_aware_elements
if (updateFields != null) 'update_fields': updateFields,
};
+3 -1
View File
@@ -970,7 +970,9 @@ extension _TrackMetadataLyricsAndSaving on _TrackMetadataScreenState {
'composer': composer ?? '',
'duration_ms': durationMs,
'search_online': true,
'replace_release_metadata': true,
'replace_release_metadata': allowsReleaseIdentityReplacement(
ReEnrichOperationScope.singleFile,
),
};
final result = await PlatformBridge.reEnrichFile(request);
+1
View File
@@ -30,6 +30,7 @@ import 'package:spotiflac_android/utils/image_cache_utils.dart';
import 'package:spotiflac_android/utils/string_utils.dart';
import 'package:spotiflac_android/utils/int_utils.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/re_enrich_release_policy.dart';
import 'package:spotiflac_android/widgets/album_detail_header.dart'
show HeaderMetaRow, HeaderMetaItem;
import 'package:spotiflac_android/widgets/audio_analysis_widget.dart';
+8
View File
@@ -0,0 +1,8 @@
enum ReEnrichOperationScope { singleFile, batch }
/// A single-file action may deliberately repair a stale release identity,
/// such as a playlist name stored in the album tag. Batch matching keeps the
/// conservative album-mismatch guard because one false match has a much larger
/// blast radius.
bool allowsReleaseIdentityReplacement(ReEnrichOperationScope scope) =>
scope == ReEnrichOperationScope.singleFile;
+18
View File
@@ -0,0 +1,18 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:spotiflac_android/utils/re_enrich_release_policy.dart';
void main() {
test(
'only deliberate single-file re-enrich can replace release identity',
() {
expect(
allowsReleaseIdentityReplacement(ReEnrichOperationScope.singleFile),
isTrue,
);
expect(
allowsReleaseIdentityReplacement(ReEnrichOperationScope.batch),
isFalse,
);
},
);
}