Update parsers
This commit is contained in:
@@ -17,7 +17,7 @@ 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.MangaListFilter
|
import org.koitharu.kotatsu.parsers.model.MangaListFilter
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaState
|
import org.koitharu.kotatsu.parsers.model.MangaState
|
||||||
import org.koitharu.kotatsu.parsers.util.formatSimple
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.mapToSet
|
import org.koitharu.kotatsu.parsers.util.mapToSet
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
@@ -29,8 +29,6 @@ fun Collection<Manga>.distinctById() = distinctBy { it.id }
|
|||||||
@JvmName("chaptersIds")
|
@JvmName("chaptersIds")
|
||||||
fun Collection<MangaChapter>.ids() = mapToSet { it.id }
|
fun Collection<MangaChapter>.ids() = mapToSet { it.id }
|
||||||
|
|
||||||
fun Collection<MangaChapter>.findById(id: Long) = find { x -> x.id == id }
|
|
||||||
|
|
||||||
fun Collection<ChapterListItem>.countChaptersByBranch(): Int {
|
fun Collection<ChapterListItem>.countChaptersByBranch(): Int {
|
||||||
if (size <= 1) {
|
if (size <= 1) {
|
||||||
return size
|
return size
|
||||||
@@ -84,14 +82,6 @@ val Demographic.titleResId: Int
|
|||||||
Demographic.NONE -> R.string.none
|
Demographic.NONE -> R.string.none
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Manga.findChapter(id: Long): MangaChapter? {
|
|
||||||
return chapters?.findById(id)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Manga.requireChapter(id: Long): MangaChapter = checkNotNull(findChapter(id)) {
|
|
||||||
"Chapter $id not found"
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Manga.getPreferredBranch(history: MangaHistory?): String? {
|
fun Manga.getPreferredBranch(history: MangaHistory?): String? {
|
||||||
val ch = chapters
|
val ch = chapters
|
||||||
if (ch.isNullOrEmpty()) {
|
if (ch.isNullOrEmpty()) {
|
||||||
@@ -140,12 +130,6 @@ val Manga.appUrl: Uri
|
|||||||
.appendQueryParameter("url", url)
|
.appendQueryParameter("url", url)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
fun MangaChapter.formatNumber(): String? = if (number > 0f) {
|
|
||||||
number.formatSimple()
|
|
||||||
} else {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Manga.chaptersCount(): Int {
|
fun Manga.chaptersCount(): Int {
|
||||||
if (chapters.isNullOrEmpty()) {
|
if (chapters.isNullOrEmpty()) {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.koitharu.kotatsu.core.parser
|
package org.koitharu.kotatsu.core.parser
|
||||||
|
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.koitharu.kotatsu.core.cache.MemoryContentCache
|
import org.koitharu.kotatsu.core.cache.MemoryContentCache
|
||||||
@@ -17,9 +18,9 @@ import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
import org.koitharu.kotatsu.parsers.model.MangaPage
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
|
||||||
import org.koitharu.kotatsu.parsers.util.domain
|
import org.koitharu.kotatsu.parsers.util.domain
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
|
|
||||||
class ParserMangaRepository(
|
class ParserMangaRepository(
|
||||||
private val parser: MangaParser,
|
private val parser: MangaParser,
|
||||||
@@ -27,7 +28,7 @@ class ParserMangaRepository(
|
|||||||
cache: MemoryContentCache,
|
cache: MemoryContentCache,
|
||||||
) : CachingMangaRepository(cache), Interceptor {
|
) : CachingMangaRepository(cache), Interceptor {
|
||||||
|
|
||||||
private val filterOptionsLazy = SuspendLazy {
|
private val filterOptionsLazy = suspendLazy(Dispatchers.Default) {
|
||||||
mirrorSwitchInterceptor.withMirrorSwitching {
|
mirrorSwitchInterceptor.withMirrorSwitching {
|
||||||
parser.getFilterOptions()
|
parser.getFilterOptions()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions
|
import org.koitharu.kotatsu.parsers.model.MangaListFilterOptions
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
import org.koitharu.kotatsu.parsers.model.MangaPage
|
||||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import java.util.EnumSet
|
import java.util.EnumSet
|
||||||
|
|
||||||
class ExternalMangaRepository(
|
class ExternalMangaRepository(
|
||||||
@@ -32,7 +32,7 @@ class ExternalMangaRepository(
|
|||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val filterOptions = SuspendLazy(contentSource::getListFilterOptions)
|
private val filterOptions = suspendLazy(initializer = contentSource::getListFilterOptions)
|
||||||
|
|
||||||
override val sortOrders: Set<SortOrder>
|
override val sortOrders: Set<SortOrder>
|
||||||
get() = capabilities?.availableSortOrders ?: EnumSet.of(SortOrder.POPULARITY)
|
get() = capabilities?.availableSortOrders ?: EnumSet.of(SortOrder.POPULARITY)
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ import kotlinx.coroutines.flow.onEach
|
|||||||
import kotlinx.coroutines.flow.transform
|
import kotlinx.coroutines.flow.transform
|
||||||
import kotlinx.coroutines.flow.transformLatest
|
import kotlinx.coroutines.flow.transformLatest
|
||||||
import kotlinx.coroutines.flow.transformWhile
|
import kotlinx.coroutines.flow.transformWhile
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.SuspendLazy
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
|
|
||||||
@@ -133,4 +134,4 @@ suspend fun <T : Any> Flow<T?>.firstNotNullOrNull(): T? = firstOrNull { x -> x !
|
|||||||
|
|
||||||
fun <T> Flow<Flow<T>>.flattenLatest() = flatMapLatest { it }
|
fun <T> Flow<Flow<T>>.flattenLatest() = flatMapLatest { it }
|
||||||
|
|
||||||
fun <T> SuspendLazy<T>.asFlow() = flow { emit(tryGet()) }
|
fun <T> SuspendLazy<T>.asFlow() = flow { emit(runCatchingCancellable { get() }) }
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.koitharu.kotatsu.details.domain
|
package org.koitharu.kotatsu.details.domain
|
||||||
|
|
||||||
import org.koitharu.kotatsu.core.db.MangaDatabase
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
import org.koitharu.kotatsu.core.model.findChapter
|
|
||||||
import org.koitharu.kotatsu.core.model.isLocal
|
import org.koitharu.kotatsu.core.model.isLocal
|
||||||
import org.koitharu.kotatsu.core.os.NetworkState
|
import org.koitharu.kotatsu.core.os.NetworkState
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
@@ -33,8 +32,8 @@ class ProgressUpdateUseCase @Inject constructor(
|
|||||||
} else {
|
} else {
|
||||||
seed
|
seed
|
||||||
}
|
}
|
||||||
val chapter = details.findChapter(history.chapterId) ?: return PROGRESS_NONE
|
val chapter = details.findChapterById(history.chapterId) ?: return PROGRESS_NONE
|
||||||
val chapters = details.getChapters(chapter.branch) ?: return PROGRESS_NONE
|
val chapters = details.getChapters(chapter.branch)
|
||||||
val chaptersCount = chapters.size
|
val chaptersCount = chapters.size
|
||||||
if (chaptersCount == 0) {
|
if (chaptersCount == 0) {
|
||||||
return PROGRESS_NONE
|
return PROGRESS_NONE
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package org.koitharu.kotatsu.details.domain
|
package org.koitharu.kotatsu.details.domain
|
||||||
|
|
||||||
import org.koitharu.kotatsu.core.model.MangaHistory
|
import org.koitharu.kotatsu.core.model.MangaHistory
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
import org.koitharu.kotatsu.details.data.MangaDetails
|
import org.koitharu.kotatsu.details.data.MangaDetails
|
||||||
import org.koitharu.kotatsu.details.data.ReadingTime
|
import org.koitharu.kotatsu.details.data.ReadingTime
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.stats.data.StatsRepository
|
import org.koitharu.kotatsu.stats.data.StatsRepository
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import dagger.hilt.android.AndroidEntryPoint
|
|||||||
import dagger.hilt.android.EntryPointAccessors
|
import dagger.hilt.android.EntryPointAccessors
|
||||||
import org.koitharu.kotatsu.core.cache.MemoryContentCache
|
import org.koitharu.kotatsu.core.cache.MemoryContentCache
|
||||||
import org.koitharu.kotatsu.core.model.LocalMangaSource
|
import org.koitharu.kotatsu.core.model.LocalMangaSource
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.model.isLocal
|
import org.koitharu.kotatsu.core.model.isLocal
|
||||||
import org.koitharu.kotatsu.core.model.parcelable.ParcelableChapter
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableChapter
|
||||||
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
|
||||||
@@ -19,6 +18,7 @@ import org.koitharu.kotatsu.history.data.HistoryRepository
|
|||||||
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
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import kotlinx.coroutines.flow.stateIn
|
|||||||
import kotlinx.coroutines.plus
|
import kotlinx.coroutines.plus
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
||||||
import org.koitharu.kotatsu.core.parser.MangaIntent
|
import org.koitharu.kotatsu.core.parser.MangaIntent
|
||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
@@ -47,6 +46,7 @@ import org.koitharu.kotatsu.local.data.LocalStorageChanges
|
|||||||
import org.koitharu.kotatsu.local.domain.DeleteLocalMangaUseCase
|
import org.koitharu.kotatsu.local.domain.DeleteLocalMangaUseCase
|
||||||
import org.koitharu.kotatsu.local.domain.model.LocalManga
|
import org.koitharu.kotatsu.local.domain.model.LocalManga
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import org.koitharu.kotatsu.reader.ui.ReaderState
|
import org.koitharu.kotatsu.reader.ui.ReaderState
|
||||||
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
|
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.koitharu.kotatsu.details.ui.adapter
|
|||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
|
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
|
||||||
import org.koitharu.kotatsu.core.model.formatNumber
|
|
||||||
import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter
|
import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter
|
||||||
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
||||||
import org.koitharu.kotatsu.core.util.ext.getThemeColorStateList
|
import org.koitharu.kotatsu.core.util.ext.getThemeColorStateList
|
||||||
@@ -22,7 +21,7 @@ fun chapterGridItemAD(
|
|||||||
|
|
||||||
bind { payloads ->
|
bind { payloads ->
|
||||||
if (payloads.isEmpty()) {
|
if (payloads.isEmpty()) {
|
||||||
binding.textViewTitle.text = item.chapter.formatNumber() ?: "?"
|
binding.textViewTitle.text = item.chapter.numberString() ?: "?"
|
||||||
}
|
}
|
||||||
binding.imageViewNew.isVisible = item.isNew
|
binding.imageViewNew.isVisible = item.isNew
|
||||||
binding.imageViewCurrent.isVisible = item.isCurrent
|
binding.imageViewCurrent.isVisible = item.isCurrent
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.koitharu.kotatsu.details.ui.adapter
|
package org.koitharu.kotatsu.details.ui.adapter
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import org.koitharu.kotatsu.core.model.formatNumber
|
|
||||||
import org.koitharu.kotatsu.core.ui.BaseListAdapter
|
import org.koitharu.kotatsu.core.ui.BaseListAdapter
|
||||||
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
|
||||||
import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller
|
import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller
|
||||||
@@ -33,7 +32,7 @@ class ChaptersAdapter(
|
|||||||
findHeader(position)?.getText(context)
|
findHeader(position)?.getText(context)
|
||||||
} else {
|
} else {
|
||||||
val chapter = (items.getOrNull(position) as? ChapterListItem)?.chapter ?: return null
|
val chapter = (items.getOrNull(position) as? ChapterListItem)?.chapter ?: return null
|
||||||
if (chapter.number > 0) chapter.formatNumber() else null
|
chapter.numberString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.koitharu.kotatsu.details.ui.model
|
|||||||
|
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
import org.jsoup.internal.StringUtil.StringJoiner
|
import org.jsoup.internal.StringUtil.StringJoiner
|
||||||
import org.koitharu.kotatsu.core.model.formatNumber
|
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
@@ -53,7 +52,7 @@ data class ChapterListItem(
|
|||||||
|
|
||||||
private fun buildDescription(): String {
|
private fun buildDescription(): String {
|
||||||
val joiner = StringJoiner(" • ")
|
val joiner = StringJoiner(" • ")
|
||||||
chapter.formatNumber()?.let {
|
chapter.numberString()?.let {
|
||||||
joiner.add("#").append(it)
|
joiner.add("#").append(it)
|
||||||
}
|
}
|
||||||
uploadDate?.let { date ->
|
uploadDate?.let { date ->
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import kotlinx.coroutines.Job
|
|||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.plus
|
import kotlinx.coroutines.plus
|
||||||
import org.koitharu.kotatsu.core.model.requireChapter
|
|
||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
import org.koitharu.kotatsu.core.prefs.observeAsStateFlow
|
import org.koitharu.kotatsu.core.prefs.observeAsStateFlow
|
||||||
import org.koitharu.kotatsu.core.ui.BaseViewModel
|
import org.koitharu.kotatsu.core.ui.BaseViewModel
|
||||||
@@ -90,7 +89,7 @@ class PagesViewModel @Inject constructor(
|
|||||||
val tasks = pages.map {
|
val tasks = pages.map {
|
||||||
PageSaveHelper.Task(
|
PageSaveHelper.Task(
|
||||||
manga = manga,
|
manga = manga,
|
||||||
chapter = manga.requireChapter(it.chapterId),
|
chapter = manga.requireChapterById(it.chapterId),
|
||||||
pageNumber = it.index + 1,
|
pageNumber = it.index + 1,
|
||||||
page = it.toMangaPage(),
|
page = it.toMangaPage(),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import org.koitharu.kotatsu.history.data.HistoryRepository
|
|||||||
import org.koitharu.kotatsu.local.data.LocalMangaRepository
|
import org.koitharu.kotatsu.local.data.LocalMangaRepository
|
||||||
import org.koitharu.kotatsu.local.data.LocalStorageManager
|
import org.koitharu.kotatsu.local.data.LocalStorageManager
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
|
||||||
import org.koitharu.kotatsu.parsers.util.mapToSet
|
import org.koitharu.kotatsu.parsers.util.mapToSet
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import org.koitharu.kotatsu.settings.storage.DirectoryModel
|
import org.koitharu.kotatsu.settings.storage.DirectoryModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ class DownloadDialogViewModel @Inject constructor(
|
|||||||
val manga = savedStateHandle.require<Array<ParcelableManga>>(DownloadDialogFragment.ARG_MANGA).map {
|
val manga = savedStateHandle.require<Array<ParcelableManga>>(DownloadDialogFragment.ARG_MANGA).map {
|
||||||
it.manga
|
it.manga
|
||||||
}
|
}
|
||||||
private val mangaDetails = SuspendLazy {
|
private val mangaDetails = suspendLazy {
|
||||||
coroutineScope {
|
coroutineScope {
|
||||||
manga.map { m ->
|
manga.map { m ->
|
||||||
async { m.getDetails() }
|
async { m.getDetails() }
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import kotlinx.coroutines.plus
|
|||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.model.formatNumber
|
|
||||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
import org.koitharu.kotatsu.core.ui.BaseViewModel
|
import org.koitharu.kotatsu.core.ui.BaseViewModel
|
||||||
@@ -308,7 +307,7 @@ class DownloadsViewModel @Inject constructor(
|
|||||||
return chapters.mapNotNullTo(ArrayList(size)) {
|
return chapters.mapNotNullTo(ArrayList(size)) {
|
||||||
if (chapterIds == null || it.id in chapterIds) {
|
if (chapterIds == null || it.id in chapterIds) {
|
||||||
DownloadChapter(
|
DownloadChapter(
|
||||||
number = it.formatNumber(),
|
number = it.numberString(),
|
||||||
name = it.name,
|
name = it.name,
|
||||||
isDownloaded = it.id in localChapters,
|
isDownloaded = it.id in localChapters,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ import org.koitharu.kotatsu.parsers.model.MangaState
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||||
import org.koitharu.kotatsu.parsers.model.YEAR_MIN
|
import org.koitharu.kotatsu.parsers.model.YEAR_MIN
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
|
||||||
import org.koitharu.kotatsu.parsers.util.ifZero
|
import org.koitharu.kotatsu.parsers.util.ifZero
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment
|
import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment
|
||||||
import org.koitharu.kotatsu.search.domain.MangaSearchRepository
|
import org.koitharu.kotatsu.search.domain.MangaSearchRepository
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
@@ -59,7 +59,7 @@ class FilterCoordinator @Inject constructor(
|
|||||||
private val currentSortOrder = MutableStateFlow(repository.defaultSortOrder)
|
private val currentSortOrder = MutableStateFlow(repository.defaultSortOrder)
|
||||||
|
|
||||||
private val availableSortOrders = repository.sortOrders
|
private val availableSortOrders = repository.sortOrders
|
||||||
private val filterOptions = SuspendLazy { repository.getFilterOptions() }
|
private val filterOptions = suspendLazy { repository.getFilterOptions() }
|
||||||
val capabilities = repository.filterCapabilities
|
val capabilities = repository.filterCapabilities
|
||||||
|
|
||||||
val mangaSource: MangaSource
|
val mangaSource: MangaSource
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import org.koitharu.kotatsu.core.db.entity.toMangaList
|
|||||||
import org.koitharu.kotatsu.core.db.entity.toMangaTags
|
import org.koitharu.kotatsu.core.db.entity.toMangaTags
|
||||||
import org.koitharu.kotatsu.core.db.entity.toMangaTagsList
|
import org.koitharu.kotatsu.core.db.entity.toMangaTagsList
|
||||||
import org.koitharu.kotatsu.core.model.MangaHistory
|
import org.koitharu.kotatsu.core.model.MangaHistory
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.model.isLocal
|
import org.koitharu.kotatsu.core.model.isLocal
|
||||||
import org.koitharu.kotatsu.core.model.isNsfw
|
import org.koitharu.kotatsu.core.model.isNsfw
|
||||||
import org.koitharu.kotatsu.core.model.toMangaSources
|
import org.koitharu.kotatsu.core.model.toMangaSources
|
||||||
@@ -30,6 +29,7 @@ import org.koitharu.kotatsu.list.domain.ReadingProgress
|
|||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.levenshteinDistance
|
import org.koitharu.kotatsu.parsers.util.levenshteinDistance
|
||||||
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
|
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
|
||||||
import org.koitharu.kotatsu.scrobbling.common.domain.tryScrobble
|
import org.koitharu.kotatsu.scrobbling.common.domain.tryScrobble
|
||||||
|
|||||||
@@ -6,14 +6,15 @@ import kotlinx.coroutines.flow.asStateFlow
|
|||||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
import org.koitharu.kotatsu.core.ui.widgets.ChipsView
|
import org.koitharu.kotatsu.core.ui.widgets.ChipsView
|
||||||
import org.koitharu.kotatsu.list.ui.model.QuickFilter
|
import org.koitharu.kotatsu.list.ui.model.QuickFilter
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
|
|
||||||
abstract class MangaListQuickFilter(
|
abstract class MangaListQuickFilter(
|
||||||
private val settings: AppSettings,
|
private val settings: AppSettings,
|
||||||
) : QuickFilterListener {
|
) : QuickFilterListener {
|
||||||
|
|
||||||
private val appliedFilter = MutableStateFlow<Set<ListFilterOption>>(emptySet())
|
private val appliedFilter = MutableStateFlow<Set<ListFilterOption>>(emptySet())
|
||||||
private val availableFilterOptions = SuspendLazy {
|
private val availableFilterOptions = suspendLazy {
|
||||||
getAvailableFilterOptions()
|
getAvailableFilterOptions()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ abstract class MangaListQuickFilter(
|
|||||||
if (!settings.isQuickFilterEnabled) {
|
if (!settings.isQuickFilterEnabled) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
val availableOptions = availableFilterOptions.tryGet().getOrNull()?.map { option ->
|
val availableOptions = availableFilterOptions.getOrNull()?.map { option ->
|
||||||
ChipsView.ChipModel(
|
ChipsView.ChipModel(
|
||||||
title = option.titleText,
|
title = option.titleText,
|
||||||
titleResId = option.titleResId,
|
titleResId = option.titleResId,
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ import org.koitharu.kotatsu.core.util.ext.subdir
|
|||||||
import org.koitharu.kotatsu.core.util.ext.takeIfReadable
|
import org.koitharu.kotatsu.core.util.ext.takeIfReadable
|
||||||
import org.koitharu.kotatsu.core.util.ext.takeIfWriteable
|
import org.koitharu.kotatsu.core.util.ext.takeIfWriteable
|
||||||
import org.koitharu.kotatsu.core.util.ext.writeAllCancellable
|
import org.koitharu.kotatsu.core.util.ext.writeAllCancellable
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -32,13 +32,13 @@ import javax.inject.Singleton
|
|||||||
@Singleton
|
@Singleton
|
||||||
class PagesCache @Inject constructor(@ApplicationContext context: Context) {
|
class PagesCache @Inject constructor(@ApplicationContext context: Context) {
|
||||||
|
|
||||||
private val cacheDir = SuspendLazy {
|
private val cacheDir = suspendLazy {
|
||||||
val dirs = context.externalCacheDirs + context.cacheDir
|
val dirs = context.externalCacheDirs + context.cacheDir
|
||||||
dirs.firstNotNullOf {
|
dirs.firstNotNullOf {
|
||||||
it?.subdir(CacheDir.PAGES.dir)?.takeIfWriteable()
|
it?.subdir(CacheDir.PAGES.dir)?.takeIfWriteable()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private val lruCache = SuspendLazy {
|
private val lruCache = suspendLazy {
|
||||||
val dir = cacheDir.get()
|
val dir = cacheDir.get()
|
||||||
val availableSize = (getAvailableSize() * 0.8).toLong()
|
val availableSize = (getAvailableSize() * 0.8).toLong()
|
||||||
val size = SIZE_DEFAULT.coerceAtMost(availableSize).coerceAtLeast(SIZE_MIN)
|
val size = SIZE_DEFAULT.coerceAtMost(availableSize).coerceAtLeast(SIZE_MIN)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.channelFlow
|
|||||||
import kotlinx.coroutines.flow.fold
|
import kotlinx.coroutines.flow.fold
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.model.ids
|
import org.koitharu.kotatsu.core.model.ids
|
||||||
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
|
||||||
@@ -18,6 +17,7 @@ import org.koitharu.kotatsu.local.data.LocalStorageChanges
|
|||||||
import org.koitharu.kotatsu.local.domain.model.LocalManga
|
import org.koitharu.kotatsu.local.domain.model.LocalManga
|
||||||
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.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.recoverCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.recoverCatchingCancellable
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -77,8 +77,8 @@ class DeleteReadChaptersUseCase @Inject constructor(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
val branch = (chapters.findById(history.chapterId) ?: return null).branch
|
val branch = (chapters.findById(history.chapterId) ?: return null).branch
|
||||||
val filteredChapters = manga.manga.getChapters(branch)?.takeWhile { it.id != history.chapterId }
|
val filteredChapters = manga.manga.getChapters(branch).takeWhile { it.id != history.chapterId }
|
||||||
return if (filteredChapters.isNullOrEmpty()) {
|
return if (filteredChapters.isEmpty()) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
DeletionTask(
|
DeletionTask(
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import coil3.request.ErrorResult
|
|||||||
import coil3.request.ImageResult
|
import coil3.request.ImageResult
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.Bookmark
|
import org.koitharu.kotatsu.bookmarks.domain.Bookmark
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.model.isLocal
|
import org.koitharu.kotatsu.core.model.isLocal
|
||||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
@@ -15,6 +14,7 @@ import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty
|
|||||||
import org.koitharu.kotatsu.core.util.ext.mangaKey
|
import org.koitharu.kotatsu.core.util.ext.mangaKey
|
||||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import androidx.core.net.toFile
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.runInterruptible
|
import kotlinx.coroutines.runInterruptible
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import org.koitharu.kotatsu.core.model.findChapter
|
|
||||||
import org.koitharu.kotatsu.core.network.MangaHttpClient
|
import org.koitharu.kotatsu.core.network.MangaHttpClient
|
||||||
import org.koitharu.kotatsu.core.network.imageproxy.ImageProxyInterceptor
|
import org.koitharu.kotatsu.core.network.imageproxy.ImageProxyInterceptor
|
||||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||||
@@ -40,7 +39,7 @@ class DetectReaderModeUseCase @Inject constructor(
|
|||||||
if (!settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON) {
|
if (!settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON) {
|
||||||
return defaultMode
|
return defaultMode
|
||||||
}
|
}
|
||||||
val chapter = state?.let { manga.findChapter(it.chapterId) }
|
val chapter = state?.let { manga.findChapterById(it.chapterId) }
|
||||||
?: manga.chapters?.firstOrNull()
|
?: manga.chapters?.firstOrNull()
|
||||||
?: error("There are no chapters in this manga")
|
?: error("There are no chapters in this manga")
|
||||||
val repo = mangaRepositoryFactory.create(manga.source)
|
val repo = mangaRepositoryFactory.create(manga.source)
|
||||||
|
|||||||
@@ -30,9 +30,7 @@ import kotlinx.coroutines.plus
|
|||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.Bookmark
|
import org.koitharu.kotatsu.bookmarks.domain.Bookmark
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
||||||
import org.koitharu.kotatsu.core.model.findChapter
|
|
||||||
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
import org.koitharu.kotatsu.core.model.getPreferredBranch
|
||||||
import org.koitharu.kotatsu.core.model.requireChapter
|
|
||||||
import org.koitharu.kotatsu.core.os.AppShortcutManager
|
import org.koitharu.kotatsu.core.os.AppShortcutManager
|
||||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||||
import org.koitharu.kotatsu.core.parser.MangaIntent
|
import org.koitharu.kotatsu.core.parser.MangaIntent
|
||||||
@@ -262,7 +260,7 @@ class ReaderViewModel @Inject constructor(
|
|||||||
val currentManga = manga.requireValue()
|
val currentManga = manga.requireValue()
|
||||||
val task = PageSaveHelper.Task(
|
val task = PageSaveHelper.Task(
|
||||||
manga = currentManga,
|
manga = currentManga,
|
||||||
chapter = currentManga.requireChapter(state.chapterId),
|
chapter = currentManga.requireChapterById(state.chapterId),
|
||||||
pageNumber = state.page + 1,
|
pageNumber = state.page + 1,
|
||||||
page = checkNotNull(getCurrentPage()) { "Cannot find current page" },
|
page = checkNotNull(getCurrentPage()) { "Cannot find current page" },
|
||||||
)
|
)
|
||||||
@@ -498,7 +496,7 @@ class ReaderViewModel @Inject constructor(
|
|||||||
val history = historyRepository.getOne(manga)
|
val history = historyRepository.getOne(manga)
|
||||||
val preselectedBranch = selectedBranch.value
|
val preselectedBranch = selectedBranch.value
|
||||||
val result = if (history != null) {
|
val result = if (history != null) {
|
||||||
if (preselectedBranch != null && preselectedBranch != manga.findChapter(history.chapterId)?.branch) {
|
if (preselectedBranch != null && preselectedBranch != manga.findChapterById(history.chapterId)?.branch) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
ReaderState(history)
|
ReaderState(history)
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import org.koitharu.kotatsu.core.parser.ParserMangaRepository
|
|||||||
import org.koitharu.kotatsu.core.util.ext.mapToArray
|
import org.koitharu.kotatsu.core.util.ext.mapToArray
|
||||||
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
import org.koitharu.kotatsu.parsers.config.ConfigKey
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull
|
||||||
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
|
|
||||||
class ImageServerDelegate(
|
class ImageServerDelegate(
|
||||||
@@ -19,30 +20,30 @@ class ImageServerDelegate(
|
|||||||
private val mangaSource: MangaSource?,
|
private val mangaSource: MangaSource?,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val repositoryLazy = SuspendLazy {
|
private val repositoryLazy = suspendLazy {
|
||||||
mangaRepositoryFactory.create(checkNotNull(mangaSource)) as ParserMangaRepository
|
mangaRepositoryFactory.create(checkNotNull(mangaSource)) as ParserMangaRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun isAvailable() = withContext(Dispatchers.Default) {
|
suspend fun isAvailable() = withContext(Dispatchers.Default) {
|
||||||
repositoryLazy.tryGet().map { repository ->
|
repositoryLazy.getOrNull()?.let { repository ->
|
||||||
repository.getConfigKeys().any { it is ConfigKey.PreferredImageServer }
|
repository.getConfigKeys().any { it is ConfigKey.PreferredImageServer }
|
||||||
}.getOrDefault(false)
|
} == true
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getValue(): String? = withContext(Dispatchers.Default) {
|
suspend fun getValue(): String? = withContext(Dispatchers.Default) {
|
||||||
repositoryLazy.tryGet().map { repository ->
|
repositoryLazy.getOrNull()?.let { repository ->
|
||||||
val key = repository.getConfigKeys().firstNotNullOfOrNull { it as? ConfigKey.PreferredImageServer }
|
val key = repository.getConfigKeys().firstNotNullOfOrNull { it as? ConfigKey.PreferredImageServer }
|
||||||
if (key != null) {
|
if (key != null) {
|
||||||
key.presetValues[repository.getConfig()[key]]
|
key.presetValues[repository.getConfig()[key]]
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}.getOrNull()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun showDialog(context: Context): Boolean {
|
suspend fun showDialog(context: Context): Boolean {
|
||||||
val repository = withContext(Dispatchers.Default) {
|
val repository = withContext(Dispatchers.Default) {
|
||||||
repositoryLazy.tryGet().getOrNull()
|
repositoryLazy.getOrNull()
|
||||||
} ?: return false
|
} ?: return false
|
||||||
val key = repository.getConfigKeys().firstNotNullOfOrNull {
|
val key = repository.getConfigKeys().firstNotNullOfOrNull {
|
||||||
it as? ConfigKey.PreferredImageServer
|
it as? ConfigKey.PreferredImageServer
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import kotlinx.coroutines.flow.Flow
|
|||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.koitharu.kotatsu.core.db.MangaDatabase
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
import org.koitharu.kotatsu.core.model.findById
|
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
import org.koitharu.kotatsu.core.util.ext.findKeyByValue
|
import org.koitharu.kotatsu.core.util.ext.findKeyByValue
|
||||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||||
import org.koitharu.kotatsu.core.util.ext.sanitize
|
import org.koitharu.kotatsu.core.util.ext.sanitize
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
|
import org.koitharu.kotatsu.parsers.util.findById
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository
|
||||||
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblingEntity
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.koitharu.kotatsu.core.util.ext.MutableEventFlow
|
|||||||
import org.koitharu.kotatsu.core.util.ext.call
|
import org.koitharu.kotatsu.core.util.ext.call
|
||||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||||
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
|
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
|
||||||
import org.koitharu.kotatsu.parsers.util.SuspendLazy
|
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
@@ -31,7 +31,7 @@ class RestoreViewModel @Inject constructor(
|
|||||||
@ApplicationContext context: Context,
|
@ApplicationContext context: Context,
|
||||||
) : BaseViewModel() {
|
) : BaseViewModel() {
|
||||||
|
|
||||||
private val backupInput = SuspendLazy {
|
private val backupInput = suspendLazy {
|
||||||
val uri = savedStateHandle.get<String>(RestoreDialogFragment.ARG_FILE)
|
val uri = savedStateHandle.get<String>(RestoreDialogFragment.ARG_FILE)
|
||||||
?.toUriOrNull() ?: throw FileNotFoundException()
|
?.toUriOrNull() ?: throw FileNotFoundException()
|
||||||
val contentResolver = context.contentResolver
|
val contentResolver = context.contentResolver
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ material = "1.12.0"
|
|||||||
moshi = "1.15.1"
|
moshi = "1.15.1"
|
||||||
okhttp = "4.12.0"
|
okhttp = "4.12.0"
|
||||||
okio = "3.9.1"
|
okio = "3.9.1"
|
||||||
parsers = "f610ae6412"
|
parsers = "8b4bac3cc2"
|
||||||
preference = "1.2.1"
|
preference = "1.2.1"
|
||||||
recyclerview = "1.3.2"
|
recyclerview = "1.3.2"
|
||||||
room = "2.6.1"
|
room = "2.6.1"
|
||||||
@@ -37,7 +37,7 @@ runner = "1.6.2"
|
|||||||
rules = "1.6.1"
|
rules = "1.6.1"
|
||||||
ssiv = "d1d10a6975"
|
ssiv = "d1d10a6975"
|
||||||
swiperefreshlayout = "1.1.0"
|
swiperefreshlayout = "1.1.0"
|
||||||
kspPlugin = "2.0.21-1.0.26"
|
kspPlugin = "2.0.21-1.0.27"
|
||||||
transition = "1.5.1"
|
transition = "1.5.1"
|
||||||
viewpager2 = "1.1.0"
|
viewpager2 = "1.1.0"
|
||||||
webkit = "1.12.1"
|
webkit = "1.12.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user