diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/TrackType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/TrackType.kt index 9c92c204..17aeb2ee 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/TrackType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/TrackType.kt @@ -8,6 +8,7 @@ import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList 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.model.table.TrackRecordTable import suwayomi.tachidesk.manga.model.table.TrackSearchTable @@ -28,7 +29,7 @@ class TrackerType( constructor(isLoggedIn: Boolean, tracker: Tracker) : this( tracker.id, tracker.name, - tracker.getLogo(), + Track.proxyThumbnailUrl(tracker.id), isLoggedIn, if (isLoggedIn) { null diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt index e017ad4e..a3ad2db5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt @@ -141,6 +141,7 @@ object MangaAPI { post("search", TrackController.search) post("bind", TrackController.bind) post("update", TrackController.update) + get("{trackerId}/thumbnail", TrackController.thumbnail) } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/TrackController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/TrackController.kt index 5f65df42..44518327 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/TrackController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/TrackController.kt @@ -17,8 +17,10 @@ import suwayomi.tachidesk.manga.impl.track.Track import suwayomi.tachidesk.manga.model.dataclass.TrackerDataClass import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.util.handler +import suwayomi.tachidesk.server.util.pathParam import suwayomi.tachidesk.server.util.queryParam import suwayomi.tachidesk.server.util.withOperation +import kotlin.time.Duration.Companion.days object TrackController { private val json by DI.global.instance() @@ -136,4 +138,30 @@ object TrackController { httpCode(HttpCode.OK) }, ) + + val thumbnail = + handler( + pathParam("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) + }, + ) } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/Track.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/Track.kt index 2c5842f6..222fe3ac 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/Track.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/Track.kt @@ -26,6 +26,8 @@ import suwayomi.tachidesk.manga.model.table.ChapterTable import suwayomi.tachidesk.manga.model.table.TrackRecordTable import suwayomi.tachidesk.manga.model.table.TrackSearchTable import suwayomi.tachidesk.manga.model.table.insertAll +import suwayomi.tachidesk.server.generated.BuildConfig +import java.io.InputStream object Track { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) @@ -39,7 +41,7 @@ object Track { TrackerDataClass( id = it.id, name = it.name, - icon = it.getLogo(), + icon = proxyThumbnailUrl(it.id), isLogin = isLogin, authUrl = authUrl, ) @@ -60,6 +62,16 @@ object Track { tracker.logout() } + fun proxyThumbnailUrl(trackerId: Int): String { + return "/api/v1/track/$trackerId/thumbnail" + } + + fun getTrackerThumbnail(trackerId: Int): Pair { + val tracker = TrackerManager.getTracker(trackerId)!! + val logo = BuildConfig::class.java.getResourceAsStream(tracker.getLogo())!! + return logo to "image/png" + } + fun getTrackRecordsByMangaId(mangaId: Int): List { if (!TrackerManager.hasLoggedTracker()) { return emptyList() @@ -85,7 +97,7 @@ object Track { MangaTrackerDataClass( id = it.id, name = it.name, - icon = it.getLogo(), + icon = proxyThumbnailUrl(it.id), statusList = it.getStatusList(), statusTextMap = it.getStatusList().associateWith { k -> it.getStatus(k) ?: "" }, scoreList = it.getScoreList(), diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/Tracker.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/Tracker.kt index da84cee2..a78f1a58 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/Tracker.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/Tracker.kt @@ -7,7 +7,7 @@ import suwayomi.tachidesk.manga.impl.track.tracker.model.TrackSearch import uy.kohesive.injekt.injectLazy abstract class Tracker(val id: Int, val name: String) { - val trackPreferences = TrackerPreferences() + val trackPreferences = TrackerPreferences private val networkService: NetworkHelper by injectLazy() open val client: OkHttpClient diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerPreferences.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerPreferences.kt index 7c97c88a..d9b6183c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerPreferences.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerPreferences.kt @@ -7,7 +7,7 @@ import suwayomi.tachidesk.manga.impl.track.tracker.anilist.Anilist import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class TrackerPreferences { +object TrackerPreferences { private val preferenceStore = Injekt.get().getSharedPreferences("tracker", Context.MODE_PRIVATE) private val logger = KotlinLogging.logger {} @@ -57,13 +57,11 @@ class TrackerPreferences { 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" } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt index 3e5c737c..d7cf7557 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt @@ -91,13 +91,6 @@ object JavalinSetup { 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.accessManager { handler, ctx, _ ->