From 1fa5f4c2f8d3d2265207248f0067d6d66bd2f9be Mon Sep 17 00:00:00 2001 From: birdbird <6892457-tzugen@users.noreply.gitlab.com> Date: Mon, 24 Jul 2023 18:38:08 +0000 Subject: [PATCH] Fix unpin --- .../ultrasonic/fragment/SearchFragment.kt | 6 +- .../ultrasonic/playback/PlaybackService.kt | 2 +- .../ultrasonic/service/DownloadService.kt | 103 +++++++++++++----- .../ultrasonic/subsonic/DownloadHandler.kt | 12 +- 4 files changed, 89 insertions(+), 34 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt index cd4d1104..4d2ffe2f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt @@ -140,7 +140,11 @@ class SearchFragment : MultiListFragment(), KoinComponent { private fun downloadBackground(save: Boolean, songs: List) { val onValid = Runnable { networkAndStorageChecker.warnIfNetworkOrStorageUnavailable() - DownloadService.download(songs.filterNotNull(), save) + DownloadService.download( + songs.filterNotNull(), + save = save, + updateSaveFlag = true + ) } onValid.run() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt index 7965558e..952b8212 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt @@ -328,7 +328,7 @@ class PlaybackService : ).map { it.toTrack() } launch { - DownloadService.download(nextSongs, save = false, isHighPriority = true) + DownloadService.download(nextSongs, isHighPriority = true) } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt index 808c3bbe..dff3d5b3 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt @@ -274,46 +274,26 @@ class DownloadService : Service(), KoinComponent { @Synchronized fun download( tracks: List, - save: Boolean, - isHighPriority: Boolean = false + save: Boolean = false, + isHighPriority: Boolean = false, + updateSaveFlag: Boolean = false ) { CoroutineScope(Dispatchers.IO).launch { - // First handle and filter out those tracks that are already completed - var filteredTracks: List - if (save) { - tracks.filter { Storage.isPathExists(it.getCompleteFile()) }.forEach { track -> - Storage.getFromPath(track.getCompleteFile())?.let { - Storage.renameOrDeleteIfAlreadyExists(it, track.getPinnedFile()) - postState(track, DownloadState.PINNED) - } - } - filteredTracks = tracks.filter { !Storage.isPathExists(it.getPinnedFile()) } + // Remove tracks which are already downloaded and update the save flag + // if needed + var filteredTracks = if (updateSaveFlag) { + setSaveFlagForTracks(save, tracks) } else { - tracks.filter { Storage.isPathExists(it.getPinnedFile()) }.forEach { track -> - Storage.getFromPath(track.getPinnedFile())?.let { - Storage.renameOrDeleteIfAlreadyExists(it, track.getCompleteFile()) - postState(track, DownloadState.DONE) - } - } - filteredTracks = tracks.filter { !Storage.isPathExists(it.getCompleteFile()) } - } - - // Update Pinned flag of items in progress - downloadQueue.filter { item -> tracks.any { it.id == item.id } } - .forEach { it.pinned = save } - tracks.forEach { - activeDownloads[it.id]?.downloadTrack?.pinned = save - } - tracks.forEach { - failedList[it.id]?.pinned = save + removeDownloadedTracksFromList(tracks) } + // Remove tracks which are currently downloading filteredTracks = filteredTracks.filter { !downloadQueue.any { i -> i.id == it.id } && !activeDownloads.containsKey(it.id) } - // The remainder tracks should be added to the download queue + // The remaining tracks should be added to the download queue // By using the counter we ensure that the songs are added in the correct order var priority = 0 val tracksToDownload = @@ -334,6 +314,69 @@ class DownloadService : Service(), KoinComponent { } } + private fun removeDownloadedTracksFromList(tracks: List): List { + return tracks.filter { track -> + val pinnedFile = Storage.getFromPath(track.getPinnedFile()) + val completeFile = Storage.getFromPath(track.getCompleteFile()) + + completeFile?.let { + postState(track, DownloadState.DONE) + false + } + pinnedFile?.let { + postState(track, DownloadState.PINNED) + false + } + true + } + } + + private fun setSaveFlagForTracks( + shouldPin: Boolean, + tracks: List + ): List { + // Walk through the tracks. If a track is pinned or complete and needs to be changed + // to the other state, rename it, but don't return it, thereby excluding it from + // further processing. + // If it is neither pinned nor saved, return it, so that it can be processed. + val filteredTracks: List = tracks.map { track -> + val pinnedFile = Storage.getFromPath(track.getPinnedFile()) + val completeFile = Storage.getFromPath(track.getCompleteFile()) + + if (shouldPin) { + pinnedFile?.let { + null + } + completeFile?.let { + Storage.renameOrDeleteIfAlreadyExists(it, track.getPinnedFile()) + postState(track, DownloadState.PINNED) + null + } + } else { + completeFile?.let { + null + } + pinnedFile?.let { + Storage.renameOrDeleteIfAlreadyExists(it, track.getCompleteFile()) + postState(track, DownloadState.DONE) + null + } + } + track + } + + // Update Pinned flag of items in progress + downloadQueue.filter { item -> tracks.any { it.id == item.id } } + .forEach { it.pinned = shouldPin } + tracks.forEach { + activeDownloads[it.id]?.downloadTrack?.pinned = shouldPin + } + tracks.forEach { + failedList[it.id]?.pinned = shouldPin + } + return filteredTracks + } + fun requestStop() { val context = UApp.applicationContext() val intent = Intent(context, DownloadService::class.java) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt index 55bceca2..2bae06e8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt @@ -53,8 +53,16 @@ class DownloadHandler( withContext(Dispatchers.Main) { // If we are just downloading tracks we don't need to add them to the controller when (action) { - DownloadAction.DOWNLOAD -> DownloadService.download(tracksToDownload, false) - DownloadAction.PIN -> DownloadService.download(tracksToDownload, true) + DownloadAction.DOWNLOAD -> DownloadService.download( + tracksToDownload, + save = false, + updateSaveFlag = true + ) + DownloadAction.PIN -> DownloadService.download( + tracksToDownload, + save = true, + updateSaveFlag = true + ) DownloadAction.UNPIN -> DownloadService.unpin(tracksToDownload) DownloadAction.DELETE -> DownloadService.delete(tracksToDownload) }