mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-03 15:48:56 +01:00
See CHANGELOG.md for this commit
This commit is contained in:
@@ -17,6 +17,8 @@ val NHENTAI_SOURCE_ID = LEWD_SOURCE_SERIES + 7
|
||||
|
||||
val HENTAI_CAFE_SOURCE_ID = LEWD_SOURCE_SERIES + 8
|
||||
|
||||
val TSUMINO_SOURCE_ID = LEWD_SOURCE_SERIES + 9
|
||||
|
||||
fun isLewdSource(source: Long) = source in 6900..6999
|
||||
|
||||
fun isEhSource(source: Long) = source == EH_SOURCE_ID
|
||||
|
||||
@@ -10,10 +10,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||
import eu.kanade.tachiyomi.source.SourceManager
|
||||
import eu.kanade.tachiyomi.util.syncChaptersWithSource
|
||||
import exh.metadata.models.ExGalleryMetadata
|
||||
import exh.metadata.models.NHentaiMetadata
|
||||
import exh.metadata.models.PervEdenGalleryMetadata
|
||||
import exh.metadata.models.PervEdenLang
|
||||
import exh.metadata.models.*
|
||||
import exh.util.defRealm
|
||||
import okhttp3.MediaType
|
||||
import okhttp3.Request
|
||||
@@ -68,7 +65,7 @@ class GalleryAdder {
|
||||
try {
|
||||
val urlObj = Uri.parse(url)
|
||||
val lowercasePs = urlObj.pathSegments.map(String::toLowerCase)
|
||||
val firstPathSegment = lowercasePs[0]
|
||||
val lcFirstPathSegment = lowercasePs[0]
|
||||
val source = when (urlObj.host.toLowerCase()) {
|
||||
"g.e-hentai.org", "e-hentai.org" -> EH_SOURCE_ID
|
||||
"exhentai.org" -> EXH_SOURCE_ID
|
||||
@@ -80,6 +77,8 @@ class GalleryAdder {
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
}
|
||||
"hentai.cafe" -> HENTAI_CAFE_SOURCE_ID
|
||||
"www.tsumino.com" -> TSUMINO_SOURCE_ID
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
|
||||
@@ -88,7 +87,7 @@ class GalleryAdder {
|
||||
}
|
||||
|
||||
val realUrl = when(source) {
|
||||
EH_SOURCE_ID, EXH_SOURCE_ID -> when (firstPathSegment) {
|
||||
EH_SOURCE_ID, EXH_SOURCE_ID -> when (lcFirstPathSegment) {
|
||||
"g" -> {
|
||||
//Is already gallery page, do nothing
|
||||
url
|
||||
@@ -100,7 +99,7 @@ class GalleryAdder {
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
NHENTAI_SOURCE_ID -> {
|
||||
if(firstPathSegment != "g")
|
||||
if(lcFirstPathSegment != "g")
|
||||
return GalleryAddEvent.Fail.UnknownType(url)
|
||||
|
||||
"https://nhentai.net/g/${urlObj.pathSegments[1]}/"
|
||||
@@ -113,6 +112,18 @@ class GalleryAdder {
|
||||
}
|
||||
uri.toString()
|
||||
}
|
||||
HENTAI_CAFE_SOURCE_ID -> {
|
||||
if(lcFirstPathSegment == "manga")
|
||||
"https://hentai.cafe/${urlObj.pathSegments[2]}"
|
||||
|
||||
"https://hentai.cafe/$lcFirstPathSegment"
|
||||
}
|
||||
TSUMINO_SOURCE_ID -> {
|
||||
if(lcFirstPathSegment != "read" && lcFirstPathSegment != "book")
|
||||
return GalleryAddEvent.Fail.UnknownType(url)
|
||||
|
||||
"https://tsumino.com/Book/Info/${urlObj.pathSegments[2]}"
|
||||
}
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
|
||||
@@ -124,6 +135,8 @@ class GalleryAdder {
|
||||
NHENTAI_SOURCE_ID -> realUrl //nhentai uses URLs directly (oops, my bad when implementing this source)
|
||||
PERV_EDEN_EN_SOURCE_ID,
|
||||
PERV_EDEN_IT_SOURCE_ID -> getUrlWithoutDomain(realUrl)
|
||||
HENTAI_CAFE_SOURCE_ID -> getUrlWithoutDomain(realUrl)
|
||||
TSUMINO_SOURCE_ID -> getUrlWithoutDomain(realUrl)
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
|
||||
@@ -142,23 +155,14 @@ class GalleryAdder {
|
||||
//Apply metadata
|
||||
defRealm { realm ->
|
||||
when (source) {
|
||||
EH_SOURCE_ID, EXH_SOURCE_ID ->
|
||||
ExGalleryMetadata.UrlQuery(realUrl, isExSource(source))
|
||||
.query(realm)
|
||||
.findFirst()?.copyTo(manga)
|
||||
NHENTAI_SOURCE_ID ->
|
||||
NHentaiMetadata.UrlQuery(realUrl)
|
||||
.query(realm)
|
||||
.findFirst()
|
||||
?.copyTo(manga)
|
||||
EH_SOURCE_ID, EXH_SOURCE_ID -> ExGalleryMetadata.UrlQuery(realUrl, isExSource(source))
|
||||
NHENTAI_SOURCE_ID -> NHentaiMetadata.UrlQuery(realUrl)
|
||||
PERV_EDEN_EN_SOURCE_ID,
|
||||
PERV_EDEN_IT_SOURCE_ID ->
|
||||
PervEdenGalleryMetadata.UrlQuery(realUrl, PervEdenLang.source(source))
|
||||
.query(realm)
|
||||
.findFirst()
|
||||
?.copyTo(manga)
|
||||
PERV_EDEN_IT_SOURCE_ID -> PervEdenGalleryMetadata.UrlQuery(realUrl, PervEdenLang.source(source))
|
||||
HENTAI_CAFE_SOURCE_ID -> HentaiCafeMetadata.UrlQuery(realUrl)
|
||||
TSUMINO_SOURCE_ID -> TsuminoMetadata.UrlQuery(realUrl)
|
||||
else -> return GalleryAddEvent.Fail.UnknownType(url)
|
||||
}
|
||||
}.query(realm).findFirst()
|
||||
}
|
||||
|
||||
if (fav) manga.favorite = true
|
||||
|
||||
@@ -25,16 +25,18 @@ open class HentaiCafeMetadata : RealmObject(), SearchableGalleryMetadata {
|
||||
hcId = hcIdFromUrl(a)
|
||||
}
|
||||
}
|
||||
|
||||
var thumbnailUrl: String? = null
|
||||
|
||||
var title: String? = null
|
||||
|
||||
var artist: String? = null
|
||||
|
||||
override var uploader: String? = null
|
||||
override var uploader: String? = null //Always will be null as this is unknown
|
||||
|
||||
override var tags: RealmList<Tag> = RealmList()
|
||||
|
||||
override fun getTitles() = listOf(title).filterNotNull()
|
||||
override fun getTitles() = listOfNotNull(title)
|
||||
|
||||
@Ignore
|
||||
override val titleFields = listOf(
|
||||
@@ -45,6 +47,8 @@ open class HentaiCafeMetadata : RealmObject(), SearchableGalleryMetadata {
|
||||
override var mangaId: Long? = null
|
||||
|
||||
override fun copyTo(manga: SManga) {
|
||||
thumbnailUrl?.let { manga.thumbnail_url = it }
|
||||
|
||||
manga.title = title!!
|
||||
manga.artist = artist
|
||||
manga.author = artist
|
||||
|
||||
130
app/src/main/java/exh/metadata/models/TsuminoMetadata.kt
Normal file
130
app/src/main/java/exh/metadata/models/TsuminoMetadata.kt
Normal file
@@ -0,0 +1,130 @@
|
||||
package exh.metadata.models
|
||||
|
||||
import android.net.Uri
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import exh.metadata.EX_DATE_FORMAT
|
||||
import exh.metadata.buildTagsDescription
|
||||
import exh.plusAssign
|
||||
import io.realm.RealmList
|
||||
import io.realm.RealmObject
|
||||
import io.realm.annotations.Ignore
|
||||
import io.realm.annotations.Index
|
||||
import io.realm.annotations.PrimaryKey
|
||||
import io.realm.annotations.RealmClass
|
||||
import java.util.*
|
||||
|
||||
@RealmClass
|
||||
open class TsuminoMetadata : RealmObject(), SearchableGalleryMetadata {
|
||||
@PrimaryKey
|
||||
override var uuid: String = UUID.randomUUID().toString()
|
||||
|
||||
@Index
|
||||
var tmId: String? = null
|
||||
|
||||
var url get() = tmId?.let { mangaUrlFromId(it) }
|
||||
set(a) {
|
||||
a?.let {
|
||||
tmId = tmIdFromUrl(a)
|
||||
}
|
||||
}
|
||||
|
||||
var title: String? = null
|
||||
|
||||
var artist: String? = null
|
||||
|
||||
override var uploader: String? = null
|
||||
|
||||
var uploadDate: Long? = null
|
||||
|
||||
var length: Int? = null
|
||||
|
||||
var ratingString: String? = null
|
||||
|
||||
var category: String? = null
|
||||
|
||||
var collection: String? = null
|
||||
|
||||
var group: String? = null
|
||||
|
||||
var parody: RealmList<String> = RealmList()
|
||||
|
||||
var character: RealmList<String> = RealmList()
|
||||
|
||||
override var tags: RealmList<Tag> = RealmList()
|
||||
|
||||
override fun getTitles() = listOfNotNull(title)
|
||||
|
||||
@Ignore
|
||||
override val titleFields = listOf(
|
||||
TsuminoMetadata::title.name
|
||||
)
|
||||
|
||||
@Index
|
||||
override var mangaId: Long? = null
|
||||
|
||||
class EmptyQuery : GalleryQuery<TsuminoMetadata>(TsuminoMetadata::class)
|
||||
|
||||
class UrlQuery(
|
||||
val url: String
|
||||
) : GalleryQuery<TsuminoMetadata>(TsuminoMetadata::class) {
|
||||
override fun transform() = Query(
|
||||
tmIdFromUrl(url)
|
||||
)
|
||||
}
|
||||
|
||||
class Query(
|
||||
val tmId: String
|
||||
) : GalleryQuery<TsuminoMetadata>(TsuminoMetadata::class) {
|
||||
override fun map() = mapOf(
|
||||
TsuminoMetadata::tmId to Query::tmId
|
||||
)
|
||||
}
|
||||
|
||||
override fun copyTo(manga: SManga) {
|
||||
title?.let { manga.title = it }
|
||||
manga.thumbnail_url = thumbUrlFromId(tmId.toString())
|
||||
|
||||
artist?.let { manga.artist = it }
|
||||
|
||||
manga.status = SManga.UNKNOWN
|
||||
|
||||
val titleDesc = "Title: $title\n"
|
||||
|
||||
val detailsDesc = StringBuilder()
|
||||
uploader?.let { detailsDesc += "Uploader: $it\n" }
|
||||
uploadDate?.let { detailsDesc += "Uploaded: ${EX_DATE_FORMAT.format(Date(it))}\n" }
|
||||
length?.let { detailsDesc += "Length: $it pages\n" }
|
||||
ratingString?.let { detailsDesc += "Rating: $it\n" }
|
||||
category?.let {
|
||||
manga.genre = it
|
||||
detailsDesc += "Category: $it\n"
|
||||
}
|
||||
collection?.let { detailsDesc += "Collection: $it\n" }
|
||||
group?.let { detailsDesc += "Group: $it\n" }
|
||||
val parodiesString = parody.joinToString()
|
||||
if(parodiesString.isNotEmpty()) {
|
||||
detailsDesc += "Parody: $parodiesString\n"
|
||||
}
|
||||
val charactersString = character.joinToString()
|
||||
if(charactersString.isNotEmpty()) {
|
||||
detailsDesc += "Character: $charactersString\n"
|
||||
}
|
||||
|
||||
val tagsDesc = buildTagsDescription(this)
|
||||
|
||||
manga.description = listOf(titleDesc, detailsDesc.toString(), tagsDesc.toString())
|
||||
.filter(String::isNotBlank)
|
||||
.joinToString(separator = "\n")
|
||||
}
|
||||
|
||||
companion object {
|
||||
val BASE_URL = "https://www.tsumino.com"
|
||||
|
||||
fun tmIdFromUrl(url: String)
|
||||
= Uri.parse(url).pathSegments[2]
|
||||
|
||||
fun mangaUrlFromId(id: String) = "$BASE_URL/Book/Info/$id"
|
||||
|
||||
fun thumbUrlFromId(id: String) = "$BASE_URL/Image/Thumb/$id"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user