Convert some interface implementations to objects

pull/431/head
Isira Seneviratne 3 years ago
parent 08acf2d882
commit fff0b17add

@ -28,7 +28,7 @@ class Bookmark(
private fun isImageUrlDirect(): Boolean { private fun isImageUrlDirect(): Boolean {
val extension = imageUrl.substringAfterLast('.') val extension = imageUrl.substringAfterLast('.')
return extension.isNotEmpty() && ImageFileFilter().isExtensionValid(extension) return extension.isNotEmpty() && ImageFileFilter.isExtensionValid(extension)
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

@ -1,7 +1,6 @@
package org.koitharu.kotatsu.core.util package org.koitharu.kotatsu.core.util
class AlphanumComparator : Comparator<String> { object AlphanumComparator : Comparator<String> {
override fun compare(s1: String?, s2: String?): Int { override fun compare(s1: String?, s2: String?): Int {
if (s1 == null || s2 == null) { if (s1 == null || s2 == null) {
return 0 return 0

@ -6,8 +6,7 @@ import java.io.FileFilter
import java.io.FilenameFilter import java.io.FilenameFilter
import java.util.Locale import java.util.Locale
class CbzFilter : FileFilter, FilenameFilter { object CbzFilter : FileFilter, FilenameFilter {
override fun accept(dir: File, name: String): Boolean { override fun accept(dir: File, name: String): Boolean {
return isFileSupported(name) return isFileSupported(name)
} }
@ -16,8 +15,6 @@ class CbzFilter : FileFilter, FilenameFilter {
return isFileSupported(pathname?.name ?: return false) return isFileSupported(pathname?.name ?: return false)
} }
companion object {
fun isFileSupported(name: String): Boolean { fun isFileSupported(name: String): Boolean {
val ext = name.substringAfterLast('.', "").lowercase(Locale.ROOT) val ext = name.substringAfterLast('.', "").lowercase(Locale.ROOT)
return ext == "cbz" || ext == "zip" return ext == "cbz" || ext == "zip"
@ -28,4 +25,3 @@ class CbzFilter : FileFilter, FilenameFilter {
return scheme != null && scheme == "cbz" || scheme == "zip" return scheme != null && scheme == "cbz" || scheme == "zip"
} }
} }
}

@ -6,8 +6,7 @@ import java.io.FilenameFilter
import java.util.Locale import java.util.Locale
import java.util.zip.ZipEntry import java.util.zip.ZipEntry
class ImageFileFilter : FilenameFilter, FileFilter { object ImageFileFilter : FilenameFilter, FileFilter {
override fun accept(dir: File, name: String): Boolean { override fun accept(dir: File, name: String): Boolean {
val ext = name.substringAfterLast('.', "").lowercase(Locale.ROOT) val ext = name.substringAfterLast('.', "").lowercase(Locale.ROOT)
return isExtensionValid(ext) return isExtensionValid(ext)

@ -14,6 +14,7 @@ import kotlinx.coroutines.runInterruptible
import org.koitharu.kotatsu.core.model.isLocal import org.koitharu.kotatsu.core.model.isLocal
import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.MangaRepository
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.util.AlphanumComparator
import org.koitharu.kotatsu.core.util.CompositeMutex import org.koitharu.kotatsu.core.util.CompositeMutex
import org.koitharu.kotatsu.core.util.ext.deleteAwait import org.koitharu.kotatsu.core.util.ext.deleteAwait
import org.koitharu.kotatsu.local.data.input.LocalMangaInput import org.koitharu.kotatsu.local.data.input.LocalMangaInput
@ -29,7 +30,6 @@ import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
import java.io.File import java.io.File
import java.io.FilenameFilter
import java.util.EnumSet import java.util.EnumSet
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -74,12 +74,9 @@ class LocalMangaRepository @Inject constructor(
list.retainAll { x -> x.containsTags(tags) } list.retainAll { x -> x.containsTags(tags) }
} }
when (sortOrder) { when (sortOrder) {
SortOrder.ALPHABETICAL -> list.sortWith(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.manga.title }) SortOrder.ALPHABETICAL -> list.sortWith(compareBy(AlphanumComparator) { x -> x.manga.title })
SortOrder.RATING -> list.sortByDescending { it.manga.rating } SortOrder.RATING -> list.sortByDescending { it.manga.rating }
SortOrder.NEWEST, SortOrder.NEWEST, SortOrder.UPDATED -> list.sortByDescending { it.createdAt }
SortOrder.UPDATED,
-> list.sortByDescending { it.createdAt }
else -> Unit else -> Unit
} }
return list.unwrap() return list.unwrap()

@ -4,6 +4,7 @@ import androidx.annotation.WorkerThread
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.core.util.AlphanumComparator
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@ -125,8 +126,7 @@ class MangaIndex(source: String?) {
item.put("id", id) item.put("id", id)
list.add(item) list.add(item)
} }
val comparator = org.koitharu.kotatsu.core.util.AlphanumComparator() list.sortWith(compareBy(AlphanumComparator) { it.getString("name") })
list.sortWith(compareBy(comparator) { it.getString("name") })
val newJo = JSONObject() val newJo = JSONObject()
list.forEachIndexed { i, obj -> list.forEachIndexed { i, obj ->
obj.put("number", i + 1) obj.put("number", i + 1)

@ -4,6 +4,7 @@ import androidx.core.net.toFile
import androidx.core.net.toUri import androidx.core.net.toUri
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.runInterruptible
import org.koitharu.kotatsu.core.util.AlphanumComparator
import org.koitharu.kotatsu.core.util.ext.listFilesRecursive import org.koitharu.kotatsu.core.util.ext.listFilesRecursive
import org.koitharu.kotatsu.core.util.ext.longHashCode import org.koitharu.kotatsu.core.util.ext.longHashCode
import org.koitharu.kotatsu.core.util.ext.toListSorted import org.koitharu.kotatsu.core.util.ext.toListSorted
@ -87,8 +88,8 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) {
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> = runInterruptible(Dispatchers.IO) { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> = runInterruptible(Dispatchers.IO) {
val file = chapter.url.toUri().toFile() val file = chapter.url.toUri().toFile()
if (file.isDirectory) { if (file.isDirectory) {
file.listFilesRecursive(ImageFileFilter()) file.listFilesRecursive(ImageFileFilter)
.toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .toListSorted(compareBy(AlphanumComparator) { x -> x.name })
.map { .map {
val pageUri = it.toUri().toString() val pageUri = it.toUri().toString()
MangaPage( MangaPage(
@ -104,7 +105,7 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) {
.asSequence() .asSequence()
.filter { x -> !x.isDirectory } .filter { x -> !x.isDirectory }
.map { it.name } .map { it.name }
.toListSorted(org.koitharu.kotatsu.core.util.AlphanumComparator()) .toListSorted(AlphanumComparator)
.map { .map {
val pageUri = zipUri(file, it) val pageUri = zipUri(file, it)
MangaPage( MangaPage(
@ -120,18 +121,17 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) {
private fun String.toHumanReadable() = replace("_", " ").toCamelCase() private fun String.toHumanReadable() = replace("_", " ").toCamelCase()
private fun getChaptersFiles(): List<File> = root.listFilesRecursive(CbzFilter()) private fun getChaptersFiles(): List<File> = root.listFilesRecursive(CbzFilter)
.toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .toListSorted(compareBy(AlphanumComparator) { x -> x.name })
private fun findFirstImageEntry(): String? { private fun findFirstImageEntry(): String? {
val filter = ImageFileFilter() root.listFilesRecursive(ImageFileFilter).firstOrNull()?.let {
root.listFilesRecursive(filter).firstOrNull()?.let {
return it.toUri().toString() return it.toUri().toString()
} }
val cbz = root.listFilesRecursive(CbzFilter()).firstOrNull() ?: return null val cbz = root.listFilesRecursive(CbzFilter).firstOrNull() ?: return null
return ZipFile(cbz).use { zip -> return ZipFile(cbz).use { zip ->
zip.entries().asSequence() zip.entries().asSequence()
.firstOrNull { x -> !x.isDirectory && filter.accept(x) } .firstOrNull { x -> !x.isDirectory && ImageFileFilter.accept(x) }
?.let { entry -> zipUri(cbz, entry.name) } ?.let { entry -> zipUri(cbz, entry.name) }
} }
} }

@ -7,6 +7,7 @@ import androidx.core.net.toFile
import androidx.core.net.toUri import androidx.core.net.toUri
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.runInterruptible
import org.koitharu.kotatsu.core.util.AlphanumComparator
import org.koitharu.kotatsu.core.util.ext.longHashCode import org.koitharu.kotatsu.core.util.ext.longHashCode
import org.koitharu.kotatsu.core.util.ext.readText import org.koitharu.kotatsu.core.util.ext.readText
import org.koitharu.kotatsu.core.util.ext.toListSorted import org.koitharu.kotatsu.core.util.ext.toListSorted
@ -70,7 +71,7 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) {
publicUrl = fileUri, publicUrl = fileUri,
source = MangaSource.LOCAL, source = MangaSource.LOCAL,
coverUrl = zipUri(root, findFirstImageEntry(zip.entries())?.name.orEmpty()), coverUrl = zipUri(root, findFirstImageEntry(zip.entries())?.name.orEmpty()),
chapters = chapters.sortedWith(org.koitharu.kotatsu.core.util.AlphanumComparator()) chapters = chapters.sortedWith(AlphanumComparator)
.mapIndexed { i, s -> .mapIndexed { i, s ->
MangaChapter( MangaChapter(
id = "$i$s".longHashCode(), id = "$i$s".longHashCode(),
@ -125,7 +126,7 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) {
} }
} }
entries entries
.toListSorted(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .toListSorted(compareBy(AlphanumComparator) { x -> x.name })
.map { x -> .map { x ->
val entryUri = zipUri(file, x.name) val entryUri = zipUri(file, x.name)
MangaPage( MangaPage(
@ -141,7 +142,7 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) {
private fun findFirstImageEntry(entries: Enumeration<out ZipEntry>): ZipEntry? { private fun findFirstImageEntry(entries: Enumeration<out ZipEntry>): ZipEntry? {
val list = entries.toList() val list = entries.toList()
.filterNot { it.isDirectory } .filterNot { it.isDirectory }
.sortedWith(compareBy(org.koitharu.kotatsu.core.util.AlphanumComparator()) { x -> x.name }) .sortedWith(compareBy(AlphanumComparator) { x -> x.name })
val map = MimeTypeMap.getSingleton() val map = MimeTypeMap.getSingleton()
return list.firstOrNull { return list.firstOrNull {
map.getMimeTypeFromExtension(it.name.substringAfterLast('.')) map.getMimeTypeFromExtension(it.name.substringAfterLast('.'))

Loading…
Cancel
Save