refactor(dart): consolidate duplicated lookup, filename, and search-provider helpers

This commit is contained in:
zarzet
2026-07-26 18:52:26 +07:00
parent a21d5bcb33
commit cb8064a317
11 changed files with 126 additions and 186 deletions
+6 -17
View File
@@ -2493,23 +2493,12 @@ class DownloadQueueNotifier extends Notifier<DownloadQueueState> {
baseFilenameFormat,
);
if (isSafMode) {
final baseName = await PlatformBridge.buildFilename(
effectiveFilenameFormat,
_filenameMetadataForTrack(
trackToDownload,
quality: quality,
qualityVariant: item.preserveQualityVariant
? qualityVariantStagingLabel(item.id)
: '',
playlistPosition: _validPlaylistPosition(item),
),
);
safFileName = await _buildSafFileName(
baseName,
safOutputExt,
qualityVariant: item.preserveQualityVariant
? qualityVariantStagingLabel(item.id)
: '',
safFileName = await _buildSafFileNameForItem(
item,
trackToDownload,
filenameFormat: effectiveFilenameFormat,
quality: quality,
outputExt: safOutputExt,
);
safBaseName = safFileName.replaceFirst(RegExp(r'\.[^.]+$'), '');
}
@@ -680,23 +680,12 @@ extension _DownloadQueueNativeWorker on DownloadQueueNotifier {
baseFilenameFormat,
);
if (isSafMode) {
final baseName = await PlatformBridge.buildFilename(
effectiveFilenameFormat,
_filenameMetadataForTrack(
item.track,
quality: quality,
qualityVariant: item.preserveQualityVariant
? qualityVariantStagingLabel(item.id)
: '',
playlistPosition: _validPlaylistPosition(item),
),
);
safFileName = await _buildSafFileName(
baseName,
safOutputExt,
qualityVariant: item.preserveQualityVariant
? qualityVariantStagingLabel(item.id)
: '',
safFileName = await _buildSafFileNameForItem(
item,
item.track,
filenameFormat: effectiveFilenameFormat,
quality: quality,
outputExt: safOutputExt,
);
}
@@ -207,6 +207,34 @@ extension _DownloadQueuePaths on DownloadQueueNotifier {
return parts.join('/');
}
/// Renders the SAF file name for [item]: filename template → sanitized,
/// byte-limited SAF name (quality-variant aware).
Future<String> _buildSafFileNameForItem(
DownloadItem item,
Track track, {
required String filenameFormat,
required String quality,
required String outputExt,
}) async {
final qualityVariant = item.preserveQualityVariant
? qualityVariantStagingLabel(item.id)
: '';
final baseName = await PlatformBridge.buildFilename(
filenameFormat,
_filenameMetadataForTrack(
track,
quality: quality,
qualityVariant: qualityVariant,
playlistPosition: _validPlaylistPosition(item),
),
);
return _buildSafFileName(
baseName,
outputExt,
qualityVariant: qualityVariant,
);
}
Future<String> _buildSafFileName(
String baseName,
String outputExt, {
+16 -13
View File
@@ -63,6 +63,21 @@ List<String>? _tryDecodeStringListPreference(String rawJson, String key) {
}
}
/// First enabled custom-search extension, preferring ones marked primary.
Extension? defaultSearchExtension(List<Extension> extensions) {
return extensions
.where(
(ext) =>
ext.enabled &&
ext.hasCustomSearch &&
ext.searchBehavior?.primary == true,
)
.firstOrNull ??
extensions
.where((ext) => ext.enabled && ext.hasCustomSearch)
.firstOrNull;
}
class Extension {
final String id;
final String name;
@@ -1247,19 +1262,7 @@ class ExtensionNotifier extends Notifier<ExtensionState> {
}
String? _firstEnabledSearchProviderId() {
return state.extensions
.where(
(ext) =>
ext.enabled &&
ext.hasCustomSearch &&
ext.searchBehavior?.primary == true,
)
.map((ext) => ext.id)
.firstOrNull ??
state.extensions
.where((ext) => ext.enabled && ext.hasCustomSearch)
.map((ext) => ext.id)
.firstOrNull;
return defaultSearchExtension(state.extensions)?.id;
}
String? _replacedBuiltInProviderFor(
+2 -28
View File
@@ -316,20 +316,7 @@ class TrackNotifier extends Notifier<TrackState> {
if (explicitProvider != null && explicitProvider.isNotEmpty) {
resolvedProvider = explicitProvider;
} else {
resolvedProvider =
extensionState.extensions
.where(
(ext) =>
ext.enabled &&
ext.hasCustomSearch &&
ext.searchBehavior?.primary == true,
)
.map((ext) => ext.id)
.firstOrNull ??
extensionState.extensions
.where((ext) => ext.enabled && ext.hasCustomSearch)
.map((ext) => ext.id)
.firstOrNull;
resolvedProvider = defaultSearchExtension(extensionState.extensions)?.id;
}
if (resolvedProvider != null &&
@@ -339,20 +326,7 @@ class TrackNotifier extends Notifier<TrackState> {
) &&
settings.searchProvider?.trim() == resolvedProvider) {
ref.read(settingsProvider.notifier).setSearchProvider(null);
resolvedProvider =
extensionState.extensions
.where(
(ext) =>
ext.enabled &&
ext.hasCustomSearch &&
ext.searchBehavior?.primary == true,
)
.map((ext) => ext.id)
.firstOrNull ??
extensionState.extensions
.where((ext) => ext.enabled && ext.hasCustomSearch)
.map((ext) => ext.id)
.firstOrNull;
resolvedProvider = defaultSearchExtension(extensionState.extensions)?.id;
}
final isEnabledExtensionProvider =