Improve Tracker Icons Implementation (#836)

* Improve tracker icons implementation

* Fix description
This commit is contained in:
Mitchell Syer
2024-01-21 14:37:51 -05:00
committed by GitHub
parent ce42e89e25
commit 0621138478
7 changed files with 51 additions and 18 deletions

View File

@@ -8,6 +8,7 @@ import suwayomi.tachidesk.graphql.server.primitives.Edge
import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.Node
import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.NodeList
import suwayomi.tachidesk.graphql.server.primitives.PageInfo import suwayomi.tachidesk.graphql.server.primitives.PageInfo
import suwayomi.tachidesk.manga.impl.track.Track
import suwayomi.tachidesk.manga.impl.track.tracker.Tracker import suwayomi.tachidesk.manga.impl.track.tracker.Tracker
import suwayomi.tachidesk.manga.model.table.TrackRecordTable import suwayomi.tachidesk.manga.model.table.TrackRecordTable
import suwayomi.tachidesk.manga.model.table.TrackSearchTable import suwayomi.tachidesk.manga.model.table.TrackSearchTable
@@ -28,7 +29,7 @@ class TrackerType(
constructor(isLoggedIn: Boolean, tracker: Tracker) : this( constructor(isLoggedIn: Boolean, tracker: Tracker) : this(
tracker.id, tracker.id,
tracker.name, tracker.name,
tracker.getLogo(), Track.proxyThumbnailUrl(tracker.id),
isLoggedIn, isLoggedIn,
if (isLoggedIn) { if (isLoggedIn) {
null null

View File

@@ -141,6 +141,7 @@ object MangaAPI {
post("search", TrackController.search) post("search", TrackController.search)
post("bind", TrackController.bind) post("bind", TrackController.bind)
post("update", TrackController.update) post("update", TrackController.update)
get("{trackerId}/thumbnail", TrackController.thumbnail)
} }
} }
} }

View File

@@ -17,8 +17,10 @@ import suwayomi.tachidesk.manga.impl.track.Track
import suwayomi.tachidesk.manga.model.dataclass.TrackerDataClass import suwayomi.tachidesk.manga.model.dataclass.TrackerDataClass
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
import suwayomi.tachidesk.server.util.handler import suwayomi.tachidesk.server.util.handler
import suwayomi.tachidesk.server.util.pathParam
import suwayomi.tachidesk.server.util.queryParam import suwayomi.tachidesk.server.util.queryParam
import suwayomi.tachidesk.server.util.withOperation import suwayomi.tachidesk.server.util.withOperation
import kotlin.time.Duration.Companion.days
object TrackController { object TrackController {
private val json by DI.global.instance<Json>() private val json by DI.global.instance<Json>()
@@ -136,4 +138,30 @@ object TrackController {
httpCode(HttpCode.OK) httpCode(HttpCode.OK)
}, },
) )
val thumbnail =
handler(
pathParam<Int>("trackerId"),
documentWith = {
withOperation {
summary("Get a tracker thumbnail")
description("Get a tracker thumbnail from the resources.")
}
},
behaviorOf = { ctx, trackerId ->
ctx.future(
future { Track.getTrackerThumbnail(trackerId) }
.thenApply {
ctx.header("content-type", it.second)
val httpCacheSeconds = 1.days.inWholeSeconds
ctx.header("cache-control", "max-age=$httpCacheSeconds")
it.first
},
)
},
withResults = {
image(HttpCode.OK)
httpCode(HttpCode.NOT_FOUND)
},
)
} }

View File

