diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..410a50bd9
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,2 @@
+github: inorichi
+ko_fi: inorichi
diff --git a/README.md b/README.md
index 1a561f595..03aa88cde 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ You can find us in the `#support-eh` channel in the [Tachiyomi discord](https://
# Features
**All the features you expect from Tachiyomi:**
-* Online reading from sources such as KissManga, MangaFox, [and more](https://github.com/inorichi/tachiyomi-extensions)
+* Online reading from sources such as KissManga, MangaDex, [and more](https://github.com/inorichi/tachiyomi-extensions)
* Local reading of downloaded manga
* Configurable reader with multiple viewers, reading directions and other settings
* [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), and [Kitsu](https://kitsu.io/explore/anime) support
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3632aac02..90bbbeaba 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -76,8 +76,8 @@
+ android:name=".ui.setting.ShikimoriLoginActivity"
+ android:label="Shikimori">
@@ -89,6 +89,20 @@
android:scheme="tachiyomi" />
+
+
+
+
+
+
+
+
+
+
) = db.delete().objects(mangas).prepare()
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaTitlePutResolver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaTitlePutResolver.kt
new file mode 100644
index 000000000..702173afb
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaTitlePutResolver.kt
@@ -0,0 +1,32 @@
+package eu.kanade.tachiyomi.data.database.resolvers
+
+import android.content.ContentValues
+import com.pushtorefresh.storio.sqlite.StorIOSQLite
+import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
+import com.pushtorefresh.storio.sqlite.operations.put.PutResult
+import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
+import eu.kanade.tachiyomi.data.database.inTransactionReturn
+import eu.kanade.tachiyomi.data.database.models.Manga
+import eu.kanade.tachiyomi.data.database.tables.MangaTable
+
+class MangaTitlePutResolver : PutResolver() {
+
+ override fun performPut(db: StorIOSQLite, manga: Manga) = db.inTransactionReturn {
+ val updateQuery = mapToUpdateQuery(manga)
+ val contentValues = mapToContentValues(manga)
+
+ val numberOfRowsUpdated = db.lowLevel().update(updateQuery, contentValues)
+ PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
+ }
+
+ fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
+ .table(MangaTable.TABLE)
+ .where("${MangaTable.COL_ID} = ?")
+ .whereArgs(manga.id)
+ .build()
+
+ fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
+ put(MangaTable.COL_TITLE, manga.title)
+ }
+
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaViewerPutResolver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaViewerPutResolver.kt
index 86c67f346..e40f397a8 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaViewerPutResolver.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/MangaViewerPutResolver.kt
@@ -20,10 +20,10 @@ class MangaViewerPutResolver : PutResolver() {
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
- .table(MangaTable.TABLE)
- .where("${MangaTable.COL_ID} = ?")
- .whereArgs(manga.id)
- .build()
+ .table(MangaTable.TABLE)
+ .where("${MangaTable.COL_ID} = ?")
+ .whereArgs(manga.id)
+ .build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_VIEWER, manga.viewer)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateRanker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateRanker.kt
new file mode 100644
index 000000000..735afa833
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateRanker.kt
@@ -0,0 +1,43 @@
+package eu.kanade.tachiyomi.data.library
+
+import eu.kanade.tachiyomi.data.database.models.Manga
+
+/**
+ * This class will provide various functions to Rank mangas to efficiently schedule mangas to update.
+ */
+object LibraryUpdateRanker {
+
+ val rankingScheme = listOf(
+ (this::lexicographicRanking)(),
+ (this::latestFirstRanking)())
+
+ /**
+ * Provides a total ordering over all the Mangas.
+ *
+ * Assumption: An active [Manga] mActive is expected to have been last updated after an
+ * inactive [Manga] mInactive.
+ *
+ * Using this insight, function returns a Comparator for which mActive appears before mInactive.
+ * @return a Comparator that ranks manga based on relevance.
+ */
+ fun latestFirstRanking(): Comparator {
+ return Comparator { mangaFirst: Manga,
+ mangaSecond: Manga ->
+ compareValues(mangaSecond.last_update, mangaFirst.last_update)
+ }
+ }
+
+ /**
+ * Provides a total ordering over all the Mangas.
+ *
+ * Order the manga lexicographically.
+ * @return a Comparator that ranks manga lexicographically based on the title.
+ */
+ fun lexicographicRanking(): Comparator {
+ return Comparator { mangaFirst: Manga,
+ mangaSecond: Manga ->
+ compareValues(mangaFirst.title, mangaSecond.title)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
index b20a62d0c..c8f2028bc 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
@@ -18,6 +18,7 @@ import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.DownloadService
+import eu.kanade.tachiyomi.data.library.LibraryUpdateRanker.rankingScheme
import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Companion.start
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.notification.Notifications
@@ -206,7 +207,9 @@ class LibraryUpdateService(
// Update favorite manga. Destroy service when completed or in case of an error.
subscription = Observable
.defer {
+ val selectedScheme = preferences.libraryUpdatePrioritization().getOrDefault()
val mangaList = getMangaToUpdate(intent, target)
+ .sortedWith(rankingScheme[selectedScheme])
// Update either chapter list or manga details.
when (target) {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
index cafa8e1ae..1ce31e117 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
@@ -29,6 +29,8 @@ object PreferenceKeys {
const val colorFilterValue = "color_filter_value"
+ const val colorFilterMode = "color_filter_mode"
+
const val defaultViewer = "pref_default_viewer_key"
const val imageScaleType = "pref_image_scale_type_key"
@@ -85,6 +87,8 @@ object PreferenceKeys {
const val libraryUpdateCategories = "library_update_categories"
+ const val libraryUpdatePrioritization = "library_update_prioritization"
+
const val filterDownloaded = "pref_filter_downloaded_key"
const val filterUnread = "pref_filter_unread_key"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
index 27a3af84f..6855cc050 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
@@ -58,6 +58,8 @@ class PreferencesHelper(val context: Context) {
fun colorFilterValue() = rxPrefs.getInteger(Keys.colorFilterValue, 0)
+ fun colorFilterMode() = rxPrefs.getInteger(Keys.colorFilterMode, 0)
+
fun defaultViewer() = prefs.getInt(Keys.defaultViewer, 1)
fun imageScaleType() = rxPrefs.getInteger(Keys.imageScaleType, 1)
@@ -142,6 +144,8 @@ class PreferencesHelper(val context: Context) {
fun libraryUpdateCategories() = rxPrefs.getStringSet(Keys.libraryUpdateCategories, emptySet())
+ fun libraryUpdatePrioritization() = rxPrefs.getInteger(Keys.libraryUpdatePrioritization, 0)
+
fun libraryAsList() = rxPrefs.getBoolean(Keys.libraryAsList, false)
fun downloadBadge() = rxPrefs.getBoolean(Keys.downloadBadge, false)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt
index 14558d1f1..854afa03d 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt
@@ -4,7 +4,8 @@ import android.content.Context
import eu.kanade.tachiyomi.data.track.anilist.Anilist
import eu.kanade.tachiyomi.data.track.kitsu.Kitsu
import eu.kanade.tachiyomi.data.track.myanimelist.Myanimelist
-import eu.kanade.tachiyomi.data.track.shikomori.Shikomori
+import eu.kanade.tachiyomi.data.track.shikimori.Shikimori
+import eu.kanade.tachiyomi.data.track.bangumi.Bangumi
class TrackManager(private val context: Context) {
@@ -12,7 +13,8 @@ class TrackManager(private val context: Context) {
const val MYANIMELIST = 1
const val ANILIST = 2
const val KITSU = 3
- const val SHIKOMORI = 4
+ const val SHIKIMORI = 4
+ const val BANGUMI = 5
}
val myAnimeList = Myanimelist(context, MYANIMELIST)
@@ -21,9 +23,11 @@ class TrackManager(private val context: Context) {
val kitsu = Kitsu(context, KITSU)
- val shikomori = Shikomori(context, SHIKOMORI)
+ val shikimori = Shikimori(context, SHIKIMORI)
- val services = listOf(myAnimeList, aniList, kitsu, shikomori)
+ val bangumi = Bangumi(context, BANGUMI)
+
+ val services = listOf(myAnimeList, aniList, kitsu, shikimori, bangumi)
fun getService(id: Int) = services.find { it.id == id }
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Avatar.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Avatar.kt
new file mode 100644
index 000000000..02e0b2efb
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Avatar.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.data.track.bangumi
+
+data class Avatar(
+ val large: String? = "",
+ val medium: String? = "",
+ val small: String? = ""
+)
\ No newline at end of file
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt
new file mode 100644
index 000000000..1eb6fff59
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt
@@ -0,0 +1,144 @@
+package eu.kanade.tachiyomi.data.track.bangumi
+
+import android.content.Context
+import android.graphics.Color
+import com.google.gson.Gson
+import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.data.database.models.Track
+import eu.kanade.tachiyomi.data.track.TrackService
+import eu.kanade.tachiyomi.data.track.model.TrackSearch
+import rx.Completable
+import rx.Observable
+import uy.kohesive.injekt.injectLazy
+
+class Bangumi(private val context: Context, id: Int) : TrackService(id) {
+
+ override fun getScoreList(): List {
+ return IntRange(0, 10).map(Int::toString)
+ }
+
+ override fun displayScore(track: Track): String {
+ return track.score.toInt().toString()
+ }
+
+ override fun add(track: Track): Observable