mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Move chapter utils to domain module
This commit is contained in:
		@@ -10,7 +10,6 @@ import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
import eu.kanade.tachiyomi.source.isLocal
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.SChapter
 | 
			
		||||
import eu.kanade.tachiyomi.source.online.HttpSource
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.ChapterRecognition
 | 
			
		||||
import tachiyomi.data.chapter.ChapterSanitizer
 | 
			
		||||
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
 | 
			
		||||
import tachiyomi.domain.chapter.interactor.ShouldUpdateDbChapter
 | 
			
		||||
@@ -19,6 +18,7 @@ import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.chapter.model.NoChaptersException
 | 
			
		||||
import tachiyomi.domain.chapter.model.toChapterUpdate
 | 
			
		||||
import tachiyomi.domain.chapter.repository.ChapterRepository
 | 
			
		||||
import tachiyomi.domain.chapter.service.ChapterRecognition
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,8 @@ import eu.kanade.domain.manga.model.isLocal
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadManager
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.ChapterItem
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.chapter.service.getChapterSort
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
import tachiyomi.domain.manga.model.TriStateFilter
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.domain.history.interactor
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
 | 
			
		||||
import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.chapter.service.getChapterSort
 | 
			
		||||
import tachiyomi.domain.history.repository.HistoryRepository
 | 
			
		||||
import tachiyomi.domain.manga.interactor.GetManga
 | 
			
		||||
import kotlin.math.max
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ import eu.kanade.tachiyomi.source.model.FilterList
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.MangasPage
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.SChapter
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.SManga
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.ChapterRecognition
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
 | 
			
		||||
import eu.kanade.tachiyomi.util.storage.DiskUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.storage.EpubFile
 | 
			
		||||
@@ -27,6 +26,7 @@ import nl.adaptivity.xmlutil.serialization.XML
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import tachiyomi.core.util.lang.withIOContext
 | 
			
		||||
import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.domain.chapter.service.ChapterRecognition
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.io.FileInputStream
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,6 @@ import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getNextUnread
 | 
			
		||||
import eu.kanade.tachiyomi.util.removeCovers
 | 
			
		||||
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
 | 
			
		||||
@@ -66,6 +65,7 @@ import tachiyomi.domain.chapter.interactor.UpdateChapter
 | 
			
		||||
import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.chapter.model.ChapterUpdate
 | 
			
		||||
import tachiyomi.domain.chapter.model.NoChaptersException
 | 
			
		||||
import tachiyomi.domain.chapter.service.getChapterSort
 | 
			
		||||
import tachiyomi.domain.manga.interactor.GetDuplicateLibraryManga
 | 
			
		||||
import tachiyomi.domain.manga.interactor.GetMangaWithChapters
 | 
			
		||||
import tachiyomi.domain.manga.interactor.SetMangaChapterFlags
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@ import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
 | 
			
		||||
import eu.kanade.tachiyomi.util.chapter.getChapterSort
 | 
			
		||||
import eu.kanade.tachiyomi.util.editCover
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.byteSize
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.takeBytes
 | 
			
		||||
@@ -72,6 +71,7 @@ import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
 | 
			
		||||
import tachiyomi.domain.chapter.interactor.UpdateChapter
 | 
			
		||||
import tachiyomi.domain.chapter.model.ChapterUpdate
 | 
			
		||||
import tachiyomi.domain.chapter.service.getChapterSort
 | 
			
		||||
import tachiyomi.domain.history.interactor.UpsertHistory
 | 
			
		||||
import tachiyomi.domain.history.model.HistoryUpdate
 | 
			
		||||
import tachiyomi.domain.manga.interactor.GetManga
 | 
			
		||||
 
 | 
			
		||||
@@ -1,119 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.util.chapter
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * -R> = regex conversion.
 | 
			
		||||
 */
 | 
			
		||||
object ChapterRecognition {
 | 
			
		||||
 | 
			
		||||
    private const val NUMBER_PATTERN = """([0-9]+)(\.[0-9]+)?(\.?[a-z]+)?"""
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * All cases with Ch.xx
 | 
			
		||||
     * Mokushiroku Alice Vol.1 Ch. 4: Misrepresentation -R> 4
 | 
			
		||||
     */
 | 
			
		||||
    private val basic = Regex("""(?<=ch\.) *$NUMBER_PATTERN""")
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Example: Bleach 567: Down With Snowwhite -R> 567
 | 
			
		||||
     */
 | 
			
		||||
    private val number = Regex(NUMBER_PATTERN)
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Regex used to remove unwanted tags
 | 
			
		||||
     * Example Prison School 12 v.1 vol004 version1243 volume64 -R> Prison School 12
 | 
			
		||||
     */
 | 
			
		||||
    private val unwanted = Regex("""\b(?:v|ver|vol|version|volume|season|s)[^a-z]?[0-9]+""")
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Regex used to remove unwanted whitespace
 | 
			
		||||
     * Example One Piece 12 special -R> One Piece 12special
 | 
			
		||||
     */
 | 
			
		||||
    private val unwantedWhiteSpace = Regex("""\s(?=extra|special|omake)""")
 | 
			
		||||
 | 
			
