Allow MDList tracking for all manga

This commit is contained in:
Jobobby04 2021-02-11 17:55:43 -05:00
parent eb5469d362
commit 4896f3d16c
5 changed files with 33 additions and 23 deletions

View File

@ -48,7 +48,7 @@ class TrackManager(context: Context) {
fun getService(id: Int) = services.find { it.id == id } fun getService(id: Int) = services.find { it.id == id }
fun hasLoggedServices(isMangaDexManga: Boolean = true) = services.any { it.isLogged && ((it.id == MDLIST && isMangaDexManga) || it.id != MDLIST) } fun hasLoggedServices() = services.any { it.isLogged }
// SY --> // SY -->
fun mapTrackingOrder(status: String, context: Context): Int { fun mapTrackingOrder(status: String, context: Context): Int {

View File

@ -10,8 +10,12 @@ import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.model.toMangaInfo
import eu.kanade.tachiyomi.util.lang.awaitSingle
import eu.kanade.tachiyomi.util.lang.runAsObservable
import exh.md.utils.FollowStatus import exh.md.utils.FollowStatus
import exh.md.utils.MdUtil import exh.md.utils.MdUtil
import tachiyomi.source.model.MangaInfo
class MdList(private val context: Context, id: Int) : TrackService(id) { class MdList(private val context: Context, id: Int) : TrackService(id) {
@ -42,7 +46,7 @@ class MdList(private val context: Context, id: Int) : TrackService(id) {
override suspend fun add(track: Track): Track = update(track) override suspend fun add(track: Track): Track = update(track)
override suspend fun update(track: Track): Track { override suspend fun update(track: Track): Track {
val mdex = mdex ?: throw Exception("Mangadex not enabled") val mdex = mdex ?: throw MangaDexNotFoundException()
val remoteTrack = mdex.fetchTrackingInfo(track.tracking_url) val remoteTrack = mdex.fetchTrackingInfo(track.tracking_url)
val followStatus = FollowStatus.fromInt(track.status) val followStatus = FollowStatus.fromInt(track.status)
@ -87,7 +91,7 @@ class MdList(private val context: Context, id: Int) : TrackService(id) {
override suspend fun bind(track: Track): Track = update(refresh(track)) override suspend fun bind(track: Track): Track = update(refresh(track))
override suspend fun refresh(track: Track): Track { override suspend fun refresh(track: Track): Track {
val mdex = mdex ?: throw Exception("Mangadex not enabled") val mdex = mdex ?: throw MangaDexNotFoundException()
val (remoteTrack, mangaMetadata) = mdex.getTrackingAndMangaInfo(track) val (remoteTrack, mangaMetadata) = mdex.getTrackingAndMangaInfo(track)
track.copyPersonalFrom(remoteTrack) track.copyPersonalFrom(remoteTrack)
if (track.total_chapters == 0 && mangaMetadata.status == SManga.COMPLETED) { if (track.total_chapters == 0 && mangaMetadata.status == SManga.COMPLETED) {
@ -105,7 +109,27 @@ class MdList(private val context: Context, id: Int) : TrackService(id) {
return track return track
} }
override suspend fun search(query: String): List<TrackSearch> = throw Exception("not used") override suspend fun search(query: String): List<TrackSearch> {
val mdex = mdex ?: throw MangaDexNotFoundException()
return mdex.fetchSearchManga(0, query, mdex.getFilterList())
.flatMap { page ->
runAsObservable({
page.mangas.map {
toTrackSearch(mdex.getMangaDetails(it.toMangaInfo()))
}
})
}
.awaitSingle()
}
private fun toTrackSearch(mangaInfo: MangaInfo): TrackSearch = TrackSearch.create(TrackManager.MDLIST).apply {
tracking_url = MdUtil.baseUrl + mangaInfo.key
title = mangaInfo.title
cover_url = mangaInfo.cover
summary = mangaInfo.description
}
override suspend fun login(username: String, password: String): Unit = throw Exception("not used") override suspend fun login(username: String, password: String): Unit = throw Exception("not used")
class MangaDexNotFoundException : Exception("Mangadex not enabled")
} }

View File

@ -27,7 +27,6 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.toSChapter import eu.kanade.tachiyomi.source.model.toSChapter
import eu.kanade.tachiyomi.source.model.toSManga import eu.kanade.tachiyomi.source.model.toSManga
import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.source.online.MetadataSource
import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem
@ -267,16 +266,13 @@ class MangaPresenter(
} }
private fun getTrackingObservable(): Observable<Int> { private fun getTrackingObservable(): Observable<Int> {
// SY --> if (!trackManager.hasLoggedServices()) {
val sourceIsMangaDex = source.getMainSource() is MangaDex || mergedManga.any { it.source in mangaDexSourceIds }
// SY <--
if (!trackManager.hasLoggedServices(/* SY --> */sourceIsMangaDex/* SY <-- */)) {
return Observable.just(0) return Observable.just(0)
} }
return db.getTracks(manga).asRxObservable() return db.getTracks(manga).asRxObservable()
.map { tracks -> .map { tracks ->
val loggedServices = trackManager.services.filter { it.isLogged /* SY --> */ && ((it.id == TrackManager.MDLIST && sourceIsMangaDex) || it.id != TrackManager.MDLIST) /* SY <-- */ }.map { it.id } val loggedServices = trackManager.services.filter { it.isLogged }.map { it.id }
tracks tracks
// SY --> // SY -->
.filterNot { it.sync_id == TrackManager.MDLIST && it.status == FollowStatus.UNFOLLOWED.int } .filterNot { it.sync_id == TrackManager.MDLIST && it.status == FollowStatus.UNFOLLOWED.int }
@ -1123,8 +1119,8 @@ class MangaPresenter(
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
// SY --> // SY -->
.map { trackItems -> .map { trackItems ->
val mdTrack = trackItems.firstOrNull { it.service.id == TrackManager.MDLIST }
if (manga.source in mangaDexSourceIds || mergedManga.any { it.source in mangaDexSourceIds }) { if (manga.source in mangaDexSourceIds || mergedManga.any { it.source in mangaDexSourceIds }) {
val mdTrack = trackItems.firstOrNull { it.service.id == TrackManager.MDLIST }
when { when {
mdTrack == null -> { mdTrack == null -> {
trackItems trackItems
@ -1134,7 +1130,7 @@ class MangaPresenter(
} }
else -> trackItems else -> trackItems
} }
} else mdTrack?.let { trackItems - it } ?: trackItems } else trackItems
} }
// SY <-- // SY <--
.doOnNext { _trackList = it } .doOnNext { _trackList = it }

View File

@ -20,15 +20,12 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import exh.source.MERGED_SOURCE_ID import exh.source.MERGED_SOURCE_ID
import exh.source.getMainSource
import exh.source.mangaDexSourceIds
import exh.util.SourceTagsUtil import exh.util.SourceTagsUtil
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@ -116,10 +113,7 @@ class MangaInfoHeaderAdapter(
} }
with(binding.btnTracking) { with(binding.btnTracking) {
// SY --> if (trackManager.hasLoggedServices()) {
val sourceIsMangaDex = source.getMainSource() is MangaDex || mergedMangaReferences.any { it.mangaSourceId in mangaDexSourceIds }
// SY <--
if (trackManager.hasLoggedServices(/* SY --> */sourceIsMangaDex/* SY <-- */)) {
isVisible = true isVisible = true
if (trackCount > 0) { if (trackCount > 0) {

View File

@ -7,7 +7,6 @@ import androidx.core.net.toUri
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.databinding.TrackControllerBinding import eu.kanade.tachiyomi.databinding.TrackControllerBinding
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
@ -72,9 +71,6 @@ class TrackSheet(
override fun onSetClick(position: Int) { override fun onSetClick(position: Int) {
val item = adapter.getItem(position) ?: return val item = adapter.getItem(position) ?: return
// SY --> Kill search for now until cesco puts MdList into stable
if (item.service.id == TrackManager.MDLIST) return
// SY <--
TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER) TrackSearchDialog(controller, item.service).showDialog(controller.router, TAG_SEARCH_CONTROLLER)
} }