tangled
alpha
login
or
join now
kepelet.com
/
flo
3
fork
atom
an open source Navidrome client written in Swift — https://dub.sh/getflo
dub.sh/getflo
navidrome-client
3
fork
atom
overview
issues
1
pulls
pipelines
feat: download queue enhancement
rizaldy.club
1 year ago
65db78c8
8ee96bb9
+13
-9
3 changed files
expand all
collapse all
unified
split
flo
AlbumView.swift
DownloadButtonView.swift
DownloadViewModel.swift
+2
-2
flo/AlbumView.swift
reviewed
···
144
144
.toolbar {
145
145
if !isDownloadScreen {
146
146
DownloadButton(
147
147
-
isDownloading: downloadViewModel.isDownloading(),
147
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
155
-
if downloadViewModel.isDownloading() {
155
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
reviewed
···
36
36
Circle()
37
37
.trim(from: 0, to: 1)
38
38
.stroke(
39
39
-
isDownloading ? Color.gray.opacity(0.2) : Color("PlayerColor"),
39
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
45
-
.stroke(Color("PlayerColor"), style: StrokeStyle(lineWidth: 1.5, lineCap: .round))
45
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
51
-
.padding(3.5)
51
51
+
.padding(4)
52
52
.frame(width: 17, height: 17)
53
53
+
.font(.system(size: 17, weight: .bold))
53
54
}
54
55
}
55
56
.frame(width: 21, height: 21)
+7
-4
flo/DownloadViewModel.swift
reviewed
···
42
42
43
43
private var activeDownloads: [String: DownloadRequest] = [:]
44
44
45
45
-
func isDownloading() -> Bool {
45
45
+
func isDownloading(_ albumName: String) -> Bool {
46
46
return downloadItems.filter({ $0.status == .downloading }).count > 0
47
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
111
+
var hasPassedThreshold = false
112
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
116
-
var hasPassedThreshold = false
117
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
190
-
activeDownloads[item.id] = downloadRequest
191
191
+
await MainActor.run {
192
192
+
activeDownloads[item.id] = downloadRequest
193
193
+
}
191
194
}
192
195
}
193
196
}