Toonily: various fixes (#8544)
* Toonily: various fixes - change `mangaSubString` -> serie - prevent 302 redirect - disable count views - 400 bad request - use LoadMoreRequest - fetch hd covers if possible * query cleanup * review changes
This commit is contained in:
		
							parent
							
								
									1c2876f7a5
								
							
						
					
					
						commit
						9ad099295c
					
				| @ -3,7 +3,7 @@ ext { | |||||||
|     extClass = '.Toonily' |     extClass = '.Toonily' | ||||||
|     themePkg = 'madara' |     themePkg = 'madara' | ||||||
|     baseUrl = 'https://toonily.com' |     baseUrl = 'https://toonily.com' | ||||||
|     overrideVersionCode = 12 |     overrideVersionCode = 13 | ||||||
|     isNsfw = true |     isNsfw = true | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,9 +4,10 @@ import eu.kanade.tachiyomi.lib.cookieinterceptor.CookieInterceptor | |||||||
| import eu.kanade.tachiyomi.multisrc.madara.Madara | import eu.kanade.tachiyomi.multisrc.madara.Madara | ||||||
| import eu.kanade.tachiyomi.network.GET | import eu.kanade.tachiyomi.network.GET | ||||||
| import eu.kanade.tachiyomi.source.model.FilterList | import eu.kanade.tachiyomi.source.model.FilterList | ||||||
| import okhttp3.HttpUrl.Companion.toHttpUrl | import eu.kanade.tachiyomi.source.model.SManga | ||||||
| import okhttp3.OkHttpClient | import okhttp3.Interceptor | ||||||
| import okhttp3.Request | import okhttp3.Request | ||||||
|  | import okhttp3.Response | ||||||
| import java.text.SimpleDateFormat | import java.text.SimpleDateFormat | ||||||
| import java.util.Locale | import java.util.Locale | ||||||
| 
 | 
 | ||||||
| @ -17,63 +18,80 @@ class Toonily : Madara( | |||||||
|     "en", |     "en", | ||||||
|     SimpleDateFormat("MMM d, yy", Locale.US), |     SimpleDateFormat("MMM d, yy", Locale.US), | ||||||
| ) { | ) { | ||||||
| 
 |     override val client = super.client.newBuilder() | ||||||
|     override val client: OkHttpClient = super.client.newBuilder() |  | ||||||
|         .addNetworkInterceptor(CookieInterceptor(domain, "toonily-mature" to "1")) |         .addNetworkInterceptor(CookieInterceptor(domain, "toonily-mature" to "1")) | ||||||
|  |         .addInterceptor(::hdCoverInterceptor) | ||||||
|         .build() |         .build() | ||||||
| 
 | 
 | ||||||
|     override val mangaSubString = "webtoon" |     override val mangaSubString = "serie" | ||||||
|  |     override val filterNonMangaItems = false | ||||||
|  |     override val useNewChapterEndpoint = true | ||||||
|  |     override val sendViewCount = false | ||||||
|  |     override val useLoadMoreRequest = LoadMoreStrategy.Always | ||||||
| 
 | 
 | ||||||
|     private fun searchPage(page: Int, query: String): String { |     override fun searchMangaSelector() = "div.page-item-detail.manga" | ||||||
|         val urlQuery = query.trim() |  | ||||||
|             .lowercase(Locale.US) |  | ||||||
|             .replace(titleSpecialCharactersRegex, "-") |  | ||||||
|             .replace(trailingHyphenRegex, "") |  | ||||||
|             .let { if (it.isNotEmpty()) "$it/" else it } |  | ||||||
|         return if (page > 1) { |  | ||||||
|             "search/${urlQuery}page/$page/" |  | ||||||
|         } else { |  | ||||||
|             "search/$urlQuery" |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { |     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { | ||||||
|         val request = super.searchMangaRequest(page, query, filters) |         return super.searchMangaRequest( | ||||||
| 
 |             page, | ||||||
|         val queries = request.url.queryParameterNames |             query.replace(titleSpecialCharactersRegex, " ").trim(), | ||||||
|             .filterNot { it == "s" } |             filters, | ||||||
| 
 |         ) | ||||||
|         val newUrl = "$baseUrl/${searchPage(page, query)}".toHttpUrl().newBuilder().apply { |  | ||||||
|             queries.map { q -> |  | ||||||
|                 request.url.queryParameterValues(q).map { |  | ||||||
|                     this.addQueryParameter(q, it) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }.build() |  | ||||||
| 
 |  | ||||||
|         return request.newBuilder() |  | ||||||
|             .url(newUrl) |  | ||||||
|             .build() |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun genresRequest(): Request { |     override fun genresRequest(): Request { | ||||||
|         return GET("$baseUrl/search/?post_type=wp-manga", headers) |         return GET("$baseUrl/search/?post_type=wp-manga", headers) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // The source customized the Madara theme and broke the filter. |     override fun mangaDetailsRequest(manga: SManga): Request { | ||||||
|     override val filterNonMangaItems = false |         val newManga = SManga.create().apply { | ||||||
|  |             url = manga.url.replace("/webtoon/", "/$mangaSubString/") | ||||||
|  |         } | ||||||
|  |         return super.mangaDetailsRequest(newManga) | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     override val useNewChapterEndpoint: Boolean = true |     override fun chapterListRequest(manga: SManga): Request { | ||||||
| 
 |         return mangaDetailsRequest(manga) | ||||||
|     override fun searchMangaSelector() = "div.page-item-detail.manga" |     } | ||||||
| 
 | 
 | ||||||
|     override fun parseChapterDate(date: String?): Long { |     override fun parseChapterDate(date: String?): Long { | ||||||
|         val formattedDate = if (date?.contains("UP") == true) "today" else date |         val formattedDate = if (date?.contains("UP") == true) "today" else date | ||||||
|         return super.parseChapterDate(formattedDate) |         return super.parseChapterDate(formattedDate) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private fun hdCoverInterceptor(chain: Interceptor.Chain): Response { | ||||||
|  |         val request = chain.request() | ||||||
|  |         val url = request.url | ||||||
|  | 
 | ||||||
|  |         return if ( | ||||||
|  |             url.pathSegments.firstOrNull() == "wp-content" && | ||||||
|  |             url.pathSegments.lastOrNull()?.contains(sdCoverRegex) == true | ||||||
|  |         ) { | ||||||
|  |             try { | ||||||
|  |                 val newUrl = url.newBuilder() | ||||||
|  |                     .removePathSegment(url.pathSegments.lastIndex) | ||||||
|  |                     .addPathSegment( | ||||||
|  |                         sdCoverRegex.replace( | ||||||
|  |                             url.pathSegments.last(), | ||||||
|  |                             "$1", | ||||||
|  |                         ), | ||||||
|  |                     ).build() | ||||||
|  |                 val newRequest = request.newBuilder() | ||||||
|  |                     .url(newUrl) | ||||||
|  |                     .build() | ||||||
|  | 
 | ||||||
|  |                 chain.proceed(newRequest) | ||||||
|  |                     .also { assert(it.isSuccessful) } | ||||||
|  |             } catch (_: Throwable) { | ||||||
|  |                 chain.proceed(request) | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             chain.proceed(request) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     companion object { |     companion object { | ||||||
|         val titleSpecialCharactersRegex = "[^a-z0-9]+".toRegex() |         val titleSpecialCharactersRegex = "[^a-z0-9]+".toRegex() | ||||||
|         val trailingHyphenRegex = "-+$".toRegex() |         val sdCoverRegex = Regex("""-[0-9]+x[0-9]+(\.\w+)$""") | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 AwkwardPeak7
						AwkwardPeak7