-
-
Notifications
You must be signed in to change notification settings - Fork 345
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Last commit merged: https://github.com/tachiyomiorg/tachiyomi/commit/1d144e67678a99ec7198e5efcb1410b5da4bc42e
- Loading branch information
1 parent
89777e9
commit d7aee03
Showing
119 changed files
with
1,089 additions
and
465 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,8 @@ | ||
[*.{kt,kts}] | ||
indent_size=4 | ||
insert_final_newline=true | ||
ij_kotlin_allow_trailing_comma=true | ||
ij_kotlin_allow_trailing_comma_on_call_site=true | ||
max_line_length = 120 | ||
indent_size = 4 | ||
insert_final_newline = true | ||
ij_kotlin_allow_trailing_comma = true | ||
ij_kotlin_allow_trailing_comma_on_call_site = true | ||
ij_kotlin_name_count_to_use_star_import = 2147483647 | ||
ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
103 changes: 83 additions & 20 deletions
103
app/src/main/java/eu/kanade/domain/track/anime/interactor/AddAnimeTracks.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,45 +1,108 @@ | ||
package eu.kanade.domain.track.anime.interactor | ||
|
||
import eu.kanade.domain.track.anime.model.toDbTrack | ||
import eu.kanade.domain.track.anime.model.toDomainTrack | ||
import eu.kanade.tachiyomi.animesource.AnimeSource | ||
import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack | ||
import eu.kanade.tachiyomi.data.track.AnimeTracker | ||
import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker | ||
import eu.kanade.tachiyomi.data.track.Tracker | ||
import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone | ||
import logcat.LogPriority | ||
import tachiyomi.core.util.lang.withIOContext | ||
import tachiyomi.core.util.lang.withNonCancellableContext | ||
import tachiyomi.core.util.system.logcat | ||
import tachiyomi.domain.entries.anime.model.Anime | ||
import tachiyomi.domain.history.anime.interactor.GetAnimeHistory | ||
import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId | ||
import tachiyomi.domain.track.anime.interactor.GetAnimeTracks | ||
import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack | ||
import uy.kohesive.injekt.Injekt | ||
import uy.kohesive.injekt.api.get | ||
import java.time.ZoneOffset | ||
|
||
class AddAnimeTracks( | ||
private val getTracks: GetAnimeTracks, | ||
private val insertTrack: InsertAnimeTrack, | ||
private val syncChapterProgressWithTrack: SyncEpisodeProgressWithTrack, | ||
private val getEpisodesByAnimeId: GetEpisodesByAnimeId, | ||
) { | ||
|
||
suspend fun bindEnhancedTracks(anime: Anime, source: AnimeSource) = withNonCancellableContext { | ||
getTracks.await(anime.id) | ||
.filterIsInstance<EnhancedAnimeTracker>() | ||
.filter { it.accept(source) } | ||
.forEach { service -> | ||
try { | ||
service.match(anime)?.let { track -> | ||
track.anime_id = anime.id | ||
(service as Tracker).animeService.bind(track) | ||
insertTrack.await(track.toDomainTrack()!!) | ||
|
||
syncChapterProgressWithTrack.await( | ||
anime.id, | ||
track.toDomainTrack()!!, | ||
service.animeService, | ||
// TODO: update all trackers based on common data | ||
suspend fun bind(tracker: AnimeTracker, item: AnimeTrack, animeId: Long) = withNonCancellableContext { | ||
withIOContext { | ||
val allChapters = getEpisodesByAnimeId.await(animeId) | ||
val hasSeenEpisodes = allChapters.any { it.seen } | ||
tracker.bind(item, hasSeenEpisodes) | ||
|
||
var track = item.toDomainTrack(idRequired = false) ?: return@withIOContext | ||
|
||
insertTrack.await(track) | ||
|
||
// TODO: merge into [SyncChapterProgressWithTrack]? | ||
// Update chapter progress if newer chapters marked read locally | ||
if (hasSeenEpisodes) { | ||
val latestLocalReadChapterNumber = allChapters | ||
.sortedBy { it.episodeNumber } | ||
.takeWhile { it.seen } | ||
.lastOrNull() | ||
?.episodeNumber ?: -1.0 | ||
|
||
if (latestLocalReadChapterNumber > track.lastEpisodeSeen) { | ||
track = track.copy( | ||
lastEpisodeSeen = latestLocalReadChapterNumber, | ||
) | ||
tracker.setRemoteLastEpisodeSeen(track.toDbTrack(), latestLocalReadChapterNumber.toInt()) | ||
} | ||
|
||
if (track.startDate <= 0) { | ||
val firstReadChapterDate = Injekt.get<GetAnimeHistory>().await(animeId) | ||
.sortedBy { it.seenAt } | ||
.firstOrNull() | ||
?.seenAt | ||
|
||
firstReadChapterDate?.let { | ||
val startDate = firstReadChapterDate.time.convertEpochMillisZone( | ||
ZoneOffset.systemDefault(), | ||
ZoneOffset.UTC, | ||
) | ||
track = track.copy( | ||
startDate = startDate, | ||
) | ||
tracker.setRemoteStartDate(track.toDbTrack(), startDate) | ||
} | ||
} catch (e: Exception) { | ||
logcat( | ||
LogPriority.WARN, | ||
e, | ||
) { "Could not match anime: ${anime.title} with service $service" } | ||
} | ||
} | ||
|
||
syncChapterProgressWithTrack.await(animeId, track, tracker) | ||
} | ||
} | ||
|
||
suspend fun bindEnhancedTrackers(anime: Anime, source: AnimeSource) = withNonCancellableContext { | ||
withIOContext { | ||
getTracks.await(anime.id) | ||
.filterIsInstance<EnhancedAnimeTracker>() | ||
.filter { it.accept(source) } | ||
.forEach { service -> | ||
try { | ||
service.match(anime)?.let { track -> | ||
track.anime_id = anime.id | ||
(service as Tracker).animeService.bind(track) | ||
insertTrack.await(track.toDomainTrack()!!) | ||
|
||
syncChapterProgressWithTrack.await( | ||
anime.id, | ||
track.toDomainTrack()!!, | ||
service.animeService, | ||
) | ||
} | ||
} catch (e: Exception) { | ||
logcat( | ||
LogPriority.WARN, | ||
e, | ||
) { "Could not match anime: ${anime.title} with service $service" } | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
103 changes: 83 additions & 20 deletions
103
app/src/main/java/eu/kanade/domain/track/manga/interactor/AddMangaTracks.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,45 +1,108 @@ | ||
package eu.kanade.domain.track.manga.interactor | ||
|
||
import eu.kanade.domain.track.manga.model.toDbTrack | ||
import eu.kanade.domain.track.manga.model.toDomainTrack | ||
import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack | ||
import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker | ||
import eu.kanade.tachiyomi.data.track.MangaTracker | ||
import eu.kanade.tachiyomi.data.track.Tracker | ||
import eu.kanade.tachiyomi.source.MangaSource | ||
import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone | ||
import logcat.LogPriority | ||
import tachiyomi.core.util.lang.withIOContext | ||
import tachiyomi.core.util.lang.withNonCancellableContext | ||
import tachiyomi.core.util.system.logcat | ||
import tachiyomi.domain.entries.manga.model.Manga | ||
import tachiyomi.domain.history.manga.interactor.GetMangaHistory | ||
import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId | ||
import tachiyomi.domain.track.manga.interactor.GetMangaTracks | ||
import tachiyomi.domain.track.manga.interactor.InsertMangaTrack | ||
import uy.kohesive.injekt.Injekt | ||
import uy.kohesive.injekt.api.get | ||
import java.time.ZoneOffset | ||
|
||
class AddMangaTracks( | ||
private val getTracks: GetMangaTracks, | ||
private val insertTrack: InsertMangaTrack, | ||
private val syncChapterProgressWithTrack: SyncChapterProgressWithTrack, | ||
private val getChaptersByMangaId: GetChaptersByMangaId, | ||
) { | ||
|
||
suspend fun bindEnhancedTracks(manga: Manga, source: MangaSource) = withNonCancellableContext { | ||
getTracks.await(manga.id) | ||
.filterIsInstance<EnhancedMangaTracker>() | ||
.filter { it.accept(source) } | ||
.forEach { service -> | ||
try { | ||
service.match(manga)?.let { track -> | ||
track.manga_id = manga.id | ||
(service as Tracker).mangaService.bind(track) | ||
insertTrack.await(track.toDomainTrack()!!) | ||
|
||
syncChapterProgressWithTrack.await( | ||
manga.id, | ||
track.toDomainTrack()!!, | ||
service.mangaService, | ||
// TODO: update all trackers based on common data | ||
suspend fun bind(tracker: MangaTracker, item: MangaTrack, mangaId: Long) = withNonCancellableContext { | ||
withIOContext { | ||
val allChapters = getChaptersByMangaId.await(mangaId) | ||
val hasReadChapters = allChapters.any { it.read } | ||
tracker.bind(item, hasReadChapters) | ||
|
||
var track = item.toDomainTrack(idRequired = false) ?: return@withIOContext | ||
|
||
insertTrack.await(track) | ||
|
||
// TODO: merge into [SyncChapterProgressWithTrack]? | ||
// Update chapter progress if newer chapters marked read locally | ||
if (hasReadChapters) { | ||
val latestLocalReadChapterNumber = allChapters | ||
.sortedBy { it.chapterNumber } | ||
.takeWhile { it.read } | ||
.lastOrNull() | ||
?.chapterNumber ?: -1.0 | ||
|
||
if (latestLocalReadChapterNumber > track.lastChapterRead) { | ||
track = track.copy( | ||
lastChapterRead = latestLocalReadChapterNumber, | ||
) | ||
tracker.setRemoteLastChapterRead(track.toDbTrack(), latestLocalReadChapterNumber.toInt()) | ||
} | ||
|
||
if (track.startDate <= 0) { | ||
val firstReadChapterDate = Injekt.get<GetMangaHistory>().await(mangaId) | ||
.sortedBy { it.readAt } | ||
.firstOrNull() | ||
?.readAt | ||
|
||
firstReadChapterDate?.let { | ||
val startDate = firstReadChapterDate.time.convertEpochMillisZone( | ||
ZoneOffset.systemDefault(), | ||
ZoneOffset.UTC, | ||
) | ||
track = track.copy( | ||
startDate = startDate, | ||
) | ||
tracker.setRemoteStartDate(track.toDbTrack(), startDate) | ||
} | ||
} catch (e: Exception) { | ||
logcat( | ||
LogPriority.WARN, | ||
e, | ||
) { "Could not match manga: ${manga.title} with service $service" } | ||
} | ||
} | ||
|
||
syncChapterProgressWithTrack.await(mangaId, track, tracker) | ||
} | ||
} | ||
|
||
suspend fun bindEnhancedTrackers(manga: Manga, source: MangaSource) = withNonCancellableContext { | ||
withIOContext { | ||
getTracks.await(manga.id) | ||
.filterIsInstance<EnhancedMangaTracker>() | ||
.filter { it.accept(source) } | ||
.forEach { service -> | ||
try { | ||
service.match(manga)?.let { track -> | ||
track.manga_id = manga.id | ||
(service as Tracker).mangaService.bind(track) | ||
insertTrack.await(track.toDomainTrack()!!) | ||
|
||
syncChapterProgressWithTrack.await( | ||
manga.id, | ||
track.toDomainTrack()!!, | ||
service.mangaService, | ||
) | ||
} | ||
} catch (e: Exception) { | ||
logcat( | ||
LogPriority.WARN, | ||
e, | ||
) { "Could not match manga: ${manga.title} with service $service" } | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.