Refactor data saver

This commit is contained in:
Jobobby04 2023-03-15 18:00:59 -04:00
parent ae712527f3
commit 36381aca33
5 changed files with 72 additions and 42 deletions

View File

@ -43,7 +43,7 @@ class SourcePreferences(
fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf()) fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf())
fun dataSaver() = preferenceStore.getInt("data_saver", 0) fun dataSaver() = preferenceStore.getEnum("data_saver", DataSaver.NONE)
fun dataSaverIgnoreJpeg() = preferenceStore.getBoolean("ignore_jpeg", false) fun dataSaverIgnoreJpeg() = preferenceStore.getBoolean("ignore_jpeg", false)
@ -60,5 +60,11 @@ class SourcePreferences(
fun dataSaverExcludedSources() = preferenceStore.getStringSet("data_saver_excluded", emptySet()) fun dataSaverExcludedSources() = preferenceStore.getStringSet("data_saver_excluded", emptySet())
fun dataSaverDownloader() = preferenceStore.getBoolean("data_saver_downloader", true) fun dataSaverDownloader() = preferenceStore.getBoolean("data_saver_downloader", true)
enum class DataSaver {
NONE,
BANDWIDTH_HERO,
WSRV_NL,
}
// SY <-- // SY <--
} }

View File

@ -42,6 +42,7 @@ import eu.kanade.domain.UnsortedPreferences
import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.base.BasePreferences
import eu.kanade.domain.manga.interactor.GetAllManga import eu.kanade.domain.manga.interactor.GetAllManga
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.source.service.SourcePreferences.DataSaver
import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.Preference
import eu.kanade.presentation.util.collectAsState import eu.kanade.presentation.util.collectAsState
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -604,31 +605,31 @@ object SettingsAdvancedScreen : SearchableSettings {
title = stringResource(R.string.data_saver), title = stringResource(R.string.data_saver),
subtitle = stringResource(R.string.data_saver_summary), subtitle = stringResource(R.string.data_saver_summary),
entries = mapOf( entries = mapOf(
0 to stringResource(R.string.disabled), DataSaver.NONE to stringResource(R.string.disabled),
1 to stringResource(R.string.bandwidth_hero), DataSaver.BANDWIDTH_HERO to stringResource(R.string.bandwidth_hero),
2 to stringResource(R.string.wsrv), DataSaver.WSRV_NL to stringResource(R.string.wsrv),
), ),
), ),
Preference.PreferenceItem.EditTextPreference( Preference.PreferenceItem.EditTextPreference(
pref = sourcePreferences.dataSaverServer(), pref = sourcePreferences.dataSaverServer(),
title = stringResource(R.string.bandwidth_data_saver_server), title = stringResource(R.string.bandwidth_data_saver_server),
subtitle = stringResource(R.string.data_saver_server_summary), subtitle = stringResource(R.string.data_saver_server_summary),
enabled = (dataSaver == 1), enabled = dataSaver == DataSaver.BANDWIDTH_HERO,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.dataSaverDownloader(), pref = sourcePreferences.dataSaverDownloader(),
title = stringResource(R.string.data_saver_downloader), title = stringResource(R.string.data_saver_downloader),
enabled = (dataSaver != 0), enabled = dataSaver != DataSaver.NONE,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.dataSaverIgnoreJpeg(), pref = sourcePreferences.dataSaverIgnoreJpeg(),
title = stringResource(R.string.data_saver_ignore_jpeg), title = stringResource(R.string.data_saver_ignore_jpeg),
enabled = (dataSaver != 0), enabled = dataSaver != DataSaver.NONE,
), ),
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.dataSaverIgnoreGif(), pref = sourcePreferences.dataSaverIgnoreGif(),
title = stringResource(R.string.data_saver_ignore_gif), title = stringResource(R.string.data_saver_ignore_gif),
enabled = (dataSaver != 0), enabled = dataSaver != DataSaver.NONE,
), ),
Preference.PreferenceItem.ListPreference( Preference.PreferenceItem.ListPreference(
pref = sourcePreferences.dataSaverImageQuality(), pref = sourcePreferences.dataSaverImageQuality(),
@ -644,7 +645,7 @@ object SettingsAdvancedScreen : SearchableSettings {
"90%", "90%",
"95%", "95%",
).associateBy { it.trimEnd('%').toInt() }, ).associateBy { it.trimEnd('%').toInt() },
enabled = (dataSaver != 0), enabled = dataSaver != DataSaver.NONE,
), ),
kotlin.run { kotlin.run {
val dataSaverImageFormatJpeg by sourcePreferences.dataSaverImageFormatJpeg().collectAsState() val dataSaverImageFormatJpeg by sourcePreferences.dataSaverImageFormatJpeg().collectAsState()
@ -656,13 +657,13 @@ object SettingsAdvancedScreen : SearchableSettings {
} else { } else {
stringResource(R.string.data_saver_image_format_summary_off) stringResource(R.string.data_saver_image_format_summary_off)
}, },
enabled = (dataSaver != 0), enabled = dataSaver != DataSaver.NONE,
) )
}, },
Preference.PreferenceItem.SwitchPreference( Preference.PreferenceItem.SwitchPreference(
pref = sourcePreferences.dataSaverColorBW(), pref = sourcePreferences.dataSaverColorBW(),
title = stringResource(R.string.data_saver_color_bw), title = stringResource(R.string.data_saver_color_bw),
enabled = (dataSaver == 1), enabled = dataSaver == DataSaver.BANDWIDTH_HERO,
), ),
), ),
) )

