an open source Navidrome client written in Swift — https://dub.sh/getflo dub.sh/getflo
navidrome-client

feat: download queue enhancement

+13 -9
+2 -2
flo/AlbumView.swift
··· 144 144 .toolbar { 145 145 if !isDownloadScreen { 146 146 DownloadButton( 147 - isDownloading: downloadViewModel.isDownloading(), 147 + isDownloading: downloadViewModel.isDownloading(viewModel.album.name), 148 148 isDownloaded: viewModel.isDownloaded, 149 149 progress: downloadViewModel.getDownloadedTrackProgress(albumName: viewModel.album.name) 150 150 / 100 ··· 152 152 if viewModel.isDownloaded { 153 153 showDeleteAlbumAlert.toggle() 154 154 } else { 155 - if downloadViewModel.isDownloading() { 155 + if downloadViewModel.isDownloading(viewModel.album.name) { 156 156 downloadViewModel.cancelCurrentAlbumDownload(albumName: viewModel.album.name) 157 157 } else { 158 158 viewModel.downloadAlbum(viewModel.album)
+4 -3
flo/DownloadButtonView.swift
··· 36 36 Circle() 37 37 .trim(from: 0, to: 1) 38 38 .stroke( 39 - isDownloading ? Color.gray.opacity(0.2) : Color("PlayerColor"), 39 + isDownloading ? Color.gray.opacity(0.2) : Color(.accent), 40 40 style: StrokeStyle(lineWidth: 1.5) 41 41 ) 42 42 .overlay( 43 43 Circle() 44 44 .trim(from: 0, to: displayProgress) 45 - .stroke(Color("PlayerColor"), style: StrokeStyle(lineWidth: 1.5, lineCap: .round)) 45 + .stroke(Color(.accent), style: StrokeStyle(lineWidth: 1.5, lineCap: .round)) 46 46 ) 47 47 48 48 Image(systemName: isDownloading ? "stop.fill" : "arrow.down") 49 49 .resizable() 50 50 .scaledToFit() 51 - .padding(3.5) 51 + .padding(4) 52 52 .frame(width: 17, height: 17) 53 + .font(.system(size: 17, weight: .bold)) 53 54 } 54 55 } 55 56 .frame(width: 21, height: 21)
+7 -4
flo/DownloadViewModel.swift
··· 42 42 43 43 private var activeDownloads: [String: DownloadRequest] = [:] 44 44 45 - func isDownloading() -> Bool { 45 + func isDownloading(_ albumName: String) -> Bool { 46 46 return downloadItems.filter({ $0.status == .downloading }).count > 0 47 + && downloadItems.filter({ $0.album == albumName }).count > 0 47 48 } 48 49 49 50 func getRemainingDownloadItems() -> Int { ··· 107 108 } 108 109 109 110 private func startDownload(index: Int) { 111 + var hasPassedThreshold = false 112 + 110 113 let item = downloadItems[index] 111 114 112 115 guard item.status != .downloading && item.status != .completed else { return } 113 116 114 117 currentDownloads.insert(item.id) 115 118 116 - var hasPassedThreshold = false 117 - 118 119 let progressUpdate: (Double) -> Void = { progress in 119 120 self.updateItemProgress(itemId: item.id, progress: progress) 120 121 ··· 187 188 } 188 189 } 189 190 190 - activeDownloads[item.id] = downloadRequest 191 + await MainActor.run { 192 + activeDownloads[item.id] = downloadRequest 193 + } 191 194 } 192 195 } 193 196 }