Delegate Perv Eden, to continue using it download the extensions(there is a English extension and a Italian extension)

This commit is contained in:
Jobobby04 2020-08-11 16:58:50 -04:00
parent 51d0a67908
commit 5a1bc6e25b
10 changed files with 98 additions and 337 deletions

View File

@ -42,7 +42,7 @@ android {
minSdkVersion AndroidConfig.minSdk minSdkVersion AndroidConfig.minSdk
targetSdkVersion AndroidConfig.targetSdk targetSdkVersion AndroidConfig.targetSdk
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
versionCode 5 versionCode 6
versionName "1.1.1" versionName "1.1.1"
buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\"" buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\""

View File

@ -22,8 +22,6 @@ import exh.EH_SOURCE_ID
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.MERGED_SOURCE_ID import exh.MERGED_SOURCE_ID
import exh.NHENTAI_SOURCE_ID import exh.NHENTAI_SOURCE_ID
import exh.PERV_EDEN_EN_SOURCE_ID
import exh.PERV_EDEN_IT_SOURCE_ID
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import kotlinx.coroutines.async import kotlinx.coroutines.async
import rx.Observable import rx.Observable
@ -81,8 +79,6 @@ class ExtensionManager(
return when (source.id) { return when (source.id) {
EH_SOURCE_ID -> context.getDrawable(R.mipmap.ic_ehentai_source) EH_SOURCE_ID -> context.getDrawable(R.mipmap.ic_ehentai_source)
EXH_SOURCE_ID -> context.getDrawable(R.mipmap.ic_ehentai_source) EXH_SOURCE_ID -> context.getDrawable(R.mipmap.ic_ehentai_source)
PERV_EDEN_EN_SOURCE_ID -> context.getDrawable(R.mipmap.ic_perveden_source)
PERV_EDEN_IT_SOURCE_ID -> context.getDrawable(R.mipmap.ic_perveden_source)
NHENTAI_SOURCE_ID -> context.getDrawable(R.mipmap.ic_nhentai_source) NHENTAI_SOURCE_ID -> context.getDrawable(R.mipmap.ic_nhentai_source)
MERGED_SOURCE_ID -> context.getDrawable(R.mipmap.ic_merged_source) MERGED_SOURCE_ID -> context.getDrawable(R.mipmap.ic_merged_source)
else -> null else -> null

View File

@ -20,10 +20,14 @@ import eu.kanade.tachiyomi.source.online.english.HentaiCafe
import eu.kanade.tachiyomi.source.online.english.Pururin import eu.kanade.tachiyomi.source.online.english.Pururin
import eu.kanade.tachiyomi.source.online.english.Tsumino import eu.kanade.tachiyomi.source.online.english.Tsumino
import exh.EH_SOURCE_ID import exh.EH_SOURCE_ID
import exh.EIGHTMUSES_SOURCE_ID
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.HBROWSE_SOURCE_ID
import exh.HENTAI_CAFE_SOURCE_ID
import exh.PERV_EDEN_EN_SOURCE_ID import exh.PERV_EDEN_EN_SOURCE_ID
import exh.PERV_EDEN_IT_SOURCE_ID import exh.PERV_EDEN_IT_SOURCE_ID
import exh.metadata.metadata.PervEdenLang import exh.PURURIN_SOURCE_ID
import exh.TSUMINO_SOURCE_ID
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import exh.source.DelegatedHttpSource import exh.source.DelegatedHttpSource
import exh.source.EnhancedHttpSource import exh.source.EnhancedHttpSource
@ -136,8 +140,6 @@ open class SourceManager(private val context: Context) {
if (prefs.enableExhentai().get()) { if (prefs.enableExhentai().get()) {
exSrcs += EHentai(EXH_SOURCE_ID, true, context) exSrcs += EHentai(EXH_SOURCE_ID, true, context)
} }
exSrcs += PervEden(PERV_EDEN_EN_SOURCE_ID, PervEdenLang.en, context)
exSrcs += PervEden(PERV_EDEN_IT_SOURCE_ID, PervEdenLang.it, context)
exSrcs += NHentai(context) exSrcs += NHentai(context)
return exSrcs return exSrcs
} }
@ -175,19 +177,19 @@ open class SourceManager(private val context: Context) {
val DELEGATED_SOURCES = listOf( val DELEGATED_SOURCES = listOf(
DelegatedSource( DelegatedSource(
"Hentai Cafe", "Hentai Cafe",
260868874183818481, HENTAI_CAFE_SOURCE_ID,
"eu.kanade.tachiyomi.extension.all.foolslide.HentaiCafe", "eu.kanade.tachiyomi.extension.all.foolslide.HentaiCafe",
HentaiCafe::class HentaiCafe::class
), ),
DelegatedSource( DelegatedSource(
"Pururin", "Pururin",
2221515250486218861, PURURIN_SOURCE_ID,
"eu.kanade.tachiyomi.extension.en.pururin.Pururin", "eu.kanade.tachiyomi.extension.en.pururin.Pururin",
Pururin::class Pururin::class
), ),
DelegatedSource( DelegatedSource(
"Tsumino", "Tsumino",
6707338697138388238, TSUMINO_SOURCE_ID,
"eu.kanade.tachiyomi.extension.en.tsumino.Tsumino", "eu.kanade.tachiyomi.extension.en.tsumino.Tsumino",
Tsumino::class Tsumino::class
)/*, )/*,
@ -200,13 +202,13 @@ open class SourceManager(private val context: Context) {
)*/, )*/,
DelegatedSource( DelegatedSource(
"HBrowse", "HBrowse",
1401584337232758222, HBROWSE_SOURCE_ID,
"eu.kanade.tachiyomi.extension.en.hbrowse.HBrowse", "eu.kanade.tachiyomi.extension.en.hbrowse.HBrowse",
HBrowse::class HBrowse::class
), ),
DelegatedSource( DelegatedSource(
"8Muses", "8Muses",
1802675169972965535, EIGHTMUSES_SOURCE_ID,
"eu.kanade.tachiyomi.extension.all.eromuse.EroMuse", "eu.kanade.tachiyomi.extension.all.eromuse.EroMuse",
EightMuses::class EightMuses::class
), ),
@ -216,6 +218,18 @@ open class SourceManager(private val context: Context) {
"eu.kanade.tachiyomi.extension.all.hitomi.Hitomi", "eu.kanade.tachiyomi.extension.all.hitomi.Hitomi",
Hitomi::class, Hitomi::class,
true true
),
DelegatedSource(
"PervEden English",
PERV_EDEN_EN_SOURCE_ID,
"eu.kanade.tachiyomi.extension.en.perveden.Perveden",
PervEden::class
),
DelegatedSource(
"PervEden Italian",
PERV_EDEN_IT_SOURCE_ID,
"eu.kanade.tachiyomi.extension.it.perveden.Perveden",
PervEden::class
) )
).associateBy { it.originalSourceQualifiedClassName } ).associateBy { it.originalSourceQualifiedClassName }

View File

@ -2,155 +2,47 @@ package eu.kanade.tachiyomi.source.online.all
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage 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.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.LewdSource import eu.kanade.tachiyomi.source.online.LewdSource
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.source.online.UrlImportableSource import eu.kanade.tachiyomi.source.online.UrlImportableSource
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import eu.kanade.tachiyomi.util.chapter.ChapterRecognition
import exh.metadata.metadata.PervEdenLang
import exh.metadata.metadata.PervEdenSearchMetadata import exh.metadata.metadata.PervEdenSearchMetadata
import exh.metadata.metadata.PervEdenSearchMetadata.Companion.TAG_TYPE_DEFAULT import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL
import exh.metadata.metadata.base.RaisedTag import exh.metadata.metadata.base.RaisedTag
import exh.source.DelegatedHttpSource
import exh.ui.metadata.adapters.PervEdenDescriptionAdapter import exh.ui.metadata.adapters.PervEdenDescriptionAdapter
import exh.util.UriFilter
import exh.util.UriGroup
import exh.util.urlImportFetchSearchManga import exh.util.urlImportFetchSearchManga
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.jsoup.nodes.TextNode import org.jsoup.nodes.TextNode
import rx.Observable import rx.Observable
// TODO Transform into delegated source class PervEden(delegate: HttpSource, val context: Context) :
class PervEden(override val id: Long, val pvLang: PervEdenLang, val context: Context) : DelegatedHttpSource(delegate),
ParsedHttpSource(),
LewdSource<PervEdenSearchMetadata, Document>, LewdSource<PervEdenSearchMetadata, Document>,
UrlImportableSource { UrlImportableSource {
/**
* The class of the metadata used by this source
*/
override val metaClass = PervEdenSearchMetadata::class override val metaClass = PervEdenSearchMetadata::class
override val lang = delegate.lang
override val supportsLatest = true
override val name = "Perv Eden"
override val baseUrl = "http://www.perveden.com"
override val lang = pvLang.name
override fun popularMangaSelector() = "#topManga > ul > li"
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.thumbnail_url = "http:" + element.select(".hottestImage > img").attr("data-src")
val titleElement = element.getElementsByClass("hottestInfo").first().child(0)
manga.url = titleElement.attr("href")
manga.title = titleElement.text()
return manga
}
override fun popularMangaNextPageSelector(): String? = null
// Support direct URL importing // Support direct URL importing
override fun fetchSearchManga(page: Int, query: String, filters: FilterList) = override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> =
urlImportFetchSearchManga(context, query) { urlImportFetchSearchManga(context, query) {
super.fetchSearchManga(page, query, filters) super.fetchSearchManga(page, query, filters)
} }
override fun searchMangaSelector() = "#mangaList > tbody > tr"
override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create()
val titleElement = element.child(0).child(0)
manga.url = titleElement.attr("href")
manga.title = titleElement.text().trim()
return manga
}
override fun searchMangaNextPageSelector() = ".next"
override fun popularMangaRequest(page: Int): Request {
val urlLang = if (lang == "en") {
"eng"
} else {
"it"
}
return GET("$baseUrl/$urlLang/")
}
override fun latestUpdatesSelector() = ".newsManga"
override fun latestUpdatesFromElement(element: Element): SManga {
val manga = SManga.create()
val header = element.getElementsByClass("manga_tooltop_header").first()
val titleElement = header.child(0)
manga.url = titleElement.attr("href")
manga.title = titleElement.text().trim()
manga.thumbnail_url = "https:" + header.parent().selectFirst(".mangaImage img").attr("tmpsrc")
return manga
}
override fun latestUpdatesParse(response: Response): MangasPage {
val document = response.asJsoup()
val mangas = document.select(latestUpdatesSelector()).map { element ->
latestUpdatesFromElement(element)
}
return MangasPage(mangas, mangas.isNotEmpty())
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val uri = Uri.parse("$baseUrl/$lang/$lang-directory/").buildUpon()
uri.appendQueryParameter("page", page.toString())
uri.appendQueryParameter("title", query)
filters.forEach {
if (it is UriFilter) it.addToUri(uri)
}
return GET(uri.toString())
}
override fun latestUpdatesNextPageSelector(): String? {
throw NotImplementedError("Unused method called!")
}
/**
* Returns an observable with the updated details for a manga. Normally it's not needed to
* override this method.
*
* @param manga the manga to be updated.
*/
override fun fetchMangaDetails(manga: SManga): Observable<SManga> { override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
return client.newCall(mangaDetailsRequest(manga)) return client.newCall(mangaDetailsRequest(manga))
.asObservableSuccess() .asObservableSuccess()
.flatMap { .flatMap {
parseToManga(manga, it.asJsoup()).andThen( parseToManga(manga, it.asJsoup()).andThen(Observable.just(manga))
Observable.just(
manga.apply {
initialized = true
}
)
)
} }
} }
/**
* Parse the supplied input into the supplied metadata object
*/
override fun parseIntoMetadata(metadata: PervEdenSearchMetadata, input: Document) { override fun parseIntoMetadata(metadata: PervEdenSearchMetadata, input: Document) {
with(metadata) { with(metadata) {
url = Uri.parse(input.location()).path url = Uri.parse(input.location()).path
@ -184,12 +76,18 @@ class PervEden(override val id: Long, val pvLang: PervEdenLang, val context: Con
"Artist" -> { "Artist" -> {
if (it is Element && it.tagName() == "a") { if (it is Element && it.tagName() == "a") {
artist = it.text() artist = it.text()
tags += RaisedTag("artist", it.text().toLowerCase(), TAG_TYPE_VIRTUAL) tags += RaisedTag(
"artist", it.text().toLowerCase(),
RaisedSearchMetadata.TAG_TYPE_VIRTUAL
)
} }
} }
"Genres" -> { "Genres" -> {
if (it is Element && it.tagName() == "a") { if (it is Element && it.tagName() == "a") {
tags += RaisedTag(null, it.text().toLowerCase(), TAG_TYPE_DEFAULT) tags += RaisedTag(
null, it.text().toLowerCase(),
PervEdenSearchMetadata.TAG_TYPE_DEFAULT
)
} }
} }
"Type" -> { "Type" -> {
@ -218,137 +116,13 @@ class PervEden(override val id: Long, val pvLang: PervEdenLang, val context: Con
} }
} }
override fun mangaDetailsParse(document: Document): SManga = throw UnsupportedOperationException()
override fun latestUpdatesRequest(page: Int): Request {
val num = when (lang) {
"en" -> "0"
"it" -> "1"
else -> throw NotImplementedError("Unimplemented language!")
}
return GET("$baseUrl/ajax/news/$page/$num/0/")
}
override fun chapterListSelector() = "#leftContent > table > tbody > tr"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
val linkElement = element.getElementsByClass("chapterLink").first()
setUrlWithoutDomain(linkElement.attr("href"))
name = "Chapter " + linkElement.getElementsByTag("b").text()
ChapterRecognition.parseChapterNumber(
this,
SManga.create().apply {
title = ""
}
)
try {
date_upload = DATE_FORMAT.parse(element.getElementsByClass("chapterDate").first().text().trim())!!.time
} catch (ignored: Exception) {
}
}
override fun pageListParse(document: Document) = document.getElementById("pageSelect").getElementsByTag("option").map {
Page(it.attr("data-page").toInt() - 1, baseUrl + it.attr("value"))
}
override fun imageUrlParse(document: Document) = "http:" + document.getElementById("mainImg").attr("src")!!
override fun getFilterList() = FilterList(
AuthorFilter(),
ArtistFilter(),
TypeFilterGroup(),
ReleaseYearGroup(),
StatusFilterGroup()
)
class StatusFilterGroup : UriGroup<StatusFilter>(
"Status",
listOf(
StatusFilter("Ongoing", 1),
StatusFilter("Completed", 2),
StatusFilter("Suspended", 0)
)
)
class StatusFilter(n: String, val id: Int) : Filter.CheckBox(n, false), UriFilter {
override fun addToUri(builder: Uri.Builder) {
if (state) {
builder.appendQueryParameter("status", id.toString())
}
}
}
// Explicit type arg for listOf() to workaround this: KT-16570
class ReleaseYearGroup : UriGroup<Filter<*>>(
"Release Year",
listOf(
ReleaseYearRangeFilter(),
ReleaseYearYearFilter()
)
)
class ReleaseYearRangeFilter :
Filter.Select<String>(
"Range",
arrayOf(
"on",
"after",
"before"
)
),
UriFilter {
override fun addToUri(builder: Uri.Builder) {
builder.appendQueryParameter("releasedType", state.toString())
}
}
class ReleaseYearYearFilter : Filter.Text("Year"), UriFilter {
override fun addToUri(builder: Uri.Builder) {
builder.appendQueryParameter("released", state)
}
}
class AuthorFilter : Filter.Text("Author"), UriFilter {
override fun addToUri(builder: Uri.Builder) {
builder.appendQueryParameter("author", state)
}
}
class ArtistFilter : Filter.Text("Artist"), UriFilter {
override fun addToUri(builder: Uri.Builder) {
builder.appendQueryParameter("artist", state)
}
}
class TypeFilterGroup : UriGroup<TypeFilter>(
"Type",
listOf(
TypeFilter("Japanese Manga", 0),
TypeFilter("Korean Manhwa", 1),
TypeFilter("Chinese Manhua", 2),
TypeFilter("Comic", 3),
TypeFilter("Doujinshi", 4)
)
)
class TypeFilter(n: String, val id: Int) : Filter.CheckBox(n, false), UriFilter {
override fun addToUri(builder: Uri.Builder) {
if (state) {
builder.appendQueryParameter("type", id.toString())
}
}
}
override val matchingHosts = listOf("www.perveden.com") override val matchingHosts = listOf("www.perveden.com")
override fun matchesUri(uri: Uri): Boolean { override fun matchesUri(uri: Uri): Boolean {
return super.matchesUri(uri) && uri.pathSegments.firstOrNull()?.toLowerCase() == when (pvLang) { return super.matchesUri(uri) && uri.pathSegments.firstOrNull()?.toLowerCase() == when (lang) {
PervEdenLang.en -> "en-manga" "en" -> "en-manga"
PervEdenLang.it -> "it-manga" "it" -> "it-manga"
else -> false
} }
} }
@ -363,10 +137,4 @@ class PervEden(override val id: Long, val pvLang: PervEdenLang, val context: Con
override fun getDescriptionAdapter(controller: MangaController): PervEdenDescriptionAdapter { override fun getDescriptionAdapter(controller: MangaController): PervEdenDescriptionAdapter {
return PervEdenDescriptionAdapter(controller) return PervEdenDescriptionAdapter(controller)
} }
companion object {
val DATE_FORMAT = SimpleDateFormat("MMM d, yyyy", Locale.US).apply {
timeZone = TimeZone.getTimeZone("GMT")
}
}
} }

View File

@ -45,8 +45,6 @@ import exh.EH_SOURCE_ID
import exh.EXHMigrations import exh.EXHMigrations
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.NHENTAI_SOURCE_ID import exh.NHENTAI_SOURCE_ID
import exh.PERV_EDEN_EN_SOURCE_ID
import exh.PERV_EDEN_IT_SOURCE_ID
import exh.eh.EHentaiUpdateWorker import exh.eh.EHentaiUpdateWorker
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
import exh.uconfig.WarnConfigureDialogController import exh.uconfig.WarnConfigureDialogController
@ -211,12 +209,6 @@ class MainActivity : BaseActivity<MainActivityBinding>() {
if (EXH_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) { if (EXH_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += EXH_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES += EXH_SOURCE_ID
} }
if (PERV_EDEN_EN_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += PERV_EDEN_EN_SOURCE_ID
}
if (PERV_EDEN_IT_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += PERV_EDEN_IT_SOURCE_ID
}
if (NHENTAI_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) { if (NHENTAI_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += NHENTAI_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES += NHENTAI_SOURCE_ID
} }

View File

@ -39,8 +39,6 @@ import eu.kanade.tachiyomi.util.system.toast
import exh.EH_SOURCE_ID import exh.EH_SOURCE_ID
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.NHENTAI_SOURCE_ID import exh.NHENTAI_SOURCE_ID
import exh.PERV_EDEN_EN_SOURCE_ID
import exh.PERV_EDEN_IT_SOURCE_ID
import exh.debug.SettingsDebugController import exh.debug.SettingsDebugController
import exh.log.EHLogLevel import exh.log.EHLogLevel
import exh.source.BlacklistedSources import exh.source.BlacklistedSources
@ -179,12 +177,6 @@ class SettingsAdvancedController : SettingsController() {
if (EXH_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) { if (EXH_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += EXH_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES += EXH_SOURCE_ID
} }
if (PERV_EDEN_EN_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += PERV_EDEN_EN_SOURCE_ID
}
if (PERV_EDEN_IT_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += PERV_EDEN_IT_SOURCE_ID
}
if (NHENTAI_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) { if (NHENTAI_SOURCE_ID !in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES += NHENTAI_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES += NHENTAI_SOURCE_ID
} }
@ -195,12 +187,6 @@ class SettingsAdvancedController : SettingsController() {
if (EXH_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) { if (EXH_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES -= EXH_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES -= EXH_SOURCE_ID
} }
if (PERV_EDEN_EN_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES -= PERV_EDEN_EN_SOURCE_ID
}
if (PERV_EDEN_IT_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES -= PERV_EDEN_IT_SOURCE_ID
}
if (NHENTAI_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) { if (NHENTAI_SOURCE_ID in BlacklistedSources.HIDDEN_SOURCES) {
BlacklistedSources.HIDDEN_SOURCES -= NHENTAI_SOURCE_ID BlacklistedSources.HIDDEN_SOURCES -= NHENTAI_SOURCE_ID
} }

View File

@ -3,6 +3,7 @@ package exh
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.all.Hitomi import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.PervEden
import eu.kanade.tachiyomi.source.online.english.EightMuses import eu.kanade.tachiyomi.source.online.english.EightMuses
import eu.kanade.tachiyomi.source.online.english.HBrowse import eu.kanade.tachiyomi.source.online.english.HBrowse
import eu.kanade.tachiyomi.source.online.english.HentaiCafe import eu.kanade.tachiyomi.source.online.english.HentaiCafe
@ -17,14 +18,14 @@ import eu.kanade.tachiyomi.source.online.english.Tsumino
const val LEWD_SOURCE_SERIES = 6900L const val LEWD_SOURCE_SERIES = 6900L
const val EH_SOURCE_ID = LEWD_SOURCE_SERIES + 1 const val EH_SOURCE_ID = LEWD_SOURCE_SERIES + 1
const val EXH_SOURCE_ID = LEWD_SOURCE_SERIES + 2 const val EXH_SOURCE_ID = LEWD_SOURCE_SERIES + 2
const val PERV_EDEN_EN_SOURCE_ID = LEWD_SOURCE_SERIES + 5 const val PERV_EDEN_EN_SOURCE_ID = 4673633799850248749
const val PERV_EDEN_IT_SOURCE_ID = LEWD_SOURCE_SERIES + 6 const val PERV_EDEN_IT_SOURCE_ID = 1433898225963724122
const val NHENTAI_SOURCE_ID = LEWD_SOURCE_SERIES + 7 const val NHENTAI_SOURCE_ID = LEWD_SOURCE_SERIES + 7
val HENTAI_CAFE_SOURCE_ID = delegatedSourceId<HentaiCafe>() const val HENTAI_CAFE_SOURCE_ID = 260868874183818481
val PURURIN_SOURCE_ID = delegatedSourceId<Pururin>() const val PURURIN_SOURCE_ID = 2221515250486218861
val TSUMINO_SOURCE_ID = delegatedSourceId<Tsumino>() const val TSUMINO_SOURCE_ID = 6707338697138388238
val EIGHTMUSES_SOURCE_ID = delegatedSourceId<EightMuses>() const val EIGHTMUSES_SOURCE_ID = 1802675169972965535
val HBROWSE_SOURCE_ID = delegatedSourceId<HBrowse>() const val HBROWSE_SOURCE_ID = 1401584337232758222
const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69 const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69
private val DELEGATED_LEWD_SOURCES = listOf( private val DELEGATED_LEWD_SOURCES = listOf(
@ -33,17 +34,12 @@ private val DELEGATED_LEWD_SOURCES = listOf(
Tsumino::class, Tsumino::class,
HBrowse::class, HBrowse::class,
EightMuses::class, EightMuses::class,
Hitomi::class Hitomi::class,
PervEden::class
) )
private val hitomiClass = listOf(Hitomi::class) private val hitomiClass = listOf(Hitomi::class)
private inline fun <reified T> delegatedSourceId(): Long? {
return SourceManager.DELEGATED_SOURCES.entries.find {
it.value.newSourceClass == T::class
}?.value?.sourceId
}
// Used to speed up isLewdSource // Used to speed up isLewdSource
val lewdDelegatedSourceIds = SourceManager.currentDelegatedSources.filter { val lewdDelegatedSourceIds = SourceManager.currentDelegatedSources.filter {
it.value.newSourceClass in DELEGATED_LEWD_SOURCES it.value.newSourceClass in DELEGATED_LEWD_SOURCES

View File

@ -50,7 +50,6 @@ object EXHMigrations {
} }
if (oldVersion < 4) { if (oldVersion < 4) {
db.inTransaction { db.inTransaction {
// Migrate Tsumino source IDs
db.lowLevel().executeSQL( db.lowLevel().executeSQL(
RawQuery.builder() RawQuery.builder()
.query( .query(
@ -103,6 +102,34 @@ object EXHMigrations {
) )
} }
} }
if (oldVersion < 6) {
db.inTransaction {
db.lowLevel().executeSQL(
RawQuery.builder()
.query(
"""
UPDATE ${MangaTable.TABLE}
SET ${MangaTable.COL_SOURCE} = $PERV_EDEN_EN_SOURCE_ID
WHERE ${MangaTable.COL_SOURCE} = 6905
""".trimIndent()
)
.affectsTables(MangaTable.TABLE)
.build()
)
db.lowLevel().executeSQL(
RawQuery.builder()
.query(
"""
UPDATE ${MangaTable.TABLE}
SET ${MangaTable.COL_SOURCE} = $PERV_EDEN_IT_SOURCE_ID
WHERE ${MangaTable.COL_SOURCE} = 6906
""".trimIndent()
)
.affectsTables(MangaTable.TABLE)
.build()
)
}
}
// if (oldVersion < 1) { } // if (oldVersion < 1) { }
// do stuff here when releasing changed crap // do stuff here when releasing changed crap
@ -120,18 +147,30 @@ object EXHMigrations {
} }
fun migrateBackupEntry(manga: MangaImpl): MangaImpl { fun migrateBackupEntry(manga: MangaImpl): MangaImpl {
if (manga.source == 6905L) {
manga.source = PERV_EDEN_EN_SOURCE_ID
}
if (manga.source == 6906L) {
manga.source = PERV_EDEN_IT_SOURCE_ID
}
// Migrate HentaiCafe source IDs // Migrate HentaiCafe source IDs
if (manga.source == 6908L) { if (manga.source == 6908L) {
manga.source = HENTAI_CAFE_SOURCE_ID!! manga.source = HENTAI_CAFE_SOURCE_ID
} }
// Migrate Tsumino source IDs // Migrate Tsumino source IDs
if (manga.source == 6909L) { if (manga.source == 6909L) {
manga.source = TSUMINO_SOURCE_ID!! manga.source = TSUMINO_SOURCE_ID
}
if (manga.source == 6910L) {
manga.source = Hitomi.otherId
} }
if (manga.source == 6912L) { if (manga.source == 6912L) {
manga.source = HBROWSE_SOURCE_ID!! manga.source = HBROWSE_SOURCE_ID
} }
// Migrate nhentai URLs // Migrate nhentai URLs
@ -144,16 +183,6 @@ object EXHMigrations {
manga.source = NHENTAI_SOURCE_ID manga.source = NHENTAI_SOURCE_ID
} }
// Allow importing of English PervEden extension backups
if (manga.source in BlacklistedSources.PERVEDEN_EN_EXT_SOURCES) {
manga.source = PERV_EDEN_EN_SOURCE_ID
}
// Allow importing of Italian PervEden extension backups
if (manga.source in BlacklistedSources.PERVEDEN_IT_EXT_SOURCES) {
manga.source = PERV_EDEN_IT_SOURCE_ID
}
// Allow importing of EHentai extension backups // Allow importing of EHentai extension backups
if (manga.source in BlacklistedSources.EHENTAI_EXT_SOURCES) { if (manga.source in BlacklistedSources.EHENTAI_EXT_SOURCES) {
manga.source = EH_SOURCE_ID manga.source = EH_SOURCE_ID

View File

@ -4,8 +4,6 @@ import android.content.Context
import android.net.Uri import android.net.Uri
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import exh.PERV_EDEN_EN_SOURCE_ID
import exh.PERV_EDEN_IT_SOURCE_ID
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.metadata.metadata.base.RaisedTitle import exh.metadata.metadata.base.RaisedTitle
@ -122,18 +120,6 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
Uri.parse(it).pathSegments.filterNot(String::isNullOrBlank) Uri.parse(it).pathSegments.filterNot(String::isNullOrBlank)
} }
fun pvIdFromUrl(url: String) = splitGalleryUrl(url).last() fun pvIdFromUrl(url: String): String = splitGalleryUrl(url).last()
}
}
enum class PervEdenLang(val id: Long) {
// DO NOT RENAME THESE TO CAPITAL LETTERS! The enum names are used to build URLs
en(PERV_EDEN_EN_SOURCE_ID),
it(PERV_EDEN_IT_SOURCE_ID);
companion object {
fun source(id: Long) =
values().find { it.id == id }
?: throw IllegalArgumentException("Unknown source ID: $id!")
} }
} }

View File

@ -8,8 +8,6 @@ object BlacklistedSources {
4726175775739752699, 4726175775739752699,
2203215402871965477 2203215402871965477
) )
val PERVEDEN_EN_EXT_SOURCES = listOf(4673633799850248749)
val PERVEDEN_IT_EXT_SOURCES = listOf(1433898225963724122)
val EHENTAI_EXT_SOURCES = listOf( val EHENTAI_EXT_SOURCES = listOf(
8100626124886895451, 8100626124886895451,
57122881048805941, 57122881048805941,
@ -31,15 +29,11 @@ object BlacklistedSources {
) )
val BLACKLISTED_EXT_SOURCES = NHENTAI_EXT_SOURCES + val BLACKLISTED_EXT_SOURCES = NHENTAI_EXT_SOURCES +
PERVEDEN_EN_EXT_SOURCES +
PERVEDEN_IT_EXT_SOURCES +
EHENTAI_EXT_SOURCES EHENTAI_EXT_SOURCES
val BLACKLISTED_EXTENSIONS = listOf( val BLACKLISTED_EXTENSIONS = listOf(
"eu.kanade.tachiyomi.extension.all.ehentai", "eu.kanade.tachiyomi.extension.all.ehentai",
"eu.kanade.tachiyomi.extension.all.nhentai", "eu.kanade.tachiyomi.extension.all.nhentai"
"eu.kanade.tachiyomi.extension.en.perveden",
"eu.kanade.tachiyomi.extension.it.perveden"
) )
var HIDDEN_SOURCES = listOf( var HIDDEN_SOURCES = listOf(