View File

@ -14,6 +14,7 @@ import eu.kanade.domain.source.interactor.ToggleExcludeFromDataSaver
import eu.kanade.domain.source.interactor.ToggleSource import eu.kanade.domain.source.interactor.ToggleSource
import eu.kanade.domain.source.interactor.ToggleSourcePin import eu.kanade.domain.source.interactor.ToggleSourcePin
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.source.service.SourcePreferences.DataSaver
import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.UiPreferences
import eu.kanade.presentation.browse.SourceUiModel import eu.kanade.presentation.browse.SourceUiModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -75,7 +76,7 @@ class SourcesScreenModel(
.onEach { .onEach {
mutableState.update { mutableState.update {
it.copy( it.copy(
dataSaverEnabled = (sourcePreferences.dataSaver().get()), dataSaverEnabled = sourcePreferences.dataSaver().get() != DataSaver.NONE,
) )
} }
} }
@ -195,7 +196,7 @@ data class SourcesState(
val categories: List<String> = emptyList(), val categories: List<String> = emptyList(),
val showPin: Boolean = true, val showPin: Boolean = true,
val showLatest: Boolean = false, val showLatest: Boolean = false,
val dataSaverEnabled: Int = 0, val dataSaverEnabled: Boolean = false,
// SY <-- // SY <--
) { ) {
val isEmpty = items.isEmpty() val isEmpty = items.isEmpty()

View File

@ -97,7 +97,7 @@ fun Screen.sourcesTab(
onClickToggleDataSaver = { onClickToggleDataSaver = {
screenModel.toggleExcludeFromDataSaver(source) screenModel.toggleExcludeFromDataSaver(source)
screenModel.closeDialog() screenModel.closeDialog()
}.takeIf { state.dataSaverEnabled != 0 }, }.takeIf { state.dataSaverEnabled },
onDismiss = screenModel::closeDialog, onDismiss = screenModel::closeDialog,
) )
} }

View File

