Madara: Refactor and added new sources (#1190)
This commit is contained in:
		
							parent
							
								
									7c7e7a92f0
								
							
						
					
					
						commit
						d8c5ca8534
					
				| @ -5,7 +5,7 @@ ext { | |||||||
|     appName = 'Tachiyomi: Madara' |     appName = 'Tachiyomi: Madara' | ||||||
|     pkgNameSuffix = "all.madara" |     pkgNameSuffix = "all.madara" | ||||||
|     extClass = '.MadaraFactory' |     extClass = '.MadaraFactory' | ||||||
|     extVersionCode = 2 |     extVersionCode = 3 | ||||||
|     libVersion = '1.2' |     libVersion = '1.2' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,5 @@ | |||||||
| package eu.kanade.tachiyomi.extension.all.madara | package eu.kanade.tachiyomi.extension.all.madara | ||||||
| 
 | 
 | ||||||
| import eu.kanade.tachiyomi.network.GET |  | ||||||
| import eu.kanade.tachiyomi.source.model.* | import eu.kanade.tachiyomi.source.model.* | ||||||
| import eu.kanade.tachiyomi.source.online.ParsedHttpSource | import eu.kanade.tachiyomi.source.online.ParsedHttpSource | ||||||
| import okhttp3.* | import okhttp3.* | ||||||
| @ -9,8 +8,13 @@ import org.jsoup.nodes.Element | |||||||
| import java.text.ParseException | import java.text.ParseException | ||||||
| import java.text.SimpleDateFormat | import java.text.SimpleDateFormat | ||||||
| import java.util.* | import java.util.* | ||||||
|  | import eu.kanade.tachiyomi.source.model.FilterList | ||||||
|  | import okhttp3.CacheControl | ||||||
|  | import okhttp3.FormBody | ||||||
|  | import okhttp3.Request | ||||||
|  | import eu.kanade.tachiyomi.network.POST | ||||||
| 
 | 
 | ||||||
| abstract class Madara( | open class Madara( | ||||||
|         override val name: String, |         override val name: String, | ||||||
|         override val baseUrl: String, |         override val baseUrl: String, | ||||||
|         override val lang: String, |         override val lang: String, | ||||||
| @ -40,13 +44,54 @@ abstract class Madara( | |||||||
|         return manga |         return manga | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     override fun popularMangaRequest(page: Int): Request { | ||||||
|  |         val form = FormBody.Builder().apply { | ||||||
|  |             add("action", "madara_load_more") | ||||||
|  |             add("page", (page-1).toString()) | ||||||
|  |             add("template", "madara-core/content/content-archive") | ||||||
|  |             add("vars[orderby]", "meta_value_num") | ||||||
|  |             add("vars[paged]", "1") | ||||||
|  |             add("vars[posts_per_page]", "20") | ||||||
|  |             add("vars[post_type]", "wp-manga") | ||||||
|  |             add("vars[post_status]", "publish") | ||||||
|  |             add("vars[meta_key]", "_wp_manga_views") | ||||||
|  |             add("vars[order]", "desc") | ||||||
|  |             add("vars[sidebar]", "full") | ||||||
|  |             add("vars[manga_archives_item_layout]", "big_thumbnail") | ||||||
|  |         } | ||||||
|  |         return POST("$baseUrl/wp-admin/admin-ajax.php", headers, form.build(), CacheControl.FORCE_NETWORK) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun popularMangaNextPageSelector(): String? = "body:not(:has(.no-posts))" | ||||||
|  | 
 | ||||||
|     // Latest Updates |     // Latest Updates | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl) |     override fun latestUpdatesSelector() = "div.page-item-detail" | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesSelector() = "div.item__wrap" |     override fun latestUpdatesFromElement(element: Element): SManga { | ||||||
|  |         // Even if it's different from the popular manga's list, the relevant classes are the same | ||||||
|  |         return popularMangaFromElement(element) | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesNextPageSelector(): String? = null |     override fun latestUpdatesRequest(page: Int): Request { | ||||||
|  |         val form = FormBody.Builder().apply { | ||||||
|  |             add("action", "madara_load_more") | ||||||
|  |             add("page", (page-1).toString()) | ||||||
|  |             add("template", "madara-core/content/content-archive") | ||||||
|  |             add("vars[orderby]", "meta_value_num") | ||||||
|  |             add("vars[paged]", "1") | ||||||
|  |             add("vars[posts_per_page]", "20") | ||||||
|  |             add("vars[post_type]", "wp-manga") | ||||||
|  |             add("vars[post_status]", "publish") | ||||||
|  |             add("vars[meta_key]", "_latest_update") | ||||||
|  |             add("vars[order]", "desc") | ||||||
|  |             add("vars[sidebar]", "right") | ||||||
|  |             add("vars[manga_archives_item_layout]", "big_thumbnail") | ||||||
|  |         } | ||||||
|  |         return POST("$baseUrl/wp-admin/admin-ajax.php", headers, form.build(), CacheControl.FORCE_NETWORK) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun latestUpdatesNextPageSelector(): String? = "body:not(:has(.no-posts))" | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesParse(response: Response): MangasPage { |     override fun latestUpdatesParse(response: Response): MangasPage { | ||||||
|         val mp = super.latestUpdatesParse(response) |         val mp = super.latestUpdatesParse(response) | ||||||
| @ -54,13 +99,24 @@ abstract class Madara( | |||||||
|         return MangasPage(mangas, mp.hasNextPage) |         return MangasPage(mangas, mp.hasNextPage) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesFromElement(element: Element): SManga { |  | ||||||
|         // Even if it's different from the popular manga's list, the relevant classes are the same |  | ||||||
|         return popularMangaFromElement(element) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Search Manga |     // Search Manga | ||||||
| 
 | 
 | ||||||
|  |     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { | ||||||
|  |         val form = FormBody.Builder().apply { | ||||||
|  |             add("action", "madara_load_more") | ||||||
|  |             add("page", (page-1).toString()) | ||||||
|  |             add("template", "madara-core/content/content-search") | ||||||
|  |             add("vars[s]", query) | ||||||
|  |             add("vars[orderby]", "") | ||||||
|  |             add("vars[paged]", (page-1).toString()) | ||||||
|  |             add("vars[template]", "search") | ||||||
|  |             add("vars[post_type]", "wp-manga") | ||||||
|  |             add("vars[post_status]", "publish") | ||||||
|  |             add("vars[manga_archives_item_layout]", "default") | ||||||
|  |         } | ||||||
|  |         return POST("$baseUrl/wp-admin/admin-ajax.php", headers, form.build(), CacheControl.FORCE_NETWORK) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     override fun searchMangaSelector() = "div.c-tabs-item__content" |     override fun searchMangaSelector() = "div.c-tabs-item__content" | ||||||
| 
 | 
 | ||||||
|     override fun searchMangaFromElement(element: Element): SManga { |     override fun searchMangaFromElement(element: Element): SManga { | ||||||
| @ -74,23 +130,6 @@ abstract class Madara( | |||||||
|             select("img").first()?.let { |             select("img").first()?.let { | ||||||
|                 manga.thumbnail_url = it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src") |                 manga.thumbnail_url = it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src") | ||||||
|             } |             } | ||||||
|             select("div.mg_author div.summary-content a").first()?.let { |  | ||||||
|                 manga.author = it.text() |  | ||||||
|             } |  | ||||||
|             select("div.mg_artists div.summary-content a").first()?.let { |  | ||||||
|                 manga.artist = it.text() |  | ||||||
|             } |  | ||||||
|             select("div.mg_genres div.summary-content a").first()?.let { |  | ||||||
|                 manga.genre = it.text() |  | ||||||
|             } |  | ||||||
|             select("div.mg_status div.summary-content a").first()?.let { |  | ||||||
|                 manga.status = when(it.text()) { |  | ||||||
|                     // I don't know what's the corresponding for COMPLETED and LICENSED |  | ||||||
|                     // There's no support for "Canceled" or "On Hold" |  | ||||||
|                     "OnGoing" -> SManga.ONGOING |  | ||||||
|                     else -> SManga.UNKNOWN |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return manga |         return manga | ||||||
| @ -121,6 +160,14 @@ abstract class Madara( | |||||||
|             select("div.summary_image img").first()?.let { |             select("div.summary_image img").first()?.let { | ||||||
|                 manga.thumbnail_url = it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src") |                 manga.thumbnail_url = it.absUrl(if(it.hasAttr("data-src")) "data-src" else "src") | ||||||
|             } |             } | ||||||
|  |             select("div.summary-content").last()?.let { | ||||||
|  |                 manga.status = when(it.text()) { | ||||||
|  |                     // I don't know what's the corresponding for COMPLETED and LICENSED | ||||||
|  |                     // There's no support for "Canceled" or "On Hold" | ||||||
|  |                     "OnGoing", "Продолжается", "Updating" -> SManga.ONGOING | ||||||
|  |                     else -> SManga.UNKNOWN | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return manga |         return manga | ||||||
| @ -153,7 +200,7 @@ abstract class Madara( | |||||||
|             parseRelativeDate(lcDate)?.let { return it } |             parseRelativeDate(lcDate)?.let { return it } | ||||||
| 
 | 
 | ||||||
|         //Handle 'yesterday' and 'today', using midnight |         //Handle 'yesterday' and 'today', using midnight | ||||||
|         if (lcDate.startsWith("ayer")) |         if (lcDate.startsWith("year")) | ||||||
|             return Calendar.getInstance().apply { |             return Calendar.getInstance().apply { | ||||||
|                 add(Calendar.DAY_OF_MONTH, -1) //yesterday |                 add(Calendar.DAY_OF_MONTH, -1) //yesterday | ||||||
|                 set(Calendar.HOUR_OF_DAY, 0) |                 set(Calendar.HOUR_OF_DAY, 0) | ||||||
|  | |||||||
| @ -1,84 +1,53 @@ | |||||||
| package eu.kanade.tachiyomi.extension.all.madara | package eu.kanade.tachiyomi.extension.all.madara | ||||||
| 
 | 
 | ||||||
| import eu.kanade.tachiyomi.network.GET | 
 | ||||||
| import eu.kanade.tachiyomi.network.POST |  | ||||||
| import eu.kanade.tachiyomi.source.Source | import eu.kanade.tachiyomi.source.Source | ||||||
| import eu.kanade.tachiyomi.source.SourceFactory | import eu.kanade.tachiyomi.source.SourceFactory | ||||||
| import eu.kanade.tachiyomi.source.model.FilterList |  | ||||||
| import okhttp3.CacheControl |  | ||||||
| import okhttp3.FormBody |  | ||||||
| import okhttp3.Request |  | ||||||
| import java.text.SimpleDateFormat | import java.text.SimpleDateFormat | ||||||
| import java.util.* | import java.util.* | ||||||
|  | import eu.kanade.tachiyomi.network.GET | ||||||
|  | import eu.kanade.tachiyomi.source.model.FilterList | ||||||
|  | import okhttp3.Request | ||||||
| 
 | 
 | ||||||
| class MadaraFactory : SourceFactory { | class MadaraFactory : SourceFactory { | ||||||
|     override fun createSources(): List<Source> = listOf( |     override fun createSources(): List<Source> = listOf( | ||||||
|         Mangasushi(), |         Mangasushi(), | ||||||
|         NinjaScans(), |         NinjaScans(), | ||||||
|         ReadManhua(), |         ReadManhua(), | ||||||
|             ZeroScans() |         ZeroScans(), | ||||||
|  |         IsekaiScanCom(), | ||||||
|  |         HappyTeaScans(), | ||||||
|  |         JustForFun(), | ||||||
|  |         AoCTranslations(), | ||||||
|  |         Kanjiku(), | ||||||
|  |         KomikGo(), | ||||||
|  |         LuxyScans(), | ||||||
|  |         TritiniaScans(), | ||||||
|  |         TsubakiNoScan(), | ||||||
|  |         YokaiJump(), | ||||||
|  |         ZManga() | ||||||
|     ) |     ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class Mangasushi : LoadMadara("Mangasushi", "https://mangasushi.net", "en") { | class Mangasushi : Madara("Mangasushi", "https://mangasushi.net", "en") | ||||||
|     override fun latestUpdatesSelector() = "div.page-item-detail" | class NinjaScans : Madara("NinjaScans", "https://ninjascans.com", "en") | ||||||
| } | class ReadManhua : Madara("ReadManhua", "https://readmanhua.net", "en", dateFormat = SimpleDateFormat("dd MMM yy", Locale.US)) | ||||||
| class NinjaScans : PageMadara("NinjaScans", "https://ninjascans.com", "en", urlModifier = "/manhua") | class ZeroScans : Madara("ZeroScans", "https://zeroscans.com", "en") | ||||||
| class ReadManhua : LoadMadara("ReadManhua", "https://readmanhua.net", "en", dateFormat = SimpleDateFormat("dd MMM yy", Locale.US)) | class IsekaiScanCom : Madara("IsekaiScan.com", "http://isekaiscan.com/", "en") | ||||||
| class ZeroScans : PageMadara("ZeroScans", "https://zeroscans.com", "en") | class HappyTeaScans : Madara("Happy Tea Scans", "https://happyteascans.com/", "en") | ||||||
| 
 | class JustForFun : Madara("Just For Fun", "https://just-for-fun.ru/", "ru", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) | ||||||
| open class LoadMadara( | class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/", "en") | ||||||
|         name: String, | class Kanjiku : Madara("Kanjiku", "https://kanjiku.net/", "de", dateFormat = SimpleDateFormat("dd. MMM yyyy", Locale.GERMAN)) | ||||||
|         baseUrl: String, | class KomikGo : Madara("KomikGo", "https://komikgo.com/", "id") | ||||||
|         lang: String, | class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com/", "en") | ||||||
|         dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US) | class TritiniaScans : Madara("Tritinia Scans", "http://tritiniascans.ml/", "en") { | ||||||
| ) : Madara(name, baseUrl, lang, dateFormat) { |     override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/index-m_orderby=views.html", headers) | ||||||
|     override fun popularMangaRequest(page: Int): Request { |     override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/index-m_orderby=latest.html", headers) | ||||||
|         val form = FormBody.Builder().apply { |     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/index.html?s=$query", headers) | ||||||
|             add("action", "madara_load_more") |     override fun latestUpdatesNextPageSelector(): String? = null | ||||||
|             add("page", (page-1).toString()) |     override fun popularMangaNextPageSelector(): String? = null | ||||||
|             add("template", "madara-core/content/content-archive") |  | ||||||
|             add("vars[manga_archives_item_layout]", "default") |  | ||||||
|             add("vars[meta_key]", "_latest_update") |  | ||||||
|             add("vars[order]", "desc") |  | ||||||
|             add("vars[paged]", (page-1).toString()) |  | ||||||
|             add("vars[post_status]", "publish") |  | ||||||
|             add("vars[post_type]", "wp-manga") |  | ||||||
|             add("vars[sidebar]", "right") |  | ||||||
|             add("vars[template]", "archive") |  | ||||||
|         } |  | ||||||
|         return POST("$baseUrl/wp-admin/admin-ajax.php", headers, form.build(), CacheControl.FORCE_NETWORK) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun popularMangaNextPageSelector(): String? = "body:not(:has(.no-posts))" |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { |  | ||||||
|         val form = FormBody.Builder().apply { |  | ||||||
|             add("action", "madara_load_more") |  | ||||||
|             add("page", (page-1).toString()) |  | ||||||
|             add("template", "madara-core/content/content-search") |  | ||||||
|             add("vars[s]", query) |  | ||||||
|             add("vars[orderby]", "") |  | ||||||
|             add("vars[paged]", (page-1).toString()) |  | ||||||
|             add("vars[template]", "search") |  | ||||||
|             add("vars[post_type]", "wp-manga") |  | ||||||
|             add("vars[post_status]", "publish") |  | ||||||
|             add("vars[manga_archives_item_layout]", "default") |  | ||||||
|         } |  | ||||||
|         return POST("$baseUrl/wp-admin/admin-ajax.php", headers, form.build(), CacheControl.FORCE_NETWORK) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| open class PageMadara( |  | ||||||
|         name: String, |  | ||||||
|         baseUrl: String, |  | ||||||
|         lang: String, |  | ||||||
|         private val urlModifier: String = "/manga", |  | ||||||
|         dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US) |  | ||||||
| ) : Madara(name, baseUrl, lang, dateFormat) { |  | ||||||
|     override fun popularMangaRequest(page: Int): Request = GET("$baseUrl$urlModifier/page/$page", headers) |  | ||||||
|     override fun popularMangaNextPageSelector() = "div.nav-previous" |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/page/$page/?s=$query&post_type=wp-manga", headers) |  | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) | ||||||
|  | class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) | ||||||
|  | class ZManga : Madara("ZManga", "https://zmanga.org/", "es") | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Vesnyx
						Vesnyx