Use wsrv.nl service (#778)
* Add wsrv.nl datasaver service * Add code comments (cherry picked from commit ae712527f333577fb2bbc178c5d915e6e6ae3916)
This commit is contained in:
parent
43b3abf43b
commit
ba0674c4a3
@ -41,7 +41,7 @@ class SourcePreferences(
|
|||||||
|
|
||||||
fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf())
|
fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf())
|
||||||
|
|
||||||
fun dataSaver() = preferenceStore.getBoolean("data_saver", false)
|
fun dataSaver() = preferenceStore.getInt("data_saver", 0)
|
||||||
|
|
||||||
fun dataSaverIgnoreJpeg() = preferenceStore.getBoolean("ignore_jpeg", false)
|
fun dataSaverIgnoreJpeg() = preferenceStore.getBoolean("ignore_jpeg", false)
|
||||||
|
|
||||||
|
@ -599,31 +599,36 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||||||
return Preference.PreferenceGroup(
|
return Preference.PreferenceGroup(
|
||||||
title = stringResource(R.string.data_saver),
|
title = stringResource(R.string.data_saver),
|
||||||
preferenceItems = listOf(
|
preferenceItems = listOf(
|
||||||
Preference.PreferenceItem.SwitchPreference(
|
Preference.PreferenceItem.ListPreference(
|
||||||
pref = sourcePreferences.dataSaver(),
|
pref = sourcePreferences.dataSaver(),
|
||||||
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(
|
||||||
|
0 to stringResource(R.string.disabled),
|
||||||
|
1 to stringResource(R.string.bandwidth_hero),
|
||||||
|
2 to stringResource(R.string.wsrv),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Preference.PreferenceItem.EditTextPreference(
|
Preference.PreferenceItem.EditTextPreference(
|
||||||
pref = sourcePreferences.dataSaverServer(),
|
pref = sourcePreferences.dataSaverServer(),
|
||||||
title = stringResource(R.string.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,
|
enabled = (dataSaver == 1),
|
||||||
),
|
),
|
||||||
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,
|
enabled = (dataSaver != 0),
|
||||||
),
|
),
|
||||||
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,
|
enabled = (dataSaver != 0),
|
||||||
),
|
),
|
||||||
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,
|
enabled = (dataSaver != 0),
|
||||||
),
|
),
|
||||||
Preference.PreferenceItem.ListPreference(
|
Preference.PreferenceItem.ListPreference(
|
||||||
pref = sourcePreferences.dataSaverImageQuality(),
|
pref = sourcePreferences.dataSaverImageQuality(),
|
||||||
@ -639,7 +644,7 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||||||
"90%",
|
"90%",
|
||||||
"95%",
|
"95%",
|
||||||
).associateBy { it.trimEnd('%').toInt() },
|
).associateBy { it.trimEnd('%').toInt() },
|
||||||
enabled = dataSaver,
|
enabled = (dataSaver != 0),
|
||||||
),
|
),
|
||||||
kotlin.run {
|
kotlin.run {
|
||||||
val dataSaverImageFormatJpeg by sourcePreferences.dataSaverImageFormatJpeg().collectAsState()
|
val dataSaverImageFormatJpeg by sourcePreferences.dataSaverImageFormatJpeg().collectAsState()
|
||||||
@ -651,13 +656,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,
|
enabled = (dataSaver != 0),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
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,
|
enabled = (dataSaver == 1),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -72,8 +72,12 @@ class SourcesScreenModel(
|
|||||||
.launchIn(coroutineScope)
|
.launchIn(coroutineScope)
|
||||||
|
|
||||||
sourcePreferences.dataSaver().changes()
|
sourcePreferences.dataSaver().changes()
|
||||||
.onEach { enabled ->
|
.onEach {
|
||||||
mutableState.update { it.copy(dataSaverEnabled = enabled) }
|
mutableState.update {
|
||||||
|
it.copy(
|
||||||
|
dataSaverEnabled = (sourcePreferences.dataSaver().get()),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.launchIn(coroutineScope)
|
.launchIn(coroutineScope)
|
||||||
// SY <--
|
// SY <--
|
||||||
@ -191,7 +195,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: Boolean = false,
|
val dataSaverEnabled: Int = 0,
|
||||||
// SY <--
|
// SY <--
|
||||||
) {
|
) {
|
||||||
val isEmpty = items.isEmpty()
|
val isEmpty = items.isEmpty()
|
||||||
|
@ -97,7 +97,7 @@ fun Screen.sourcesTab(
|
|||||||
onClickToggleDataSaver = {
|
onClickToggleDataSaver = {
|
||||||
screenModel.toggleExcludeFromDataSaver(source)
|
screenModel.toggleExcludeFromDataSaver(source)
|
||||||
screenModel.closeDialog()
|
screenModel.closeDialog()
|
||||||
}.takeIf { state.dataSaverEnabled },
|
}.takeIf { state.dataSaverEnabled != 0 },
|
||||||
onDismiss = screenModel::closeDialog,
|
onDismiss = screenModel::closeDialog,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ interface DataSaver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun DataSaver(source: Source, preferences: SourcePreferences): DataSaver {
|
fun DataSaver(source: Source, preferences: SourcePreferences): DataSaver {
|
||||||
return if (preferences.dataSaver().get() && source.id.toString() !in preferences.dataSaverExcludedSources().get()) {
|
return if (preferences.dataSaver().get() != 0 && source.id.toString() !in preferences.dataSaverExcludedSources().get()) {
|
||||||
return DataSaverImpl(preferences)
|
return DataSaverImpl(preferences)
|
||||||
} else {
|
} else {
|
||||||
DataSaver.NoOp
|
DataSaver.NoOp
|
||||||
@ -49,6 +49,7 @@ fun DataSaver(source: Source, preferences: SourcePreferences): DataSaver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class DataSaverImpl(preferences: SourcePreferences) : DataSaver {
|
private class DataSaverImpl(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()
|
||||||
@ -59,7 +60,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 (dataSavedServer.isNotBlank() && !imageUrl.contains(dataSavedServer)) {
|
return if (dataSaver == 2 || (dataSaver == 1 && 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)
|
||||||
@ -71,7 +72,27 @@ private class DataSaverImpl(preferences: SourcePreferences) : DataSaver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getUrl(imageUrl: String): String {
|
private fun getUrl(imageUrl: String): String {
|
||||||
return "$dataSavedServer/?jpg=$format&l=$quality&bw=$colorBW&url=$imageUrl"
|
if (dataSaver == 1) {
|
||||||
|
// Network Request sent for the Bandwidth Hero Proxy server
|
||||||
|
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"
|
||||||
|
@ -141,7 +141,7 @@
|
|||||||
<item quantity="other">Cleanup done. Removed %d folders</item>
|
<item quantity="other">Cleanup done. Removed %d folders</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="data_saver">Data Saver</string>
|
<string name="data_saver">Data Saver</string>
|
||||||
<string name="data_saver_summary">Compress images before downloading or loading in reader, requires a Bandwidth Hero Proxy server</string>
|
<string name="data_saver_summary">Compress images before downloading or loading in reader</string>
|
||||||
<string name="data_saver_downloader">Use data saver in the downloader</string>
|
<string name="data_saver_downloader">Use data saver in the downloader</string>
|
||||||
<string name="data_saver_ignore_jpeg">Ignore Jpeg Images</string>
|
<string name="data_saver_ignore_jpeg">Ignore Jpeg Images</string>
|
||||||
<string name="data_saver_ignore_gif">Ignore Gif Animations</string>
|
<string name="data_saver_ignore_gif">Ignore Gif Animations</string>
|
||||||
@ -151,7 +151,9 @@
|
|||||||
<string name="data_saver_image_format_summary_on">The Jpeg file size is considerably smaller then Webp is(meaning more data is saved), but it makes the images lose more quality as well.\nCurrently compresses to Jpeg</string>
|
<string name="data_saver_image_format_summary_on">The Jpeg file size is considerably smaller then Webp is(meaning more data is saved), but it makes the images lose more quality as well.\nCurrently compresses to Jpeg</string>
|
||||||
<string name="data_saver_image_format_summary_off">The Jpeg file size is considerably smaller then Webp is(meaning more data is saved), but it makes the images lose more quality as well.\nCurrently compresses to Webp</string>
|
<string name="data_saver_image_format_summary_off">The Jpeg file size is considerably smaller then Webp is(meaning more data is saved), but it makes the images lose more quality as well.\nCurrently compresses to Webp</string>
|
||||||
<string name="data_saver_color_bw">Convert to Black And White</string>
|
<string name="data_saver_color_bw">Convert to Black And White</string>
|
||||||
<string name="data_saver_server">Bandwidth Hero Proxy Server</string>
|
<string name="bandwidth_hero">Bandwidth Hero (requires a Bandwidth Hero Proxy server)</string>
|
||||||
|
<string name="wsrv">wsrv.nl</string>
|
||||||
|
<string name="bandwidth_data_saver_server">Bandwidth Hero Proxy Server</string>
|
||||||
<string name="data_saver_server_summary">Put Bandwidth Hero Proxy server url here</string>
|
<string name="data_saver_server_summary">Put Bandwidth Hero Proxy server url here</string>
|
||||||
<string name="clear_db_exclude_read">Keep entries with read chapters</string>
|
<string name="clear_db_exclude_read">Keep entries with read chapters</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user