@ -1,6 +1,9 @@
package exh.util package exh.util
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.source.service.SourcePreferences.DataSaver.BANDWIDTH_HERO
import eu.kanade.domain.source.service.SourcePreferences.DataSaver.NONE
import eu.kanade.domain.source.service.SourcePreferences.DataSaver.WSRV_NL
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
@ -41,15 +44,18 @@ interface DataSaver {
} }
fun DataSaver(source: Source, preferences: SourcePreferences): DataSaver { fun DataSaver(source: Source, preferences: SourcePreferences): DataSaver {
return if (preferences.dataSaver().get() != 0 && source.id.toString() !in preferences.dataSaverExcludedSources().get()) { val dataSaver = preferences.dataSaver().get()
return DataSaverImpl(preferences) if (dataSaver != NONE && source.id.toString() in preferences.dataSaverExcludedSources().get()) {
} else { return DataSaver.NoOp
DataSaver.NoOp }
return when (dataSaver) {
NONE -> DataSaver.NoOp
BANDWIDTH_HERO -> BandwidthHeroDataSaver(preferences)
WSRV_NL -> WsrvNlDataSaver(preferences)
} }
} }
private class DataSaverImpl(preferences: SourcePreferences) : DataSaver { private class BandwidthHeroDataSaver(preferences: SourcePreferences) : DataSaver {
private val dataSaver = preferences.dataSaver().get()
private val dataSavedServer = preferences.dataSaverServer().get().trimEnd('/') private val dataSavedServer = preferences.dataSaverServer().get().trimEnd('/')
private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get() private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get()
@ -60,7 +66,7 @@ private class DataSaverImpl(preferences: SourcePreferences) : DataSaver {
private val colorBW = preferences.dataSaverColorBW().toIntRepresentation() private val colorBW = preferences.dataSaverColorBW().toIntRepresentation()
override fun compress(imageUrl: String): String { override fun compress(imageUrl: String): String {
return if (dataSaver == 2 || (dataSaver == 1 && dataSavedServer.isNotBlank() && !imageUrl.contains(dataSavedServer))) { return if (dataSavedServer.isNotBlank() && !imageUrl.contains(dataSavedServer)) {
when { when {
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl) imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl)
imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl) imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl)
@ -72,28 +78,44 @@ private class DataSaverImpl(preferences: SourcePreferences) : DataSaver {
} }
private fun getUrl(imageUrl: String): String { private fun getUrl(imageUrl: String): String {
if (dataSaver == 1) { // Network Request sent for the Bandwidth Hero Proxy server
// Network Request sent for the Bandwidth Hero Proxy server return "$dataSavedServer/?jpg=$format&l=$quality&bw=$colorBW&url=$imageUrl"
return "$dataSavedServer/?jpg=$format&l=$quality&bw=$colorBW&url=$imageUrl"
} else {
// Network Request sent to wsrv
if (imageUrl.contains(".webp", true) || imageUrl.contains(".gif", true)) {
if (format.toInt() == 0) {
// Preserve output image extension for animated images(.webp and .gif)
return "https://wsrv.nl/?url=$imageUrl&q=$quality&n=-1"
} else {
// Do not preserve output Extension if User asked to convert into Jpeg
return "https://wsrv.nl/?url=$imageUrl&output=jpg&q=$quality&n=-1"
}
} else {
if (format.toInt() == 1) {
return "https://wsrv.nl/?url=$imageUrl&output=jpg&q=$quality"
} else {
return "https://wsrv.nl/?url=$imageUrl&output=webp&q=$quality"
}
}
}
} }
private fun Preference<Boolean>.toIntRepresentation() = if (get()) "1" else "0" private fun Preference<Boolean>.toIntRepresentation() = if (get()) "1" else "0"
} }
private class WsrvNlDataSaver(preferences: SourcePreferences) : DataSaver {
private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get()
private val ignoreGif = preferences.dataSaverIgnoreGif().get()
private val format = preferences.dataSaverImageFormatJpeg().get()
private val quality = preferences.dataSaverImageQuality().get()
override fun compress(imageUrl: String): String {
return when {
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl)
imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl)
else -> getUrl(imageUrl)
}
}
private fun getUrl(imageUrl: String): String {
// Network Request sent to wsrv
return "https://wsrv.nl/?url=$imageUrl" + if (imageUrl.contains(".webp", true) || imageUrl.contains(".gif", true)) {
if (!format) {
// Preserve output image extension for animated images(.webp and .gif)
"&q=$quality&n=-1"
} else {
// Do not preserve output Extension if User asked to convert into Jpeg
"&output=jpg&q=$quality&n=-1"
}
} else {
if (format) {
"&output=jpg&q=$quality"
} else {
"&output=webp&q=$quality"
}
}
}
}