library: skip queue resets for missing songs

This commit is contained in:
austinried
2026-11-14 12:05:28 +00:00
parent 4e72b1f38d
commit 79915d6c7a
3 changed files with 27 additions and 4 deletions
@@ -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<String>
@@ -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)
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)
@@ -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<String>()
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 {