From ce42e89e25c520ac8ddf35972f04ffe8f9e168f5 Mon Sep 17 00:00:00 2001 From: Mitchell Syer Date: Sun, 21 Jan 2024 11:45:34 -0500 Subject: [PATCH] Add MangaUpdates (#834) --- .../eu/kanade/tachiyomi/network/Requests.kt | 28 +++ .../impl/track/tracker/TrackerManager.kt | 6 +- .../tracker/mangaupdates/MangaUpdates.kt | 128 ++++++++++ .../tracker/mangaupdates/MangaUpdatesApi.kt | 220 ++++++++++++++++++ .../mangaupdates/MangaUpdatesInterceptor.kt | 31 +++ .../track/tracker/mangaupdates/dto/Context.kt | 11 + .../track/tracker/mangaupdates/dto/Image.kt | 10 + .../tracker/mangaupdates/dto/ListItem.kt | 22 ++ .../track/tracker/mangaupdates/dto/Rating.kt | 15 ++ .../track/tracker/mangaupdates/dto/Record.kt | 42 ++++ .../track/tracker/mangaupdates/dto/Series.kt | 9 + .../track/tracker/mangaupdates/dto/Status.kt | 9 + .../track/tracker/mangaupdates/dto/Url.kt | 9 + .../static/tracker/manga_updates.png | Bin 0 -> 64928 bytes 14 files changed, 538 insertions(+), 2 deletions(-) create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdates.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesApi.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesInterceptor.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Context.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Image.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/ListItem.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Rating.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Record.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Series.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Status.kt create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Url.kt create mode 100644 server/src/main/resources/static/tracker/manga_updates.png diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt index 39f84967..67a6671b 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt @@ -54,3 +54,31 @@ fun POST( .cacheControl(cache) .build() } + +fun PUT( + url: String, + headers: Headers = DEFAULT_HEADERS, + body: RequestBody = DEFAULT_BODY, + cache: CacheControl = DEFAULT_CACHE_CONTROL, +): Request { + return Request.Builder() + .url(url) + .put(body) + .headers(headers) + .cacheControl(cache) + .build() +} + +fun DELETE( + url: String, + headers: Headers = DEFAULT_HEADERS, + body: RequestBody = DEFAULT_BODY, + cache: CacheControl = DEFAULT_CACHE_CONTROL, +): Request { + return Request.Builder() + .url(url) + .delete(body) + .headers(headers) + .cacheControl(cache) + .build() +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerManager.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerManager.kt index cea4a182..feab34a3 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerManager.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/TrackerManager.kt @@ -1,6 +1,7 @@ package suwayomi.tachidesk.manga.impl.track.tracker import suwayomi.tachidesk.manga.impl.track.tracker.anilist.Anilist +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.MangaUpdates import suwayomi.tachidesk.manga.impl.track.tracker.myanimelist.MyAnimeList object TrackerManager { @@ -16,15 +17,16 @@ object TrackerManager { val myAnimeList = MyAnimeList(MYANIMELIST) val aniList = Anilist(ANILIST) + // val kitsu = Kitsu(KITSU) // val shikimori = Shikimori(SHIKIMORI) // val bangumi = Bangumi(BANGUMI) // val komga = Komga(KOMGA) -// val mangaUpdates = MangaUpdates(MANGA_UPDATES) + val mangaUpdates = MangaUpdates(MANGA_UPDATES) // val kavita = Kavita(context, KAVITA) // val suwayomi = Suwayomi(SUWAYOMI) - val services: List = listOf(myAnimeList, aniList) + val services: List = listOf(myAnimeList, aniList, mangaUpdates) fun getTracker(id: Int) = services.find { it.id == id } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdates.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdates.kt new file mode 100644 index 00000000..9e15eb36 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdates.kt @@ -0,0 +1,128 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates + +import suwayomi.tachidesk.manga.impl.track.tracker.Tracker +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.ListItem +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.Rating +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.copyTo +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.toTrackSearch +import suwayomi.tachidesk.manga.impl.track.tracker.model.Track +import suwayomi.tachidesk.manga.impl.track.tracker.model.TrackSearch + +class MangaUpdates(id: Int) : Tracker(id, "MangaUpdates") { + // , DeletableTracker + companion object { + const val READING_LIST = 0 + const val WISH_LIST = 1 + const val COMPLETE_LIST = 2 + const val UNFINISHED_LIST = 3 + const val ON_HOLD_LIST = 4 + + private val SCORE_LIST = + (0..10) + .flatMap { decimal -> + when (decimal) { + 0 -> listOf("-") + 10 -> listOf("10.0") + else -> + (0..9).map { fraction -> + "$decimal.$fraction" + } + } + } + } + + private val interceptor by lazy { MangaUpdatesInterceptor(this) } + + private val api by lazy { MangaUpdatesApi(interceptor, client) } + + override fun getLogo(): String = "/static/tracker/manga_updates.png" + + override fun getStatusList(): List { + return listOf(READING_LIST, COMPLETE_LIST, ON_HOLD_LIST, UNFINISHED_LIST, WISH_LIST) + } + + override fun getStatus(status: Int): String? = + when (status) { + READING_LIST -> "Reading List" + WISH_LIST -> "Wish List" + COMPLETE_LIST -> "Complete List" + ON_HOLD_LIST -> "On Hold List" + UNFINISHED_LIST -> "Unfinished List" + else -> null + } + + override fun getReadingStatus(): Int = READING_LIST + + override fun getRereadingStatus(): Int = -1 + + override fun getCompletionStatus(): Int = COMPLETE_LIST + + override fun getScoreList(): List = SCORE_LIST + + override fun indexToScore(index: Int): Float = if (index == 0) 0f else SCORE_LIST[index].toFloat() + + override fun displayScore(track: Track): String = track.score.toString() + + override suspend fun update( + track: Track, + didReadChapter: Boolean, + ): Track { + if (track.status != COMPLETE_LIST && didReadChapter) { + track.status = READING_LIST + } + api.updateSeriesListItem(track) + return track + } + + // override suspend fun delete(track: Track) { + // api.deleteSeriesFromList(track) + // } + + override suspend fun bind( + track: Track, + hasReadChapters: Boolean, + ): Track { + return try { + val (series, rating) = api.getSeriesListItem(track) + track.copyFrom(series, rating) + } catch (e: Exception) { + track.score = 0f + api.addSeriesToList(track, hasReadChapters) + track + } + } + + override suspend fun search(query: String): List { + return api.search(query) + .map { + it.toTrackSearch(id) + } + } + + override suspend fun refresh(track: Track): Track { + val (series, rating) = api.getSeriesListItem(track) + return track.copyFrom(series, rating) + } + + private fun Track.copyFrom( + item: ListItem, + rating: Rating?, + ): Track = + apply { + item.copyTo(this) + score = rating?.rating ?: 0f + } + + override suspend fun login( + username: String, + password: String, + ) { + val authenticated = api.authenticate(username, password) ?: throw Throwable("Unable to login") + saveCredentials(authenticated.uid.toString(), authenticated.sessionToken) + interceptor.newAuth(authenticated.sessionToken) + } + + fun restoreSession(): String? { + return trackPreferences.getTrackPassword(this) + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesApi.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesApi.kt new file mode 100644 index 00000000..8ecc132f --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesApi.kt @@ -0,0 +1,220 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates + +import eu.kanade.tachiyomi.network.DELETE +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.PUT +import eu.kanade.tachiyomi.network.awaitSuccess +import eu.kanade.tachiyomi.network.parseAs +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.add +import kotlinx.serialization.json.addJsonObject +import kotlinx.serialization.json.buildJsonArray +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.put +import kotlinx.serialization.json.putJsonObject +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.RequestBody.Companion.toRequestBody +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.MangaUpdates.Companion.READING_LIST +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.MangaUpdates.Companion.WISH_LIST +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.Context +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.ListItem +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.Rating +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto.Record +import suwayomi.tachidesk.manga.impl.track.tracker.model.Track +import uy.kohesive.injekt.injectLazy + +class MangaUpdatesApi( + interceptor: MangaUpdatesInterceptor, + private val client: OkHttpClient, +) { + private val json: Json by injectLazy() + + private val baseUrl = "https://api.mangaupdates.com" + private val contentType = "application/vnd.api+json".toMediaType() + + private val authClient by lazy { + client.newBuilder() + .addInterceptor(interceptor) + .build() + } + + suspend fun getSeriesListItem(track: Track): Pair { + val listItem = + with(json) { + authClient.newCall(GET("$baseUrl/v1/lists/series/${track.media_id}")) + .awaitSuccess() + .parseAs() + } + + val rating = getSeriesRating(track) + + return listItem to rating + } + + suspend fun addSeriesToList( + track: Track, + hasReadChapters: Boolean, + ) { + val status = if (hasReadChapters) READING_LIST else WISH_LIST + val body = + buildJsonArray { + addJsonObject { + putJsonObject("series") { + put("id", track.media_id) + } + put("list_id", status) + } + } + authClient.newCall( + POST( + url = "$baseUrl/v1/lists/series", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + .let { + if (it.code == 200) { + track.status = status + track.last_chapter_read = 1f + } + } + } + + suspend fun updateSeriesListItem(track: Track) { + val body = + buildJsonArray { + addJsonObject { + putJsonObject("series") { + put("id", track.media_id) + } + put("list_id", track.status) + putJsonObject("status") { + put("chapter", track.last_chapter_read.toInt()) + } + } + } + authClient.newCall( + POST( + url = "$baseUrl/v1/lists/series/update", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + + updateSeriesRating(track) + } + + suspend fun deleteSeriesFromList(track: Track) { + val body = + buildJsonArray { + add(track.media_id) + } + authClient.newCall( + POST( + url = "$baseUrl/v1/lists/series/delete", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + } + + private suspend fun getSeriesRating(track: Track): Rating? { + return try { + with(json) { + authClient.newCall(GET("$baseUrl/v1/series/${track.media_id}/rating")) + .awaitSuccess() + .parseAs() + } + } catch (e: Exception) { + null + } + } + + private suspend fun updateSeriesRating(track: Track) { + if (track.score != 0f) { + val body = + buildJsonObject { + put("rating", track.score) + } + authClient.newCall( + PUT( + url = "$baseUrl/v1/series/${track.media_id}/rating", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + } else { + authClient.newCall( + DELETE( + url = "$baseUrl/v1/series/${track.media_id}/rating", + ), + ) + .awaitSuccess() + } + } + + suspend fun search(query: String): List { + val body = + buildJsonObject { + put("search", query) + put( + "filter_types", + buildJsonArray { + add("drama cd") + add("novel") + }, + ) + } + return with(json) { + client.newCall( + POST( + url = "$baseUrl/v1/series/search", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + .parseAs() + .let { obj -> + obj["results"]?.jsonArray?.map { element -> + json.decodeFromJsonElement(element.jsonObject["record"]!!) + } + } + .orEmpty() + } + } + + suspend fun authenticate( + username: String, + password: String, + ): Context? { + val body = + buildJsonObject { + put("username", username) + put("password", password) + } + return with(json) { + client.newCall( + PUT( + url = "$baseUrl/v1/account/login", + body = body.toString().toRequestBody(contentType), + ), + ) + .awaitSuccess() + .parseAs() + .let { obj -> + try { + json.decodeFromJsonElement(obj["context"]!!) + } catch (e: Exception) { + // logcat(LogPriority.ERROR, e) + null + } + } + } + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesInterceptor.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesInterceptor.kt new file mode 100644 index 00000000..ce2cb8c7 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/MangaUpdatesInterceptor.kt @@ -0,0 +1,31 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates + +import okhttp3.Interceptor +import okhttp3.Response +import suwayomi.tachidesk.server.generated.BuildConfig +import java.io.IOException + +class MangaUpdatesInterceptor( + mangaUpdates: MangaUpdates, +) : Interceptor { + private var token: String? = mangaUpdates.restoreSession() + + override fun intercept(chain: Interceptor.Chain): Response { + val originalRequest = chain.request() + + val token = token ?: throw IOException("Not authenticated with MangaUpdates") + + // Add the authorization header to the original request. + val authRequest = + originalRequest.newBuilder() + .addHeader("Authorization", "Bearer $token") + .header("User-Agent", "Suwayomi ${BuildConfig.VERSION} (${BuildConfig.REVISION})") + .build() + + return chain.proceed(authRequest) + } + + fun newAuth(token: String?) { + this.token = token + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Context.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Context.kt new file mode 100644 index 00000000..9c5690a6 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Context.kt @@ -0,0 +1,11 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Context( + @SerialName("session_token") + val sessionToken: String, + val uid: Long, +) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Image.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Image.kt new file mode 100644 index 00000000..907564fe --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Image.kt @@ -0,0 +1,10 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class Image( + val url: Url? = null, + val height: Int? = null, + val width: Int? = null, +) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/ListItem.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/ListItem.kt new file mode 100644 index 00000000..e030b59a --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/ListItem.kt @@ -0,0 +1,22 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.MangaUpdates.Companion.READING_LIST +import suwayomi.tachidesk.manga.impl.track.tracker.model.Track + +@Serializable +data class ListItem( + val series: Series? = null, + @SerialName("list_id") + val listId: Int? = null, + val status: Status? = null, + val priority: Int? = null, +) + +fun ListItem.copyTo(track: Track): Track { + return track.apply { + this.status = listId ?: READING_LIST + this.last_chapter_read = this@copyTo.status?.chapter?.toFloat() ?: 0f + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Rating.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Rating.kt new file mode 100644 index 00000000..78851715 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Rating.kt @@ -0,0 +1,15 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.Serializable +import suwayomi.tachidesk.manga.impl.track.tracker.model.Track + +@Serializable +data class Rating( + val rating: Float? = null, +) + +fun Rating.copyTo(track: Track): Track { + return track.apply { + this.score = rating ?: 0f + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Record.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Record.kt new file mode 100644 index 00000000..cc31b1e3 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Record.kt @@ -0,0 +1,42 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.jsoup.Jsoup +import suwayomi.tachidesk.manga.impl.track.tracker.model.TrackSearch + +@Serializable +data class Record( + @SerialName("series_id") + val seriesId: Long? = null, + val title: String? = null, + val url: String? = null, + val description: String? = null, + val image: Image? = null, + val type: String? = null, + val year: String? = null, + @SerialName("bayesian_rating") + val bayesianRating: Double? = null, + @SerialName("rating_votes") + val ratingVotes: Int? = null, + @SerialName("latest_chapter") + val latestChapter: Int? = null, +) + +private fun String.htmlDecode(): String { + return Jsoup.parse(this).wholeText() +} + +fun Record.toTrackSearch(id: Int): TrackSearch { + return TrackSearch.create(id).apply { + media_id = this@toTrackSearch.seriesId ?: 0L + title = this@toTrackSearch.title?.htmlDecode() ?: "" + total_chapters = 0 + cover_url = this@toTrackSearch.image?.url?.original ?: "" + summary = this@toTrackSearch.description?.htmlDecode() ?: "" + tracking_url = this@toTrackSearch.url ?: "" + publishing_status = "" + publishing_type = this@toTrackSearch.type.toString() + start_date = this@toTrackSearch.year.toString() + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Series.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Series.kt new file mode 100644 index 00000000..ffd6ec4d --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Series.kt @@ -0,0 +1,9 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class Series( + val id: Long? = null, + val title: String? = null, +) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Status.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Status.kt new file mode 100644 index 00000000..3d5ed016 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Status.kt @@ -0,0 +1,9 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class Status( + val volume: Int? = null, + val chapter: Int? = null, +) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Url.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Url.kt new file mode 100644 index 00000000..876db261 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/track/tracker/mangaupdates/dto/Url.kt @@ -0,0 +1,9 @@ +package suwayomi.tachidesk.manga.impl.track.tracker.mangaupdates.dto + +import kotlinx.serialization.Serializable + +@Serializable +data class Url( + val original: String? = null, + val thumb: String? = null, +) diff --git a/server/src/main/resources/static/tracker/manga_updates.png b/server/src/main/resources/static/tracker/manga_updates.png new file mode 100644 index 0000000000000000000000000000000000000000..fb593493a347b1c7ded4e0e1e8d45a8257d6ce1e GIT binary patch literal 64928 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 U8}0De1o;*j2}SW*QRCqM18K0u-2eap literal 0 HcmV?d00001