mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Migrate to more domain model usages
This commit is contained in:
		| @@ -4,7 +4,6 @@ import eu.kanade.data.chapter.CleanupChapterName | ||||
| import eu.kanade.data.chapter.NoChaptersException | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toChapterUpdate | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.chapter.repository.ChapterRepository | ||||
| import eu.kanade.domain.manga.interactor.UpdateManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| @@ -111,7 +110,7 @@ class SyncChaptersWithSource( | ||||
|                         downloadManager.isChapterDownloaded(dbChapter.name, dbChapter.scanlator, manga.title, manga.source) | ||||
|  | ||||
|                     if (shouldRenameChapter) { | ||||
|                         downloadManager.renameChapter(source, manga, dbChapter.toDbChapter(), chapter.toDbChapter()) | ||||
|                         downloadManager.renameChapter(source, manga, dbChapter, chapter) | ||||
|                     } | ||||
|                     var toChangeChapter = dbChapter.copy( | ||||
|                         name = chapter.name, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package eu.kanade.domain.download.interactor | ||||
|  | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| @@ -14,7 +13,7 @@ class DeleteDownload( | ||||
|  | ||||
|     suspend fun awaitAll(manga: Manga, vararg chapters: Chapter) = withNonCancellableContext { | ||||
|         sourceManager.get(manga.source)?.let { source -> | ||||
|             downloadManager.deleteChapters(chapters.map { it.toDbChapter() }, manga, source) | ||||
|             downloadManager.deleteChapters(chapters.toList(), manga, source) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.domain.manga.model.MangaUpdate | ||||
| import eu.kanade.domain.manga.model.hasCustomCover | ||||
| import eu.kanade.domain.manga.model.isLocal | ||||
| import eu.kanade.domain.manga.model.toDbManga | ||||
| import eu.kanade.domain.manga.repository.MangaRepository | ||||
| import eu.kanade.tachiyomi.data.cache.CoverCache | ||||
| import eu.kanade.tachiyomi.source.model.SManga | ||||
| @@ -46,11 +45,11 @@ class UpdateManga( | ||||
|                 !manualFetch && localManga.thumbnailUrl == remoteManga.thumbnail_url -> null | ||||
|                 localManga.isLocal() -> Date().time | ||||
|                 localManga.hasCustomCover(coverCache) -> { | ||||
|                     coverCache.deleteFromCache(localManga.toDbManga(), false) | ||||
|                     coverCache.deleteFromCache(localManga, false) | ||||
|                     null | ||||
|                 } | ||||
|                 else -> { | ||||
|                     coverCache.deleteFromCache(localManga.toDbManga(), false) | ||||
|                     coverCache.deleteFromCache(localManga, false) | ||||
|                     Date().time | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| package eu.kanade.tachiyomi.data.cache | ||||
|  | ||||
| import android.content.Context | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import java.io.File | ||||
| import java.io.IOException | ||||
| import java.io.InputStream | ||||
| import eu.kanade.domain.manga.model.Manga as DomainManga | ||||
|  | ||||
| /** | ||||
|  * Class used to create cover cache. | ||||
| @@ -76,7 +75,7 @@ class CoverCache(private val context: Context) { | ||||
|     fun deleteFromCache(manga: Manga, deleteCustomCover: Boolean = false): Int { | ||||
|         var deleted = 0 | ||||
|  | ||||
|         getCoverFile(manga.thumbnail_url)?.let { | ||||
|         getCoverFile(manga.thumbnailUrl)?.let { | ||||
|             if (it.exists() && it.delete()) ++deleted | ||||
|         } | ||||
|  | ||||
| @@ -87,20 +86,6 @@ class CoverCache(private val context: Context) { | ||||
|         return deleted | ||||
|     } | ||||
|  | ||||
|     fun deleteFromCache(manga: DomainManga, deleteCustomCover: Boolean = false): Int { | ||||
|         var amountDeleted = 0 | ||||
|  | ||||
|         getCoverFile(manga.thumbnailUrl)?.let { | ||||
|             if (it.exists() && it.delete()) amountDeleted++ | ||||
|         } | ||||
|  | ||||
|         if (deleteCustomCover && deleteCustomCover(manga.id)) { | ||||
|             amountDeleted++ | ||||
|         } | ||||
|  | ||||
|         return amountDeleted | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Delete custom cover of the manga from the cache | ||||
|      * | ||||
|   | ||||
| @@ -4,9 +4,9 @@ import android.content.Context | ||||
| import androidx.core.net.toUri | ||||
| import com.hippo.unifile.UniFile | ||||
| import eu.kanade.core.util.mapNotNullKeys | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.extension.ExtensionManager | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
|   | ||||
| @@ -4,10 +4,11 @@ import android.content.Context | ||||
| import com.hippo.unifile.UniFile | ||||
| import com.jakewharton.rxrelay.BehaviorRelay | ||||
| import eu.kanade.domain.category.interactor.GetCategories | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainChapter | ||||
| import eu.kanade.tachiyomi.data.download.model.Download | ||||
| import eu.kanade.tachiyomi.data.download.model.DownloadQueue | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| @@ -218,7 +219,7 @@ class DownloadManager( | ||||
|      */ | ||||
|     fun getChapterDownloadOrNull(chapter: Chapter): Download? { | ||||
|         return downloader.queue | ||||
|             .firstOrNull { it.chapter.id == chapter.id && it.chapter.manga_id == chapter.manga_id } | ||||
|             .firstOrNull { it.chapter.id == chapter.id && it.chapter.manga_id == chapter.mangaId } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -236,7 +237,7 @@ class DownloadManager( | ||||
|      * @param download the download to cancel. | ||||
|      */ | ||||
|     fun deletePendingDownload(download: Download) { | ||||
|         deleteChapters(listOf(download.chapter), download.manga, download.source, true) | ||||
|         deleteChapters(listOf(download.chapter.toDomainChapter()!!), download.manga, download.source, true) | ||||
|     } | ||||
|  | ||||
|     fun deletePendingDownloads(vararg downloads: Download) { | ||||
| @@ -244,7 +245,7 @@ class DownloadManager( | ||||
|         downloadsByManga.map { entry -> | ||||
|             val manga = entry.value.first().manga | ||||
|             val source = entry.value.first().source | ||||
|             deleteChapters(entry.value.map { it.chapter }, manga, source, true) | ||||
|             deleteChapters(entry.value.map { it.chapter.toDomainChapter()!! }, manga, source, true) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.data.download | ||||
|  | ||||
| import android.content.Context | ||||
| import androidx.core.content.edit | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import kotlinx.serialization.Serializable | ||||
| import kotlinx.serialization.decodeFromString | ||||
| import kotlinx.serialization.encodeToString | ||||
| @@ -181,11 +181,11 @@ class DownloadPendingDeleter(context: Context) { | ||||
|      * Returns a chapter model from a chapter entry. | ||||
|      */ | ||||
|     private fun ChapterEntry.toModel(): Chapter { | ||||
|         return Chapter.create().also { | ||||
|             it.id = id | ||||
|             it.url = url | ||||
|             it.name = name | ||||
|             it.scanlator = scanlator | ||||
|         } | ||||
|         return Chapter.create().copy( | ||||
|             id = id, | ||||
|             url = url, | ||||
|             name = name, | ||||
|             scanlator = scanlator, | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,10 +3,10 @@ package eu.kanade.tachiyomi.data.download | ||||
| import android.content.Context | ||||
| import androidx.core.net.toUri | ||||
| import com.hippo.unifile.UniFile | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.system.logcat | ||||
| @@ -16,7 +16,6 @@ import kotlinx.coroutines.flow.onEach | ||||
| import logcat.LogPriority | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import eu.kanade.domain.chapter.model.Chapter as DomainChapter | ||||
|  | ||||
| /** | ||||
|  * This class is used to provide the directories where the downloads should be saved. | ||||
| @@ -147,7 +146,7 @@ class DownloadProvider( | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     fun isChapterDirNameChanged(oldChapter: DomainChapter, newChapter: DomainChapter): Boolean { | ||||
|     fun isChapterDirNameChanged(oldChapter: Chapter, newChapter: Chapter): Boolean { | ||||
|         return oldChapter.name != newChapter.name || | ||||
|             oldChapter.scanlator?.takeIf { it.isNotBlank() } != newChapter.scanlator?.takeIf { it.isNotBlank() } | ||||
|     } | ||||
|   | ||||
| @@ -4,11 +4,12 @@ import android.content.Context | ||||
| import com.hippo.unifile.UniFile | ||||
| import com.jakewharton.rxrelay.BehaviorRelay | ||||
| import com.jakewharton.rxrelay.PublishRelay | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.cache.ChapterCache | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.download.model.Download | ||||
| import eu.kanade.tachiyomi.data.download.model.DownloadQueue | ||||
| import eu.kanade.tachiyomi.data.library.LibraryUpdateNotifier | ||||
| @@ -256,7 +257,7 @@ class Downloader( | ||||
|                 // Filter out those already downloaded. | ||||
|                 .filter { provider.findChapterDir(it.name, it.scanlator, manga.title, source) == null } | ||||
|                 // Add chapters to queue from the start. | ||||
|                 .sortedByDescending { it.source_order } | ||||
|                 .sortedByDescending { it.sourceOrder } | ||||
|         } | ||||
|  | ||||
|         // Runs in main thread (synchronization needed). | ||||
| @@ -264,7 +265,7 @@ class Downloader( | ||||
|             // Filter out those already enqueued. | ||||
|             .filter { chapter -> queue.none { it.chapter.id == chapter.id } } | ||||
|             // Create a download for each one. | ||||
|             .map { Download(source, manga, it) } | ||||
|             .map { Download(source, manga, it.toDbChapter()) } | ||||
|  | ||||
|         if (chaptersToQueue.isNotEmpty()) { | ||||
|             queue.addAll(chaptersToQueue) | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.data.download.model | ||||
|  | ||||
| import com.jakewharton.rxrelay.PublishRelay | ||||
| import eu.kanade.core.util.asFlow | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.download.DownloadStore | ||||
| import eu.kanade.tachiyomi.source.model.Page | ||||
| import kotlinx.coroutines.flow.Flow | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import eu.kanade.domain.chapter.interactor.GetChapterByMangaId | ||||
| import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource | ||||
| import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.library.model.LibraryManga | ||||
| import eu.kanade.domain.library.service.LibraryPreferences | ||||
| @@ -415,7 +414,7 @@ class LibraryUpdateService( | ||||
|     private fun downloadChapters(manga: Manga, chapters: List<Chapter>) { | ||||
|         // We don't want to start downloading while the library is updating, because websites | ||||
|         // may don't like it and they could ban the user. | ||||
|         downloadManager.downloadChapters(manga, chapters.map { it.toDbChapter() }, false) | ||||
|         downloadManager.downloadChapters(manga, chapters, false) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import eu.kanade.domain.chapter.interactor.GetChapter | ||||
| import eu.kanade.domain.chapter.interactor.UpdateChapter | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toChapterUpdate | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.interactor.GetManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| @@ -253,7 +252,7 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|                         if (manga != null) { | ||||
|                             val source = sourceManager.get(manga.source) | ||||
|                             if (source != null) { | ||||
|                                 downloadManager.deleteChapters(listOf(it.toDbChapter()), manga, source) | ||||
|                                 downloadManager.deleteChapters(listOf(it), manga, source) | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| @@ -272,7 +271,7 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|     private fun downloadChapters(chapterUrls: Array<String>, mangaId: Long) { | ||||
|         launchIO { | ||||
|             val manga = getManga.await(mangaId) ?: return@launchIO | ||||
|             val chapters = chapterUrls.mapNotNull { getChapter.await(it, mangaId)?.toDbChapter() } | ||||
|             val chapters = chapterUrls.mapNotNull { getChapter.await(it, mangaId) } | ||||
|             downloadManager.downloadChapters(manga, chapters) | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import eu.kanade.domain.manga.interactor.UpdateManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.domain.manga.model.MangaUpdate | ||||
| import eu.kanade.domain.manga.model.hasCustomCover | ||||
| import eu.kanade.domain.manga.model.toDbManga | ||||
| import eu.kanade.domain.track.interactor.GetTracks | ||||
| import eu.kanade.domain.track.interactor.InsertTrack | ||||
| import eu.kanade.tachiyomi.core.preference.Preference | ||||
| @@ -189,7 +188,7 @@ class SearchPresenter( | ||||
|         // Update custom cover (recheck if custom cover exists) | ||||
|         if (migrateCustomCover && prevManga.hasCustomCover()) { | ||||
|             @Suppress("BlockingMethodInNonBlockingContext") | ||||
|             coverCache.setCustomCoverToCache(manga.toDbManga(), coverCache.getCustomCoverFile(prevManga.id).inputStream()) | ||||
|             coverCache.setCustomCoverToCache(manga, coverCache.getCustomCoverFile(prevManga.id).inputStream()) | ||||
|         } | ||||
|  | ||||
|         updateManga.await( | ||||
|   | ||||
| @@ -22,6 +22,7 @@ import eu.kanade.core.prefs.mapAsCheckboxState | ||||
| import eu.kanade.domain.base.BasePreferences | ||||
| import eu.kanade.domain.category.interactor.GetCategories | ||||
| import eu.kanade.domain.category.interactor.SetMangaCategories | ||||
| import eu.kanade.domain.category.model.Category | ||||
| import eu.kanade.domain.chapter.interactor.GetChapterByMangaId | ||||
| import eu.kanade.domain.chapter.interactor.SetMangaDefaultChapterFlags | ||||
| import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay | ||||
| @@ -30,6 +31,7 @@ import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga | ||||
| import eu.kanade.domain.manga.interactor.GetManga | ||||
| import eu.kanade.domain.manga.interactor.NetworkToLocalManga | ||||
| import eu.kanade.domain.manga.interactor.UpdateManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.domain.manga.model.toDbManga | ||||
| import eu.kanade.domain.manga.model.toDomainManga | ||||
| import eu.kanade.domain.manga.model.toMangaUpdate | ||||
| @@ -76,8 +78,6 @@ import logcat.LogPriority | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Date | ||||
| import eu.kanade.domain.category.model.Category as DomainCategory | ||||
| import eu.kanade.domain.manga.model.Manga as DomainManga | ||||
|  | ||||
| open class BrowseSourcePresenter( | ||||
|     private val sourceId: Long, | ||||
| @@ -121,7 +121,7 @@ open class BrowseSourcePresenter( | ||||
|     } | ||||
|  | ||||
|     @Composable | ||||
|     fun getMangaList(): Flow<PagingData<DomainManga>> { | ||||
|     fun getMangaList(): Flow<PagingData<Manga>> { | ||||
|         return remember(currentFilter) { | ||||
|             Pager( | ||||
|                 PagingConfig(pageSize = 25), | ||||
| @@ -140,7 +140,7 @@ open class BrowseSourcePresenter( | ||||
|     } | ||||
|  | ||||
|     @Composable | ||||
|     fun getManga(initialManga: DomainManga): State<DomainManga> { | ||||
|     fun getManga(initialManga: Manga): State<Manga> { | ||||
|         return produceState(initialValue = initialManga) { | ||||
|             getManga.subscribe(initialManga.url, initialManga.source) | ||||
|                 .collectLatest { manga -> | ||||
| @@ -186,7 +186,7 @@ open class BrowseSourcePresenter( | ||||
|      * | ||||
|      * @param manga to initialize. | ||||
|      */ | ||||
|     private suspend fun initializeManga(manga: DomainManga) { | ||||
|     private suspend fun initializeManga(manga: Manga) { | ||||
|         if (manga.thumbnailUrl != null || manga.initialized) return | ||||
|         withNonCancellableContext { | ||||
|             try { | ||||
| @@ -206,7 +206,7 @@ open class BrowseSourcePresenter( | ||||
|      * | ||||
|      * @param manga the manga to update. | ||||
|      */ | ||||
|     fun changeMangaFavorite(manga: DomainManga) { | ||||
|     fun changeMangaFavorite(manga: Manga) { | ||||
|         presenterScope.launch { | ||||
|             var new = manga.copy( | ||||
|                 favorite = !manga.favorite, | ||||
| @@ -228,11 +228,11 @@ open class BrowseSourcePresenter( | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun getSourceOrStub(manga: DomainManga): Source { | ||||
|     fun getSourceOrStub(manga: Manga): Source { | ||||
|         return sourceManager.getOrStub(manga.source) | ||||
|     } | ||||
|  | ||||
|     fun addFavorite(manga: DomainManga) { | ||||
|     fun addFavorite(manga: Manga) { | ||||
|         presenterScope.launch { | ||||
|             val categories = getCategories() | ||||
|             val defaultCategoryId = libraryPreferences.defaultCategory().get() | ||||
| @@ -262,7 +262,7 @@ open class BrowseSourcePresenter( | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private suspend fun autoAddTrack(manga: DomainManga) { | ||||
|     private suspend fun autoAddTrack(manga: Manga) { | ||||
|         loggedServices | ||||
|             .filterIsInstance<EnhancedTrackService>() | ||||
|             .filter { it.accept(source!!) } | ||||
| @@ -287,22 +287,22 @@ open class BrowseSourcePresenter( | ||||
|      * | ||||
|      * @return List of categories, not including the default category | ||||
|      */ | ||||
|     suspend fun getCategories(): List<DomainCategory> { | ||||
|     suspend fun getCategories(): List<Category> { | ||||
|         return getCategories.subscribe() | ||||
|             .firstOrNull() | ||||
|             ?.filterNot { it.isSystemCategory } | ||||
|             ?: emptyList() | ||||
|     } | ||||
|  | ||||
|     suspend fun getDuplicateLibraryManga(manga: DomainManga): DomainManga? { | ||||
|     suspend fun getDuplicateLibraryManga(manga: Manga): Manga? { | ||||
|         return getDuplicateLibraryManga.await(manga.title, manga.source) | ||||
|     } | ||||
|  | ||||
|     fun moveMangaToCategories(manga: DomainManga, vararg categories: DomainCategory) { | ||||
|     fun moveMangaToCategories(manga: Manga, vararg categories: Category) { | ||||
|         moveMangaToCategories(manga, categories.filter { it.id != 0L }.map { it.id }) | ||||
|     } | ||||
|  | ||||
|     fun moveMangaToCategories(manga: DomainManga, categoryIds: List<Long>) { | ||||
|     fun moveMangaToCategories(manga: Manga, categoryIds: List<Long>) { | ||||
|         presenterScope.launchIO { | ||||
|             setMangaCategories.await( | ||||
|                 mangaId = manga.id, | ||||
| @@ -328,11 +328,11 @@ open class BrowseSourcePresenter( | ||||
|     } | ||||
|  | ||||
|     sealed class Dialog { | ||||
|         data class RemoveManga(val manga: DomainManga) : Dialog() | ||||
|         data class AddDuplicateManga(val manga: DomainManga, val duplicate: DomainManga) : Dialog() | ||||
|         data class RemoveManga(val manga: Manga) : Dialog() | ||||
|         data class AddDuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog() | ||||
|         data class ChangeMangaCategory( | ||||
|             val manga: DomainManga, | ||||
|             val initialSelection: List<CheckboxState.State<DomainCategory>>, | ||||
|             val manga: Manga, | ||||
|             val initialSelection: List<CheckboxState.State<Category>>, | ||||
|         ) : Dialog() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.library.model.LibraryManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.domain.manga.model.isLocal | ||||
| import eu.kanade.domain.manga.model.toDbManga | ||||
| import eu.kanade.presentation.components.ChangeCategoryDialog | ||||
| import eu.kanade.presentation.components.DeleteLibraryMangaDialog | ||||
| import eu.kanade.presentation.library.LibraryScreen | ||||
| @@ -102,7 +101,7 @@ class LibraryController( | ||||
|                     containsLocalManga = dialog.manga.any(Manga::isLocal), | ||||
|                     onDismissRequest = onDismissRequest, | ||||
|                     onConfirm = { deleteManga, deleteChapter -> | ||||
|                         presenter.removeMangas(dialog.manga.map { it.toDbManga() }, deleteManga, deleteChapter) | ||||
|                         presenter.removeMangas(dialog.manga, deleteManga, deleteChapter) | ||||
|                         presenter.clearSelection() | ||||
|                     }, | ||||
|                 ) | ||||
|   | ||||
| @@ -20,7 +20,6 @@ import eu.kanade.domain.category.model.Category | ||||
| import eu.kanade.domain.chapter.interactor.GetChapterByMangaId | ||||
| import eu.kanade.domain.chapter.interactor.SetReadStatus | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.history.interactor.GetNextChapters | ||||
| import eu.kanade.domain.library.model.LibraryManga | ||||
| import eu.kanade.domain.library.model.LibrarySort | ||||
| @@ -38,7 +37,6 @@ import eu.kanade.presentation.library.LibraryStateImpl | ||||
| import eu.kanade.presentation.library.components.LibraryToolbarTitle | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.cache.CoverCache | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainManga | ||||
| import eu.kanade.tachiyomi.data.download.DownloadCache | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| @@ -64,7 +62,6 @@ import uy.kohesive.injekt.api.get | ||||
| import java.text.Collator | ||||
| import java.util.Collections | ||||
| import java.util.Locale | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga as DbManga | ||||
|  | ||||
| /** | ||||
|  * Class containing library information. | ||||
| @@ -432,7 +429,7 @@ class LibraryPresenter( | ||||
|                     } | ||||
|                     .let { if (amount != null) it.take(amount) else it } | ||||
|  | ||||
|                 downloadManager.downloadChapters(manga, chapters.map { it.toDbChapter() }) | ||||
|                 downloadManager.downloadChapters(manga, chapters) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -460,7 +457,7 @@ class LibraryPresenter( | ||||
|      * @param deleteFromLibrary whether to delete manga from library. | ||||
|      * @param deleteChapters whether to delete downloaded chapters. | ||||
|      */ | ||||
|     fun removeMangas(mangaList: List<DbManga>, deleteFromLibrary: Boolean, deleteChapters: Boolean) { | ||||
|     fun removeMangas(mangaList: List<Manga>, deleteFromLibrary: Boolean, deleteChapters: Boolean) { | ||||
|         presenterScope.launchNonCancellable { | ||||
|             val mangaToDelete = mangaList.distinctBy { it.id } | ||||
|  | ||||
| @@ -469,7 +466,7 @@ class LibraryPresenter( | ||||
|                     it.removeCovers(coverCache) | ||||
|                     MangaUpdate( | ||||
|                         favorite = false, | ||||
|                         id = it.id!!, | ||||
|                         id = it.id, | ||||
|                     ) | ||||
|                 } | ||||
|                 updateManga.awaitAll(toDelete) | ||||
| @@ -479,7 +476,7 @@ class LibraryPresenter( | ||||
|                 mangaToDelete.forEach { manga -> | ||||
|                     val source = sourceManager.get(manga.source) as? HttpSource | ||||
|                     if (source != null) { | ||||
|                         downloadManager.deleteManga(manga.toDomainManga()!!, source) | ||||
|                         downloadManager.deleteManga(manga, source) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -19,7 +19,6 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource | ||||
| import eu.kanade.domain.chapter.interactor.UpdateChapter | ||||
| import eu.kanade.domain.chapter.model.Chapter | ||||
| import eu.kanade.domain.chapter.model.ChapterUpdate | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.library.service.LibraryPreferences | ||||
| import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga | ||||
| @@ -289,7 +288,7 @@ class MangaInfoScreenModel( | ||||
|                 // Remove from library | ||||
|                 if (updateManga.awaitUpdateFavorite(manga.id, false)) { | ||||
|                     // Remove covers and update last modified in db | ||||
|                     if (manga.toDbManga().removeCovers() > 0) { | ||||
|                     if (manga.removeCovers() != manga) { | ||||
|                         updateManga.awaitUpdateCoverLastModified(manga.id) | ||||
|                     } | ||||
|                     withUIContext { onRemoved() } | ||||
| @@ -689,7 +688,7 @@ class MangaInfoScreenModel( | ||||
|      */ | ||||
|     private fun downloadChapters(chapters: List<Chapter>) { | ||||
|         val manga = successState?.manga ?: return | ||||
|         downloadManager.downloadChapters(manga, chapters.map { it.toDbChapter() }) | ||||
|         downloadManager.downloadChapters(manga, chapters) | ||||
|         toggleAllSelection(false) | ||||
|     } | ||||
|  | ||||
| @@ -717,7 +716,7 @@ class MangaInfoScreenModel( | ||||
|             try { | ||||
|                 successState?.let { state -> | ||||
|                     downloadManager.deleteChapters( | ||||
|                         chapters.map { it.toDbChapter() }, | ||||
|                         chapters, | ||||
|                         state.manga, | ||||
|                         state.source, | ||||
|                     ) | ||||
|   | ||||
| @@ -23,6 +23,7 @@ import eu.kanade.domain.track.interactor.InsertTrack | ||||
| import eu.kanade.domain.track.model.toDbTrack | ||||
| import eu.kanade.domain.track.service.TrackPreferences | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainChapter | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainManga | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.data.download.DownloadProvider | ||||
| @@ -479,7 +480,7 @@ class ReaderPresenter( | ||||
|                 .take(amount) | ||||
|             downloadManager.downloadChapters( | ||||
|                 manga.toDomainManga()!!, | ||||
|                 chaptersToDownload.map { it.toDbChapter() }, | ||||
|                 chaptersToDownload, | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| @@ -489,7 +490,7 @@ class ReaderPresenter( | ||||
|      * if setting is enabled and [currentChapter] is queued for download | ||||
|      */ | ||||
|     private fun deleteChapterFromDownloadQueue(currentChapter: ReaderChapter): Download? { | ||||
|         return downloadManager.getChapterDownloadOrNull(currentChapter.chapter)?.apply { | ||||
|         return downloadManager.getChapterDownloadOrNull(currentChapter.chapter.toDomainChapter()!!)?.apply { | ||||
|             downloadManager.deletePendingDownload(this) | ||||
|         } | ||||
|     } | ||||
| @@ -874,7 +875,7 @@ class ReaderPresenter( | ||||
|         val manga = manga ?: return | ||||
|  | ||||
|         presenterScope.launchNonCancellable { | ||||
|             downloadManager.enqueueDeleteChapters(listOf(chapter.chapter), manga.toDomainManga()!!) | ||||
|             downloadManager.enqueueDeleteChapters(listOf(chapter.chapter.toDomainChapter()!!), manga.toDomainManga()!!) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import android.app.Application | ||||
| import android.net.Uri | ||||
| import com.hippo.unifile.UniFile | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainChapter | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.data.download.DownloadProvider | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| @@ -47,7 +48,7 @@ class DownloadPageLoader( | ||||
|     } | ||||
|  | ||||
|     private fun getPagesFromDirectory(): Observable<List<ReaderPage>> { | ||||
|         return downloadManager.buildPageList(source, manga, chapter.chapter) | ||||
|         return downloadManager.buildPageList(source, manga, chapter.chapter.toDomainChapter()!!) | ||||
|             .map { pages -> | ||||
|                 pages.map { page -> | ||||
|                     ReaderPage(page.index, page.url, page.imageUrl) { | ||||
|   | ||||
| @@ -9,7 +9,6 @@ import eu.kanade.domain.chapter.interactor.GetChapter | ||||
| import eu.kanade.domain.chapter.interactor.SetReadStatus | ||||
| import eu.kanade.domain.chapter.interactor.UpdateChapter | ||||
| import eu.kanade.domain.chapter.model.ChapterUpdate | ||||
| import eu.kanade.domain.chapter.model.toDbChapter | ||||
| import eu.kanade.domain.library.service.LibraryPreferences | ||||
| import eu.kanade.domain.manga.interactor.GetManga | ||||
| import eu.kanade.domain.ui.UiPreferences | ||||
| @@ -242,7 +241,7 @@ class UpdatesPresenter( | ||||
|                 val manga = getManga.await(mangaId) ?: continue | ||||
|                 // Don't download if source isn't available | ||||
|                 sourceManager.get(manga.source) ?: continue | ||||
|                 val chapters = updates.mapNotNull { getChapter.await(it.update.chapterId)?.toDbChapter() } | ||||
|                 val chapters = updates.mapNotNull { getChapter.await(it.update.chapterId) } | ||||
|                 downloadManager.downloadChapters(manga, chapters) | ||||
|             } | ||||
|         } | ||||
| @@ -261,7 +260,7 @@ class UpdatesPresenter( | ||||
|                 .forEach { (mangaId, updates) -> | ||||
|                     val manga = getManga.await(mangaId) ?: return@forEach | ||||
|                     val source = sourceManager.get(manga.source) ?: return@forEach | ||||
|                     val chapters = updates.mapNotNull { getChapter.await(it.update.chapterId)?.toDbChapter() } | ||||
|                     val chapters = updates.mapNotNull { getChapter.await(it.update.chapterId) } | ||||
|                     downloadManager.deleteChapters(chapters, manga, source) | ||||
|                 } | ||||
|         } | ||||
|   | ||||
| @@ -3,24 +3,21 @@ package eu.kanade.tachiyomi.util | ||||
| import android.content.Context | ||||
| import eu.kanade.domain.download.service.DownloadPreferences | ||||
| import eu.kanade.domain.manga.interactor.UpdateManga | ||||
| import eu.kanade.domain.manga.model.Manga | ||||
| import eu.kanade.domain.manga.model.hasCustomCover | ||||
| import eu.kanade.domain.manga.model.isLocal | ||||
| import eu.kanade.domain.manga.model.toDbManga | ||||
| import eu.kanade.tachiyomi.data.cache.CoverCache | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.database.models.toDomainManga | ||||
| import eu.kanade.tachiyomi.source.LocalSource | ||||
| import eu.kanade.tachiyomi.source.model.SManga | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.io.InputStream | ||||
| import java.util.Date | ||||
| import eu.kanade.domain.manga.model.Manga as DomainManga | ||||
|  | ||||
| /** | ||||
|  * Call before updating [Manga.thumbnail_url] to ensure old cover can be cleared from cache | ||||
|  */ | ||||
| fun DomainManga.prepUpdateCover(coverCache: CoverCache, remoteManga: SManga, refreshSameUrl: Boolean): DomainManga { | ||||
| fun Manga.prepUpdateCover(coverCache: CoverCache, remoteManga: SManga, refreshSameUrl: Boolean): Manga { | ||||
|     // Never refresh covers if the new url is null, as the current url has possibly become invalid | ||||
|     val newUrl = remoteManga.thumbnail_url ?: return this | ||||
|  | ||||
| @@ -44,20 +41,16 @@ fun DomainManga.prepUpdateCover(coverCache: CoverCache, remoteManga: SManga, ref | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun Manga.removeCovers(coverCache: CoverCache = Injekt.get()): Int { | ||||
|     if (toDomainManga()!!.isLocal()) return 0 | ||||
|  | ||||
|     cover_last_modified = Date().time | ||||
|     return coverCache.deleteFromCache(this, true) | ||||
| } | ||||
|  | ||||
| fun DomainManga.removeCovers(coverCache: CoverCache = Injekt.get()): DomainManga { | ||||
| fun Manga.removeCovers(coverCache: CoverCache = Injekt.get()): Manga { | ||||
|     if (isLocal()) return this | ||||
|     coverCache.deleteFromCache(this, true) | ||||
|     return copy(coverLastModified = Date().time) | ||||
|     return if (coverCache.deleteFromCache(this, true) > 0) { | ||||
|         return copy(coverLastModified = Date().time) | ||||
|     } else { | ||||
|         this | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun DomainManga.shouldDownloadNewChapters(dbCategories: List<Long>, preferences: DownloadPreferences): Boolean { | ||||
| fun Manga.shouldDownloadNewChapters(dbCategories: List<Long>, preferences: DownloadPreferences): Boolean { | ||||
|     if (!favorite) return false | ||||
|  | ||||
|     val categories = dbCategories.ifEmpty { listOf(0L) } | ||||
| @@ -82,7 +75,7 @@ fun DomainManga.shouldDownloadNewChapters(dbCategories: List<Long>, preferences: | ||||
|     return categories.any { it in includedCategories } | ||||
| } | ||||
|  | ||||
| suspend fun DomainManga.editCover( | ||||
| suspend fun Manga.editCover( | ||||
|     context: Context, | ||||
|     stream: InputStream, | ||||
|     updateManga: UpdateManga = Injekt.get(), | ||||
| @@ -92,7 +85,7 @@ suspend fun DomainManga.editCover( | ||||
|         LocalSource.updateCover(context, toSManga(), stream) | ||||
|         updateManga.awaitUpdateCoverLastModified(id) | ||||
|     } else if (favorite) { | ||||
|         coverCache.setCustomCoverToCache(toDbManga(), stream) | ||||
|         coverCache.setCustomCoverToCache(this, stream) | ||||
|         updateManga.awaitUpdateCoverLastModified(id) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user