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() }