parent
							
								
									f5f2fb636a
								
							
						
					
					
						commit
						2c38b18df0
					
				| @ -1,12 +0,0 @@ | |||||||
| apply plugin: 'com.android.application' |  | ||||||
| apply plugin: 'kotlin-android' |  | ||||||
| 
 |  | ||||||
| ext { |  | ||||||
|     appName = 'Tachiyomi: Mangastream' |  | ||||||
|     pkgNameSuffix = 'en.mangastream' |  | ||||||
|     extClass = '.Mangastream' |  | ||||||
|     extVersionCode = 4 |  | ||||||
|     libVersion = '1.2' |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| apply from: "$rootDir/common.gradle" |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 4.5 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.8 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 6.2 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 10 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 17 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 31 KiB | 
| @ -1,168 +0,0 @@ | |||||||
| package eu.kanade.tachiyomi.extension.en.mangastream |  | ||||||
| 
 |  | ||||||
| import eu.kanade.tachiyomi.network.GET |  | ||||||
| import eu.kanade.tachiyomi.network.asObservableSuccess |  | ||||||
| import eu.kanade.tachiyomi.source.model.FilterList |  | ||||||
| import eu.kanade.tachiyomi.source.model.MangasPage |  | ||||||
| import eu.kanade.tachiyomi.source.model.Page |  | ||||||
| import eu.kanade.tachiyomi.source.model.SChapter |  | ||||||
| import eu.kanade.tachiyomi.source.model.SManga |  | ||||||
| import eu.kanade.tachiyomi.source.online.ParsedHttpSource |  | ||||||
| import eu.kanade.tachiyomi.util.asJsoup |  | ||||||
| import okhttp3.Response |  | ||||||
| import org.jsoup.nodes.Document |  | ||||||
| import org.jsoup.nodes.Element |  | ||||||
| import rx.Observable |  | ||||||
| import java.text.ParseException |  | ||||||
| import java.text.SimpleDateFormat |  | ||||||
| import java.util.Calendar |  | ||||||
| import java.util.Date |  | ||||||
| import java.util.Locale |  | ||||||
| import java.util.regex.Pattern |  | ||||||
| 
 |  | ||||||
| class Mangastream : ParsedHttpSource() { |  | ||||||
| 
 |  | ||||||
|     override val name = "Mangastream" |  | ||||||
| 
 |  | ||||||
|     override val baseUrl = "https://readms.net/" |  | ||||||
| 
 |  | ||||||
|     override val lang = "en" |  | ||||||
| 
 |  | ||||||
|     override val supportsLatest = true |  | ||||||
| 
 |  | ||||||
|     private val datePattern by lazy { |  | ||||||
|         Pattern.compile("(\\d+) days? ago") |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun popularMangaSelector() = "table.table-striped > tbody > tr > td:nth-of-type(1)" |  | ||||||
| 
 |  | ||||||
|     override fun latestUpdatesSelector() = "div.col-sm-4 > div.side-nav > ul.new-list > li" |  | ||||||
| 
 |  | ||||||
|     override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga", headers) |  | ||||||
| 
 |  | ||||||
|     override fun latestUpdatesRequest(page: Int) = GET(baseUrl, headers) |  | ||||||
| 
 |  | ||||||
|     override fun popularMangaFromElement(element: Element): SManga { |  | ||||||
|         val manga = SManga.create() |  | ||||||
|         element.select("strong > a").first().let { |  | ||||||
|             manga.setUrlWithoutDomain(it.attr("href")) |  | ||||||
|             manga.title = if (it.hasAttr("title")) it.attr("title") else if (it.hasAttr("rel")) it.attr("rel") else it.text() |  | ||||||
|         } |  | ||||||
|         return manga |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun latestUpdatesFromElement(element: Element): SManga { |  | ||||||
|         val manga = SManga.create() |  | ||||||
|         element.select("a").first().let { |  | ||||||
|             val name = it.attr("href").substringAfter("/r/").substringBefore("/") |  | ||||||
|             manga.setUrlWithoutDomain("http://mangastream.com/manga/$name") |  | ||||||
|             manga.title = it.html().substringBefore(" <strong>").substringAfterLast(">") |  | ||||||
|         } |  | ||||||
|         return manga |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun popularMangaNextPageSelector() = null |  | ||||||
| 
 |  | ||||||
|     override fun latestUpdatesNextPageSelector() = null |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/manga", headers) |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaSelector() = popularMangaSelector() |  | ||||||
| 
 |  | ||||||
|     private fun searchMangaSelector(query: String) = "table.table-striped > tbody > tr > td:nth-of-type(1):contains($query)" |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) |  | ||||||
| 
 |  | ||||||
|     override fun searchMangaNextPageSelector() = null |  | ||||||
| 
 |  | ||||||
|     private fun searchMangaParse(response: Response, query: String): MangasPage { |  | ||||||
|         val document = response.asJsoup() |  | ||||||
| 
 |  | ||||||
|         val mangas = document.select(searchMangaSelector(query)).map { element -> |  | ||||||
|             searchMangaFromElement(element) |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         val hasNextPage = searchMangaNextPageSelector()?.let { selector -> |  | ||||||
|             document.select(selector).first() |  | ||||||
|         } != null |  | ||||||
| 
 |  | ||||||
|         return MangasPage(mangas, hasNextPage) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { |  | ||||||
|         return client.newCall(searchMangaRequest(page, query, filters)) |  | ||||||
|             .asObservableSuccess() |  | ||||||
|             .map { response -> |  | ||||||
|                 searchMangaParse(response, query) |  | ||||||
|             } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun mangaDetailsParse(document: Document): SManga { |  | ||||||
|         val title = document.select("h1").first().text() |  | ||||||
|         val manga = SManga.create() |  | ||||||
|         manga.author = "Unknown" |  | ||||||
|         manga.artist = "Unknown" |  | ||||||
|         manga.genre = "Unknown" |  | ||||||
|         manga.description = "Unknown" |  | ||||||
|         manga.status = SManga.UNKNOWN |  | ||||||
|         manga.thumbnail_url = if (title == "One Shot") "" else setThumbnail(title) |  | ||||||
|         return manga |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private fun setThumbnail(title: String): String { |  | ||||||
|         return client.newCall(GET("https://myanimelist.net/manga.php?q=" + title.replace(" ", "%20"), headers)).execute().asJsoup().select("a.hoverinfo_trigger").first().attr("href").let { |  | ||||||
|             client.newCall(GET(it, headers)).execute().asJsoup().select("img.ac").first().attr("src") |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun chapterListSelector() = "table.table-striped > tbody > tr:has(td)" |  | ||||||
| 
 |  | ||||||
|     override fun chapterFromElement(element: Element): SChapter { |  | ||||||
|         val urlEl = element.select("td:nth-of-type(1) > a").first() |  | ||||||
|         val dateEl = element.select("td:nth-of-type(2)") |  | ||||||
| 
 |  | ||||||
|         val chapter = SChapter.create() |  | ||||||
|         chapter.url = urlEl.attr("href") |  | ||||||
|         chapter.name = urlEl.text() |  | ||||||
|         chapter.date_upload = dateEl.text()?.let { dateParse(it) } ?: 0 |  | ||||||
| 
 |  | ||||||
|         return chapter |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private fun dateParse(dateAsString: String): Long { |  | ||||||
|         val date: Date = try { |  | ||||||
|             SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).parse(dateAsString.replace(Regex("(st|nd|rd|th)"), "")) |  | ||||||
|         } catch (e: ParseException) { |  | ||||||
|             val m = datePattern.matcher(dateAsString) |  | ||||||
| 
 |  | ||||||
|             if (dateAsString != "Today" && m.matches()) { |  | ||||||
|                 val amount = m.group(1).toInt() |  | ||||||
| 
 |  | ||||||
|                 Calendar.getInstance().apply { |  | ||||||
|                     add(Calendar.DATE, -amount) |  | ||||||
|                 }.time |  | ||||||
|             } else if (dateAsString == "Today") { |  | ||||||
|                 Calendar.getInstance().time |  | ||||||
|             } else return 0 |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return date.time |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun pageListParse(document: Document): List<Page> { |  | ||||||
|         val num = document.select("div.btn-reader-page > ul.dropdown-menu > li").last().text().substringAfter("Last Page (").substringBefore(")").toInt() |  | ||||||
|         val url = document.baseUri().substringBeforeLast("1") |  | ||||||
|         val pages = mutableListOf<Page>() |  | ||||||
| 
 |  | ||||||
|         for (i in 1..num) |  | ||||||
|             pages.add(Page(i - 1, url + i)) |  | ||||||
| 
 |  | ||||||
|         pages.getOrNull(0)?.imageUrl = imageUrlParse(document) |  | ||||||
|         return pages |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun imageUrlParse(document: Document): String { |  | ||||||
|         return "http:" + document.getElementById("manga-page").attr("src") |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Mike
						Mike