From 5c6bf02f1cf6165d6f58fa60e235022f58ab9446 Mon Sep 17 00:00:00 2001 From: zarzet Date: Sat, 3 Jan 2026 05:43:14 +0700 Subject: [PATCH] v2.0.1: Unified progress tracking, quality picker consistency, notification fixes --- CHANGELOG.md | 34 ++-- flutter_01.png | Bin 133277 -> 0 bytes go_backend/amazon.go | 20 +-- go_backend/progress.go | 171 +++++---------------- go_backend/qobuz.go | 20 +-- go_backend/tidal.go | 40 ++--- lib/constants/app_info.dart | 4 +- lib/providers/download_queue_provider.dart | 156 ++++++++----------- lib/screens/album_screen.dart | 2 +- lib/screens/home_tab.dart | 10 +- lib/screens/playlist_screen.dart | 2 +- pubspec.yaml | 2 +- temp_changelog.txt | 38 ----- 13 files changed, 160 insertions(+), 339 deletions(-) delete mode 100644 flutter_01.png delete mode 100644 temp_changelog.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index fcf21a0d..99bb3dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## [2.0.1] - 2026-01-03 + +### Added +- **Quality Picker Track Info**: Shows track name, artist, and cover in quality picker + - Tap to expand long track titles + - Expand icon only shows when title is truncated + - Ripple effect follows rounded corners including drag handle + +### Changed +- **Update Dialog Redesign**: Material Expressive 3 style + - Icon header with container + - Version chips with "Current" and "New" labels + - Changelog in rounded card + - Download progress with percentage indicator + - Cleaner button layout +- **Unified Progress Tracking System**: Deprecated legacy single-download progress + - All downloads now use item-based progress tracking + - Fixes duplicate notification bug when finalizing + - Cleaner codebase with single progress system + +### Fixed +- **Duplicate Notification Bug**: Fixed issue where "Finalizing" and "Downloading" notifications appeared simultaneously +- **Update Notification Stuck**: Fixed notification staying at 100% after download completes + ## [2.0.0] - 2026-01-03 ### Added @@ -48,16 +72,6 @@ - Theme/view mode chips have visible borders in light mode - **Navigation Bar Styling**: Distinct background color from content area - **Ask Before Download Default**: Now enabled by default for better UX -- **Quality Picker Track Info**: Shows track name, artist, and cover in quality picker - - Tap to expand long track titles - - Expand icon only shows when title is truncated - - Ripple effect follows rounded corners including drag handle -- **Update Dialog Redesign**: Material Expressive 3 style - - Icon header with container - - Version chips with "Current" and "New" labels - - Changelog in rounded card - - Download progress with percentage indicator - - Cleaner button layout ### Fixed - **Artist Profile Images**: Fixed artist images not showing in search results (field name mismatch) diff --git a/flutter_01.png b/flutter_01.png deleted file mode 100644 index e80af511d8209845b35424a85fcc4e2567d017fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133277 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%0D6Ik)(wEQZXxtNX)Qh&3 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 diff --git a/go_backend/amazon.go b/go_backend/amazon.go index 10d48fbd..55c8870a 100644 --- a/go_backend/amazon.go +++ b/go_backend/amazon.go @@ -203,12 +203,7 @@ func (a *AmazonDownloader) downloadFromDoubleDoubleService(amazonURL, outputDir // DownloadFile downloads a file from URL with User-Agent and progress tracking func (a *AmazonDownloader) DownloadFile(downloadURL, outputPath, itemID string) error { - // Set current file being downloaded (legacy) - SetCurrentFile(filepath.Base(outputPath)) - SetDownloading(true) - defer SetDownloading(false) - - // Initialize item progress if itemID provided + // Initialize item progress (required for all downloads) if itemID != "" { StartItemProgress(itemID) defer CompleteItemProgress(itemID) @@ -232,11 +227,8 @@ func (a *AmazonDownloader) DownloadFile(downloadURL, outputPath, itemID string) } // Set total bytes if available - if resp.ContentLength > 0 { - SetBytesTotal(resp.ContentLength) - if itemID != "" { - SetItemBytesTotal(itemID, resp.ContentLength) - } + if resp.ContentLength > 0 && itemID != "" { + SetItemBytesTotal(itemID, resp.ContentLength) } out, err := os.Create(outputPath) @@ -245,14 +237,14 @@ func (a *AmazonDownloader) DownloadFile(downloadURL, outputPath, itemID string) } defer out.Close() - // Use appropriate progress writer + // Use item progress writer var bytesWritten int64 if itemID != "" { pw := NewItemProgressWriter(out, itemID) bytesWritten, err = io.Copy(pw, resp.Body) } else { - pw := NewProgressWriter(out) - bytesWritten, err = io.Copy(pw, resp.Body) + // Fallback: direct copy without progress tracking + bytesWritten, err = io.Copy(out, resp.Body) } if err != nil { return fmt.Errorf("failed to write file: %w", err) diff --git a/go_backend/progress.go b/go_backend/progress.go index 94a0d3e6..d86778f9 100644 --- a/go_backend/progress.go +++ b/go_backend/progress.go @@ -5,7 +5,8 @@ import ( "sync" ) -// DownloadProgress represents current download progress (legacy single download) +// DownloadProgress represents current download progress +// Now unified - returns data from multi-progress system type DownloadProgress struct { CurrentFile string `json:"current_file"` Progress float64 `json:"progress"` @@ -32,28 +33,40 @@ type MultiProgress struct { } var ( - currentProgress DownloadProgress - progressMu sync.RWMutex - downloadDir string - downloadDirMu sync.RWMutex - - // Multi-download progress tracking + downloadDir string + downloadDirMu sync.RWMutex + + // Multi-download progress tracking (unified system) multiProgress = MultiProgress{Items: make(map[string]*ItemProgress)} multiMu sync.RWMutex ) -// getProgress returns current download progress (legacy) +// getProgress returns current download progress from multi-progress system +// Returns first active item's progress for backward compatibility func getProgress() DownloadProgress { - progressMu.RLock() - defer progressMu.RUnlock() - return currentProgress + multiMu.RLock() + defer multiMu.RUnlock() + + // Find first active item + for _, item := range multiProgress.Items { + return DownloadProgress{ + CurrentFile: item.ItemID, + Progress: item.Progress * 100, // Convert to percentage + BytesTotal: item.BytesTotal, + BytesReceived: item.BytesReceived, + IsDownloading: item.IsDownloading, + Status: item.Status, + } + } + + return DownloadProgress{} } // GetMultiProgress returns progress for all active downloads as JSON func GetMultiProgress() string { multiMu.RLock() defer multiMu.RUnlock() - + jsonBytes, err := json.Marshal(multiProgress) if err != nil { return "{\"items\":{}}" @@ -65,7 +78,7 @@ func GetMultiProgress() string { func GetItemProgress(itemID string) string { multiMu.RLock() defer multiMu.RUnlock() - + if item, ok := multiProgress.Items[itemID]; ok { jsonBytes, _ := json.Marshal(item) return string(jsonBytes) @@ -77,7 +90,7 @@ func GetItemProgress(itemID string) string { func StartItemProgress(itemID string) { multiMu.Lock() defer multiMu.Unlock() - + multiProgress.Items[itemID] = &ItemProgress{ ItemID: itemID, BytesTotal: 0, @@ -92,7 +105,7 @@ func StartItemProgress(itemID string) { func SetItemBytesTotal(itemID string, total int64) { multiMu.Lock() defer multiMu.Unlock() - + if item, ok := multiProgress.Items[itemID]; ok { item.BytesTotal = total } @@ -102,7 +115,7 @@ func SetItemBytesTotal(itemID string, total int64) { func SetItemBytesReceived(itemID string, received int64) { multiMu.Lock() defer multiMu.Unlock() - + if item, ok := multiProgress.Items[itemID]; ok { item.BytesReceived = received if item.BytesTotal > 0 { @@ -115,16 +128,19 @@ func SetItemBytesReceived(itemID string, received int64) { func CompleteItemProgress(itemID string) { multiMu.Lock() defer multiMu.Unlock() - + if item, ok := multiProgress.Items[itemID]; ok { item.Progress = 1.0 item.IsDownloading = false + item.Status = "completed" } } -// SetItemProgress sets progress for an item directly (used to force 100% before embedding) +// SetItemProgress sets progress for an item directly func SetItemProgress(itemID string, progress float64, bytesReceived, bytesTotal int64) { multiMu.Lock() + defer multiMu.Unlock() + if item, ok := multiProgress.Items[itemID]; ok { item.Progress = progress if bytesReceived > 0 { @@ -134,39 +150,24 @@ func SetItemProgress(itemID string, progress float64, bytesReceived, bytesTotal item.BytesTotal = bytesTotal } } - multiMu.Unlock() - - // Also update legacy progress for backward compatibility - progressMu.Lock() - if progress >= 1.0 { - currentProgress.Progress = 100.0 - } else { - currentProgress.Progress = progress * 100.0 - } - progressMu.Unlock() } // SetItemFinalizing marks an item as finalizing (embedding metadata) func SetItemFinalizing(itemID string) { multiMu.Lock() + defer multiMu.Unlock() + if item, ok := multiProgress.Items[itemID]; ok { item.Progress = 1.0 item.Status = "finalizing" } - multiMu.Unlock() - - // Also update legacy progress - progressMu.Lock() - currentProgress.Progress = 100.0 - currentProgress.Status = "finalizing" - progressMu.Unlock() } // RemoveItemProgress removes progress tracking for an item func RemoveItemProgress(itemID string) { multiMu.Lock() defer multiMu.Unlock() - + delete(multiProgress.Items, itemID) } @@ -174,46 +175,10 @@ func RemoveItemProgress(itemID string) { func ClearAllItemProgress() { multiMu.Lock() defer multiMu.Unlock() - + multiProgress.Items = make(map[string]*ItemProgress) } -// Legacy functions for backward compatibility - -// SetDownloadProgress sets the current download progress (MB downloaded) -func SetDownloadProgress(mbDownloaded float64) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.Progress = mbDownloaded - currentProgress.IsDownloading = true -} - -// SetDownloadSpeed sets the current download speed -func SetDownloadSpeed(speedMBps float64) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.Speed = speedMBps -} - -// SetCurrentFile sets the current file being downloaded and resets progress -func SetCurrentFile(filename string) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.BytesReceived = 0 - currentProgress.BytesTotal = 0 - currentProgress.Progress = 0 - currentProgress.CurrentFile = filename - currentProgress.IsDownloading = true - currentProgress.Status = "downloading" -} - -// ResetProgress resets the download progress -func ResetProgress() { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress = DownloadProgress{} -} - // setDownloadDir sets the default download directory func setDownloadDir(path string) error { downloadDirMu.Lock() @@ -229,64 +194,6 @@ func getDownloadDir() string { return downloadDir } -// SetDownloading sets the download status -func SetDownloading(status bool) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.IsDownloading = status -} - -// SetBytesTotal sets total bytes to download -func SetBytesTotal(total int64) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.BytesTotal = total -} - -// SetBytesReceived sets bytes received so far -func SetBytesReceived(received int64) { - progressMu.Lock() - defer progressMu.Unlock() - currentProgress.BytesReceived = received - if currentProgress.BytesTotal > 0 { - currentProgress.Progress = float64(received) / float64(currentProgress.BytesTotal) * 100 - } -} - -// ProgressWriter wraps io.Writer to track download progress (legacy single) -type ProgressWriter struct { - writer interface{ Write([]byte) (int, error) } - total int64 - current int64 -} - -// NewProgressWriter creates a new progress writer wrapping an io.Writer -func NewProgressWriter(w interface{ Write([]byte) (int, error) }) *ProgressWriter { - SetBytesReceived(0) - return &ProgressWriter{ - writer: w, - current: 0, - total: 0, - } -} - -// Write implements io.Writer -func (pw *ProgressWriter) Write(p []byte) (int, error) { - n, err := pw.writer.Write(p) - if err != nil { - return n, err - } - pw.current += int64(n) - pw.total += int64(n) - SetBytesReceived(pw.current) - return n, nil -} - -// GetTotal returns total bytes written -func (pw *ProgressWriter) GetTotal() int64 { - return pw.total -} - // ItemProgressWriter wraps io.Writer to track download progress for a specific item type ItemProgressWriter struct { writer interface{ Write([]byte) (int, error) } @@ -311,7 +218,5 @@ func (pw *ItemProgressWriter) Write(p []byte) (int, error) { } pw.current += int64(n) SetItemBytesReceived(pw.itemID, pw.current) - // Also update legacy progress for backward compatibility - SetBytesReceived(pw.current) return n, nil } diff --git a/go_backend/qobuz.go b/go_backend/qobuz.go index 338c1951..97c15511 100644 --- a/go_backend/qobuz.go +++ b/go_backend/qobuz.go @@ -262,12 +262,7 @@ func (q *QobuzDownloader) GetDownloadURL(trackID int64, quality string) (string, // DownloadFile downloads a file from URL with User-Agent and progress tracking func (q *QobuzDownloader) DownloadFile(downloadURL, outputPath, itemID string) error { - // Set current file being downloaded (legacy) - SetCurrentFile(filepath.Base(outputPath)) - SetDownloading(true) - defer SetDownloading(false) - - // Initialize item progress if itemID provided + // Initialize item progress (required for all downloads) if itemID != "" { StartItemProgress(itemID) defer CompleteItemProgress(itemID) @@ -289,11 +284,8 @@ func (q *QobuzDownloader) DownloadFile(downloadURL, outputPath, itemID string) e } // Set total bytes if available - if resp.ContentLength > 0 { - SetBytesTotal(resp.ContentLength) - if itemID != "" { - SetItemBytesTotal(itemID, resp.ContentLength) - } + if resp.ContentLength > 0 && itemID != "" { + SetItemBytesTotal(itemID, resp.ContentLength) } out, err := os.Create(outputPath) @@ -302,13 +294,13 @@ func (q *QobuzDownloader) DownloadFile(downloadURL, outputPath, itemID string) e } defer out.Close() - // Use appropriate progress writer + // Use item progress writer if itemID != "" { progressWriter := NewItemProgressWriter(out, itemID) _, err = io.Copy(progressWriter, resp.Body) } else { - progressWriter := NewProgressWriter(out) - _, err = io.Copy(progressWriter, resp.Body) + // Fallback: direct copy without progress tracking + _, err = io.Copy(out, resp.Body) } return err } diff --git a/go_backend/tidal.go b/go_backend/tidal.go index 1ad3728f..664c0105 100644 --- a/go_backend/tidal.go +++ b/go_backend/tidal.go @@ -646,12 +646,7 @@ func (t *TidalDownloader) DownloadFile(downloadURL, outputPath, itemID string) e return t.downloadFromManifest(strings.TrimPrefix(downloadURL, "MANIFEST:"), outputPath, itemID) } - // Set current file being downloaded (legacy) - SetCurrentFile(filepath.Base(outputPath)) - SetDownloading(true) - defer SetDownloading(false) - - // Initialize item progress if itemID provided + // Initialize item progress (required for all downloads) if itemID != "" { StartItemProgress(itemID) defer CompleteItemProgress(itemID) @@ -673,11 +668,8 @@ func (t *TidalDownloader) DownloadFile(downloadURL, outputPath, itemID string) e } // Set total bytes if available - if resp.ContentLength > 0 { - SetBytesTotal(resp.ContentLength) - if itemID != "" { - SetItemBytesTotal(itemID, resp.ContentLength) - } + if resp.ContentLength > 0 && itemID != "" { + SetItemBytesTotal(itemID, resp.ContentLength) } out, err := os.Create(outputPath) @@ -686,13 +678,13 @@ func (t *TidalDownloader) DownloadFile(downloadURL, outputPath, itemID string) e } defer out.Close() - // Use appropriate progress writer + // Use item progress writer if itemID != "" { progressWriter := NewItemProgressWriter(out, itemID) _, err = io.Copy(progressWriter, resp.Body) } else { - progressWriter := NewProgressWriter(out) - _, err = io.Copy(progressWriter, resp.Body) + // Fallback: direct copy without progress tracking + _, err = io.Copy(out, resp.Body) } return err } @@ -709,12 +701,7 @@ func (t *TidalDownloader) downloadFromManifest(manifestB64, outputPath, itemID s // If we have a direct URL (BTS format), download directly with progress tracking if directURL != "" { - // Set current file being downloaded (legacy) - SetCurrentFile(filepath.Base(outputPath)) - SetDownloading(true) - defer SetDownloading(false) - - // Initialize item progress if itemID provided + // Initialize item progress (required for all downloads) if itemID != "" { StartItemProgress(itemID) defer CompleteItemProgress(itemID) @@ -736,11 +723,8 @@ func (t *TidalDownloader) downloadFromManifest(manifestB64, outputPath, itemID s } // Set total bytes for progress tracking - if resp.ContentLength > 0 { - SetBytesTotal(resp.ContentLength) - if itemID != "" { - SetItemBytesTotal(itemID, resp.ContentLength) - } + if resp.ContentLength > 0 && itemID != "" { + SetItemBytesTotal(itemID, resp.ContentLength) } out, err := os.Create(outputPath) @@ -749,13 +733,13 @@ func (t *TidalDownloader) downloadFromManifest(manifestB64, outputPath, itemID s } defer out.Close() - // Use appropriate progress writer + // Use item progress writer if itemID != "" { progressWriter := NewItemProgressWriter(out, itemID) _, err = io.Copy(progressWriter, resp.Body) } else { - progressWriter := NewProgressWriter(out) - _, err = io.Copy(progressWriter, resp.Body) + // Fallback: direct copy without progress tracking + _, err = io.Copy(out, resp.Body) } return err } diff --git a/lib/constants/app_info.dart b/lib/constants/app_info.dart index f1f82455..95aabbe6 100644 --- a/lib/constants/app_info.dart +++ b/lib/constants/app_info.dart @@ -1,8 +1,8 @@ /// App version and info constants /// Update version here only - all other files will reference this class AppInfo { - static const String version = '2.0.0'; - static const String buildNumber = '30'; + static const String version = '2.0.1'; + static const String buildNumber = '31'; static const String fullVersion = '$version+$buildNumber'; diff --git a/lib/providers/download_queue_provider.dart b/lib/providers/download_queue_provider.dart index 0509ae1c..a92d7eb6 100644 --- a/lib/providers/download_queue_provider.dart +++ b/lib/providers/download_queue_provider.dart @@ -267,6 +267,8 @@ class DownloadQueueNotifier extends Notifier { static const _queueStorageKey = 'download_queue'; // Storage key for queue persistence final NotificationService _notificationService = NotificationService(); int _totalQueuedAtStart = 0; // Track total items when queue started + int _completedInSession = 0; // Track completed downloads in current session + int _failedInSession = 0; // Track failed downloads in current session bool _isLoaded = false; @override @@ -354,69 +356,7 @@ class DownloadQueueNotifier extends Notifier { } } - void _startProgressPolling(String itemId) { - _progressTimer?.cancel(); - _progressTimer = Timer.periodic(const Duration(milliseconds: 500), (timer) async { - try { - final progress = await PlatformBridge.getDownloadProgress(); - final bytesReceived = progress['bytes_received'] as int? ?? 0; - final bytesTotal = progress['bytes_total'] as int? ?? 0; - final isDownloading = progress['is_downloading'] as bool? ?? false; - final status = progress['status'] as String? ?? 'downloading'; - - // Check if status is "finalizing" (embedding metadata) - if (status == 'finalizing') { - updateItemStatus(itemId, DownloadStatus.finalizing, progress: 1.0); - - // Update notification to show finalizing - final currentItem = state.items.where((i) => i.id == itemId).firstOrNull; - if (currentItem != null) { - _notificationService.showDownloadFinalizing( - trackName: currentItem.track.name, - artistName: currentItem.track.artistName, - ); - } - return; - } - - if (isDownloading && bytesTotal > 0) { - final percentage = bytesReceived / bytesTotal; - updateProgress(itemId, percentage); - - // Update notification with progress - final currentItem = state.currentDownload; - if (currentItem != null) { - _notificationService.showDownloadProgress( - trackName: currentItem.track.name, - artistName: currentItem.track.artistName, - progress: bytesReceived, - total: bytesTotal, - ); - - // Update foreground service notification (Android) - if (Platform.isAndroid) { - PlatformBridge.updateDownloadServiceProgress( - trackName: currentItem.track.name, - artistName: currentItem.track.artistName, - progress: bytesReceived, - total: bytesTotal, - queueCount: state.queuedCount, - ).catchError((_) {}); // Ignore errors - } - } - - // Log progress - final mbReceived = bytesReceived / (1024 * 1024); - final mbTotal = bytesTotal / (1024 * 1024); - _log.d('Progress: ${(percentage * 100).toStringAsFixed(1)}% (${mbReceived.toStringAsFixed(2)}/${mbTotal.toStringAsFixed(2)} MB)'); - } - } catch (e) { - // Ignore polling errors - } - }); - } - - /// Start multi-progress polling for concurrent downloads + /// Start multi-progress polling for all downloads (sequential and parallel) void _startMultiProgressPolling() { _progressTimer?.cancel(); _progressTimer = Timer.periodic(const Duration(milliseconds: 500), (timer) async { @@ -424,6 +364,10 @@ class DownloadQueueNotifier extends Notifier { final allProgress = await PlatformBridge.getAllDownloadProgress(); final items = allProgress['items'] as Map? ?? {}; + bool hasFinalizingItem = false; + String? finalizingTrackName; + String? finalizingArtistName; + for (final entry in items.entries) { final itemId = entry.key; final itemProgress = entry.value as Map; @@ -433,16 +377,16 @@ class DownloadQueueNotifier extends Notifier { final status = itemProgress['status'] as String? ?? 'downloading'; // Check if status is "finalizing" (embedding metadata) - if (status == 'finalizing') { + // Only trust finalizing status if bytesTotal > 0 (download actually happened) + if (status == 'finalizing' && bytesTotal > 0) { updateItemStatus(itemId, DownloadStatus.finalizing, progress: 1.0); - // Update notification to show finalizing + // Track finalizing item for notification final currentItem = state.items.where((i) => i.id == itemId).firstOrNull; if (currentItem != null) { - _notificationService.showDownloadFinalizing( - trackName: currentItem.track.name, - artistName: currentItem.track.artistName, - ); + hasFinalizingItem = true; + finalizingTrackName = currentItem.track.name; + finalizingArtistName = currentItem.track.artistName; } continue; } @@ -458,19 +402,36 @@ class DownloadQueueNotifier extends Notifier { } } - // Update notification with first active download + // Show finalizing notification if any item is finalizing (takes priority) + if (hasFinalizingItem && finalizingTrackName != null) { + _notificationService.showDownloadFinalizing( + trackName: finalizingTrackName, + artistName: finalizingArtistName ?? '', + ); + return; // Don't show download progress notification + } + + // Update notification with active downloads if (items.isNotEmpty) { final firstEntry = items.entries.first; final firstProgress = firstEntry.value as Map; final bytesReceived = firstProgress['bytes_received'] as int? ?? 0; final bytesTotal = firstProgress['bytes_total'] as int? ?? 0; - // Find the item to get track info - final downloadingItems = state.items.where((i) => i.status == DownloadStatus.downloading || i.status == DownloadStatus.finalizing).toList(); + // Find downloading items (not finalizing) + final downloadingItems = state.items.where((i) => i.status == DownloadStatus.downloading).toList(); if (downloadingItems.isNotEmpty) { + // Show single track name if only 1 download, otherwise show count + final trackName = downloadingItems.length == 1 + ? downloadingItems.first.track.name + : '${downloadingItems.length} downloads'; + final artistName = downloadingItems.length == 1 + ? downloadingItems.first.track.artistName + : 'Downloading...'; + _notificationService.showDownloadProgress( - trackName: '${downloadingItems.length} downloads', - artistName: 'Downloading...', + trackName: trackName, + artistName: artistName, progress: bytesReceived, total: bytesTotal > 0 ? bytesTotal : 1, ); @@ -823,6 +784,8 @@ class DownloadQueueNotifier extends Notifier { // Track total items at start for notification _totalQueuedAtStart = state.items.where((i) => i.status == DownloadStatus.queued).length; + _completedInSession = 0; + _failedInSession = 0; // Start foreground service to keep downloads running in background (Android only) if (Platform.isAndroid && _totalQueuedAtStart > 0) { @@ -893,12 +856,11 @@ class DownloadQueueNotifier extends Notifier { } // Show queue completion notification - final completedCount = state.completedCount; - final failedCount = state.failedCount; + _log.i('Queue stats - completed: $_completedInSession, failed: $_failedInSession, totalAtStart: $_totalQueuedAtStart'); if (_totalQueuedAtStart > 0) { await _notificationService.showQueueComplete( - completedCount: completedCount, - failedCount: failedCount, + completedCount: _completedInSession, + failedCount: _failedInSession, ); } @@ -906,8 +868,11 @@ class DownloadQueueNotifier extends Notifier { state = state.copyWith(isProcessing: false, currentDownload: null); } - /// Sequential download processing (original behavior) + /// Sequential download processing (uses multi-progress system with single item) Future _processQueueSequential() async { + // Start multi-progress polling (works for both sequential and parallel) + _startMultiProgressPolling(); + while (true) { // Check if paused if (state.isPaused) { @@ -932,7 +897,13 @@ class DownloadQueueNotifier extends Notifier { } await _downloadSingleItem(nextItem); + + // Clear item progress after download completes + PlatformBridge.clearItemProgress(nextItem.id).catchError((_) {}); } + + // Stop polling when queue is done + _stopProgressPolling(); } /// Parallel download processing with worker pool @@ -940,7 +911,7 @@ class DownloadQueueNotifier extends Notifier { final maxConcurrent = state.concurrentDownloads; final activeDownloads = >{}; // Map item ID to future - // Start multi-progress polling for concurrent downloads + // Start multi-progress polling (shared with sequential mode) _startMultiProgressPolling(); while (true) { @@ -991,6 +962,9 @@ class DownloadQueueNotifier extends Notifier { if (activeDownloads.isNotEmpty) { await Future.wait(activeDownloads.values); } + + // Stop polling when queue is done + _stopProgressPolling(); } /// Download a single item (used by both sequential and parallel processing) @@ -998,11 +972,8 @@ class DownloadQueueNotifier extends Notifier { _log.d('Processing: ${item.track.name} by ${item.track.artistName}'); _log.d('Cover URL: ${item.track.coverUrl}'); - // Only set currentDownload for sequential mode (for progress polling) - if (state.concurrentDownloads == 1) { - state = state.copyWith(currentDownload: item); - _startProgressPolling(item.id); - } + // Set currentDownload for UI reference + state = state.copyWith(currentDownload: item); updateItemStatus(item.id, DownloadStatus.downloading); @@ -1058,11 +1029,6 @@ class DownloadQueueNotifier extends Notifier { convertLyricsToRomaji: settings.convertLyricsToRomaji, ); } - - // Stop progress polling for this item (sequential mode only) - if (state.concurrentDownloads == 1) { - _stopProgressPolling(); - } _log.d('Result: $result'); @@ -1099,12 +1065,15 @@ class DownloadQueueNotifier extends Notifier { progress: 1.0, filePath: filePath, ); + + // Increment completed counter + _completedInSession++; // Show completion notification for this track await _notificationService.showDownloadComplete( trackName: item.track.name, artistName: item.track.artistName, - completedCount: state.completedCount, + completedCount: _completedInSession, totalCount: _totalQueuedAtStart, ); @@ -1142,6 +1111,7 @@ class DownloadQueueNotifier extends Notifier { DownloadStatus.failed, error: errorMsg, ); + _failedInSession++; } // Increment download counter and cleanup connections periodically @@ -1155,15 +1125,13 @@ class DownloadQueueNotifier extends Notifier { } } } catch (e, stackTrace) { - if (state.concurrentDownloads == 1) { - _stopProgressPolling(); - } _log.e('Exception: $e', e, stackTrace); updateItemStatus( item.id, DownloadStatus.failed, error: e.toString(), ); + _failedInSession++; } } } diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart index d6e0ebb3..1eb2024a 100644 --- a/lib/screens/album_screen.dart +++ b/lib/screens/album_screen.dart @@ -351,7 +351,7 @@ class _AlbumScreenState extends ConsumerState { ), _QualityOption(title: 'FLAC Lossless', subtitle: '16-bit / 44.1kHz', icon: Icons.music_note, onTap: () { Navigator.pop(context); onSelect('LOSSLESS'); }), _QualityOption(title: 'Hi-Res FLAC', subtitle: '24-bit / up to 96kHz', icon: Icons.high_quality, onTap: () { Navigator.pop(context); onSelect('HI_RES'); }), - _QualityOption(title: 'Hi-Res FLAC Max', subtitle: '24-bit / up to 192kHz', icon: Icons.hd, onTap: () { Navigator.pop(context); onSelect('HI_RES_LOSSLESS'); }), + _QualityOption(title: 'Hi-Res FLAC Max', subtitle: '24-bit / up to 192kHz', icon: Icons.four_k, onTap: () { Navigator.pop(context); onSelect('HI_RES_LOSSLESS'); }), const SizedBox(height: 16), ], ), diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index f45caefd..ac30d485 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -225,16 +225,19 @@ class _HomeTabState extends ConsumerState with AutomaticKeepAliveClient _QualityPickerOption( title: 'FLAC Lossless', subtitle: '16-bit / 44.1kHz', + icon: Icons.music_note, onTap: () { Navigator.pop(context); onSelect('LOSSLESS'); }, ), _QualityPickerOption( title: 'Hi-Res FLAC', subtitle: '24-bit / up to 96kHz', + icon: Icons.high_quality, onTap: () { Navigator.pop(context); onSelect('HI_RES'); }, ), _QualityPickerOption( title: 'Hi-Res FLAC Max', subtitle: '24-bit / up to 192kHz', + icon: Icons.four_k, onTap: () { Navigator.pop(context); onSelect('HI_RES_LOSSLESS'); }, ), const SizedBox(height: 16), @@ -669,16 +672,17 @@ class _HomeTabState extends ConsumerState with AutomaticKeepAliveClient class _QualityPickerOption extends StatelessWidget { final String title; final String subtitle; + final IconData icon; final VoidCallback onTap; - const _QualityPickerOption({required this.title, required this.subtitle, required this.onTap}); + const _QualityPickerOption({required this.title, required this.subtitle, required this.icon, required this.onTap}); @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; return ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 4), - leading: Icon(Icons.music_note, color: colorScheme.primary), - title: Text(title), + leading: Container(padding: const EdgeInsets.all(10), decoration: BoxDecoration(color: colorScheme.primaryContainer, borderRadius: BorderRadius.circular(12)), child: Icon(icon, color: colorScheme.onPrimaryContainer, size: 20)), + title: Text(title, style: const TextStyle(fontWeight: FontWeight.w500)), subtitle: Text(subtitle, style: TextStyle(color: colorScheme.onSurfaceVariant)), onTap: onTap, ); diff --git a/lib/screens/playlist_screen.dart b/lib/screens/playlist_screen.dart index cbbfb3ba..2d42642d 100644 --- a/lib/screens/playlist_screen.dart +++ b/lib/screens/playlist_screen.dart @@ -213,7 +213,7 @@ class PlaylistScreen extends ConsumerWidget { Padding(padding: const EdgeInsets.fromLTRB(24, 16, 24, 8), child: Text('Select Quality', style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold))), _QualityOption(title: 'FLAC Lossless', subtitle: '16-bit / 44.1kHz', icon: Icons.music_note, onTap: () { Navigator.pop(context); onSelect('LOSSLESS'); }), _QualityOption(title: 'Hi-Res FLAC', subtitle: '24-bit / up to 96kHz', icon: Icons.high_quality, onTap: () { Navigator.pop(context); onSelect('HI_RES'); }), - _QualityOption(title: 'Hi-Res FLAC Max', subtitle: '24-bit / up to 192kHz', icon: Icons.hd, onTap: () { Navigator.pop(context); onSelect('HI_RES_LOSSLESS'); }), + _QualityOption(title: 'Hi-Res FLAC Max', subtitle: '24-bit / up to 192kHz', icon: Icons.four_k, onTap: () { Navigator.pop(context); onSelect('HI_RES_LOSSLESS'); }), const SizedBox(height: 16), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index c4611ba1..182d7fa0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: spotiflac_android description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music publish_to: 'none' -version: 2.0.0+30 +version: 2.0.1+31 environment: sdk: ^3.10.0 diff --git a/temp_changelog.txt b/temp_changelog.txt deleted file mode 100644 index 1d377d42..00000000 --- a/temp_changelog.txt +++ /dev/null @@ -1,38 +0,0 @@ -# Changelog - -## [1.1.0] - 2026-01-01 - -### Added -- **Parallel Downloads**: Download up to 3 tracks simultaneously (configurable in Settings) - - Default: Sequential (1 at a time) for stability - - Options: 1, 2, or 3 concurrent downloads - - Warning about potential rate limiting from streaming services -- **Download Progress Tracking**: Real-time progress for BTS manifest downloads from Tidal -- **History Persistence**: Download history now persists across app restarts using SharedPreferences -- **Connection Pooling**: Shared HTTP transport to prevent TCP connection exhaustion during large batch downloads -- **Connection Cleanup**: Automatic cleanup of idle connections every 50 downloads and at queue end -- **GitHub & Credits Section**: Added links to SpotiFLAC Mobile and original SpotiFLAC desktop in Settings - -### Fixed -- **Download Progress Bug**: Fixed 0% → 100% jump by adding proper progress tracking for BTS format downloads -- **TCP Connection Exhaustion**: Fixed slow downloads after ~300 tracks by implementing connection pooling and periodic cleanup -- **Trailing Space in Names**: Fixed download failures when playlist/album/track names have trailing spaces -- **History Loss on Debug**: History no longer disappears when sideloading via `flutter run --debug` - -### Changed -- Updated version to 1.1.0 - -### Technical Details -- Added `concurrentDownloads` field to `AppSettings` model (default: 1, max: 3) -- Implemented worker pool pattern in `DownloadQueueNotifier` for parallel processing -- Added `SetCurrentFile()`, `SetBytesTotal()`, and `ProgressWriter` for BTS downloads in Go backend -- Added `strings.TrimSpace()` to all string fields in `DownloadTrack()` and `DownloadWithFallback()` -- Added shared `http.Transport` with connection pooling in `httputil.go` -- Added `CleanupConnections()` export for Flutter to call via method channel - -## [1.0.5] - Previous Release -- Material Expressive 3 UI -- Dynamic color support -- Swipe navigation with PageView -- Settings as bottom navigation tab -- APK size optimization