@ -1,12 +1,13 @@
package eu.kanade.tachiyomi.data.source.online.russian
import android.content.Context
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.source.Language
import eu.kanade.tachiyomi.data.source.RU
import eu.kanade.tachiyomi.data.source.model.MangasPage
import eu.kanade.tachiyomi.data.source.model.Page
import eu.kanade.tachiyomi.data.source.online.ParsedOnlineSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
@ -25,13 +26,25 @@ class Mangachan(override val id: Int) : ParsedOnlineSource() {
override fun popularMangaInitialUrl ( ) = " $baseUrl /mostfavorites "
override fun latestUpdatesInitialUrl ( ) = " $baseUrl /manga/new "
override fun searchMangaInitialUrl ( query : String , filters : List < Filter > ) = " $baseUrl /?do=search&subaction=search&story= $query "
override fun latestUpdatesInitialUrl ( ) = " $baseUrl /newestch "
override fun searchMangaInitialUrl ( query : String , filters : List < Filter > ) : String {
if ( query . isNotEmpty ( ) ) {
return " $baseUrl /?do=search&subaction=search&story= $query "
} else if ( filters . isNotEmpty ( ) ) {
var genres = " "
filters . forEach { genres = genres + it . name + '+' }
return " $baseUrl /tags/ ${genres.dropLast(1)} "
} else {
return " $baseUrl /?do=search&subaction=search&story= $query "
}
}
override fun popularMangaSelector ( ) = " div.content_row "
override fun latestUpdatesSelector ( ) = " div.content_row "
override fun latestUpdatesSelector ( ) = " ul.area_rightNews li "
override fun searchMangaSelector ( ) = popularMangaSelector ( )
override fun popularMangaFromElement ( element : Element , manga : Manga ) {
element . select ( " h2 > a " ) . first ( ) . let {
@ -41,20 +54,48 @@ class Mangachan(override val id: Int) : ParsedOnlineSource() {
}
override fun latestUpdatesFromElement ( element : Element , manga : Manga ) {
element . select ( " a:nth-child(1) " ) . first ( ) . let {
manga . setUrlWithoutDomain ( it . attr ( " href " ) )
manga . title = it . text ( )
}
}
override fun searchMangaFromElement ( element : Element , manga : Manga ) {
popularMangaFromElement ( element , manga )
}
override fun popularMangaNextPageSelector ( ) = " a:contains(Вперед) "
override fun latestUpdatesNextPageSelector ( ) = " a:contains(Вперед) "
override fun latestUpdatesNextPageSelector ( ) = popularMangaNextPageSelector ( )
override fun searchManga Selector( ) = popularMangaSelector ( )
override fun searchManga NextPageSelector( ) = " a:contains(Далее) "
override fun searchMangaFromElement ( element : Element , manga : Manga ) {
popularMangaFromElement ( element , manga )
}
private fun searchGenresNextPageSelector ( ) = popularMangaNextPageSelector ( )
override fun searchMangaNextPageSelector ( ) = popularMangaNextPageSelector ( )
override fun searchMangaParse ( response : Response , page : MangasPage , query : String , filters : List < Filter > ) {
val document = response . asJsoup ( )
for ( element in document . select ( searchMangaSelector ( ) ) ) {
Manga . create ( id ) . apply {
searchMangaFromElement ( element , this )
page . mangas . add ( this )
}
}
searchMangaNextPageSelector ( ) . let { selector ->
if ( page . nextPageUrl . isNullOrEmpty ( ) && filters . isEmpty ( ) ) {
val onClick = document . select ( selector ) . first ( ) ?. attr ( " onclick " )
val pageNum = onClick ?. substring ( 23 , onClick . indexOf ( " ); return(false) " ) )
page . nextPageUrl = searchMangaInitialUrl ( query , emptyList ( ) ) + " &search_start= " + pageNum
}
}
searchGenresNextPageSelector ( ) . let { selector ->
if ( page . nextPageUrl . isNullOrEmpty ( ) && filters . isNotEmpty ( ) ) {
val url = document . select ( selector ) . first ( ) ?. attr ( " href " )
page . nextPageUrl = searchMangaInitialUrl ( query , filters ) + url
}
}
}
override fun mangaDetailsParse ( document : Document , manga : Manga ) {
val infoElement = document . select ( " table.mangatitle " ) . first ( )
@ -95,13 +136,74 @@ class Mangachan(override val id: Int) : ParsedOnlineSource() {
val trimmedHtml = html . substring ( beginIndex , endIndex ) . replace ( " \" " , " " )
val pageUrls = trimmedHtml . split ( ',' )
for ( ( i , url ) in pageUrls . withIndex ( ) ) {
pages . add ( Page ( i , " " , url ) )
}
pageUrls . mapIndexedTo ( pages ) { i , url -> Page ( i , " " , url ) }
}
override fun pageListParse ( document : Document , pages : MutableList < Page > ) { }
override fun imageUrlParse ( document : Document ) = " "
/ * [ .. . document . querySelectorAll ( " li.sidetag > a:nth-child(1) " ) ] . map ( ( el , i ) = >
* { const link = el . getAttribute ( ' href ' ) ; const id = link . substr ( 6 , link . length ) ;
* return ` Filter ( " ${id} " , " ${id} " ) ` } ) . join ( ' , \ n ' )
* on http : //mangachan.me/
* /
override fun getFilterList ( ) : List < Filter > = listOf (
Filter ( " 18_плюс " , " 18_плюс " ) ,
Filter ( " bdsm " , " bdsm " ) ,
Filter ( " арт " , " арт " ) ,
Filter ( " биография " , " биография " ) ,
Filter ( " боевик " , " боевик " ) ,
Filter ( " б о е вые _ис ку с с тва " , " б о е вые _ис ку с с тва " ) ,
Filter ( " вампиры " , " вампиры " ) ,
Filter ( " веб " , " веб " ) ,
Filter ( " гарем " , " гарем " ) ,
Filter ( " г е нде р на я_интр иг а " , " г е нде р на я_интр иг а " ) ,
Filter ( " г е р о иче с ко е _фэнте зи" , " г е р о иче с ко е _фэнте зи" ) ,
Filter ( " детектив " , " детектив " ) ,
Filter ( " дзёсэй " , " дзёсэй " ) ,
Filter ( " додзинси " , " додзинси " ) ,
Filter ( " драма " , " драма " ) ,
Filter ( " игра " , " игра " ) ,
Filter ( " инцест " , " инцест " ) ,
Filter ( " искусство " , " искусство " ) ,
Filter ( " история " , " история " ) ,
Filter ( " киберпанк " , " киберпанк " ) ,
Filter ( " кодомо " , " кодомо " ) ,
Filter ( " комедия " , " комедия " ) ,
Filter ( " литРПГ " , " литРПГ " ) ,
Filter ( " махо-сёдзё " , " махо-сёдзё " ) ,
Filter ( " меха " , " меха " ) ,
Filter ( " мистика " , " мистика " ) ,
Filter ( " музыка " , " музыка " ) ,
Filter ( " на у чна я_фа нта с тика " , " на у чна я_фа нта с тика " ) ,
Filter ( " повседневность " , " повседневность " ) ,
Filter ( " постапокалиптика " , " постапокалиптика " ) ,
Filter ( " приключения " , " приключения " ) ,
Filter ( " психология " , " психология " ) ,
Filter ( " романтика " , " романтика " ) ,
Filter ( " с а му р а йс кий_б о е вик" , " с а му р а йс кий_б о е вик" ) ,
Filter ( " сборник " , " сборник " ) ,
Filter ( " сверхъестественное " , " сверхъестественное " ) ,
Filter ( " сказка " , " сказка " ) ,
Filter ( " спорт " , " спорт " ) ,
Filter ( " супергерои " , " супергерои " ) ,
Filter ( " сэйнэн " , " сэйнэн " ) ,
Filter ( " сёдзё " , " сёдзё " ) ,
Filter ( " сёдзё-ай " , " сёдзё-ай " ) ,
Filter ( " сёнэн " , " сёнэн " ) ,
Filter ( " сёнэн-ай " , " сёнэн-ай " ) ,
Filter ( " тентакли " , " тентакли " ) ,
Filter ( " трагедия " , " трагедия " ) ,
Filter ( " триллер " , " триллер " ) ,
Filter ( " ужасы " , " ужасы " ) ,
Filter ( " фантастика " , " фантастика " ) ,
Filter ( " фурри " , " фурри " ) ,
Filter ( " фэнтези " , " фэнтези " ) ,
Filter ( " школа " , " школа " ) ,
Filter ( " эротика " , " эротика " ) ,
Filter ( " юри " , " юри " ) ,
Filter ( " яой " , " яой " ) ,
Filter ( " ёнкома " , " ёнкома " )
)
}