From f876cdb037831ae1e98978b49eb1aa1fcd16fcdf Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Fri, 16 May 2025 20:34:03 -0400 Subject: [PATCH] Use MediaServer in Json for NHentai Co-authored-by: 4521 <18432684+az4521@users.noreply.github.com> --- .../tachiyomi/source/online/all/NHentai.kt | 22 ++++++++++++++----- .../metadata/NHentaiSearchMetadata.kt | 3 ++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/NHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/NHentai.kt index 452c792b2..53756a501 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/NHentai.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/NHentai.kt @@ -70,7 +70,9 @@ class NHentai(delegate: HttpSource, val context: Context) : } override suspend fun parseIntoMetadata(metadata: NHentaiSearchMetadata, input: Response) { - val json = GALLERY_JSON_REGEX.find(input.body.string())!!.groupValues[1].replace( + val body = input.body.string() + val server = MEDIA_SERVER_REGEX.find(body)?.groupValues?.get(1)?.toInt() ?: 1 + val json = GALLERY_JSON_REGEX.find(body)!!.groupValues[1].replace( UNICODE_ESCAPE_REGEX, ) { it.groupValues[1].toInt(radix = 16).toChar().toString() } val jsonResponse = jsonParser.decodeFromString(json) @@ -84,6 +86,8 @@ class NHentai(delegate: HttpSource, val context: Context) : mediaId = jsonResponse.mediaId + mediaServer = server + jsonResponse.title?.let { title -> japaneseTitle = title.japanese shortTitle = title.pretty @@ -190,16 +194,23 @@ class NHentai(delegate: HttpSource, val context: Context) : return PagePreviewPage( page, metadata.pageImageTypes.mapIndexed { index, s -> - PagePreviewInfo(index + 1, imageUrl = thumbnailUrlFromType(metadata.mediaId!!, index + 1, s)!!) + PagePreviewInfo( + index + 1, + imageUrl = thumbnailUrlFromType(metadata.mediaId!!, metadata.mediaServer ?: 1, index + 1, s)!! + ) }, false, 1, ) } - private fun thumbnailUrlFromType(mediaId: String, page: Int, t: String) = - NHentaiSearchMetadata.typeToExtension(t)?.let { - "https://t1.nhentai.net/galleries/$mediaId/${page}t.$it" + private fun thumbnailUrlFromType( + mediaId: String, + mediaServer: Int, + page: Int, + t: String, + ) = NHentaiSearchMetadata.typeToExtension(t)?.let { + "https://t$mediaServer.nhentai.net/galleries/$mediaId/${page}t.$it" } override suspend fun fetchPreviewImage(page: PagePreviewInfo, cacheControl: CacheControl?): Response { @@ -221,6 +232,7 @@ class NHentai(delegate: HttpSource, val context: Context) : } private val GALLERY_JSON_REGEX = Regex(".parse\\(\"(.*)\"\\);") + private val MEDIA_SERVER_REGEX = Regex("media_server\\s*:\\s*(\\d+)") private val UNICODE_ESCAPE_REGEX = Regex("\\\\u([0-9a-fA-F]{4})") private const val TITLE_PREF = "Display manga title as:" } diff --git a/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt b/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt index 3885f1e6b..206700a52 100644 --- a/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt +++ b/source-api/src/commonMain/kotlin/exh/metadata/metadata/NHentaiSearchMetadata.kt @@ -28,6 +28,7 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() { var favoritesCount: Long? = null var mediaId: String? = null + var mediaServer: Int? = null var japaneseTitle by titleDelegate(TITLE_TYPE_JAPANESE) var englishTitle by titleDelegate(TITLE_TYPE_ENGLISH) @@ -46,7 +47,7 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() { val cover = if (mediaId != null) { typeToExtension(coverImageType)?.let { - "https://t1.nhentai.net/galleries/$mediaId/cover.$it" + "https://t${mediaServer ?: 1}.nhentai.net/galleries/$mediaId/cover.$it" } } else { null