mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-27 21:30:23 +02:00
fix: correct track/disc defaults, forward extension metadata, and fix service ID display
- Default track/disc number to 0 (unknown) instead of 1, letting the backend use the service-provided value or skip the field entirely - Add releaseDate to ExploreItem so explore downloads carry release info - Pass discNumber and releaseDate from extension album/playlist tracks - Fix isDeezer detection using service field instead of substring match - Add _displayServiceTrackId() to properly strip prefixes for all services
This commit is contained in:
@@ -1845,10 +1845,10 @@ class _HomeTabState extends ConsumerState<HomeTab>
|
||||
albumName: item.albumName ?? '',
|
||||
albumId: item.albumId,
|
||||
duration: item.durationMs ~/ 1000,
|
||||
trackNumber: 1,
|
||||
discNumber: 1,
|
||||
trackNumber: null,
|
||||
discNumber: null,
|
||||
isrc: null,
|
||||
releaseDate: null,
|
||||
releaseDate: item.releaseDate,
|
||||
coverUrl: item.coverUrl,
|
||||
source: item.providerId ?? 'spotify-web',
|
||||
);
|
||||
@@ -4272,6 +4272,8 @@ class _ExtensionAlbumScreenState extends ConsumerState<ExtensionAlbumScreen> {
|
||||
isrc: data['isrc']?.toString(),
|
||||
duration: (durationMs / 1000).round(),
|
||||
trackNumber: data['track_number'] as int?,
|
||||
discNumber: data['disc_number'] as int?,
|
||||
releaseDate: data['release_date']?.toString(),
|
||||
source: widget.extensionId,
|
||||
);
|
||||
}
|
||||
@@ -4429,6 +4431,8 @@ class _ExtensionPlaylistScreenState
|
||||
isrc: data['isrc']?.toString(),
|
||||
duration: (durationMs / 1000).round(),
|
||||
trackNumber: data['track_number'] as int?,
|
||||
discNumber: data['disc_number'] as int?,
|
||||
releaseDate: data['release_date']?.toString(),
|
||||
source: widget.extensionId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -552,6 +552,36 @@ class _TrackMetadataScreenState extends ConsumerState<TrackMetadataScreen> {
|
||||
return parsed;
|
||||
}
|
||||
|
||||
String _displayServiceTrackId(String value) {
|
||||
final raw = value.trim();
|
||||
if (raw.isEmpty) return raw;
|
||||
final spotifyTrackIdPattern = RegExp(r'^[A-Za-z0-9]{22}$');
|
||||
|
||||
if (raw.startsWith('deezer:')) return raw.substring('deezer:'.length);
|
||||
if (raw.startsWith('tidal:')) return raw.substring('tidal:'.length);
|
||||
if (raw.startsWith('qobuz:')) return raw.substring('qobuz:'.length);
|
||||
if (spotifyTrackIdPattern.hasMatch(raw)) return raw;
|
||||
|
||||
if (raw.startsWith('spotify:')) {
|
||||
final last = raw.split(':').last.trim();
|
||||
if (spotifyTrackIdPattern.hasMatch(last)) return last;
|
||||
return raw;
|
||||
}
|
||||
|
||||
final uri = Uri.tryParse(raw);
|
||||
if (uri != null &&
|
||||
uri.host.contains('spotify.com') &&
|
||||
uri.pathSegments.length >= 2 &&
|
||||
uri.pathSegments.first == 'track') {
|
||||
final candidate = uri.pathSegments[1].trim();
|
||||
if (spotifyTrackIdPattern.hasMatch(candidate)) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
return raw;
|
||||
}
|
||||
|
||||
String? get _displayAudioQuality {
|
||||
final fileName = _extractFileNameFromPathOrUri(cleanFilePath);
|
||||
final fileExt = fileName.contains('.')
|
||||
@@ -1102,8 +1132,9 @@ class _TrackMetadataScreenState extends ConsumerState<TrackMetadataScreen> {
|
||||
Future<void> _openServiceUrl(BuildContext context) async {
|
||||
if (_spotifyId == null) return;
|
||||
|
||||
final isDeezer = _spotifyId!.contains('deezer');
|
||||
final rawId = _spotifyId!.replaceAll('deezer:', '');
|
||||
final isDeezer =
|
||||
_service.toLowerCase() == 'deezer' || _spotifyId!.startsWith('deezer:');
|
||||
final rawId = _displayServiceTrackId(_spotifyId!);
|
||||
final svc = _service.toLowerCase();
|
||||
|
||||
String webUrl;
|
||||
@@ -1192,8 +1223,9 @@ class _TrackMetadataScreenState extends ConsumerState<TrackMetadataScreen> {
|
||||
];
|
||||
|
||||
if (!_isLocalItem && _spotifyId != null && _spotifyId!.isNotEmpty) {
|
||||
final isDeezer = _spotifyId!.contains('deezer');
|
||||
final cleanId = _spotifyId!.replaceAll('deezer:', '');
|
||||
final isDeezer =
|
||||
_service.toLowerCase() == 'deezer' || _spotifyId!.startsWith('deezer:');
|
||||
final cleanId = _displayServiceTrackId(_spotifyId!);
|
||||
String idLabel;
|
||||
if (isDeezer) {
|
||||
idLabel = 'Deezer ID';
|
||||
|
||||
Reference in New Issue
Block a user