Optimize imports, disallow wildcard imports because of klint, run linter

This commit is contained in:
jobobby04
2020-04-04 16:30:05 -04:00
committed by Jobobby04
parent f18891a07e
commit 23ac3d18e5
138 changed files with 1192 additions and 1027 deletions
@@ -1,7 +1,7 @@
package exh.metadata
import java.text.SimpleDateFormat
import java.util.*
import java.util.Locale
/**
* Metadata utils
@@ -35,13 +35,12 @@ fun parseHumanReadableByteCount(arg0: String): Double? {
return null
}
fun String?.nullIfBlank(): String? = if(isNullOrBlank())
fun String?.nullIfBlank(): String? = if (isNullOrBlank())
null
else
this
fun <K,V> Set<Map.Entry<K,V>>.forEach(action: (K, V) -> Unit) {
fun <K, V> Set<Map.Entry<K, V>>.forEach(action: (K, V) -> Unit) {
forEach { action(it.key, it.value) }
}
@@ -4,12 +4,14 @@ import android.net.Uri
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.*
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.ONGOING_SUFFIX
import exh.metadata.humanReadableByteCount
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.plusAssign
import java.util.Date
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.*
class EHentaiSearchMetadata : RaisedSearchMetadata() {
var gId: String?
@@ -27,7 +29,7 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
var datePosted: Long? = null
var parent: String? = null
var visible: String? = null //Not a boolean
var visible: String? = null // Not a boolean
var language: String? = null
var translated: Boolean? = null
var size: Long? = null
@@ -47,23 +49,23 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
}
thumbnailUrl?.let { manga.thumbnail_url = it }
//No title bug?
val titleObj = if(Injekt.get<PreferencesHelper>().useJapaneseTitle().getOrDefault())
// No title bug?
val titleObj = if (Injekt.get<PreferencesHelper>().useJapaneseTitle().getOrDefault())
altTitle ?: title
else
title
titleObj?.let { manga.title = it }
//Set artist (if we can find one)
// Set artist (if we can find one)
tags.filter { it.namespace == EH_ARTIST_NAMESPACE }.let {
if(it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name })
if (it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name })
}
//Copy tags -> genres
// Copy tags -> genres
manga.genre = tagsToGenreString()
//Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes
//We default to completed
// Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes
// We default to completed
manga.status = SManga.COMPLETED
title?.let { t ->
ONGOING_SUFFIX.find {
@@ -73,7 +75,7 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
}
}
//Build a nice looking description out of what we know
// Build a nice looking description out of what we know
val titleDesc = StringBuilder()
title?.let { titleDesc += "Title: $it\n" }
altTitle?.let { titleDesc += "Alternate Title: $it\n" }
@@ -85,7 +87,7 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
visible?.let { detailsDesc += "Visible: $it\n" }
language?.let {
detailsDesc += "Language: $it"
if(translated == true) detailsDesc += " TR"
if (translated == true) detailsDesc += " TR"
detailsDesc += "\n"
}
size?.let { detailsDesc += "File size: ${humanReadableByteCount(it, true)}\n" }
@@ -114,10 +116,10 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
const val EH_GENRE_NAMESPACE = "genre"
private const val EH_ARTIST_NAMESPACE = "artist"
private fun splitGalleryUrl(url: String)
= url.let {
//Only parse URL if is full URL
val pathSegments = if(it.startsWith("http"))
private fun splitGalleryUrl(url: String) =
url.let {
// Only parse URL if is full URL
val pathSegments = if (it.startsWith("http"))
Uri.parse(it).pathSegments
else
it.split('/')
@@ -129,10 +131,10 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
fun galleryToken(url: String) =
splitGalleryUrl(url)[2]
fun normalizeUrl(url: String)
= idAndTokenToUrl(galleryId(url), galleryToken(url))
fun normalizeUrl(url: String) =
idAndTokenToUrl(galleryId(url), galleryToken(url))
fun idAndTokenToUrl(id: String, token: String)
= "/g/$id/$token/?nw=always"
fun idAndTokenToUrl(id: String, token: String) =
"/g/$id/$token/?nw=always"
}
}
}
@@ -34,7 +34,6 @@ class EightMusesSearchMetadata : RaisedSearchMetadata() {
manga.description = listOf(titleDesc.toString(), tagsDesc.toString())
.filter(String::isNotBlank)
.joinToString(separator = "\n")
}
companion object {
@@ -47,4 +46,4 @@ class EightMusesSearchMetadata : RaisedSearchMetadata() {
const val TAGS_NAMESPACE = "tags"
const val ARTIST_NAMESPACE = "artist"
}
}
}
@@ -21,7 +21,7 @@ class HBrowseSearchMetadata : RaisedSearchMetadata() {
}
// Guess thumbnail URL if manga does not have thumbnail URL
if(manga.thumbnail_url.isNullOrBlank()) {
if (manga.thumbnail_url.isNullOrBlank()) {
manga.thumbnail_url = guessThumbnailUrl(hbId.toString())
}
@@ -49,4 +49,4 @@ class HBrowseSearchMetadata : RaisedSearchMetadata() {
return "$BASE_URL/thumbnails/${hbid}_1.jpg#guessed"
}
}
}
}
@@ -27,7 +27,7 @@ class HentaiCafeSearchMetadata : RaisedSearchMetadata() {
manga.artist = artist
manga.author = artist
//Not available
// Not available
manga.status = SManga.UNKNOWN
val detailsDesc = "Title: $title\n" +
@@ -49,7 +49,7 @@ class HentaiCafeSearchMetadata : RaisedSearchMetadata() {
const val BASE_URL = "https://hentai.cafe"
fun hcIdFromUrl(url: String)
= url.split("/").last { it.isNotBlank() }
fun hcIdFromUrl(url: String) =
url.split("/").last { it.isNotBlank() }
}
}
}
@@ -4,9 +4,9 @@ import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.plusAssign
import java.util.*
import java.util.Date
class HitomiSearchMetadata: RaisedSearchMetadata() {
class HitomiSearchMetadata : RaisedSearchMetadata() {
var url get() = hlId?.let { urlFromHlId(it) }
set(a) {
a?.let {
@@ -62,10 +62,10 @@ class HitomiSearchMetadata: RaisedSearchMetadata() {
detailsDesc += "Language: ${it.capitalize()}\n"
}
if(series.isNotEmpty())
if (series.isNotEmpty())
detailsDesc += "Series: ${series.joinToString()}\n"
if(characters.isNotEmpty())
if (characters.isNotEmpty())
detailsDesc += "Characters: ${characters.joinToString()}\n"
uploadDate?.let {
@@ -74,7 +74,7 @@ class HitomiSearchMetadata: RaisedSearchMetadata() {
manga.status = SManga.UNKNOWN
//Copy tags -> genres
// Copy tags -> genres
manga.genre = tagsToGenreString()
val tagsDesc = tagsToDescription()
@@ -92,10 +92,10 @@ class HitomiSearchMetadata: RaisedSearchMetadata() {
const val LTN_BASE_URL = "https://ltn.hitomi.la"
const val BASE_URL = "https://hitomi.la"
fun hlIdFromUrl(url: String)
= url.split('/').last().split('-').last().substringBeforeLast('.')
fun hlIdFromUrl(url: String) =
url.split('/').last().split('-').last().substringBeforeLast('.')
fun urlFromHlId(id: String)
= "$BASE_URL/galleries/$id.html"
fun urlFromHlId(id: String) =
"$BASE_URL/galleries/$id.html"
}
}
@@ -3,12 +3,14 @@ package exh.metadata.metadata
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.*
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.ONGOING_SUFFIX
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.metadata.nullIfBlank
import exh.plusAssign
import java.util.Date
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.*
class NHentaiSearchMetadata : RaisedSearchMetadata() {
var url get() = nhId?.let { BASE_URL + nhIdToPath(it) }
@@ -39,10 +41,10 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
override fun copyTo(manga: SManga) {
nhId?.let { manga.url = nhIdToPath(it) }
if(mediaId != null) {
if (mediaId != null) {
val hqThumbs = Injekt.get<PreferencesHelper>().eh_nh_useHighQualityThumbs().getOrDefault()
typeToExtension(if(hqThumbs) coverImageType else thumbnailImageType)?.let {
manga.thumbnail_url = "https://t.nhentai.net/galleries/$mediaId/${if(hqThumbs)
typeToExtension(if (hqThumbs) coverImageType else thumbnailImageType)?.let {
manga.thumbnail_url = "https://t.nhentai.net/galleries/$mediaId/${if (hqThumbs)
"cover"
else "thumb"}.$it"
}
@@ -50,21 +52,21 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
manga.title = englishTitle ?: japaneseTitle ?: shortTitle!!
//Set artist (if we can find one)
// Set artist (if we can find one)
tags.filter { it.namespace == NHENTAI_ARTIST_NAMESPACE }.let {
if(it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name })
if (it.isNotEmpty()) manga.artist = it.joinToString(transform = { it.name })
}
var category: String? = null
tags.filter { it.namespace == NHENTAI_CATEGORIES_NAMESPACE }.let {
if(it.isNotEmpty()) category = it.joinToString(transform = { it.name })
if (it.isNotEmpty()) category = it.joinToString(transform = { it.name })
}
//Copy tags -> genres
// Copy tags -> genres
manga.genre = tagsToGenreString()
//Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes
//We default to completed
// Try to automatically identify if it is ongoing, we try not to be too lenient here to avoid making mistakes
// We default to completed
manga.status = SManga.COMPLETED
englishTitle?.let { t ->
ONGOING_SUFFIX.find {
@@ -106,14 +108,14 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
private const val NHENTAI_CATEGORIES_NAMESPACE = "category"
fun typeToExtension(t: String?) =
when(t) {
when (t) {
"p" -> "png"
"j" -> "jpg"
else -> null
}
fun nhUrlToId(url: String)
= url.split("/").last { it.isNotBlank() }.toLong()
fun nhUrlToId(url: String) =
url.split("/").last { it.isNotBlank() }.toLong()
fun nhIdToPath(id: Long) = "/g/$id/"
}
@@ -41,7 +41,7 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
manga.title = it
titleDesc += "Title: $it\n"
}
if(altTitles.isNotEmpty())
if (altTitles.isNotEmpty())
titleDesc += "Alternate Titles: \n" + altTitles
.joinToString(separator = "\n", postfix = "\n") {
"$it"
@@ -58,7 +58,7 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
}
status?.let {
manga.status = when(it) {
manga.status = when (it) {
"Ongoing" -> SManga.ONGOING
"Completed", "Suspended" -> SManga.COMPLETED
else -> SManga.UNKNOWN
@@ -70,7 +70,7 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
detailsDesc += "Rating: %.2\n".format(it)
}
//Copy tags -> genres
// Copy tags -> genres
manga.genre = tagsToGenreString()
val tagsDesc = tagsToDescription()
@@ -80,15 +80,14 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
.joinToString(separator = "\n")
}
companion object {
private const val TITLE_TYPE_MAIN = 0
private const val TITLE_TYPE_ALT = 1
const val TAG_TYPE_DEFAULT = 0
private fun splitGalleryUrl(url: String)
= url.let {
private fun splitGalleryUrl(url: String) =
url.let {
Uri.parse(it).pathSegments.filterNot(String::isNullOrBlank)
}
@@ -97,13 +96,13 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
}
enum class PervEdenLang(val id: Long) {
//DO NOT RENAME THESE TO CAPITAL LETTERS! The enum names are used to build URLs
// 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 }
fun source(id: Long) =
values().find { it.id == id }
?: throw IllegalArgumentException("Unknown source ID: $id!")
}
}
@@ -47,7 +47,7 @@ class PururinSearchMetadata : RaisedSearchMetadata() {
altTitle?.let { titleDesc += "Japanese Title: $it\n" }
val detailsDesc = StringBuilder()
(uploaderDisp ?: uploader)?.let { detailsDesc += "Uploader: $it\n"}
(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" }
@@ -69,4 +69,4 @@ class PururinSearchMetadata : RaisedSearchMetadata() {
val BASE_URL = "https://pururin.io"
}
}
}
@@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.plusAssign
import java.util.*
import java.util.Date
class TsuminoSearchMetadata : RaisedSearchMetadata() {
var tmId: Int? = null
@@ -51,15 +51,15 @@ class TsuminoSearchMetadata : RaisedSearchMetadata() {
collection?.let { detailsDesc += "Collection: $it\n" }
group?.let { detailsDesc += "Group: $it\n" }
val parodiesString = parody.joinToString()
if(parodiesString.isNotEmpty()) {
if (parodiesString.isNotEmpty()) {
detailsDesc += "Parody: $parodiesString\n"
}
val charactersString = character.joinToString()
if(charactersString.isNotEmpty()) {
if (charactersString.isNotEmpty()) {
detailsDesc += "Character: $charactersString\n"
}
//Copy tags -> genres
// Copy tags -> genres
manga.genre = tagsToGenreString()
val tagsDesc = tagsToDescription()
@@ -76,8 +76,8 @@ class TsuminoSearchMetadata : RaisedSearchMetadata() {
val BASE_URL = "https://www.tsumino.com"
fun tmIdFromUrl(url: String)
= Uri.parse(url).lastPathSegment
fun tmIdFromUrl(url: String) =
Uri.parse(url).lastPathSegment
fun mangaUrlFromId(id: String) = "/Book/Info/$id"
@@ -5,19 +5,19 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.models.SearchTag
import exh.metadata.sql.models.SearchTitle
import kotlin.reflect.KClass
import rx.Completable
import rx.Single
import kotlin.reflect.KClass
data class FlatMetadata(
val metadata: SearchMetadata,
val tags: List<SearchTag>,
val titles: List<SearchTitle>
val metadata: SearchMetadata,
val tags: List<SearchTag>,
val titles: List<SearchTitle>
) {
inline fun <reified T : RaisedSearchMetadata> raise(): T = raise(T::class)
fun <T : RaisedSearchMetadata> raise(clazz: KClass<T>)
= RaisedSearchMetadata.raiseFlattenGson
fun <T : RaisedSearchMetadata> raise(clazz: KClass<T>) =
RaisedSearchMetadata.raiseFlattenGson
.fromJson(metadata.extra, clazz.java).apply {
fillBaseFields(this@FlatMetadata)
}
@@ -27,7 +27,7 @@ fun DatabaseHelper.getFlatMetadataForManga(mangaId: Long): PreparedOperation<Fla
// We have to use fromCallable because StorIO messes up the thread scheduling if we use their rx functions
val single = Single.fromCallable {
val meta = getSearchMetadataForManga(mangaId).executeAsBlocking()
if(meta != null) {
if (meta != null) {
val tags = getSearchTagsForManga(mangaId).executeAsBlocking()
val titles = getSearchTitlesForManga(mangaId).executeAsBlocking()
@@ -92,4 +92,4 @@ fun DatabaseHelper.insertFlatMetadata(flatMetadata: FlatMetadata) = Completable.
setSearchTagsForManga(flatMetadata.metadata.mangaId, flatMetadata.tags)
setSearchTitlesForManga(flatMetadata.metadata.mangaId, flatMetadata.titles)
}
}
}
@@ -30,18 +30,18 @@ abstract class RaisedSearchMetadata {
fun replaceTitleOfType(type: Int, newTitle: String?) {
titles.removeAll { it.type == type }
if(newTitle != null) titles += RaisedTitle(newTitle, type)
if (newTitle != null) titles += RaisedTitle(newTitle, type)
}
abstract fun copyTo(manga: SManga)
fun tagsToGenreString()
= tags.filter { it.type != TAG_TYPE_VIRTUAL }
.joinToString { (if(it.namespace != null) "${it.namespace}: " else "") + it.name }
fun tagsToGenreString() =
tags.filter { it.type != TAG_TYPE_VIRTUAL }
.joinToString { (if (it.namespace != null) "${it.namespace}: " else "") + it.name }
fun tagsToDescription()
= StringBuilder("Tags:\n").apply {
//BiConsumer only available in Java 8, don't bother calling forEach directly on 'tags'
fun tagsToDescription() =
StringBuilder("Tags:\n").apply {
// BiConsumer only available in Java 8, don't bother calling forEach directly on 'tags'
val groupedTags = tags.filter { it.type != TAG_TYPE_VIRTUAL }.groupBy {
it.namespace
}.entries
@@ -49,7 +49,7 @@ abstract class RaisedSearchMetadata {
groupedTags.forEach { namespace, tags ->
if (tags.isNotEmpty()) {
val joinedTags = tags.joinToString(separator = " ", transform = { "<${it.name}>" })
if(namespace != null) {
if (namespace != null) {
this += ""
this += namespace
this += ": "
@@ -125,8 +125,8 @@ abstract class RaisedSearchMetadata {
* @param property the metadata for the property.
* @return the property value.
*/
override fun getValue(thisRef: RaisedSearchMetadata, property: KProperty<*>)
= thisRef.getTitleOfType(type)
override fun getValue(thisRef: RaisedSearchMetadata, property: KProperty<*>) =
thisRef.getTitleOfType(type)
/**
* Sets the value of the property for the given object.
@@ -134,8 +134,8 @@ abstract class RaisedSearchMetadata {
* @param property the metadata for the property.
* @param value the value to set.
*/
override fun setValue(thisRef: RaisedSearchMetadata, property: KProperty<*>, value: String?)
= thisRef.replaceTitleOfType(type, value)
override fun setValue(thisRef: RaisedSearchMetadata, property: KProperty<*>, value: String?) =
thisRef.replaceTitleOfType(type, value)
}
}
}
}
@@ -1,5 +1,7 @@
package exh.metadata.metadata.base
data class RaisedTag(val namespace: String?,
val name: String,
val type: Int)
data class RaisedTag(
val namespace: String?,
val name: String,
val type: Int
)
@@ -1,6 +1,6 @@
package exh.metadata.metadata.base
data class RaisedTitle(
val title: String,
val type: Int = 0
)
val title: String,
val type: Int = 0
)
@@ -2,20 +2,20 @@ package exh.metadata.sql.models
data class SearchMetadata(
// Manga ID this gallery is linked to
val mangaId: Long,
val mangaId: Long,
// Gallery uploader
val uploader: String?,
val uploader: String?,
// Extra data attached to this metadata, in JSON format
val extra: String,
val extra: String,
// Indexed extra data attached to this metadata
val indexedExtra: String?,
val indexedExtra: String?,
// The version of this metadata's extra. Used to track changes to the 'extra' field's schema
val extraVersion: Int
val extraVersion: Int
) {
// Transient information attached to this piece of metadata, useful for caching
var transientCache: Map<String, Any>? = null
}
}
@@ -2,17 +2,17 @@ package exh.metadata.sql.models
data class SearchTag(
// Tag identifier, unique
val id: Long?,
val id: Long?,
// Metadata this tag is attached to
val mangaId: Long,
val mangaId: Long,
// Tag namespace
val namespace: String?,
val namespace: String?,
// Tag name
val name: String,
val name: String,
// Tag type
val type: Int
)
val type: Int
)
@@ -2,14 +2,14 @@ package exh.metadata.sql.models
data class SearchTitle(
// Title identifier, unique
val id: Long?,
val id: Long?,
// Metadata this title is attached to
val mangaId: Long,
val mangaId: Long,
// Title
val title: String,
val title: String,
// Title type, useful for distinguishing between main/alt titles
val type: Int
val type: Int
)
@@ -3,7 +3,6 @@ package exh.metadata.sql.queries
import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
import com.pushtorefresh.storio.sqlite.queries.Query
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.models.Manga
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.tables.SearchMetadataTable
@@ -42,4 +41,4 @@ interface SearchMetadataQueries : DbProvider {
.table(SearchMetadataTable.TABLE)
.build())
.prepare()
}
}
@@ -44,4 +44,4 @@ interface SearchTagQueries : DbProvider {
}
}
}
}
}
@@ -4,8 +4,6 @@ import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
import com.pushtorefresh.storio.sqlite.queries.Query
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.inTransaction
import eu.kanade.tachiyomi.data.database.models.Manga
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.models.SearchTitle
import exh.metadata.sql.tables.SearchTitleTable
@@ -46,4 +44,4 @@ interface SearchTitleQueries : DbProvider {
}
}
}
}
}