feat(jellyfin): add functionality to mark media as watched/unwatched

This commit is contained in:
2026-05-03 22:08:56 +02:00
parent b1ae478f6d
commit f2c46af410
4 changed files with 55 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
package hu.bbara.purefin.jellyfin
import java.util.UUID
interface JellyfinMediaMetadataUpdater {
suspend fun markAsWatched(mediaId: UUID, watched: Boolean)
}

View File

@@ -0,0 +1,19 @@
package hu.bbara.purefin.data.jellyfin
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.jellyfin.JellyfinMediaMetadataUpdater
import java.util.UUID
import javax.inject.Inject
class JellyfinMediaMetadataUpdaterImpl @Inject constructor(
private val jellyfinApiClient: JellyfinApiClient
) : JellyfinMediaMetadataUpdater {
override suspend fun markAsWatched(mediaId: UUID, watched: Boolean) {
if (watched) {
jellyfinApiClient.markAsWatched(mediaId)
} else {
jellyfinApiClient.markAsUnwatched(mediaId)
}
}
}

View File

@@ -322,6 +322,30 @@ class JellyfinApiClient @Inject constructor(
}
}
suspend fun markAsWatched(mediaId: UUID) = withContext(Dispatchers.IO) {
logApiFailure("markAsWatched($mediaId)") {
if (!ensureConfigured()) {
return@logApiFailure
}
api.playStateApi.markPlayedItem(
itemId = mediaId,
userId = getUserId(),
)
}
}
suspend fun markAsUnwatched(mediaId: UUID) = withContext(Dispatchers.IO) {
logApiFailure("markAsUnwatched($mediaId)") {
if (!ensureConfigured()) {
return@logApiFailure
}
api.playStateApi.markUnplayedItem(
itemId = mediaId,
userId = getUserId(),
)
}
}
suspend fun getMediaSources(mediaId: UUID): List<MediaSourceInfo> = withContext(Dispatchers.IO) {
logApiFailure("getMediaSources($mediaId)") {
if (!ensureConfigured()) {

View File

@@ -12,7 +12,9 @@ import hu.bbara.purefin.data.SearchManager
import hu.bbara.purefin.data.catalog.InMemoryAppContentRepository
import hu.bbara.purefin.data.catalog.InMemoryLocalMediaRepository
import hu.bbara.purefin.data.catalog.OfflineLocalMediaRepository
import hu.bbara.purefin.data.jellyfin.JellyfinMediaMetadataUpdaterImpl
import hu.bbara.purefin.data.jellyfin.SearchManagerImpl
import hu.bbara.purefin.jellyfin.JellyfinMediaMetadataUpdater
@Module
@InstallIn(SingletonComponent::class)
@@ -29,6 +31,9 @@ abstract class MediaRepositoryModule {
@Binds
abstract fun bindHomeRepository(impl: InMemoryAppContentRepository): HomeRepository
@Binds
abstract fun bindJellyfinMediaMetadataUpdater(impl: JellyfinMediaMetadataUpdaterImpl): JellyfinMediaMetadataUpdater
@Binds
abstract fun bindSearchManager(impl: SearchManagerImpl): SearchManager
}