mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-02 09:08:35 +02:00
fix(reenrich): preserve release identity in batch actions
This commit is contained in:
@@ -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"`
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
@@ -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,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user