From 5195cb8eda6e2f4dff8597224509ab9fb698b025 Mon Sep 17 00:00:00 2001 From: NerdNumber9 Date: Thu, 8 Aug 2019 13:31:47 -0400 Subject: [PATCH] Delegate Pururin.io --- app/src/main/AndroidManifest.xml | 23 +++++++ .../kanade/tachiyomi/source/SourceManager.kt | 11 +++- .../source/online/english/Pururin.kt | 63 ++++++++++++++++++- app/src/main/java/exh/EHSourceHelpers.kt | 4 +- .../metadata/PururinSearchMetadata.kt | 37 +++-------- .../metadata/base/RaisedSearchMetadata.kt | 4 ++ app/src/main/java/exh/util/StringUtil.kt | 5 ++ 7 files changed, 113 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/exh/util/StringUtil.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ae10c9966..bb0a9eb60 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -154,6 +154,7 @@ + + + + + + + + + + + + + + + + + ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Pururin.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Pururin.kt index 8892bc723..4e6962ce9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Pururin.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/english/Pururin.kt @@ -1,13 +1,19 @@ package eu.kanade.tachiyomi.source.online.english import android.net.Uri +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.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.LewdSource import eu.kanade.tachiyomi.source.online.UrlImportableSource +import eu.kanade.tachiyomi.util.asJsoup import exh.metadata.metadata.PururinSearchMetadata +import exh.metadata.metadata.base.RaisedTag import exh.source.DelegatedHttpSource +import exh.util.dropBlank +import exh.util.trimAll import exh.util.urlImportFetchSearchManga import org.jsoup.nodes.Document import rx.Observable @@ -26,7 +32,6 @@ class Pururin(delegate: HttpSource) : DelegatedHttpSource(delegate), //Support direct URL importing override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { val trimmedIdQuery = query.trim().removePrefix("id:") - // TODO Fetch gallery shortlink val newQuery = if(trimmedIdQuery.toIntOrNull() ?: -1 >= 0) { "$baseUrl/gallery/$trimmedIdQuery/-" } else query @@ -36,6 +41,15 @@ class Pururin(delegate: HttpSource) : DelegatedHttpSource(delegate), } } + override fun fetchMangaDetails(manga: SManga): Observable { + return client.newCall(mangaDetailsRequest(manga)) + .asObservableSuccess() + .flatMap { + parseToManga(manga, it.asJsoup()) + .andThen(Observable.just(manga)) + } + } + override fun parseIntoMetadata(metadata: PururinSearchMetadata, input: Document) { val selfLink = input.select("[itemprop=name]").last().parent() val parsedSelfLink = Uri.parse(selfLink.attr("href")).pathSegments @@ -44,7 +58,52 @@ class Pururin(delegate: HttpSource) : DelegatedHttpSource(delegate), prId = parsedSelfLink[parsedSelfLink.lastIndex - 1].toIntOrNull() prShortLink = parsedSelfLink.last() - title = + val contentWrapper = input.selectFirst(".content-wrapper") + title = contentWrapper.selectFirst(".title h1").text() + altTitle = contentWrapper.selectFirst(".alt-title").text() + + thumbnailUrl = "https:" + input.selectFirst(".cover-wrapper v-lazy-image").attr("src") + + tags.clear() + contentWrapper.select(".table-gallery-info > tbody > tr").forEach { ele -> + val key = ele.child(0).text().toLowerCase() + val value = ele.child(1) + when(key) { + "pages" -> { + val split = value.text().split("(").trimAll().dropBlank() + + pages = split.first().toIntOrNull() + fileSize = split.last().removeSuffix(")").trim() + } + "ratings" -> { + ratingCount = value.selectFirst("[itemprop=ratingCount]").attr("content").toIntOrNull() + averageRating = value.selectFirst("[itemprop=ratingValue]").attr("content").toDoubleOrNull() + } + "uploader" -> { + uploaderDisp = value.text() + uploader = Uri.parse(value.child(0).attr("href")).lastPathSegment + } + else -> { + value.select("a").forEach { link -> + val searchUrl = Uri.parse(link.attr("href")) + tags += RaisedTag( + searchUrl.pathSegments[searchUrl.pathSegments.lastIndex - 2], + searchUrl.lastPathSegment!!.substringBefore("."), + PururinSearchMetadata.TAG_TYPE_DEFAULT + ) + } + } + } + } } } + + override val matchingHosts = listOf( + "pururin.io", + "www.pururin.io" + ) + + override fun mapUrlToMangaUrl(uri: Uri): String? { + return "${PururinSearchMetadata.BASE_URL}/gallery/${uri.pathSegments[1]}/${uri.lastPathSegment}" + } } \ No newline at end of file diff --git a/app/src/main/java/exh/EHSourceHelpers.kt b/app/src/main/java/exh/EHSourceHelpers.kt index 5b30df6a0..b5ed6ba6b 100755 --- a/app/src/main/java/exh/EHSourceHelpers.kt +++ b/app/src/main/java/exh/EHSourceHelpers.kt @@ -3,6 +3,7 @@ package exh import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.english.HentaiCafe +import eu.kanade.tachiyomi.source.online.english.Pururin /** * Source helpers @@ -21,7 +22,8 @@ const val HITOMI_SOURCE_ID = LEWD_SOURCE_SERIES + 10 const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69 private val DELEGATED_LEWD_SOURCES = listOf( - HentaiCafe::class + HentaiCafe::class, + Pururin::class ) private inline fun delegatedSourceId(): Long { diff --git a/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt index a2ad7a498..762abdec7 100644 --- a/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt +++ b/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt @@ -14,27 +14,6 @@ class PururinSearchMetadata : RaisedSearchMetadata() { var thumbnailUrl: String? = null - var artist: String? = null - var artistDisp: String? = null - - var circle: String? = null - var circleDisp: String? = null - - var parody: String? = null // TODO Mult - var parodyDisp: String? = null - - var character: String? = null // TODO Mult - var characterDisp: String? = null - - var category: String? = null - var categoryDisp: String? = null - - var collection: String? = null - var collectionDisp: String? = null - - var language: String? = null - var languageDisp: String? = null - var uploaderDisp: String? = null var pages: Int? = null @@ -59,9 +38,7 @@ class PururinSearchMetadata : RaisedSearchMetadata() { manga.thumbnail_url = it } - (artistDisp ?: artist)?.let { - manga.artist = it - } + manga.artist = tags.ofNamespace(TAG_NAMESPACE_ARTIST).joinToString { it.name } manga.genre = tagsToGenreString() @@ -70,10 +47,10 @@ class PururinSearchMetadata : RaisedSearchMetadata() { altTitle?.let { titleDesc += "Japanese Title: $it\n" } val detailsDesc = StringBuilder() - (uploaderDisp ?: uploader)?.let { detailsDesc += "Uploader: $it"} - pages?.let { detailsDesc += "Length: $it pages" } - fileSize?.let { detailsDesc += "Size: $it" } - ratingCount?.let { detailsDesc += "Rating: $averageRating ($ratingCount)" } + (uploaderDisp ?: uploader)?.let { detailsDesc += "Uploader: $it\n"} + pages?.let { detailsDesc += "Length: $it pages\n" } + fileSize?.let { detailsDesc += "Size: $it\n" } + ratingCount?.let { detailsDesc += "Rating: $averageRating ($ratingCount)\n" } val tagsDesc = tagsToDescription() @@ -86,7 +63,9 @@ class PururinSearchMetadata : RaisedSearchMetadata() { private const val TITLE_TYPE_TITLE = 0 private const val TITLE_TYPE_ALT_TITLE = 1 - const val TAG_TYPE_CONTENTS = 0 + const val TAG_TYPE_DEFAULT = 0 + + private const val TAG_NAMESPACE_ARTIST = "artist" val BASE_URL = "https://pururin.io" } diff --git a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt index 928b4027d..655d4f877 100644 --- a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt +++ b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt @@ -60,6 +60,10 @@ abstract class RaisedSearchMetadata { } } + fun List.ofNamespace(ns: String): List { + return filter { it.namespace == ns } + } + fun flatten(): FlatMetadata { require(mangaId != -1L) diff --git a/app/src/main/java/exh/util/StringUtil.kt b/app/src/main/java/exh/util/StringUtil.kt new file mode 100644 index 000000000..a80054d39 --- /dev/null +++ b/app/src/main/java/exh/util/StringUtil.kt @@ -0,0 +1,5 @@ +package exh.util + +fun List.trimAll() = map { it.trim() } +fun List.dropBlank() = filter { it.isNotBlank() } +fun List.dropEmpty() = filter { it.isNotEmpty() }