		||||
    fun parseChapterNumber(mangaTitle: String, chapterName: String, chapterNumber: Float? = null): Float {
 | 
			
		||||
        // If chapter number is known return.
 | 
			
		||||
        if (chapterNumber != null && (chapterNumber == -2f || chapterNumber > -1f)) {
 | 
			
		||||
            return chapterNumber
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get chapter title with lower case
 | 
			
		||||
        var name = chapterName.lowercase()
 | 
			
		||||
 | 
			
		||||
        // Remove manga title from chapter title.
 | 
			
		||||
        name = name.replace(mangaTitle.lowercase(), "").trim()
 | 
			
		||||
 | 
			
		||||
        // Remove comma's or hyphens.
 | 
			
		||||
        name = name.replace(',', '.').replace('-', '.')
 | 
			
		||||
 | 
			
		||||
        // Remove unwanted white spaces.
 | 
			
		||||
        name = unwantedWhiteSpace.replace(name, "")
 | 
			
		||||
 | 
			
		||||
        // Remove unwanted tags.
 | 
			
		||||
        name = unwanted.replace(name, "")
 | 
			
		||||
 | 
			
		||||
        // Check base case ch.xx
 | 
			
		||||
        basic.find(name)?.let { return getChapterNumberFromMatch(it) }
 | 
			
		||||
 | 
			
		||||
        // Take the first number encountered.
 | 
			
		||||
        number.find(name)?.let { return getChapterNumberFromMatch(it) }
 | 
			
		||||
 | 
			
		||||
        return chapterNumber ?: -1f
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if chapter number is found and return it
 | 
			
		||||
     * @param match result of regex
 | 
			
		||||
     * @return chapter number if found else null
 | 
			
		||||
     */
 | 
			
		||||
    private fun getChapterNumberFromMatch(match: MatchResult): Float {
 | 
			
		||||
        return match.let {
 | 
			
		||||
            val initial = it.groups[1]?.value?.toFloat()!!
 | 
			
		||||
            val subChapterDecimal = it.groups[2]?.value
 | 
			
		||||
            val subChapterAlpha = it.groups[3]?.value
 | 
			
		||||
            val addition = checkForDecimal(subChapterDecimal, subChapterAlpha)
 | 
			
		||||
            initial.plus(addition)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check for decimal in received strings
 | 
			
		||||
     * @param decimal decimal value of regex
 | 
			
		||||
     * @param alpha alpha value of regex
 | 
			
		||||
     * @return decimal/alpha float value
 | 
			
		||||
     */
 | 
			
		||||
    private fun checkForDecimal(decimal: String?, alpha: String?): Float {
 | 
			
		||||
        if (!decimal.isNullOrEmpty()) {
 | 
			
		||||
            return decimal.toFloat()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!alpha.isNullOrEmpty()) {
 | 
			
		||||
            if (alpha.contains("extra")) {
 | 
			
		||||
                return .99f
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (alpha.contains("omake")) {
 | 
			
		||||
                return .98f
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (alpha.contains("special")) {
 | 
			
		||||
                return .97f
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val trimmedAlpha = alpha.trimStart('.')
 | 
			
		||||
            if (trimmedAlpha.length == 1) {
 | 
			
		||||
                return parseAlphaPostFix(trimmedAlpha[0])
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return .0f
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * x.a -> x.1, x.b -> x.2, etc
 | 
			
		||||
     */
 | 
			
		||||
    private fun parseAlphaPostFix(alpha: Char): Float {
 | 
			
		||||
        val number = alpha.code - ('a'.code - 1)
 | 
			
		||||
        if (number >= 10) return 0f
 | 
			
		||||
        return number / 10f
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.util.chapter
 | 
			
		||||
 | 
			
		||||
import tachiyomi.domain.chapter.model.Chapter
 | 
			
		||||
import tachiyomi.domain.manga.model.Manga
 | 
			
		||||
 | 
			
		||||
fun getChapterSort(manga: Manga, sortDescending: Boolean = manga.sortDescending()): (Chapter, Chapter) -> Int {
 | 
			
		||||
    return when (manga.sorting) {
 | 
			
		||||
        Manga.CHAPTER_SORTING_SOURCE -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c1.sourceOrder.compareTo(c2.sourceOrder) }
 | 
			
		||||
            false -> { c1, c2 -> c2.sourceOrder.compareTo(c1.sourceOrder) }
 | 
			
		||||
        }
 | 
			
		||||
        Manga.CHAPTER_SORTING_NUMBER -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c2.chapterNumber.compareTo(c1.chapterNumber) }
 | 
			
		||||
            false -> { c1, c2 -> c1.chapterNumber.compareTo(c2.chapterNumber) }
 | 
			
		||||
        }
 | 
			
		||||
        Manga.CHAPTER_SORTING_UPLOAD_DATE -> when (sortDescending) {
 | 
			
		||||
            true -> { c1, c2 -> c2.dateUpload.compareTo(c1.dateUpload) }
 | 
			
		||||
            false -> { c1, c2 -> c1.dateUpload.compareTo(c2.dateUpload) }
 | 
			
		||||
        }
 | 
			
		||||
        else -> throw NotImplementedError("Invalid chapter sorting method: ${manga.sorting}")
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user