From abe77f468320c3d44ead09dc56c648558cd6ea7a Mon Sep 17 00:00:00 2001 From: FineFindus Date: Sat, 1 Mar 2025 11:13:21 +0100 Subject: [PATCH] feat(Feed): update local feed data when watching video As local feed videos are only fetched once, this can lead to outdated data being displayed in the feed. As we already fetch the metadata when the video is being played, use this data to update the locally stored feed data. --- .../java/com/github/libretube/api/SubscriptionHelper.kt | 2 ++ .../com/github/libretube/db/dao/SubscriptionsFeedDao.kt | 4 ++++ .../java/com/github/libretube/repo/FeedRepository.kt | 2 ++ .../com/github/libretube/repo/LocalFeedRepository.kt | 4 ++++ .../com/github/libretube/services/OnlinePlayerService.kt | 9 ++++++++- 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt index 231741bf3..60c4fb9c5 100644 --- a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt +++ b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt @@ -3,6 +3,7 @@ package com.github.libretube.api import android.content.Context import com.github.libretube.R import com.github.libretube.constants.PreferenceKeys +import com.github.libretube.db.obj.SubscriptionsFeedItem import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.repo.AccountSubscriptionsRepository import com.github.libretube.repo.FeedProgress @@ -49,6 +50,7 @@ object SubscriptionHelper { suspend fun getSubscriptionChannelIds() = subscriptionsRepository.getSubscriptionChannelIds() suspend fun getFeed(forceRefresh: Boolean, onProgressUpdate: (FeedProgress) -> Unit = {}) = feedRepository.getFeed(forceRefresh, onProgressUpdate) + suspend fun submitFeedItemChange(feedItem: SubscriptionsFeedItem) = feedRepository.submitFeedItemChange(feedItem) fun handleUnsubscribe( context: Context, diff --git a/app/src/main/java/com/github/libretube/db/dao/SubscriptionsFeedDao.kt b/app/src/main/java/com/github/libretube/db/dao/SubscriptionsFeedDao.kt index 57be8f49e..ba565f826 100644 --- a/app/src/main/java/com/github/libretube/db/dao/SubscriptionsFeedDao.kt +++ b/app/src/main/java/com/github/libretube/db/dao/SubscriptionsFeedDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Update import com.github.libretube.db.obj.SubscriptionsFeedItem @Dao @@ -14,6 +15,9 @@ interface SubscriptionsFeedDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertAll(feedItems: List) + @Update + suspend fun update(feedItem: SubscriptionsFeedItem) + @Query("SELECT EXISTS (SELECT * FROM feedItem WHERE videoId = :videoId)") suspend fun contains(videoId: String): Boolean diff --git a/app/src/main/java/com/github/libretube/repo/FeedRepository.kt b/app/src/main/java/com/github/libretube/repo/FeedRepository.kt index d08dec06c..35db4ec6b 100644 --- a/app/src/main/java/com/github/libretube/repo/FeedRepository.kt +++ b/app/src/main/java/com/github/libretube/repo/FeedRepository.kt @@ -1,6 +1,7 @@ package com.github.libretube.repo import com.github.libretube.api.obj.StreamItem +import com.github.libretube.db.obj.SubscriptionsFeedItem data class FeedProgress( val currentProgress: Int, @@ -12,4 +13,5 @@ interface FeedRepository { forceRefresh: Boolean, onProgressUpdate: (FeedProgress) -> Unit ): List + suspend fun submitFeedItemChange(feedItem: SubscriptionsFeedItem) {} } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/repo/LocalFeedRepository.kt b/app/src/main/java/com/github/libretube/repo/LocalFeedRepository.kt index d5e9ab40e..eaf02db47 100644 --- a/app/src/main/java/com/github/libretube/repo/LocalFeedRepository.kt +++ b/app/src/main/java/com/github/libretube/repo/LocalFeedRepository.kt @@ -35,6 +35,10 @@ class LocalFeedRepository : FeedRepository { if (filter.isEnabled) tab else null }.toTypedArray() + override suspend fun submitFeedItemChange(feedItem: SubscriptionsFeedItem) { + DatabaseHolder.Database.feedDao().update(feedItem) + } + override suspend fun getFeed( forceRefresh: Boolean, onProgressUpdate: (FeedProgress) -> Unit diff --git a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt index 9f31d3dd6..e6dbe732e 100644 --- a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt @@ -14,11 +14,13 @@ import com.github.libretube.R import com.github.libretube.api.JsonHelper import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.StreamsExtractor +import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.obj.Segment import com.github.libretube.api.obj.Streams import com.github.libretube.constants.IntentData import com.github.libretube.constants.PreferenceKeys import com.github.libretube.db.DatabaseHelper +import com.github.libretube.db.DatabaseHolder import com.github.libretube.enums.PlayerCommand import com.github.libretube.extensions.parcelable import com.github.libretube.extensions.setMetadata @@ -138,9 +140,14 @@ open class OnlinePlayerService : AbstractPlayerService() { PlayingQueue.insertRelatedStreams(streams!!.relatedStreams) } - // save the current stream to the queue streams?.toStreamItem(videoId)?.let { + // save the current stream to the queue PlayingQueue.updateCurrent(it) + + // update feed item with newer information, e.g. more up-to-date views + SubscriptionHelper.submitFeedItemChange( + it.toFeedItem() + ) } withContext(Dispatchers.Main) {