mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-27 11:51:56 +02:00
refactor(dart): consolidate duplicated lookup, filename, and search-provider helpers
This commit is contained in:
@@ -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, {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user