diff --git a/app/src/main/java/com/github/libretube/LibreTubeApp.kt b/app/src/main/java/com/github/libretube/LibreTubeApp.kt index 9c75cae9b..dbd4db631 100644 --- a/app/src/main/java/com/github/libretube/LibreTubeApp.kt +++ b/app/src/main/java/com/github/libretube/LibreTubeApp.kt @@ -16,6 +16,7 @@ import com.github.libretube.util.ExceptionHandler import com.github.libretube.util.ImageHelper import com.github.libretube.util.NotificationHelper import com.github.libretube.util.PreferenceHelper +import com.github.libretube.util.ProxyHelper class LibreTubeApp : Application() { override fun onCreate() { @@ -57,6 +58,11 @@ class LibreTubeApp : Application() { existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.KEEP ) + /** + * Fetch the image proxy URL for local playlists and the watch history + */ + ProxyHelper.fetchProxyUrl() + /** * Handler for uncaught exceptions */ diff --git a/app/src/main/java/com/github/libretube/api/PipedApi.kt b/app/src/main/java/com/github/libretube/api/PipedApi.kt index 61f24d214..cfdf4457b 100644 --- a/app/src/main/java/com/github/libretube/api/PipedApi.kt +++ b/app/src/main/java/com/github/libretube/api/PipedApi.kt @@ -6,6 +6,7 @@ import com.github.libretube.api.obj.CommentsPage import com.github.libretube.api.obj.DeleteUserRequest import com.github.libretube.api.obj.Login import com.github.libretube.api.obj.Message +import com.github.libretube.api.obj.PipedConfig import com.github.libretube.api.obj.Playlist import com.github.libretube.api.obj.PlaylistId import com.github.libretube.api.obj.Playlists @@ -24,6 +25,9 @@ import retrofit2.http.Path import retrofit2.http.Query interface PipedApi { + @GET("config") + suspend fun getConfig(): PipedConfig + @GET("trending") suspend fun getTrending(@Query("region") region: String): List diff --git a/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt b/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt index 9dfd2560b..0a40135ee 100644 --- a/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt +++ b/app/src/main/java/com/github/libretube/api/PlaylistsHelper.kt @@ -15,6 +15,7 @@ import com.github.libretube.extensions.toLocalPlaylistItem import com.github.libretube.extensions.toStreamItem import com.github.libretube.extensions.toastFromMainThread import com.github.libretube.util.PreferenceHelper +import com.github.libretube.util.ProxyHelper import retrofit2.HttpException import java.io.IOException @@ -56,7 +57,7 @@ object PlaylistsHelper { }.first { it.playlist.id.toString() == playlistId } return Playlist( name = relation.playlist.name, - thumbnailUrl = relation.playlist.thumbnailUrl, + thumbnailUrl = ProxyHelper.rewriteUrl(relation.playlist.thumbnailUrl), videos = relation.videos.size, relatedStreams = relation.videos.map { it.toStreamItem() } ) diff --git a/app/src/main/java/com/github/libretube/api/obj/PipedConfig.kt b/app/src/main/java/com/github/libretube/api/obj/PipedConfig.kt new file mode 100644 index 000000000..1595b674f --- /dev/null +++ b/app/src/main/java/com/github/libretube/api/obj/PipedConfig.kt @@ -0,0 +1,7 @@ +package com.github.libretube.api.obj + +data class PipedConfig( + val donationUrl: String? = null, + val statusPageUrl: String? = null, + val imageProxyUrl: String? = null +) diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt index cfe14370d..d2012cf50 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -10,6 +10,7 @@ object PreferenceKeys { const val AUTH_PREF_FILE = "auth" const val TOKEN = "token" const val USERNAME = "username" + const val IMAGE_PROXY_URL = "image_proxy_url" /** * General diff --git a/app/src/main/java/com/github/libretube/db/obj/WatchHistoryItem.kt b/app/src/main/java/com/github/libretube/db/obj/WatchHistoryItem.kt index c5fed1b1b..45da337df 100644 --- a/app/src/main/java/com/github/libretube/db/obj/WatchHistoryItem.kt +++ b/app/src/main/java/com/github/libretube/db/obj/WatchHistoryItem.kt @@ -11,7 +11,7 @@ data class WatchHistoryItem( @ColumnInfo val uploadDate: String? = null, @ColumnInfo val uploader: String? = null, @ColumnInfo val uploaderUrl: String? = null, - @ColumnInfo val uploaderAvatar: String? = null, - @ColumnInfo val thumbnailUrl: String? = null, + @ColumnInfo var uploaderAvatar: String? = null, + @ColumnInfo var thumbnailUrl: String? = null, @ColumnInfo val duration: Long? = null ) diff --git a/app/src/main/java/com/github/libretube/extensions/ToStreamItem.kt b/app/src/main/java/com/github/libretube/extensions/ToStreamItem.kt index 87d3671bc..8ae20d965 100644 --- a/app/src/main/java/com/github/libretube/extensions/ToStreamItem.kt +++ b/app/src/main/java/com/github/libretube/extensions/ToStreamItem.kt @@ -1,8 +1,10 @@ package com.github.libretube.extensions +import android.util.Log import com.github.libretube.api.obj.StreamItem import com.github.libretube.api.obj.Streams import com.github.libretube.db.obj.LocalPlaylistItem +import com.github.libretube.util.ProxyHelper fun Streams.toStreamItem(videoId: String): StreamItem { return StreamItem( @@ -22,13 +24,14 @@ fun Streams.toStreamItem(videoId: String): StreamItem { } fun LocalPlaylistItem.toStreamItem(): StreamItem { + Log.e("thumb", ProxyHelper.rewriteUrl(thumbnailUrl).toString()) return StreamItem( url = videoId, title = title, - thumbnail = thumbnailUrl, + thumbnail = ProxyHelper.rewriteUrl(thumbnailUrl), uploaderName = uploader, uploaderUrl = uploaderUrl, - uploaderAvatar = uploaderAvatar, + uploaderAvatar = ProxyHelper.rewriteUrl(uploaderAvatar), uploadedDate = uploadDate, uploaded = null, duration = duration diff --git a/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt index 623415cdc..a9ae97a9a 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/WatchHistoryFragment.kt @@ -12,6 +12,7 @@ import com.github.libretube.db.DatabaseHolder.Companion.Database import com.github.libretube.extensions.awaitQuery import com.github.libretube.ui.adapters.WatchHistoryAdapter import com.github.libretube.ui.base.BaseFragment +import com.github.libretube.util.ProxyHelper class WatchHistoryFragment : BaseFragment() { private lateinit var binding: FragmentWatchHistoryBinding @@ -34,6 +35,11 @@ class WatchHistoryFragment : BaseFragment() { if (watchHistory.isEmpty()) return + watchHistory.forEach { + it.thumbnailUrl = ProxyHelper.rewriteUrl(it.thumbnailUrl) + it.uploaderAvatar = ProxyHelper.rewriteUrl(it.uploaderAvatar) + } + // reversed order binding.watchHistoryRecView.layoutManager = LinearLayoutManager(requireContext()).apply { reverseLayout = true diff --git a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt index d03b9f6ff..636558eb5 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -33,8 +33,8 @@ object PreferenceHelper { editor.putString(key, value).commit() } - fun getString(key: String?, defValue: String?): String { - return settings.getString(key, defValue)!! + fun getString(key: String?, defValue: String): String { + return settings.getString(key, defValue) ?: defValue } fun getBoolean(key: String?, defValue: Boolean): Boolean { @@ -49,10 +49,6 @@ object PreferenceHelper { editor.clear().apply() } - fun removePreference(value: String?) { - editor.remove(value).apply() - } - fun getToken(): String { return authSettings.getString(PreferenceKeys.TOKEN, "")!! } diff --git a/app/src/main/java/com/github/libretube/util/ProxyHelper.kt b/app/src/main/java/com/github/libretube/util/ProxyHelper.kt new file mode 100644 index 000000000..41860ea38 --- /dev/null +++ b/app/src/main/java/com/github/libretube/util/ProxyHelper.kt @@ -0,0 +1,48 @@ +package com.github.libretube.util + +import com.github.libretube.api.RetrofitInstance +import com.github.libretube.constants.PreferenceKeys +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.net.URI + +object ProxyHelper { + private fun getImageProxyUrl(): String? { + val url = PreferenceHelper.getString(PreferenceKeys.IMAGE_PROXY_URL, "") + return if (url != "") url else null + } + + private fun setImageProxyUrl(url: String) { + PreferenceHelper.putString(PreferenceKeys.IMAGE_PROXY_URL, url) + } + + fun fetchProxyUrl() { + CoroutineScope(Dispatchers.IO).launch { + runCatching { + RetrofitInstance.api.getConfig().imageProxyUrl?.let { + setImageProxyUrl(it) + } + } + } + } + + fun rewriteUrl(url: String?): String? { + url ?: return null + + val proxyUrl = getImageProxyUrl() + proxyUrl ?: return url + + runCatching { + val originalUri = URI(url) + return URI( + originalUri.scheme.lowercase(), + proxyUrl, + originalUri.path, + originalUri.query, + originalUri.fragment + ).toString() + } + return url + } +}