From 79915d6c7a602c6ffe42f8c87a491bdf2afccad8 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Thu, 12 Nov 2026 10:13:03 +0000 Subject: [PATCH] library: skip queue resets for missing songs --- .../com/subtracks/data/db/LibraryDao.kt | 2 +- .../subtracks/data/repo/LibraryRepository.kt | 5 ++-- .../data/repo/LibraryRepositoryTest.kt | 24 ++++++++++++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt index 86b059c7..a680dd6e 100644 --- a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt +++ b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt @@ -542,7 +542,7 @@ interface LibraryDao { sourceId: Long, id: String, starred: Long?, - ) + ): Int @Query("SELECT id FROM artists WHERE sourceId = :sourceId") suspend fun artistIds(sourceId: Long): List diff --git a/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt b/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt index 4b6e8574..ab73f6bf 100644 --- a/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt +++ b/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt @@ -459,8 +459,9 @@ class LibraryRepository( val previous = song(sourceId, id).first()?.starred if (previous == starred) return val point = queueRepository.captureResetPoint() - dao.setSongStar(sourceId, id, starred) - queueRepository.resetChangedOrigins(setOf(QueueOrigin(QueueKind.Starred, sourceId, "")), point) + if (dao.setSongStar(sourceId, id, starred) > 0) { + queueRepository.resetChangedOrigins(setOf(QueueOrigin(QueueKind.Starred, sourceId, "")), point) + } } else { when (type) { StarType.Album -> dao.setAlbumStar(sourceId, id, starred) diff --git a/app/src/test/kotlin/com/subtracks/data/repo/LibraryRepositoryTest.kt b/app/src/test/kotlin/com/subtracks/data/repo/LibraryRepositoryTest.kt index 7406dc5e..e020cb47 100644 --- a/app/src/test/kotlin/com/subtracks/data/repo/LibraryRepositoryTest.kt +++ b/app/src/test/kotlin/com/subtracks/data/repo/LibraryRepositoryTest.kt @@ -54,6 +54,7 @@ class LibraryRepositoryTest { private lateinit var db: SubtracksDatabase private lateinit var sourceRepository: SourceRepository private lateinit var repository: LibraryRepository + private lateinit var queues: QueueRepository private lateinit var scope: CoroutineScope private val messages = ArrayList() private lateinit var resources: Resources @@ -66,13 +67,14 @@ class LibraryRepositoryTest { scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) sourceRepository = SourceRepository(db, OkHttpClient(), fakeUserPreferences(), ArtworkStore(File(context.cacheDir, "art")), scope = scope) + queues = QueueRepository(db) repository = LibraryRepository( db, sourceRepository, NetworkServerActionSink(sourceRepository), fakeUserPreferences(), - queueRepository = QueueRepository(db), + queueRepository = queues, showMessage = { messages += it.resolve(resources) }, scope = scope, ) @@ -160,6 +162,26 @@ class LibraryRepositoryTest { } } + @Test + fun starringAMissingSongDoesNotResetTheStarredQueue() = + runBlocking { + withSource { server -> + val sourceId = sourceRepository.activeSourceIdOnce()!! + db.libraryDao().setSongStar(sourceId, "s1", 1) + queues.replace(listOf(queues.starredEntry(sourceId).copy(rangeStart = 0, rangeEnd = 0))) + val before = queues.snapshot() + server.enqueue(ok()) + + assertTrue(repository.setStar(StarType.Song, "pruned-id", true).isSuccess) + + val after = queues.snapshot() + assertEquals(before.resetVersion, after.resetVersion) + assertEquals(before.entries.map { it.entry }, after.entries.map { it.entry }) + assertNull(db.libraryDao().songOnce(sourceId, "pruned-id")) + assertEquals("/rest/star.view", server.takeRequest().requestUrl!!.encodedPath) + } + } + @Test fun albumSongOrdinalFollowsTheAlbumOrder() = runBlocking {