@@ -26,6 +26,8 @@ import suwayomi.tachidesk.manga.model.table.ChapterTable
import suwayomi.tachidesk.manga.model.table.TrackRecordTable import suwayomi.tachidesk.manga.model.table.TrackRecordTable
import suwayomi.tachidesk.manga.model.table.TrackSearchTable import suwayomi.tachidesk.manga.model.table.TrackSearchTable
import suwayomi.tachidesk.manga.model.table.insertAll import suwayomi.tachidesk.manga.model.table.insertAll
import suwayomi.tachidesk.server.generated.BuildConfig
import java.io.InputStream
object Track { object Track {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
@@ -39,7 +41,7 @@ object Track {
TrackerDataClass( TrackerDataClass(
id = it.id, id = it.id,
name = it.name, name = it.name,
icon = it.getLogo(), icon = proxyThumbnailUrl(it.id),
isLogin = isLogin, isLogin = isLogin,
authUrl = authUrl, authUrl = authUrl,
) )
@@ -60,6 +62,16 @@ object Track {
tracker.logout() tracker.logout()
} }
fun proxyThumbnailUrl(trackerId: Int): String {
return "/api/v1/track/$trackerId/thumbnail"
}
fun getTrackerThumbnail(trackerId: Int): Pair<InputStream, String> {
val tracker = TrackerManager.getTracker(trackerId)!!
val logo = BuildConfig::class.java.getResourceAsStream(tracker.getLogo())!!
return logo to "image/png"
}
fun getTrackRecordsByMangaId(mangaId: Int): List<MangaTrackerDataClass> { fun getTrackRecordsByMangaId(mangaId: Int): List<MangaTrackerDataClass> {
if (!TrackerManager.hasLoggedTracker()) { if (!TrackerManager.hasLoggedTracker()) {
return emptyList() return emptyList()
@@ -85,7 +97,7 @@ object Track {
MangaTrackerDataClass( MangaTrackerDataClass(
id = it.id, id = it.id,
name = it.name, name = it.name,
icon = it.getLogo(), icon = proxyThumbnailUrl(it.id),
statusList = it.getStatusList(), statusList = it.getStatusList(),
statusTextMap = it.getStatusList().associateWith { k -> it.getStatus(k) ?: "" }, statusTextMap = it.getStatusList().associateWith { k -> it.getStatus(k) ?: "" },
scoreList = it.getScoreList(), scoreList = it.getScoreList(),

View File

@@ -7,7 +7,7 @@ import suwayomi.tachidesk.manga.impl.track.tracker.model.TrackSearch
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
abstract class Tracker(val id: Int, val name: String) { abstract class Tracker(val id: Int, val name: String) {
val trackPreferences = TrackerPreferences() val trackPreferences = TrackerPreferences
private val networkService: NetworkHelper by injectLazy() private val networkService: NetworkHelper by injectLazy()
open val client: OkHttpClient open val client: OkHttpClient

View File

@@ -7,7 +7,7 @@ import suwayomi.tachidesk.manga.impl.track.tracker.anilist.Anilist
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
class TrackerPreferences { object TrackerPreferences {
private val preferenceStore = private val preferenceStore =
Injekt.get<Application>().getSharedPreferences("tracker", Context.MODE_PRIVATE) Injekt.get<Application>().getSharedPreferences("tracker", Context.MODE_PRIVATE)
private val logger = KotlinLogging.logger {} private val logger = KotlinLogging.logger {}
@@ -57,13 +57,11 @@ class TrackerPreferences {
fun autoUpdateTrack() = preferenceStore.getBoolean("pref_auto_update_manga_sync_key", true) fun autoUpdateTrack() = preferenceStore.getBoolean("pref_auto_update_manga_sync_key", true)
companion object { fun trackUsername(trackerId: Int) = "pref_mangasync_username_$trackerId"
fun trackUsername(trackerId: Int) = "pref_mangasync_username_$trackerId"
private fun trackPassword(trackerId: Int) = "pref_mangasync_password_$trackerId" private fun trackPassword(trackerId: Int) = "pref_mangasync_password_$trackerId"
private fun trackToken(trackerId: Int) = "track_token_$trackerId" private fun trackToken(trackerId: Int) = "track_token_$trackerId"
private fun scoreType(trackerId: Int) = "score_type_$trackerId" private fun scoreType(trackerId: Int) = "score_type_$trackerId"
}
} }

View File

@@ -91,13 +91,6 @@ object JavalinSetup {
config.server { server } config.server { server }
config.addStaticFiles { staticFiles ->
staticFiles.hostedPath = "/static"
staticFiles.directory = "/static"
staticFiles.location = Location.CLASSPATH
staticFiles.headers = mapOf("cache-control" to "max-age=86400")
}
config.enableCorsForAllOrigins() config.enableCorsForAllOrigins()
config.accessManager { handler, ctx, _ -> config.accessManager { handler, ctx, _ ->