diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7049d912..bc12ce57 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -335,6 +335,7 @@ "installed": "Installed", "auto_scroll": "Auto scroll", "video_audio": "Audio", + "video_audio_info": "Preferred languages, pitch correction, audio channels", "player": "Player", "markEpisodeAsSeenSetting": "At what point to mark the episode as seen", "default_skip_intro_length": "Default Skip intro length", @@ -406,6 +407,7 @@ "torrent_url": "Torrent url", "or": "OR", "advanced": "Advanced", + "advanced_info": "mpv config", "use_native_http_client": "Use native http client", "use_native_http_client_info": "it automatically supports platform features such VPNs, support more HTTP features such as HTTP/3 and custom redirect handling", "n_hour_ago": "{hour} hour ago", @@ -458,6 +460,7 @@ "you_have_finished_reading": "You have finished reading", "return_to_the_list_of_chapters": "Return to the list of chapters", "hwdec": "Hardware Decoder", + "track_library_navigate": "Go to existing local entry", "track_library_add": "Add to local library", "track_library_add_confirm": "Add tracked item to local library", "track_library_not_logged": "Login to the corresponding tracker to use this feature!", @@ -488,5 +491,23 @@ "custom_buttons_js_code_req": "Javascript code required", "custom_buttons_js_code_long": "Javascript code (on long press)", "custom_buttons_startup": "Javascript code (on startup)", - "n_days": "{n} days" + "n_days": "{n} days", + "decoder": "Decoder", + "decoder_info": "Hardware decoding, pixel format, debanding", + "enable_gpu_next": "Enable gpu-next (Android only)", + "enable_gpu_next_info": "A new video rendering backend", + "debanding": "Debanding", + "use_yuv420p": "Use YUV420P pixel format", + "use_yuv420p_info": "May fix black screens on some video codecs, can also improve performance at the cost of quality", + "audio_preferred_languages": "Preferred langauages", + "audio_preferred_languages_info": "Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.", + "enable_audio_pitch_correction": "Enable audio pitch correction", + "enable_audio_pitch_correction_info": "Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds", + "audio_channels": "Audio channels", + "volume_boost_cap": "Volume boost cap", + "internal_player": "Internal player", + "internal_player_info": "Progress, controls, orientation", + "subtitle_delay_text": "Subtitle delay", + "subtitle_delay": "Delay (ms)", + "subtitle_speed": "Speed" } diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 73ef3982..f8f51b64 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -2081,6 +2081,12 @@ abstract class AppLocalizations { /// **'Audio'** String get video_audio; + /// No description provided for @video_audio_info. + /// + /// In en, this message translates to: + /// **'Preferred languages, pitch correction, audio channels'** + String get video_audio_info; + /// No description provided for @player. /// /// In en, this message translates to: @@ -2507,6 +2513,12 @@ abstract class AppLocalizations { /// **'Advanced'** String get advanced; + /// No description provided for @advanced_info. + /// + /// In en, this message translates to: + /// **'mpv config'** + String get advanced_info; + /// No description provided for @use_native_http_client. /// /// In en, this message translates to: @@ -2819,6 +2831,12 @@ abstract class AppLocalizations { /// **'Hardware Decoder'** String get hwdec; + /// No description provided for @track_library_navigate. + /// + /// In en, this message translates to: + /// **'Go to existing local entry'** + String get track_library_navigate; + /// No description provided for @track_library_add. /// /// In en, this message translates to: @@ -3004,6 +3022,114 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'{n} days'** String n_days(Object n); + + /// No description provided for @decoder. + /// + /// In en, this message translates to: + /// **'Decoder'** + String get decoder; + + /// No description provided for @decoder_info. + /// + /// In en, this message translates to: + /// **'Hardware decoding, pixel format, debanding'** + String get decoder_info; + + /// No description provided for @enable_gpu_next. + /// + /// In en, this message translates to: + /// **'Enable gpu-next (Android only)'** + String get enable_gpu_next; + + /// No description provided for @enable_gpu_next_info. + /// + /// In en, this message translates to: + /// **'A new video rendering backend'** + String get enable_gpu_next_info; + + /// No description provided for @debanding. + /// + /// In en, this message translates to: + /// **'Debanding'** + String get debanding; + + /// No description provided for @use_yuv420p. + /// + /// In en, this message translates to: + /// **'Use YUV420P pixel format'** + String get use_yuv420p; + + /// No description provided for @use_yuv420p_info. + /// + /// In en, this message translates to: + /// **'May fix black screens on some video codecs, can also improve performance at the cost of quality'** + String get use_yuv420p_info; + + /// No description provided for @audio_preferred_languages. + /// + /// In en, this message translates to: + /// **'Preferred langauages'** + String get audio_preferred_languages; + + /// No description provided for @audio_preferred_languages_info. + /// + /// In en, this message translates to: + /// **'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'** + String get audio_preferred_languages_info; + + /// No description provided for @enable_audio_pitch_correction. + /// + /// In en, this message translates to: + /// **'Enable audio pitch correction'** + String get enable_audio_pitch_correction; + + /// No description provided for @enable_audio_pitch_correction_info. + /// + /// In en, this message translates to: + /// **'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'** + String get enable_audio_pitch_correction_info; + + /// No description provided for @audio_channels. + /// + /// In en, this message translates to: + /// **'Audio channels'** + String get audio_channels; + + /// No description provided for @volume_boost_cap. + /// + /// In en, this message translates to: + /// **'Volume boost cap'** + String get volume_boost_cap; + + /// No description provided for @internal_player. + /// + /// In en, this message translates to: + /// **'Internal player'** + String get internal_player; + + /// No description provided for @internal_player_info. + /// + /// In en, this message translates to: + /// **'Progress, controls, orientation'** + String get internal_player_info; + + /// No description provided for @subtitle_delay_text. + /// + /// In en, this message translates to: + /// **'Subtitle delay'** + String get subtitle_delay_text; + + /// No description provided for @subtitle_delay. + /// + /// In en, this message translates to: + /// **'Delay (ms)'** + String get subtitle_delay; + + /// No description provided for @subtitle_speed. + /// + /// In en, this message translates to: + /// **'Speed'** + String get subtitle_speed; } class _AppLocalizationsDelegate diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index a3fb79f5..6a7b7c8e 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -1050,6 +1050,10 @@ class AppLocalizationsAr extends AppLocalizations { @override String get video_audio => 'الصوت'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'لاعب'; @@ -1272,6 +1276,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get advanced => 'متقدم'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'استخدام عميل HTTP الأصلي'; @@ -1450,6 +1457,9 @@ class AppLocalizationsAr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1548,4 +1558,61 @@ class AppLocalizationsAr extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index ccc8ce7f..94cd4f50 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1055,6 +1055,10 @@ class AppLocalizationsDe extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Player'; @@ -1282,6 +1286,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get advanced => 'Erweitert'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Nativen HTTP-Client verwenden'; @@ -1462,6 +1469,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Zur lokalen Bibliothek hinzufügen'; @@ -1561,4 +1571,61 @@ class AppLocalizationsDe extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 19050456..3a06fe3a 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1049,6 +1049,10 @@ class AppLocalizationsEn extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Player'; @@ -1272,6 +1276,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get advanced => 'Advanced'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Use native http client'; @@ -1451,6 +1458,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1549,4 +1559,61 @@ class AppLocalizationsEn extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 8ad3b531..2badf647 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1059,6 +1059,10 @@ class AppLocalizationsEs extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Jugador'; @@ -1286,6 +1290,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get advanced => 'Avanzado'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Utilizar cliente HTTP nativo'; @@ -1468,6 +1475,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1566,6 +1576,63 @@ class AppLocalizationsEs extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } /// The translations for Spanish Castilian, as used in Latin America and the Caribbean (`es_419`). diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index f1dee22e..3e884093 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1061,6 +1061,10 @@ class AppLocalizationsFr extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Lecteur'; @@ -1288,6 +1292,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get advanced => 'Avancé'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Utiliser le client HTTP natif'; @@ -1469,6 +1476,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1567,4 +1577,61 @@ class AppLocalizationsFr extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index c2c87a01..00de1ae8 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1055,6 +1055,10 @@ class AppLocalizationsId extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Pemain'; @@ -1279,6 +1283,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get advanced => 'Lanjutan'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Gunakan klien http asli'; @@ -1457,6 +1464,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1555,4 +1565,61 @@ class AppLocalizationsId extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index 7411c45b..e162f89f 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1058,6 +1058,10 @@ class AppLocalizationsIt extends AppLocalizations { @override String get video_audio => 'Audio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Giocatore'; @@ -1286,6 +1290,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get advanced => 'Avanzate'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Usa il client HTTP nativo'; @@ -1466,6 +1473,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1564,4 +1574,61 @@ class AppLocalizationsIt extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index c1885463..bb6ea388 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1057,6 +1057,10 @@ class AppLocalizationsPt extends AppLocalizations { @override String get video_audio => 'Áudio'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Jogador'; @@ -1283,6 +1287,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get advanced => 'Avançado'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Usar cliente HTTP nativo'; @@ -1465,6 +1472,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1563,6 +1573,63 @@ class AppLocalizationsPt extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } /// The translations for Portuguese, as used in Brazil (`pt_BR`). diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 55c58f7b..6fc4136d 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1060,6 +1060,10 @@ class AppLocalizationsRu extends AppLocalizations { @override String get video_audio => 'Аудио'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Игрок'; @@ -1286,6 +1290,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get advanced => 'Продвинутые'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Использовать нативный HTTP-клиент'; @@ -1467,6 +1474,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1565,4 +1575,61 @@ class AppLocalizationsRu extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index b9cbb00c..fcb07900 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1049,6 +1049,10 @@ class AppLocalizationsTh extends AppLocalizations { @override String get video_audio => 'เสียง'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'ตัวเล่น'; @@ -1273,6 +1277,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get advanced => 'ขั้นสูง'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'ใช้ไคลเอนต์ HTTP พื้นเมือง'; @@ -1451,6 +1458,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1549,4 +1559,61 @@ class AppLocalizationsTh extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 382f9f66..34cdac5e 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1053,6 +1053,10 @@ class AppLocalizationsTr extends AppLocalizations { @override String get video_audio => 'Ses'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => 'Oyuncu'; @@ -1278,6 +1282,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get advanced => 'Gelişmiş'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => 'Yerel http istemcisini kullan'; @@ -1457,6 +1464,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1555,4 +1565,61 @@ class AppLocalizationsTr extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index b1eca29e..b4f3f66b 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1033,6 +1033,10 @@ class AppLocalizationsZh extends AppLocalizations { @override String get video_audio => '音频'; + @override + String get video_audio_info => + 'Preferred languages, pitch correction, audio channels'; + @override String get player => '播放器'; @@ -1250,6 +1254,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get advanced => '高级'; + @override + String get advanced_info => 'mpv config'; + @override String get use_native_http_client => '使用本地 HTTP 客户端'; @@ -1422,6 +1429,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get hwdec => 'Hardware Decoder'; + @override + String get track_library_navigate => 'Go to existing local entry'; + @override String get track_library_add => 'Add to local library'; @@ -1520,4 +1530,61 @@ class AppLocalizationsZh extends AppLocalizations { String n_days(Object n) { return '$n days'; } + + @override + String get decoder => 'Decoder'; + + @override + String get decoder_info => 'Hardware decoding, pixel format, debanding'; + + @override + String get enable_gpu_next => 'Enable gpu-next (Android only)'; + + @override + String get enable_gpu_next_info => 'A new video rendering backend'; + + @override + String get debanding => 'Debanding'; + + @override + String get use_yuv420p => 'Use YUV420P pixel format'; + + @override + String get use_yuv420p_info => + 'May fix black screens on some video codecs, can also improve performance at the cost of quality'; + + @override + String get audio_preferred_languages => 'Preferred langauages'; + + @override + String get audio_preferred_languages_info => + 'Audio langauage(s) to be selected by default on a video with multiple audio streams, 2/3-letter languages codes (e.g.: en, de, fr) work. Multiple values can be delimited by a comma.'; + + @override + String get enable_audio_pitch_correction => 'Enable audio pitch correction'; + + @override + String get enable_audio_pitch_correction_info => + 'Prevents the audio from becoming high-pitched at faster speeds and low-pitched at slower speeds'; + + @override + String get audio_channels => 'Audio channels'; + + @override + String get volume_boost_cap => 'Volume boost cap'; + + @override + String get internal_player => 'Internal player'; + + @override + String get internal_player_info => 'Progress, controls, orientation'; + + @override + String get subtitle_delay_text => 'Subtitle delay'; + + @override + String get subtitle_delay => 'Delay (ms)'; + + @override + String get subtitle_speed => 'Speed'; } diff --git a/lib/models/settings.dart b/lib/models/settings.dart index e4655ed0..425f9134 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -260,6 +260,22 @@ class Settings { bool? useMpvConfig; + @enumerated + late DebandingType debandingType; + + bool? enableGpuNext; + + bool? useYUV420P; + + String? audioPreferredLanguages; + + bool? enableAudioPitchCorrection; + + @enumerated + late AudioChannel audioChannels; + + int? volumeBoostCap; + Settings({ this.id = 227, this.updatedAt = 0, @@ -376,6 +392,13 @@ class Settings { this.rpcShowTitle = true, this.rpcShowCoverImage = true, this.useMpvConfig = true, + this.debandingType = DebandingType.none, + this.enableGpuNext = false, + this.useYUV420P = false, + this.audioPreferredLanguages, + this.enableAudioPitchCorrection, + this.audioChannels = AudioChannel.autoSafe, + this.volumeBoostCap, }); Settings.fromJson(Map json) { @@ -598,6 +621,15 @@ class Settings { rpcShowTitle = json['rpcShowTitle']; rpcShowCoverImage = json['rpcShowCoverImage']; useMpvConfig = json['useMpvConfig']; + debandingType = + DebandingType.values[json['debandingType'] ?? DebandingType.none.index]; + enableGpuNext = json['enableGpuNext']; + useYUV420P = json['useYUV420P']; + audioPreferredLanguages = json['audioPreferredLanguages']; + enableAudioPitchCorrection = json['enableAudioPitchCorrection']; + audioChannels = AudioChannel + .values[json['audioChannels'] ?? AudioChannel.autoSafe.index]; + volumeBoostCap = json['volumeBoostCap']; } Map toJson() => { @@ -737,9 +769,30 @@ class Settings { 'rpcShowTitle': rpcShowTitle, 'rpcShowCoverImage': rpcShowCoverImage, 'useMpvConfig': useMpvConfig, + 'debandingType': debandingType.index, + 'enableGpuNext': enableGpuNext, + 'useYUV420P': useYUV420P, + 'audioPreferredLanguages': audioPreferredLanguages, + 'enableAudioPitchCorrection': enableAudioPitchCorrection, + 'audioChannels': audioChannels.index, + 'volumeBoostCap': volumeBoostCap, }; } +enum DebandingType { none, cpu, gpu } + +enum AudioChannel { + auto(mpvName: "auto"), + autoSafe(mpvName: "auto-safe"), + mono(mpvName: "mono"), + stereo(mpvName: "stereo"), + reverseStereo(mpvName: "pan=[stereo|c0=c1|c1=c0]"); + + final String mpvName; + + const AudioChannel({required this.mpvName}); +} + enum SectionType { all, anime, manga } enum DisplayType { compactGrid, comfortableGrid, coverOnlyGrid, list } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 8a4e5827..975f0946 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -79,574 +79,611 @@ const SettingsSchema = CollectionSchema( name: r'appFontFamily', type: IsarType.string, ), - r'autoBackupLocation': PropertySchema( + r'audioChannels': PropertySchema( id: 12, + name: r'audioChannels', + type: IsarType.byte, + enumMap: _SettingsaudioChannelsEnumValueMap, + ), + r'audioPreferredLanguages': PropertySchema( + id: 13, + name: r'audioPreferredLanguages', + type: IsarType.string, + ), + r'autoBackupLocation': PropertySchema( + id: 14, name: r'autoBackupLocation', type: IsarType.string, ), r'autoExtensionsUpdates': PropertySchema( - id: 13, + id: 15, name: r'autoExtensionsUpdates', type: IsarType.bool, ), r'autoScrollPages': PropertySchema( - id: 14, + id: 16, name: r'autoScrollPages', type: IsarType.objectList, target: r'AutoScrollPages', ), r'backgroundColor': PropertySchema( - id: 15, + id: 17, name: r'backgroundColor', type: IsarType.byte, enumMap: _SettingsbackgroundColorEnumValueMap, ), r'backupFrequency': PropertySchema( - id: 16, + id: 18, name: r'backupFrequency', type: IsarType.long, ), r'backupListOptions': PropertySchema( - id: 17, + id: 19, name: r'backupListOptions', type: IsarType.longList, ), r'btServerAddress': PropertySchema( - id: 18, + id: 20, name: r'btServerAddress', type: IsarType.string, ), r'btServerPort': PropertySchema( - id: 19, + id: 21, name: r'btServerPort', type: IsarType.long, ), r'chapterFilterBookmarkedList': PropertySchema( - id: 20, + id: 22, name: r'chapterFilterBookmarkedList', type: IsarType.objectList, target: r'ChapterFilterBookmarked', ), r'chapterFilterDownloadedList': PropertySchema( - id: 21, + id: 23, name: r'chapterFilterDownloadedList', type: IsarType.objectList, target: r'ChapterFilterDownloaded', ), r'chapterFilterUnreadList': PropertySchema( - id: 22, + id: 24, name: r'chapterFilterUnreadList', type: IsarType.objectList, target: r'ChapterFilterUnread', ), r'chapterPageIndexList': PropertySchema( - id: 23, + id: 25, name: r'chapterPageIndexList', type: IsarType.objectList, target: r'ChapterPageIndex', ), r'chapterPageUrlsList': PropertySchema( - id: 24, + id: 26, name: r'chapterPageUrlsList', type: IsarType.objectList, target: r'ChapterPageurls', ), r'checkForAppUpdates': PropertySchema( - id: 25, + id: 27, name: r'checkForAppUpdates', type: IsarType.bool, ), r'checkForExtensionUpdates': PropertySchema( - id: 26, + id: 28, name: r'checkForExtensionUpdates', type: IsarType.bool, ), r'clearChapterCacheOnAppLaunch': PropertySchema( - id: 27, + id: 29, name: r'clearChapterCacheOnAppLaunch', type: IsarType.bool, ), r'colorFilterBlendMode': PropertySchema( - id: 28, + id: 30, name: r'colorFilterBlendMode', type: IsarType.byte, enumMap: _SettingscolorFilterBlendModeEnumValueMap, ), r'concurrentDownloads': PropertySchema( - id: 29, + id: 31, name: r'concurrentDownloads', type: IsarType.long, ), r'cookiesList': PropertySchema( - id: 30, + id: 32, name: r'cookiesList', type: IsarType.objectList, target: r'MCookie', ), r'cropBorders': PropertySchema( - id: 31, + id: 33, name: r'cropBorders', type: IsarType.bool, ), r'customColorFilter': PropertySchema( - id: 32, + id: 34, name: r'customColorFilter', type: IsarType.object, target: r'CustomColorFilter', ), r'dateFormat': PropertySchema( - id: 33, + id: 35, name: r'dateFormat', type: IsarType.string, ), + r'debandingType': PropertySchema( + id: 36, + name: r'debandingType', + type: IsarType.byte, + enumMap: _SettingsdebandingTypeEnumValueMap, + ), r'defaultDoubleTapToSkipLength': PropertySchema( - id: 34, + id: 37, name: r'defaultDoubleTapToSkipLength', type: IsarType.long, ), r'defaultPlayBackSpeed': PropertySchema( - id: 35, + id: 38, name: r'defaultPlayBackSpeed', type: IsarType.double, ), r'defaultReaderMode': PropertySchema( - id: 36, + id: 39, name: r'defaultReaderMode', type: IsarType.byte, enumMap: _SettingsdefaultReaderModeEnumValueMap, ), r'defaultSkipIntroLength': PropertySchema( - id: 37, + id: 40, name: r'defaultSkipIntroLength', type: IsarType.long, ), r'defaultSubtitleLang': PropertySchema( - id: 38, + id: 41, name: r'defaultSubtitleLang', type: IsarType.object, target: r'L10nLocale', ), r'disableSectionType': PropertySchema( - id: 39, + id: 42, name: r'disableSectionType', type: IsarType.byte, enumMap: _SettingsdisableSectionTypeEnumValueMap, ), r'displayType': PropertySchema( - id: 40, + id: 43, name: r'displayType', type: IsarType.byte, enumMap: _SettingsdisplayTypeEnumValueMap, ), r'doubleTapAnimationSpeed': PropertySchema( - id: 41, + id: 44, name: r'doubleTapAnimationSpeed', type: IsarType.long, ), r'downloadLocation': PropertySchema( - id: 42, + id: 45, name: r'downloadLocation', type: IsarType.string, ), r'downloadOnlyOnWifi': PropertySchema( - id: 43, + id: 46, name: r'downloadOnlyOnWifi', type: IsarType.bool, ), r'enableAniSkip': PropertySchema( - id: 44, + id: 47, name: r'enableAniSkip', type: IsarType.bool, ), + r'enableAudioPitchCorrection': PropertySchema( + id: 48, + name: r'enableAudioPitchCorrection', + type: IsarType.bool, + ), r'enableAutoSkip': PropertySchema( - id: 45, + id: 49, name: r'enableAutoSkip', type: IsarType.bool, ), r'enableCustomColorFilter': PropertySchema( - id: 46, + id: 50, name: r'enableCustomColorFilter', type: IsarType.bool, ), r'enableDiscordRpc': PropertySchema( - id: 47, + id: 51, name: r'enableDiscordRpc', type: IsarType.bool, ), + r'enableGpuNext': PropertySchema( + id: 52, + name: r'enableGpuNext', + type: IsarType.bool, + ), r'filterScanlatorList': PropertySchema( - id: 48, + id: 53, name: r'filterScanlatorList', type: IsarType.objectList, target: r'FilterScanlator', ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 49, + id: 54, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 50, + id: 55, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'followSystemTheme': PropertySchema( - id: 51, + id: 56, name: r'followSystemTheme', type: IsarType.bool, ), r'fullScreenPlayer': PropertySchema( - id: 52, + id: 57, name: r'fullScreenPlayer', type: IsarType.bool, ), r'fullScreenReader': PropertySchema( - id: 53, + id: 58, name: r'fullScreenReader', type: IsarType.bool, ), r'hideDiscordRpcInIncognito': PropertySchema( - id: 54, + id: 59, name: r'hideDiscordRpcInIncognito', type: IsarType.bool, ), r'hideItems': PropertySchema( - id: 55, + id: 60, name: r'hideItems', type: IsarType.stringList, ), r'hwdecMode': PropertySchema( - id: 56, + id: 61, name: r'hwdecMode', type: IsarType.string, ), r'incognitoMode': PropertySchema( - id: 57, + id: 62, name: r'incognitoMode', type: IsarType.bool, ), r'lastTrackerLibraryLocation': PropertySchema( - id: 58, + id: 63, name: r'lastTrackerLibraryLocation', type: IsarType.string, ), r'libraryDownloadedChapters': PropertySchema( - id: 59, + id: 64, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 60, + id: 65, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 61, + id: 66, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 62, + id: 67, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 63, + id: 68, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 64, + id: 69, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 65, + id: 70, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 66, + id: 71, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 67, + id: 72, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 68, + id: 73, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 69, + id: 74, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 70, + id: 75, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 71, + id: 76, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 72, + id: 77, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 73, + id: 78, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 74, + id: 79, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 75, + id: 80, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 76, + id: 81, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 77, + id: 82, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaExtensionsRepo': PropertySchema( - id: 78, + id: 83, name: r'mangaExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'mangaGridSize': PropertySchema( - id: 79, + id: 84, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 80, + id: 85, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 81, + id: 86, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'mergeLibraryNavMobile': PropertySchema( - id: 82, + id: 87, name: r'mergeLibraryNavMobile', type: IsarType.bool, ), r'navigationOrder': PropertySchema( - id: 83, + id: 88, name: r'navigationOrder', type: IsarType.stringList, ), r'novelDisplayType': PropertySchema( - id: 84, + id: 89, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelExtensionsRepo': PropertySchema( - id: 85, + id: 90, name: r'novelExtensionsRepo', type: IsarType.objectList, target: r'Repo', ), r'novelFontSize': PropertySchema( - id: 86, + id: 91, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 87, + id: 92, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 88, + id: 93, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 89, + id: 94, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 90, + id: 95, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 91, + id: 96, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 92, + id: 97, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 93, + id: 98, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 94, + id: 99, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 95, + id: 100, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 96, + id: 101, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 97, + id: 102, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 98, + id: 103, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 99, + id: 104, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 100, + id: 105, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 101, + id: 106, name: r'relativeTimesTamps', type: IsarType.long, ), r'rpcShowCoverImage': PropertySchema( - id: 102, + id: 107, name: r'rpcShowCoverImage', type: IsarType.bool, ), r'rpcShowReadingWatchingProgress': PropertySchema( - id: 103, + id: 108, name: r'rpcShowReadingWatchingProgress', type: IsarType.bool, ), r'rpcShowTitle': PropertySchema( - id: 104, + id: 109, name: r'rpcShowTitle', type: IsarType.bool, ), r'saveAsCBZArchive': PropertySchema( - id: 105, + id: 110, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 106, + id: 111, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 107, + id: 112, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 108, + id: 113, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 109, + id: 114, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 110, + id: 115, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 111, + id: 116, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 112, + id: 117, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 113, + id: 118, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 114, + id: 119, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'updatedAt': PropertySchema( - id: 115, + id: 120, name: r'updatedAt', type: IsarType.long, ), r'useLibass': PropertySchema( - id: 116, + id: 121, name: r'useLibass', type: IsarType.bool, ), r'useMpvConfig': PropertySchema( - id: 117, + id: 122, name: r'useMpvConfig', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 118, + id: 123, name: r'usePageTapZones', type: IsarType.bool, ), + r'useYUV420P': PropertySchema( + id: 124, + name: r'useYUV420P', + type: IsarType.bool, + ), r'userAgent': PropertySchema( - id: 119, + id: 125, name: r'userAgent', type: IsarType.string, + ), + r'volumeBoostCap': PropertySchema( + id: 126, + name: r'volumeBoostCap', + type: IsarType.long, ) }, estimateSize: _settingsEstimateSize, @@ -712,6 +749,12 @@ int _settingsEstimateSize( bytesCount += 3 + value.length * 3; } } + { + final value = object.audioPreferredLanguages; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.autoBackupLocation; if (value != null) { @@ -1045,214 +1088,221 @@ void _settingsSerialize( writer.writeBool(offsets[9], object.animeLibraryShowLanguage); writer.writeBool(offsets[10], object.animeLibraryShowNumbersOfItems); writer.writeString(offsets[11], object.appFontFamily); - writer.writeString(offsets[12], object.autoBackupLocation); - writer.writeBool(offsets[13], object.autoExtensionsUpdates); + writer.writeByte(offsets[12], object.audioChannels.index); + writer.writeString(offsets[13], object.audioPreferredLanguages); + writer.writeString(offsets[14], object.autoBackupLocation); + writer.writeBool(offsets[15], object.autoExtensionsUpdates); writer.writeObjectList( - offsets[14], + offsets[16], allOffsets, AutoScrollPagesSchema.serialize, object.autoScrollPages, ); - writer.writeByte(offsets[15], object.backgroundColor.index); - writer.writeLong(offsets[16], object.backupFrequency); - writer.writeLongList(offsets[17], object.backupListOptions); - writer.writeString(offsets[18], object.btServerAddress); - writer.writeLong(offsets[19], object.btServerPort); + writer.writeByte(offsets[17], object.backgroundColor.index); + writer.writeLong(offsets[18], object.backupFrequency); + writer.writeLongList(offsets[19], object.backupListOptions); + writer.writeString(offsets[20], object.btServerAddress); + writer.writeLong(offsets[21], object.btServerPort); writer.writeObjectList( - offsets[20], + offsets[22], allOffsets, ChapterFilterBookmarkedSchema.serialize, object.chapterFilterBookmarkedList, ); writer.writeObjectList( - offsets[21], + offsets[23], allOffsets, ChapterFilterDownloadedSchema.serialize, object.chapterFilterDownloadedList, ); writer.writeObjectList( - offsets[22], + offsets[24], allOffsets, ChapterFilterUnreadSchema.serialize, object.chapterFilterUnreadList, ); writer.writeObjectList( - offsets[23], + offsets[25], allOffsets, ChapterPageIndexSchema.serialize, object.chapterPageIndexList, ); writer.writeObjectList( - offsets[24], + offsets[26], allOffsets, ChapterPageurlsSchema.serialize, object.chapterPageUrlsList, ); - writer.writeBool(offsets[25], object.checkForAppUpdates); - writer.writeBool(offsets[26], object.checkForExtensionUpdates); - writer.writeBool(offsets[27], object.clearChapterCacheOnAppLaunch); - writer.writeByte(offsets[28], object.colorFilterBlendMode.index); - writer.writeLong(offsets[29], object.concurrentDownloads); + writer.writeBool(offsets[27], object.checkForAppUpdates); + writer.writeBool(offsets[28], object.checkForExtensionUpdates); + writer.writeBool(offsets[29], object.clearChapterCacheOnAppLaunch); + writer.writeByte(offsets[30], object.colorFilterBlendMode.index); + writer.writeLong(offsets[31], object.concurrentDownloads); writer.writeObjectList( - offsets[30], + offsets[32], allOffsets, MCookieSchema.serialize, object.cookiesList, ); - writer.writeBool(offsets[31], object.cropBorders); + writer.writeBool(offsets[33], object.cropBorders); writer.writeObject( - offsets[32], + offsets[34], allOffsets, CustomColorFilterSchema.serialize, object.customColorFilter, ); - writer.writeString(offsets[33], object.dateFormat); - writer.writeLong(offsets[34], object.defaultDoubleTapToSkipLength); - writer.writeDouble(offsets[35], object.defaultPlayBackSpeed); - writer.writeByte(offsets[36], object.defaultReaderMode.index); - writer.writeLong(offsets[37], object.defaultSkipIntroLength); + writer.writeString(offsets[35], object.dateFormat); + writer.writeByte(offsets[36], object.debandingType.index); + writer.writeLong(offsets[37], object.defaultDoubleTapToSkipLength); + writer.writeDouble(offsets[38], object.defaultPlayBackSpeed); + writer.writeByte(offsets[39], object.defaultReaderMode.index); + writer.writeLong(offsets[40], object.defaultSkipIntroLength); writer.writeObject( - offsets[38], + offsets[41], allOffsets, L10nLocaleSchema.serialize, object.defaultSubtitleLang, ); - writer.writeByte(offsets[39], object.disableSectionType.index); - writer.writeByte(offsets[40], object.displayType.index); - writer.writeLong(offsets[41], object.doubleTapAnimationSpeed); - writer.writeString(offsets[42], object.downloadLocation); - writer.writeBool(offsets[43], object.downloadOnlyOnWifi); - writer.writeBool(offsets[44], object.enableAniSkip); - writer.writeBool(offsets[45], object.enableAutoSkip); - writer.writeBool(offsets[46], object.enableCustomColorFilter); - writer.writeBool(offsets[47], object.enableDiscordRpc); + writer.writeByte(offsets[42], object.disableSectionType.index); + writer.writeByte(offsets[43], object.displayType.index); + writer.writeLong(offsets[44], object.doubleTapAnimationSpeed); + writer.writeString(offsets[45], object.downloadLocation); + writer.writeBool(offsets[46], object.downloadOnlyOnWifi); + writer.writeBool(offsets[47], object.enableAniSkip); + writer.writeBool(offsets[48], object.enableAudioPitchCorrection); + writer.writeBool(offsets[49], object.enableAutoSkip); + writer.writeBool(offsets[50], object.enableCustomColorFilter); + writer.writeBool(offsets[51], object.enableDiscordRpc); + writer.writeBool(offsets[52], object.enableGpuNext); writer.writeObjectList( - offsets[48], + offsets[53], allOffsets, FilterScanlatorSchema.serialize, object.filterScanlatorList, ); - writer.writeDouble(offsets[49], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[50], object.flexSchemeColorIndex); - writer.writeBool(offsets[51], object.followSystemTheme); - writer.writeBool(offsets[52], object.fullScreenPlayer); - writer.writeBool(offsets[53], object.fullScreenReader); - writer.writeBool(offsets[54], object.hideDiscordRpcInIncognito); - writer.writeStringList(offsets[55], object.hideItems); - writer.writeString(offsets[56], object.hwdecMode); - writer.writeBool(offsets[57], object.incognitoMode); - writer.writeString(offsets[58], object.lastTrackerLibraryLocation); - writer.writeBool(offsets[59], object.libraryDownloadedChapters); - writer.writeLong(offsets[60], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[61], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[62], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[63], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[64], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[65], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[66], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[67], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[68], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[69], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[70], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[71], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[72], object.libraryLocalSource); - writer.writeBool(offsets[73], object.libraryShowCategoryTabs); - writer.writeBool(offsets[74], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[75], object.libraryShowLanguage); - writer.writeBool(offsets[76], object.libraryShowNumbersOfItems); + writer.writeDouble(offsets[54], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[55], object.flexSchemeColorIndex); + writer.writeBool(offsets[56], object.followSystemTheme); + writer.writeBool(offsets[57], object.fullScreenPlayer); + writer.writeBool(offsets[58], object.fullScreenReader); + writer.writeBool(offsets[59], object.hideDiscordRpcInIncognito); + writer.writeStringList(offsets[60], object.hideItems); + writer.writeString(offsets[61], object.hwdecMode); + writer.writeBool(offsets[62], object.incognitoMode); + writer.writeString(offsets[63], object.lastTrackerLibraryLocation); + writer.writeBool(offsets[64], object.libraryDownloadedChapters); + writer.writeLong(offsets[65], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[66], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[67], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[68], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[69], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[70], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[71], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[72], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[73], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[74], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[75], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[76], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[77], object.libraryLocalSource); + writer.writeBool(offsets[78], object.libraryShowCategoryTabs); + writer.writeBool(offsets[79], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[80], object.libraryShowLanguage); + writer.writeBool(offsets[81], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[77], + offsets[82], allOffsets, L10nLocaleSchema.serialize, object.locale, ); writer.writeObjectList( - offsets[78], + offsets[83], allOffsets, RepoSchema.serialize, object.mangaExtensionsRepo, ); - writer.writeLong(offsets[79], object.mangaGridSize); - writer.writeByte(offsets[80], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[81], object.markEpisodeAsSeenType); - writer.writeBool(offsets[82], object.mergeLibraryNavMobile); - writer.writeStringList(offsets[83], object.navigationOrder); - writer.writeByte(offsets[84], object.novelDisplayType.index); + writer.writeLong(offsets[84], object.mangaGridSize); + writer.writeByte(offsets[85], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[86], object.markEpisodeAsSeenType); + writer.writeBool(offsets[87], object.mergeLibraryNavMobile); + writer.writeStringList(offsets[88], object.navigationOrder); + writer.writeByte(offsets[89], object.novelDisplayType.index); writer.writeObjectList( - offsets[85], + offsets[90], allOffsets, RepoSchema.serialize, object.novelExtensionsRepo, ); - writer.writeLong(offsets[86], object.novelFontSize); - writer.writeLong(offsets[87], object.novelGridSize); - writer.writeBool(offsets[88], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[89], object.novelLibraryLocalSource); - writer.writeBool(offsets[90], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[91], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[92], object.novelLibraryShowLanguage); - writer.writeBool(offsets[93], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[94], object.novelTextAlign.index); - writer.writeBool(offsets[95], object.onlyIncludePinnedSources); - writer.writeLong(offsets[96], object.pagePreloadAmount); + writer.writeLong(offsets[91], object.novelFontSize); + writer.writeLong(offsets[92], object.novelGridSize); + writer.writeBool(offsets[93], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[94], object.novelLibraryLocalSource); + writer.writeBool(offsets[95], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[96], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[97], object.novelLibraryShowLanguage); + writer.writeBool(offsets[98], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[99], object.novelTextAlign.index); + writer.writeBool(offsets[100], object.onlyIncludePinnedSources); + writer.writeLong(offsets[101], object.pagePreloadAmount); writer.writeObjectList( - offsets[97], + offsets[102], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[98], + offsets[103], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[99], + offsets[104], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[100], object.pureBlackDarkMode); - writer.writeLong(offsets[101], object.relativeTimesTamps); - writer.writeBool(offsets[102], object.rpcShowCoverImage); - writer.writeBool(offsets[103], object.rpcShowReadingWatchingProgress); - writer.writeBool(offsets[104], object.rpcShowTitle); - writer.writeBool(offsets[105], object.saveAsCBZArchive); - writer.writeByte(offsets[106], object.scaleType.index); - writer.writeBool(offsets[107], object.showPagesNumber); + writer.writeBool(offsets[105], object.pureBlackDarkMode); + writer.writeLong(offsets[106], object.relativeTimesTamps); + writer.writeBool(offsets[107], object.rpcShowCoverImage); + writer.writeBool(offsets[108], object.rpcShowReadingWatchingProgress); + writer.writeBool(offsets[109], object.rpcShowTitle); + writer.writeBool(offsets[110], object.saveAsCBZArchive); + writer.writeByte(offsets[111], object.scaleType.index); + writer.writeBool(offsets[112], object.showPagesNumber); writer.writeObjectList( - offsets[108], + offsets[113], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[109], + offsets[114], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[110], + offsets[115], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[111], + offsets[116], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[112], object.startDatebackup); - writer.writeBool(offsets[113], object.themeIsDark); - writer.writeBool(offsets[114], object.updateProgressAfterReading); - writer.writeLong(offsets[115], object.updatedAt); - writer.writeBool(offsets[116], object.useLibass); - writer.writeBool(offsets[117], object.useMpvConfig); - writer.writeBool(offsets[118], object.usePageTapZones); - writer.writeString(offsets[119], object.userAgent); + writer.writeLong(offsets[117], object.startDatebackup); + writer.writeBool(offsets[118], object.themeIsDark); + writer.writeBool(offsets[119], object.updateProgressAfterReading); + writer.writeLong(offsets[120], object.updatedAt); + writer.writeBool(offsets[121], object.useLibass); + writer.writeBool(offsets[122], object.useMpvConfig); + writer.writeBool(offsets[123], object.usePageTapZones); + writer.writeBool(offsets[124], object.useYUV420P); + writer.writeString(offsets[125], object.userAgent); + writer.writeLong(offsets[126], object.volumeBoostCap); } Settings _settingsDeserialize( @@ -1281,228 +1331,239 @@ Settings _settingsDeserialize( animeLibraryShowLanguage: reader.readBoolOrNull(offsets[9]), animeLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[10]), appFontFamily: reader.readStringOrNull(offsets[11]), - autoBackupLocation: reader.readStringOrNull(offsets[12]), - autoExtensionsUpdates: reader.readBoolOrNull(offsets[13]), + audioChannels: _SettingsaudioChannelsValueEnumMap[ + reader.readByteOrNull(offsets[12])] ?? + AudioChannel.autoSafe, + audioPreferredLanguages: reader.readStringOrNull(offsets[13]), + autoBackupLocation: reader.readStringOrNull(offsets[14]), + autoExtensionsUpdates: reader.readBoolOrNull(offsets[15]), autoScrollPages: reader.readObjectList( - offsets[14], + offsets[16], AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), ), backgroundColor: _SettingsbackgroundColorValueEnumMap[ - reader.readByteOrNull(offsets[15])] ?? + reader.readByteOrNull(offsets[17])] ?? BackgroundColor.black, - backupFrequency: reader.readLongOrNull(offsets[16]), - backupListOptions: reader.readLongList(offsets[17]), - btServerAddress: reader.readStringOrNull(offsets[18]), - btServerPort: reader.readLongOrNull(offsets[19]), + backupFrequency: reader.readLongOrNull(offsets[18]), + backupListOptions: reader.readLongList(offsets[19]), + btServerAddress: reader.readStringOrNull(offsets[20]), + btServerPort: reader.readLongOrNull(offsets[21]), chapterFilterDownloadedList: reader.readObjectList( - offsets[21], + offsets[23], ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), ), chapterPageIndexList: reader.readObjectList( - offsets[23], + offsets[25], ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), ), chapterPageUrlsList: reader.readObjectList( - offsets[24], + offsets[26], ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), ), - checkForAppUpdates: reader.readBoolOrNull(offsets[25]), - checkForExtensionUpdates: reader.readBoolOrNull(offsets[26]), - clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[27]), + checkForAppUpdates: reader.readBoolOrNull(offsets[27]), + checkForExtensionUpdates: reader.readBoolOrNull(offsets[28]), + clearChapterCacheOnAppLaunch: reader.readBoolOrNull(offsets[29]), colorFilterBlendMode: _SettingscolorFilterBlendModeValueEnumMap[ - reader.readByteOrNull(offsets[28])] ?? + reader.readByteOrNull(offsets[30])] ?? ColorFilterBlendMode.none, - concurrentDownloads: reader.readLongOrNull(offsets[29]), + concurrentDownloads: reader.readLongOrNull(offsets[31]), cookiesList: reader.readObjectList( - offsets[30], + offsets[32], MCookieSchema.deserialize, allOffsets, MCookie(), ), - cropBorders: reader.readBoolOrNull(offsets[31]), + cropBorders: reader.readBoolOrNull(offsets[33]), customColorFilter: reader.readObjectOrNull( - offsets[32], + offsets[34], CustomColorFilterSchema.deserialize, allOffsets, ), - dateFormat: reader.readStringOrNull(offsets[33]), - defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[34]), - defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[35]), - defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ + dateFormat: reader.readStringOrNull(offsets[35]), + debandingType: _SettingsdebandingTypeValueEnumMap[ reader.readByteOrNull(offsets[36])] ?? - ReaderMode.vertical, - defaultSkipIntroLength: reader.readLongOrNull(offsets[37]), - disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ + DebandingType.none, + defaultDoubleTapToSkipLength: reader.readLongOrNull(offsets[37]), + defaultPlayBackSpeed: reader.readDoubleOrNull(offsets[38]), + defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ reader.readByteOrNull(offsets[39])] ?? + ReaderMode.vertical, + defaultSkipIntroLength: reader.readLongOrNull(offsets[40]), + disableSectionType: _SettingsdisableSectionTypeValueEnumMap[ + reader.readByteOrNull(offsets[42])] ?? SectionType.all, displayType: - _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[40])] ?? + _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[43])] ?? DisplayType.compactGrid, - doubleTapAnimationSpeed: reader.readLongOrNull(offsets[41]), - downloadLocation: reader.readStringOrNull(offsets[42]), - downloadOnlyOnWifi: reader.readBoolOrNull(offsets[43]), - enableAniSkip: reader.readBoolOrNull(offsets[44]), - enableAutoSkip: reader.readBoolOrNull(offsets[45]), - enableCustomColorFilter: reader.readBoolOrNull(offsets[46]), - enableDiscordRpc: reader.readBoolOrNull(offsets[47]), - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[49]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[50]), - followSystemTheme: reader.readBoolOrNull(offsets[51]), - fullScreenPlayer: reader.readBoolOrNull(offsets[52]), - fullScreenReader: reader.readBoolOrNull(offsets[53]), - hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[54]), - hideItems: reader.readStringList(offsets[55]), - hwdecMode: reader.readStringOrNull(offsets[56]), + doubleTapAnimationSpeed: reader.readLongOrNull(offsets[44]), + downloadLocation: reader.readStringOrNull(offsets[45]), + downloadOnlyOnWifi: reader.readBoolOrNull(offsets[46]), + enableAniSkip: reader.readBoolOrNull(offsets[47]), + enableAudioPitchCorrection: reader.readBoolOrNull(offsets[48]), + enableAutoSkip: reader.readBoolOrNull(offsets[49]), + enableCustomColorFilter: reader.readBoolOrNull(offsets[50]), + enableDiscordRpc: reader.readBoolOrNull(offsets[51]), + enableGpuNext: reader.readBoolOrNull(offsets[52]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[54]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[55]), + followSystemTheme: reader.readBoolOrNull(offsets[56]), + fullScreenPlayer: reader.readBoolOrNull(offsets[57]), + fullScreenReader: reader.readBoolOrNull(offsets[58]), + hideDiscordRpcInIncognito: reader.readBoolOrNull(offsets[59]), + hideItems: reader.readStringList(offsets[60]), + hwdecMode: reader.readStringOrNull(offsets[61]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[57]), - lastTrackerLibraryLocation: reader.readStringOrNull(offsets[58]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[59]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[60]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[61]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[62]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[63]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[64]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[65]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[66]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[67]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[68]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[69]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[70]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[71]), - libraryLocalSource: reader.readBoolOrNull(offsets[72]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[73]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[74]), - libraryShowLanguage: reader.readBoolOrNull(offsets[75]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[76]), + incognitoMode: reader.readBoolOrNull(offsets[62]), + lastTrackerLibraryLocation: reader.readStringOrNull(offsets[63]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[64]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[65]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[66]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[67]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[68]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[69]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[70]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[71]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[72]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[73]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[74]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[75]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[76]), + libraryLocalSource: reader.readBoolOrNull(offsets[77]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[78]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[79]), + libraryShowLanguage: reader.readBoolOrNull(offsets[80]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[81]), mangaExtensionsRepo: reader.readObjectList( - offsets[78], + offsets[83], RepoSchema.deserialize, allOffsets, Repo(), ), - mangaGridSize: reader.readLongOrNull(offsets[79]), + mangaGridSize: reader.readLongOrNull(offsets[84]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[80])] ?? + reader.readByteOrNull(offsets[85])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[81]), - mergeLibraryNavMobile: reader.readBoolOrNull(offsets[82]), - navigationOrder: reader.readStringList(offsets[83]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[86]), + mergeLibraryNavMobile: reader.readBoolOrNull(offsets[87]), + navigationOrder: reader.readStringList(offsets[88]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[84])] ?? + reader.readByteOrNull(offsets[89])] ?? DisplayType.comfortableGrid, novelExtensionsRepo: reader.readObjectList( - offsets[85], + offsets[90], RepoSchema.deserialize, allOffsets, Repo(), ), - novelFontSize: reader.readLongOrNull(offsets[86]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[88]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[89]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[90]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[91]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[92]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[93]), + novelFontSize: reader.readLongOrNull(offsets[91]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[93]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[94]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[95]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[96]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[97]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[98]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[94])] ?? + reader.readByteOrNull(offsets[99])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[95]), - pagePreloadAmount: reader.readLongOrNull(offsets[96]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[100]), + pagePreloadAmount: reader.readLongOrNull(offsets[101]), personalPageModeList: reader.readObjectList( - offsets[97], + offsets[102], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[98], + offsets[103], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[99], + offsets[104], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[100]), - relativeTimesTamps: reader.readLongOrNull(offsets[101]), - rpcShowCoverImage: reader.readBoolOrNull(offsets[102]), - rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[103]), - rpcShowTitle: reader.readBoolOrNull(offsets[104]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[105]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[105]), + relativeTimesTamps: reader.readLongOrNull(offsets[106]), + rpcShowCoverImage: reader.readBoolOrNull(offsets[107]), + rpcShowReadingWatchingProgress: reader.readBoolOrNull(offsets[108]), + rpcShowTitle: reader.readBoolOrNull(offsets[109]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[110]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[106])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[111])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[107]), + showPagesNumber: reader.readBoolOrNull(offsets[112]), sortChapterList: reader.readObjectList( - offsets[108], + offsets[113], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[109], + offsets[114], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[110], + offsets[115], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[111], + offsets[116], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[112]), - themeIsDark: reader.readBoolOrNull(offsets[113]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[114]), - updatedAt: reader.readLongOrNull(offsets[115]), - useLibass: reader.readBoolOrNull(offsets[116]), - useMpvConfig: reader.readBoolOrNull(offsets[117]), - usePageTapZones: reader.readBoolOrNull(offsets[118]), - userAgent: reader.readStringOrNull(offsets[119]), + startDatebackup: reader.readLongOrNull(offsets[117]), + themeIsDark: reader.readBoolOrNull(offsets[118]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[119]), + updatedAt: reader.readLongOrNull(offsets[120]), + useLibass: reader.readBoolOrNull(offsets[121]), + useMpvConfig: reader.readBoolOrNull(offsets[122]), + usePageTapZones: reader.readBoolOrNull(offsets[123]), + useYUV420P: reader.readBoolOrNull(offsets[124]), + userAgent: reader.readStringOrNull(offsets[125]), + volumeBoostCap: reader.readLongOrNull(offsets[126]), ); object.chapterFilterBookmarkedList = reader.readObjectList( - offsets[20], + offsets[22], ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), ); object.chapterFilterUnreadList = reader.readObjectList( - offsets[22], + offsets[24], ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), ); object.defaultSubtitleLang = reader.readObjectOrNull( - offsets[38], + offsets[41], L10nLocaleSchema.deserialize, allOffsets, ); object.filterScanlatorList = reader.readObjectList( - offsets[48], + offsets[53], FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[77], + offsets[82], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[87]); + object.novelGridSize = reader.readLongOrNull(offsets[92]); return object; } @@ -1545,168 +1606,172 @@ P _settingsDeserializeProp

( case 11: return (reader.readStringOrNull(offset)) as P; case 12: - return (reader.readStringOrNull(offset)) as P; + return (_SettingsaudioChannelsValueEnumMap[ + reader.readByteOrNull(offset)] ?? + AudioChannel.autoSafe) as P; case 13: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 14: + return (reader.readStringOrNull(offset)) as P; + case 15: + return (reader.readBoolOrNull(offset)) as P; + case 16: return (reader.readObjectList( offset, AutoScrollPagesSchema.deserialize, allOffsets, AutoScrollPages(), )) as P; - case 15: + case 17: return (_SettingsbackgroundColorValueEnumMap[ reader.readByteOrNull(offset)] ?? BackgroundColor.black) as P; - case 16: - return (reader.readLongOrNull(offset)) as P; - case 17: - return (reader.readLongList(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; - case 19: return (reader.readLongOrNull(offset)) as P; + case 19: + return (reader.readLongList(offset)) as P; case 20: + return (reader.readStringOrNull(offset)) as P; + case 21: + return (reader.readLongOrNull(offset)) as P; + case 22: return (reader.readObjectList( offset, ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), )) as P; - case 21: + case 23: return (reader.readObjectList( offset, ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), )) as P; - case 22: + case 24: return (reader.readObjectList( offset, ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), )) as P; - case 23: + case 25: return (reader.readObjectList( offset, ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), )) as P; - case 24: + case 26: return (reader.readObjectList( offset, ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), )) as P; - case 25: - return (reader.readBoolOrNull(offset)) as P; - case 26: - return (reader.readBoolOrNull(offset)) as P; case 27: return (reader.readBoolOrNull(offset)) as P; case 28: + return (reader.readBoolOrNull(offset)) as P; + case 29: + return (reader.readBoolOrNull(offset)) as P; + case 30: return (_SettingscolorFilterBlendModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ColorFilterBlendMode.none) as P; - case 29: + case 31: return (reader.readLongOrNull(offset)) as P; - case 30: + case 32: return (reader.readObjectList( offset, MCookieSchema.deserialize, allOffsets, MCookie(), )) as P; - case 31: + case 33: return (reader.readBoolOrNull(offset)) as P; - case 32: + case 34: return (reader.readObjectOrNull( offset, CustomColorFilterSchema.deserialize, allOffsets, )) as P; - case 33: - return (reader.readStringOrNull(offset)) as P; - case 34: - return (reader.readLongOrNull(offset)) as P; case 35: - return (reader.readDoubleOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 36: - return (_SettingsdefaultReaderModeValueEnumMap[ + return (_SettingsdebandingTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? - ReaderMode.vertical) as P; + DebandingType.none) as P; case 37: return (reader.readLongOrNull(offset)) as P; case 38: + return (reader.readDoubleOrNull(offset)) as P; + case 39: + return (_SettingsdefaultReaderModeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + ReaderMode.vertical) as P; + case 40: + return (reader.readLongOrNull(offset)) as P; + case 41: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 39: + case 42: return (_SettingsdisableSectionTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? SectionType.all) as P; - case 40: + case 43: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 41: - return (reader.readLongOrNull(offset)) as P; - case 42: - return (reader.readStringOrNull(offset)) as P; - case 43: - return (reader.readBoolOrNull(offset)) as P; case 44: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 45: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 46: return (reader.readBoolOrNull(offset)) as P; case 47: return (reader.readBoolOrNull(offset)) as P; case 48: + return (reader.readBoolOrNull(offset)) as P; + case 49: + return (reader.readBoolOrNull(offset)) as P; + case 50: + return (reader.readBoolOrNull(offset)) as P; + case 51: + return (reader.readBoolOrNull(offset)) as P; + case 52: + return (reader.readBoolOrNull(offset)) as P; + case 53: return (reader.readObjectList( offset, FilterScanlatorSchema.deserialize, allOffsets, FilterScanlator(), )) as P; - case 49: - return (reader.readDoubleOrNull(offset)) as P; - case 50: - return (reader.readLongOrNull(offset)) as P; - case 51: - return (reader.readBoolOrNull(offset)) as P; - case 52: - return (reader.readBoolOrNull(offset)) as P; - case 53: - return (reader.readBoolOrNull(offset)) as P; case 54: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 55: - return (reader.readStringList(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 56: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 57: return (reader.readBoolOrNull(offset)) as P; case 58: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 59: return (reader.readBoolOrNull(offset)) as P; case 60: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 61: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 62: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 63: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 64: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 65: return (reader.readLongOrNull(offset)) as P; case 66: @@ -1722,153 +1787,167 @@ P _settingsDeserializeProp

( case 71: return (reader.readLongOrNull(offset)) as P; case 72: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 73: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 74: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 75: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 76: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 77: + return (reader.readBoolOrNull(offset)) as P; + case 78: + return (reader.readBoolOrNull(offset)) as P; + case 79: + return (reader.readBoolOrNull(offset)) as P; + case 80: + return (reader.readBoolOrNull(offset)) as P; + case 81: + return (reader.readBoolOrNull(offset)) as P; + case 82: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 78: + case 83: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 79: + case 84: return (reader.readLongOrNull(offset)) as P; - case 80: + case 85: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 81: + case 86: return (reader.readLongOrNull(offset)) as P; - case 82: + case 87: return (reader.readBoolOrNull(offset)) as P; - case 83: + case 88: return (reader.readStringList(offset)) as P; - case 84: + case 89: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 85: + case 90: return (reader.readObjectList( offset, RepoSchema.deserialize, allOffsets, Repo(), )) as P; - case 86: - return (reader.readLongOrNull(offset)) as P; - case 87: - return (reader.readLongOrNull(offset)) as P; - case 88: - return (reader.readBoolOrNull(offset)) as P; - case 89: - return (reader.readBoolOrNull(offset)) as P; - case 90: - return (reader.readBoolOrNull(offset)) as P; case 91: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 92: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 93: return (reader.readBoolOrNull(offset)) as P; case 94: - return (_SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offset)] ?? - NovelTextAlign.left) as P; + return (reader.readBoolOrNull(offset)) as P; case 95: return (reader.readBoolOrNull(offset)) as P; case 96: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 97: + return (reader.readBoolOrNull(offset)) as P; + case 98: + return (reader.readBoolOrNull(offset)) as P; + case 99: + return (_SettingsnovelTextAlignValueEnumMap[ + reader.readByteOrNull(offset)] ?? + NovelTextAlign.left) as P; + case 100: + return (reader.readBoolOrNull(offset)) as P; + case 101: + return (reader.readLongOrNull(offset)) as P; + case 102: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 98: + case 103: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 99: + case 104: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 100: - return (reader.readBoolOrNull(offset)) as P; - case 101: - return (reader.readLongOrNull(offset)) as P; - case 102: - return (reader.readBoolOrNull(offset)) as P; - case 103: - return (reader.readBoolOrNull(offset)) as P; - case 104: - return (reader.readBoolOrNull(offset)) as P; case 105: return (reader.readBoolOrNull(offset)) as P; case 106: - return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? - ScaleType.fitScreen) as P; + return (reader.readLongOrNull(offset)) as P; case 107: return (reader.readBoolOrNull(offset)) as P; case 108: + return (reader.readBoolOrNull(offset)) as P; + case 109: + return (reader.readBoolOrNull(offset)) as P; + case 110: + return (reader.readBoolOrNull(offset)) as P; + case 111: + return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ScaleType.fitScreen) as P; + case 112: + return (reader.readBoolOrNull(offset)) as P; + case 113: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 109: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 110: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 111: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 112: - return (reader.readLongOrNull(offset)) as P; - case 113: - return (reader.readBoolOrNull(offset)) as P; case 114: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 115: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 116: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 117: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 118: return (reader.readBoolOrNull(offset)) as P; case 119: + return (reader.readBoolOrNull(offset)) as P; + case 120: + return (reader.readLongOrNull(offset)) as P; + case 121: + return (reader.readBoolOrNull(offset)) as P; + case 122: + return (reader.readBoolOrNull(offset)) as P; + case 123: + return (reader.readBoolOrNull(offset)) as P; + case 124: + return (reader.readBoolOrNull(offset)) as P; + case 125: return (reader.readStringOrNull(offset)) as P; + case 126: + return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } @@ -1886,6 +1965,20 @@ const _SettingsanimeDisplayTypeValueEnumMap = { 2: DisplayType.coverOnlyGrid, 3: DisplayType.list, }; +const _SettingsaudioChannelsEnumValueMap = { + 'auto': 0, + 'autoSafe': 1, + 'mono': 2, + 'stereo': 3, + 'reverseStereo': 4, +}; +const _SettingsaudioChannelsValueEnumMap = { + 0: AudioChannel.auto, + 1: AudioChannel.autoSafe, + 2: AudioChannel.mono, + 3: AudioChannel.stereo, + 4: AudioChannel.reverseStereo, +}; const _SettingsbackgroundColorEnumValueMap = { 'black': 0, 'grey': 1, @@ -1928,6 +2021,16 @@ const _SettingscolorFilterBlendModeValueEnumMap = { 11: ColorFilterBlendMode.plus, 12: ColorFilterBlendMode.exclusion, }; +const _SettingsdebandingTypeEnumValueMap = { + 'none': 0, + 'cpu': 1, + 'gpu': 2, +}; +const _SettingsdebandingTypeValueEnumMap = { + 0: DebandingType.none, + 1: DebandingType.cpu, + 2: DebandingType.gpu, +}; const _SettingsdefaultReaderModeEnumValueMap = { 'vertical': 0, 'ltr': 1, @@ -2766,6 +2869,216 @@ extension SettingsQueryFilter }); } + QueryBuilder audioChannelsEqualTo( + AudioChannel value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder + audioChannelsGreaterThan( + AudioChannel value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder audioChannelsLessThan( + AudioChannel value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'audioChannels', + value: value, + )); + }); + } + + QueryBuilder audioChannelsBetween( + AudioChannel lower, + AudioChannel upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'audioChannels', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'audioPreferredLanguages', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'audioPreferredLanguages', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'audioPreferredLanguages', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'audioPreferredLanguages', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'audioPreferredLanguages', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'audioPreferredLanguages', + value: '', + )); + }); + } + + QueryBuilder + audioPreferredLanguagesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'audioPreferredLanguages', + value: '', + )); + }); + } + QueryBuilder autoBackupLocationIsNull() { return QueryBuilder.apply(this, (query) { @@ -4620,6 +4933,60 @@ extension SettingsQueryFilter }); } + QueryBuilder debandingTypeEqualTo( + DebandingType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder + debandingTypeGreaterThan( + DebandingType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder debandingTypeLessThan( + DebandingType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'debandingType', + value: value, + )); + }); + } + + QueryBuilder debandingTypeBetween( + DebandingType lower, + DebandingType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'debandingType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder defaultDoubleTapToSkipLengthIsNull() { return QueryBuilder.apply(this, (query) { @@ -5320,6 +5687,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableAudioPitchCorrectionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enableAudioPitchCorrection', + )); + }); + } + + QueryBuilder + enableAudioPitchCorrectionIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enableAudioPitchCorrection', + )); + }); + } + + QueryBuilder + enableAudioPitchCorrectionEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enableAudioPitchCorrection', + value: value, + )); + }); + } + QueryBuilder enableAutoSkipIsNull() { return QueryBuilder.apply(this, (query) { @@ -5404,6 +5799,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + enableGpuNextIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'enableGpuNext', + )); + }); + } + + QueryBuilder + enableGpuNextIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'enableGpuNext', + )); + }); + } + + QueryBuilder enableGpuNextEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'enableGpuNext', + value: value, + )); + }); + } + QueryBuilder filterScanlatorListIsNull() { return QueryBuilder.apply(this, (query) { @@ -9672,6 +10095,33 @@ extension SettingsQueryFilter }); } + QueryBuilder useYUV420PIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'useYUV420P', + )); + }); + } + + QueryBuilder + useYUV420PIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'useYUV420P', + )); + }); + } + + QueryBuilder useYUV420PEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'useYUV420P', + value: value, + )); + }); + } + QueryBuilder userAgentIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -9818,6 +10268,79 @@ extension SettingsQueryFilter )); }); } + + QueryBuilder + volumeBoostCapIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'volumeBoostCap', + )); + }); + } + + QueryBuilder + volumeBoostCapIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'volumeBoostCap', + )); + }); + } + + QueryBuilder volumeBoostCapEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder + volumeBoostCapGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder + volumeBoostCapLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'volumeBoostCap', + value: value, + )); + }); + } + + QueryBuilder volumeBoostCapBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'volumeBoostCap', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } } extension SettingsQueryObject @@ -10182,6 +10705,32 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.asc); + }); + } + + QueryBuilder sortByAudioChannelsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.desc); + }); + } + + QueryBuilder + sortByAudioPreferredLanguages() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.asc); + }); + } + + QueryBuilder + sortByAudioPreferredLanguagesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.desc); + }); + } + QueryBuilder sortByAutoBackupLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.asc); @@ -10347,6 +10896,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.asc); + }); + } + + QueryBuilder sortByDebandingTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.desc); + }); + } + QueryBuilder sortByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -10476,6 +11037,20 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); + }); + } + + QueryBuilder + sortByEnableAudioPitchCorrectionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); + }); + } + QueryBuilder sortByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -10514,6 +11089,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.asc); + }); + } + + QueryBuilder sortByEnableGpuNextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.desc); + }); + } + QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -11275,6 +11862,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.asc); + }); + } + + QueryBuilder sortByUseYUV420PDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.desc); + }); + } + QueryBuilder sortByUserAgent() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'userAgent', Sort.asc); @@ -11286,6 +11885,18 @@ extension SettingsQuerySortBy on QueryBuilder { return query.addSortBy(r'userAgent', Sort.desc); }); } + + QueryBuilder sortByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.asc); + }); + } + + QueryBuilder sortByVolumeBoostCapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.desc); + }); + } } extension SettingsQuerySortThenBy @@ -11439,6 +12050,32 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.asc); + }); + } + + QueryBuilder thenByAudioChannelsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioChannels', Sort.desc); + }); + } + + QueryBuilder + thenByAudioPreferredLanguages() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.asc); + }); + } + + QueryBuilder + thenByAudioPreferredLanguagesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'audioPreferredLanguages', Sort.desc); + }); + } + QueryBuilder thenByAutoBackupLocation() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'autoBackupLocation', Sort.asc); @@ -11604,6 +12241,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.asc); + }); + } + + QueryBuilder thenByDebandingTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'debandingType', Sort.desc); + }); + } + QueryBuilder thenByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -11733,6 +12382,20 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.asc); + }); + } + + QueryBuilder + thenByEnableAudioPitchCorrectionDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableAudioPitchCorrection', Sort.desc); + }); + } + QueryBuilder thenByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'enableAutoSkip', Sort.asc); @@ -11771,6 +12434,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.asc); + }); + } + + QueryBuilder thenByEnableGpuNextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'enableGpuNext', Sort.desc); + }); + } + QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -12544,6 +13219,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.asc); + }); + } + + QueryBuilder thenByUseYUV420PDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'useYUV420P', Sort.desc); + }); + } + QueryBuilder thenByUserAgent() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'userAgent', Sort.asc); @@ -12555,6 +13242,18 @@ extension SettingsQuerySortThenBy return query.addSortBy(r'userAgent', Sort.desc); }); } + + QueryBuilder thenByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.asc); + }); + } + + QueryBuilder thenByVolumeBoostCapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'volumeBoostCap', Sort.desc); + }); + } } extension SettingsQueryWhereDistinct @@ -12634,6 +13333,20 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByAudioChannels() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'audioChannels'); + }); + } + + QueryBuilder distinctByAudioPreferredLanguages( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'audioPreferredLanguages', + caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByAutoBackupLocation( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -12726,6 +13439,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByDebandingType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'debandingType'); + }); + } + QueryBuilder distinctByDefaultDoubleTapToSkipLength() { return QueryBuilder.apply(this, (query) { @@ -12791,6 +13510,13 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByEnableAudioPitchCorrection() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableAudioPitchCorrection'); + }); + } + QueryBuilder distinctByEnableAutoSkip() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'enableAutoSkip'); @@ -12810,6 +13536,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByEnableGpuNext() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'enableGpuNext'); + }); + } + QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -13202,12 +13934,24 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByUseYUV420P() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'useYUV420P'); + }); + } + QueryBuilder distinctByUserAgent( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'userAgent', caseSensitive: caseSensitive); }); } + + QueryBuilder distinctByVolumeBoostCap() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'volumeBoostCap'); + }); + } } extension SettingsQueryProperty @@ -13300,6 +14044,20 @@ extension SettingsQueryProperty }); } + QueryBuilder + audioChannelsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'audioChannels'); + }); + } + + QueryBuilder + audioPreferredLanguagesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'audioPreferredLanguages'); + }); + } + QueryBuilder autoBackupLocationProperty() { return QueryBuilder.apply(this, (query) { @@ -13447,6 +14205,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + debandingTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'debandingType'); + }); + } + QueryBuilder defaultDoubleTapToSkipLengthProperty() { return QueryBuilder.apply(this, (query) { @@ -13520,6 +14285,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + enableAudioPitchCorrectionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableAudioPitchCorrection'); + }); + } + QueryBuilder enableAutoSkipProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'enableAutoSkip'); @@ -13539,6 +14311,12 @@ extension SettingsQueryProperty }); } + QueryBuilder enableGpuNextProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'enableGpuNext'); + }); + } + QueryBuilder?, QQueryOperations> filterScanlatorListProperty() { return QueryBuilder.apply(this, (query) { @@ -14011,11 +14789,23 @@ extension SettingsQueryProperty }); } + QueryBuilder useYUV420PProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'useYUV420P'); + }); + } + QueryBuilder userAgentProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'userAgent'); }); } + + QueryBuilder volumeBoostCapProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'volumeBoostCap'); + }); + } } // ************************************************************************** diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index c7748744..385b5a3b 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -17,6 +17,7 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/video.dart' as vid; import 'package:mangayomi/modules/anime/providers/anime_player_controller_provider.dart'; import 'package:mangayomi/modules/anime/widgets/aniskip_countdown_btn.dart'; @@ -28,6 +29,8 @@ import 'package:mangayomi/modules/anime/widgets/subtitle_view.dart'; import 'package:mangayomi/modules/anime/widgets/subtitle_setting_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/modules/more/settings/player/providers/custom_buttons_provider.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_audio_state_provider.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_decoder_state_provider.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; @@ -191,11 +194,32 @@ class _AnimeStreamPageState extends riv.ConsumerState late final GlobalKey _key = GlobalKey(); late final useLibass = ref.read(useLibassStateProvider); late final useMpvConfig = ref.read(useMpvConfigStateProvider); + late final useGpuNext = ref.read(useGpuNextStateProvider); + late final debandingType = ref.read(debandingStateProvider); + late final useYUV420P = ref.read(useYUV420PStateProvider); + late final audioPreferredLang = ref.read(audioPreferredLangStateProvider); + late final enableAudioPitchCorrection = ref.read( + enableAudioPitchCorrectionStateProvider, + ); + late final audioChannel = ref.read(audioChannelStateProvider); + late final volumeBoostCap = ref.read(volumeBoostCapStateProvider); late final Player _player = Player( configuration: PlayerConfiguration( libass: useLibass, config: true, configDir: useMpvConfig ? widget.mpvDirectory?.path ?? "" : "", + options: { + if (debandingType == DebandingType.cpu) "vf": "gradfun=radius=12", + if (debandingType == DebandingType.gpu) "deband": "yes", + if (useYUV420P) "vf": "format=yuv420p", + "alang": audioPreferredLang, + if (enableAudioPitchCorrection) "audio-pitch-correction": "yes", + "volume-max": "${volumeBoostCap + 100}", + if (audioChannel != AudioChannel.reverseStereo) + "audio-channels": audioChannel.mpvName, + if (audioChannel == AudioChannel.reverseStereo) + "af": audioChannel.mpvName, + }, observeProperties: { "user-data/aniyomi/show_text": generated.mpv_format.MPV_FORMAT_NODE, "user-data/aniyomi/toggle_ui": generated.mpv_format.MPV_FORMAT_NODE, @@ -231,7 +255,14 @@ class _AnimeStreamPageState extends riv.ConsumerState late final hwdecMode = ref.read(hwdecModeStateProvider()); late final VideoController _controller = VideoController( _player, - configuration: VideoControllerConfiguration(hwdec: hwdecMode), + configuration: VideoControllerConfiguration( + hwdec: hwdecMode, + vo: Platform.isAndroid + ? useGpuNext + ? "gpu-next" + : "gpu" + : "libmpv", + ), ); late final _streamController = ref.read( animeStreamControllerProvider(episode: widget.episode).notifier, @@ -261,6 +292,7 @@ class _AnimeStreamPageState extends riv.ConsumerState final ValueNotifier _currentChapterMark = ValueNotifier(null); final ValueNotifier _selectedShader = ValueNotifier(""); final ValueNotifier _customButton = ValueNotifier(null); + final ValueNotifier?> _customButtons = ValueNotifier(null); late final ValueNotifier<_AniSkipPhase> _skipPhase = ValueNotifier( _AniSkipPhase.none, ); @@ -270,6 +302,10 @@ class _AnimeStreamPageState extends riv.ConsumerState bool _hasEndingSkip = false; bool _initSubtitleAndAudio = true; bool _includeSubtitles = false; + int _subDelay = 0; + final _subDelayController = TextEditingController(text: "0"); + double _subSpeed = 1; + final _subSpeedController = TextEditingController(text: "1"); int lastRpcTimestampUpdate = DateTime.now().millisecondsSinceEpoch; late final StreamSubscription _currentPositionSub; @@ -309,8 +345,10 @@ class _AnimeStreamPageState extends riv.ConsumerState generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE) { final prop = event.ref.data.cast(); final propName = prop.ref.name.cast().toDartString(); - if (propName.startsWith("user-data/")) { - print("DEBUG 00: $propName - ${prop.ref.format}"); + if (kDebugMode) { + if (propName.startsWith("user-data/")) { + print("DEBUG 00: $propName - ${prop.ref.format}"); + } } if (propName.startsWith("user-data/") && prop.ref.format == generated.mpv_format.MPV_FORMAT_NODE) { @@ -469,9 +507,6 @@ class _AnimeStreamPageState extends riv.ConsumerState case "aniyomi/seek_by": if (value.ref.format == generated.mpv_format.MPV_FORMAT_STRING) { final text = value.ref.u.string.cast().toDartString(); - final tt = await nativePlayer.getProperty( - "user-data/current-anime/intro-length", - ); if (text.isEmpty) break; final data = int.parse(text.replaceAll("\"", "")); final pos = _currentPosition.value.inSeconds + data; @@ -679,6 +714,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo "call_button_${primaryButton.id}_long", ]), ); + _customButtons.value = customButtons; } void pushToNewEpisode(BuildContext context, Chapter episode) { @@ -753,6 +789,47 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo } } + void _onSubDelayChanged() { + final nativePlayer = (_player.platform as NativePlayer); + final delayMs = int.tryParse(_subDelayController.text); + if (delayMs != null) { + final namePtr = "sub-delay".toNativeUtf8(); + final valuePtr = calloc(1)..value = delayMs / 1000; + nativePlayer.mpv.mpv_set_property( + nativePlayer.ctx, + namePtr.cast(), + generated.mpv_format.MPV_FORMAT_DOUBLE, + valuePtr.cast(), + ); + malloc.free(namePtr); + malloc.free(valuePtr); + _subDelay = delayMs; + } + } + + void _onSubSpeedChanged() { + final nativePlayer = (_player.platform as NativePlayer); + final speed = double.tryParse(_subSpeedController.text); + if (speed != null) { + final namePtr = "sub-speed".toNativeUtf8(); + final valuePtr = calloc(1) + ..value = speed < 0.1 + ? 0.1 + : speed > 10 + ? 10 + : speed; + nativePlayer.mpv.mpv_set_property( + nativePlayer.ctx, + namePtr.cast(), + generated.mpv_format.MPV_FORMAT_DOUBLE, + valuePtr.cast(), + ); + malloc.free(namePtr); + malloc.free(valuePtr); + _subSpeed = speed; + } + } + @override void initState() { super.initState(); @@ -798,6 +875,8 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo _initCustomButton(); discordRpc?.showChapterDetails(ref, widget.episode); _currentPosition.addListener(_updateRpcTimestamp); + _subDelayController.addListener(_onSubDelayChanged); + _subSpeedController.addListener(_onSubSpeedChanged); WidgetsBinding.instance.addObserver(this); } @@ -886,6 +965,8 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo discordRpc?.showIdleText(); discordRpc?.showOriginalTimestamp(); _currentPosition.dispose(); + _subDelayController.dispose(); + _subSpeedController.dispose(); super.dispose(); } @@ -1117,6 +1198,91 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12), child: Column( children: [ + Row( + children: [ + Text(context.l10n.subtitle_delay_text), + IconButton( + onPressed: () { + _subDelay = 0; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + _subSpeed = 1; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 15), + Row( + children: [ + IconButton( + onPressed: () { + _subDelay -= 50; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + }, + icon: const Icon(Icons.remove_circle), + ), + Expanded( + child: TextFormField( + controller: _subDelayController, + keyboardType: TextInputType.number, + decoration: InputDecoration( + isDense: true, + label: Text(context.l10n.subtitle_delay), + ), + ), + ), + IconButton( + onPressed: () { + _subDelay += 50; + _subDelayController.value = TextEditingValue( + text: "$_subDelay", + ); + }, + icon: const Icon(Icons.add_circle), + ), + ], + ), + const SizedBox(height: 15), + Row( + children: [ + IconButton( + onPressed: () { + _subSpeed -= 0.01; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.remove_circle), + ), + Expanded( + child: TextFormField( + controller: _subSpeedController, + keyboardType: TextInputType.numberWithOptions(decimal: true), + decoration: InputDecoration( + isDense: true, + label: Text(context.l10n.subtitle_speed), + ), + ), + ), + IconButton( + onPressed: () { + _subSpeed += 0.01; + _subSpeedController.value = TextEditingValue( + text: _subSpeed.toStringAsFixed(2), + ); + }, + icon: const Icon(Icons.add_circle), + ), + ], + ), + const SizedBox(height: 15), ...videoSubtitleLast.toSet().toList().map((sub) { final title = sub.title ?? @@ -1522,6 +1688,111 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo ); } + List _buildMpvSettingsButton(BuildContext context) { + return [ + PopupMenuButton( + tooltip: 'Shaders', + icon: const Icon(Icons.high_quality, color: Colors.white), + itemBuilder: (context) => + [ + ("Anime4K: Mode A (Fast)", "set_anime_a"), + ("Anime4K: Mode B (Fast)", "set_anime_b"), + ("Anime4K: Mode C (Fast)", "set_anime_c"), + ("Anime4K: Mode A+A (Fast)", "set_anime_aa"), + ("Anime4K: Mode B+B (Fast)", "set_anime_bb"), + ("Anime4K: Mode C+A (Fast)", "set_anime_ca"), + ("Anime4K: Mode A (HQ)", "set_anime_hq_a"), + ("Anime4K: Mode B (HQ)", "set_anime_hq_b"), + ("Anime4K: Mode C (HQ)", "set_anime_hq_c"), + ("Anime4K: Mode A+A (HQ)", "set_anime_hq_aa"), + ("Anime4K: Mode B+B (HQ)", "set_anime_hq_bb"), + ("Anime4K: Mode C+A (HQ)", "set_anime_hq_ca"), + ("AMD FSR", "set_fsr"), + ("Luma Upscaling", "set_luma"), + ("Qualcomm Snapdragon GSR", "set_snapdragon"), + ("NVIDIA Image Scaling", "set_nvidia"), + ("Clear GLSL shaders", "clear_anime"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-message", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), + PopupMenuButton( + tooltip: 'Stats', + icon: const Icon(Icons.memory, color: Colors.white), + itemBuilder: (context) => + [ + ("Stats Toggle", "stats/display-stats-toggle"), + ("Stats Page 1", "stats/display-page-1"), + ("Stats Page 2", "stats/display-page-2"), + ("Stats Page 3", "stats/display-page-3"), + ("Stats Page 4", "stats/display-page-4"), + ("Stats Page 5", "stats/display-page-5"), + ] + .map( + (mode) => PopupMenuItem( + value: mode.$1, + child: Text( + mode.$1, + style: TextStyle( + fontWeight: _selectedShader.value == mode.$1 + ? FontWeight.w900 + : FontWeight.normal, + ), + ), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-binding", + mode.$2, + ]); + }, + ), + ) + .toList(), + ), + ValueListenableBuilder( + valueListenable: _customButtons, + builder: (context, value, child) => value != null + ? PopupMenuButton( + tooltip: context.l10n.custom_buttons, + icon: const Icon(Icons.terminal, color: Colors.white), + itemBuilder: (context) => value + .map( + (btn) => PopupMenuItem( + value: btn.title!, + child: Text(btn.title!), + onTap: () { + (_player.platform as NativePlayer).command([ + "script-message", + "call_button_${btn.id}", + ]); + }, + ), + ) + .toList(), + ) + : Container(), + ), + ]; + } + /// helper method for _mobileBottomButtonBar() and _desktopBottomButtonBar() Widget _buildSettingsButtons(BuildContext context) { final isFullscreen = ref.watch(fullscreenProvider); @@ -1532,85 +1803,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo onPressed: () => _videoSettingDraggableMenu(context), icon: const Icon(Icons.video_settings, color: Colors.white), ), - if (useMpvConfig) - PopupMenuButton( - tooltip: '', // Remove default tooltip "Show menu" for consistency - icon: const Icon(Icons.high_quality, color: Colors.white), - itemBuilder: (context) => - [ - ("Anime4K: Mode A (Fast)", "set_anime_a"), - ("Anime4K: Mode B (Fast)", "set_anime_b"), - ("Anime4K: Mode C (Fast)", "set_anime_c"), - ("Anime4K: Mode A+A (Fast)", "set_anime_aa"), - ("Anime4K: Mode B+B (Fast)", "set_anime_bb"), - ("Anime4K: Mode C+A (Fast)", "set_anime_ca"), - ("Anime4K: Mode A (HQ)", "set_anime_hq_a"), - ("Anime4K: Mode B (HQ)", "set_anime_hq_b"), - ("Anime4K: Mode C (HQ)", "set_anime_hq_c"), - ("Anime4K: Mode A+A (HQ)", "set_anime_hq_aa"), - ("Anime4K: Mode B+B (HQ)", "set_anime_hq_bb"), - ("Anime4K: Mode C+A (HQ)", "set_anime_hq_ca"), - ("AMD FSR", "set_fsr"), - ("Luma Upscaling", "set_luma"), - ("Qualcomm Snapdragon GSR", "set_snapdragon"), - ("NVIDIA Image Scaling", "set_nvidia"), - ("Clear GLSL shaders", "clear_anime"), - ] - .map( - (mode) => PopupMenuItem( - value: mode.$1, - child: Text( - mode.$1, - style: TextStyle( - fontWeight: _selectedShader.value == mode.$1 - ? FontWeight.w900 - : FontWeight.normal, - ), - ), - onTap: () { - (_player.platform as NativePlayer).command([ - "script-message", - mode.$2, - ]); - }, - ), - ) - .toList(), - ), - if (useMpvConfig) - PopupMenuButton( - tooltip: '', // Remove default tooltip "Show menu" for consistency - icon: const Icon(Icons.terminal, color: Colors.white), - itemBuilder: (context) => - [ - ("Stats Toggle", "stats/display-stats-toggle"), - ("Stats Page 1", "stats/display-page-1"), - ("Stats Page 2", "stats/display-page-2"), - ("Stats Page 3", "stats/display-page-3"), - ("Stats Page 4", "stats/display-page-4"), - ("Stats Page 5", "stats/display-page-5"), - ] - .map( - (mode) => PopupMenuItem( - value: mode.$1, - child: Text( - mode.$1, - style: TextStyle( - fontWeight: _selectedShader.value == mode.$1 - ? FontWeight.w900 - : FontWeight.normal, - ), - ), - onTap: () { - (_player.platform as NativePlayer).command([ - "script-binding", - mode.$2, - ]); - }, - ), - ) - .toList(), - ), + if (useMpvConfig) ..._buildMpvSettingsButton(context), PopupMenuButton( tooltip: '', // Remove default tooltip "Show menu" for consistency icon: const Icon(Icons.speed, color: Colors.white), diff --git a/lib/modules/more/settings/player/player_advanced_screen.dart b/lib/modules/more/settings/player/player_advanced_screen.dart new file mode 100644 index 00000000..e891bf94 --- /dev/null +++ b/lib/modules/more/settings/player/player_advanced_screen.dart @@ -0,0 +1,138 @@ +import 'dart:io'; + +import 'package:archive/archive.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/providers/storage_provider.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:path/path.dart' as path; +import 'package:permission_handler/permission_handler.dart'; + +class PlayerAdvancedScreen extends ConsumerStatefulWidget { + const PlayerAdvancedScreen({super.key}); + + @override + ConsumerState createState() => + _PlayerAdvancedScreenState(); +} + +class _PlayerAdvancedScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final useMpvConfig = ref.watch(useMpvConfigStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.advanced)), + body: SingleChildScrollView( + child: Column( + children: [ + SwitchListTile( + value: useMpvConfig, + title: Text(context.l10n.enable_mpv), + subtitle: Text( + context.l10n.mpv_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) async { + if (value && !(await _checkMpvConfig(context))) { + return; + } + ref.read(useMpvConfigStateProvider.notifier).set(value); + }, + ), + ListTile( + onTap: () { + _checkMpvConfig(context, redownload: true); + }, + title: Text(context.l10n.mpv_redownload), + subtitle: Text( + context.l10n.mpv_redownload_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + ], + ), + ), + ); + } + + Future _checkMpvConfig( + BuildContext context, { + bool redownload = false, + }) async { + var status = await Permission.storage.status; + if (!status.isGranted) { + await Permission.storage.request(); + } + final provider = StorageProvider(); + final dir = await provider.getMpvDirectory(); + final mpvFile = File('${dir!.path}/mpv.conf'); + final inputFile = File('${dir.path}/input.conf'); + final filesMissing = + !(await mpvFile.exists()) && !(await inputFile.exists()); + if ((redownload || filesMissing) && context.mounted) { + final res = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Text(context.l10n.mpv_download), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(context.l10n.cancel), + ), + const SizedBox(width: 15), + ElevatedButton( + onPressed: () async { + final bytes = await rootBundle.load( + "assets/mangayomi_mpv.zip", + ); + final archive = ZipDecoder().decodeBytes( + bytes.buffer.asUint8List(), + ); + String shadersDir = path.join(dir.path, 'shaders'); + await Directory(shadersDir).create(recursive: true); + String scriptsDir = path.join(dir.path, 'scripts'); + await Directory(scriptsDir).create(recursive: true); + for (final file in archive.files) { + if (file.name == "mpv.conf") { + await mpvFile.writeAsBytes(file.content); + } else if (file.name == "input.conf") { + await inputFile.writeAsBytes(file.content); + } else if (file.name.startsWith("shaders/") && + file.name.endsWith(".glsl")) { + final shaderFile = File( + '$shadersDir/${file.name.split("/").last}', + ); + await shaderFile.writeAsBytes(file.content); + } else if (file.name.startsWith("scripts/") && + file.name.endsWith(".js")) { + final scriptFile = File( + '$scriptsDir/${file.name.split("/").last}', + ); + await scriptFile.writeAsBytes(file.content); + } + } + if (context.mounted) { + Navigator.pop(context, "ok"); + } + }, + child: Text(context.l10n.download), + ), + ], + ), + ], + ); + }, + ); + return res != null && res == "ok"; + } + return context.mounted; + } +} diff --git a/lib/modules/more/settings/player/player_audio_screen.dart b/lib/modules/more/settings/player/player_audio_screen.dart new file mode 100644 index 00000000..ceb75e1d --- /dev/null +++ b/lib/modules/more/settings/player/player_audio_screen.dart @@ -0,0 +1,236 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/l10n/generated/app_localizations.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_audio_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class PlayerAudioScreen extends ConsumerStatefulWidget { + const PlayerAudioScreen({super.key}); + + @override + ConsumerState createState() => _PlayerAudioScreenState(); +} + +class _PlayerAudioScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final audioPreferredLang = ref.watch(audioPreferredLangStateProvider); + final enableAudioPitchCorrection = ref.watch( + enableAudioPitchCorrectionStateProvider, + ); + final audioChannel = ref.watch(audioChannelStateProvider); + final volumeBoostCap = ref.watch(volumeBoostCapStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.video_audio)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTile( + onTap: () => _showEditController(), + title: Text(context.l10n.audio_preferred_languages), + subtitle: Text( + audioPreferredLang, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: enableAudioPitchCorrection, + title: Text(context.l10n.enable_audio_pitch_correction), + subtitle: Text( + context.l10n.enable_audio_pitch_correction_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref + .read(enableAudioPitchCorrectionStateProvider.notifier) + .set(value); + }, + ), + ListTile( + onTap: () { + final values = [ + (AudioChannel.auto, "Auto"), + (AudioChannel.autoSafe, "Auto-safe"), + (AudioChannel.mono, "Mono"), + (AudioChannel.stereo, "Stereo"), + (AudioChannel.reverseStereo, "Reverse stereo"), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.audio_channels), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: audioChannel, + onChanged: (value) { + ref + .read(audioChannelStateProvider.notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.audio_channels), + subtitle: Text( + audioChannel.name, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + Padding( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.volume_boost_cap), + Text( + "$volumeBoostCap", + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + const SizedBox(height: 20), + SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: const RoundSliderOverlayShape( + overlayRadius: 5.0, + ), + ), + child: Slider.adaptive( + min: 0, + max: 200, + value: volumeBoostCap.toDouble(), + onChanged: (value) { + HapticFeedback.vibrate(); + ref + .read(volumeBoostCapStateProvider.notifier) + .set(value.toInt()); + }, + onChangeEnd: (value) { + ref + .read(volumeBoostCapStateProvider.notifier) + .set(value.toInt()); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + + void _showEditController() { + final audioPreferredLang = ref.read(audioPreferredLangStateProvider); + final langCodes = AppLocalizations.supportedLocales + .map((e) => e.languageCode) + .toList(); + bool isLangCodeError = false; + final textController = TextEditingController(text: audioPreferredLang); + showDialog( + context: context, + builder: (context) { + return StatefulBuilder( + builder: (context, setState) { + return AlertDialog( + title: Column( + children: [ + Text(context.l10n.audio_preferred_languages), + Text( + context.l10n.audio_preferred_languages_info, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ], + ), + content: SizedBox( + width: context.width(0.8), + child: CustomTextFormField( + controller: textController, + context: context, + isMissing: isLangCodeError, + val: (text) => setState(() { + isLangCodeError = text + .split(",") + .any((e) => !langCodes.contains(e)); + }), + missing: (_) {}, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + TextButton( + onPressed: () { + ref + .read(audioPreferredLangStateProvider.notifier) + .set(textController.text); + Navigator.pop(context); + }, + child: Text( + context.l10n.ok, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + ); + } +} diff --git a/lib/modules/more/settings/player/player_decoder_screen.dart b/lib/modules/more/settings/player/player_decoder_screen.dart new file mode 100644 index 00000000..3c63f5b2 --- /dev/null +++ b/lib/modules/more/settings/player/player_decoder_screen.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/more/settings/player/providers/player_decoder_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:super_sliver_list/super_sliver_list.dart'; + +class PlayerDecoderScreen extends ConsumerStatefulWidget { + const PlayerDecoderScreen({super.key}); + + @override + ConsumerState createState() => + _PlayerDecoderScreenState(); +} + +class _PlayerDecoderScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); + final useGpuNext = ref.watch(useGpuNextStateProvider); + final debandingType = ref.watch(debandingStateProvider); + final useYUV420P = ref.watch(useYUV420PStateProvider); + + return Scaffold( + appBar: AppBar(title: Text(context.l10n.decoder)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTile( + onTap: () { + final values = [ + ("no", ""), + ("auto", ""), + ("d3d11va", "(Windows 8+)"), + ("d3d11va-copy", "(Windows 8+)"), + ("videotoolbox", "(iOS 9.0+)"), + ("videotoolbox-copy", "(iOS 9.0+)"), + ("nvdec", "(CUDA)"), + ("nvdec-copy", "(CUDA)"), + ("mediacodec", "- HW (Android)"), + ("mediacodec-copy", "- HW+ (Android)"), + ("crystalhd", ""), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.hwdec), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: hwdecMode, + onChanged: (value) { + ref + .read( + hwdecModeStateProvider( + rawValue: true, + ).notifier, + ) + .set(value!); + Navigator.pop(context); + }, + title: Row( + children: [ + Text( + "${values[index].$1} ${values[index].$2}", + ), + ], + ), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.hwdec), + subtitle: Text( + hwdecMode, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: useGpuNext, + title: Text(context.l10n.enable_gpu_next), + subtitle: Text( + context.l10n.enable_gpu_next_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref.read(useGpuNextStateProvider.notifier).set(value); + }, + ), + ListTile( + onTap: () { + final values = [ + (DebandingType.none, "None"), + (DebandingType.cpu, "CPU"), + (DebandingType.gpu, "GPU"), + ]; + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(context.l10n.debanding), + content: SizedBox( + width: context.width(0.8), + child: SuperListView.builder( + shrinkWrap: true, + itemCount: values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: values[index].$1, + groupValue: debandingType, + onChanged: (value) { + ref + .read(debandingStateProvider.notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row(children: [Text(values[index].$2)]), + ); + }, + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + context.l10n.cancel, + style: TextStyle(color: context.primaryColor), + ), + ), + ], + ), + ], + ); + }, + ); + }, + title: Text(context.l10n.debanding), + subtitle: Text( + debandingType.name, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + ), + SwitchListTile( + value: useYUV420P, + title: Text(context.l10n.use_yuv420p), + subtitle: Text( + context.l10n.use_yuv420p_info, + style: TextStyle(fontSize: 11, color: context.secondaryColor), + ), + onChanged: (value) { + ref.read(useYUV420PStateProvider.notifier).set(value); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_overview_screen.dart b/lib/modules/more/settings/player/player_overview_screen.dart new file mode 100644 index 00000000..04b98d83 --- /dev/null +++ b/lib/modules/more/settings/player/player_overview_screen.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; + +class PlayerOverviewScreen extends StatelessWidget { + const PlayerOverviewScreen({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = l10nLocalizations(context); + return Scaffold( + appBar: AppBar(title: Text(l10n!.player)), + body: SingleChildScrollView( + child: Column( + children: [ + ListTileWidget( + title: l10n.internal_player, + subtitle: l10n.internal_player_info, + icon: Icons.play_circle_outline_outlined, + onTap: () => context.push('/playerMode'), + ), + ListTileWidget( + title: l10n.decoder, + subtitle: l10n.decoder_info, + icon: Icons.memory_outlined, + onTap: () => context.push('/playerDecoderScreen'), + ), + ListTileWidget( + title: l10n.video_audio, + subtitle: l10n.video_audio_info, + icon: Icons.audiotrack_outlined, + onTap: () => context.push('/playerAudioScreen'), + ), + ListTileWidget( + title: l10n.custom_buttons, + subtitle: l10n.custom_buttons_info, + icon: Icons.terminal_outlined, + onTap: () => context.push('/customButtonScreen'), + ), + ListTileWidget( + title: l10n.advanced, + subtitle: l10n.advanced_info, + icon: Icons.code_outlined, + onTap: () => context.push('/playerAdvancedScreen'), + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 0647c5e6..bf1c64e4 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,20 +1,10 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:archive/archive.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; -import 'package:mangayomi/modules/more/widgets/list_tile_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; -import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:numberpicker/numberpicker.dart'; -import 'package:path/path.dart' as path; -import 'package:permission_handler/permission_handler.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; import 'package:mangayomi/l10n/generated/app_localizations.dart'; @@ -41,12 +31,10 @@ class _PlayerScreenState extends ConsumerState { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); - final useMpvConfig = ref.watch(useMpvConfigStateProvider); - final hwdecMode = ref.watch(hwdecModeStateProvider(rawValue: true)); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); return Scaffold( - appBar: AppBar(title: Text(context.l10n.player)), + appBar: AppBar(title: Text(context.l10n.internal_player)), body: SingleChildScrollView( child: Column( children: [ @@ -359,23 +347,6 @@ class _PlayerScreenState extends ConsumerState { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), - ListTile( - title: Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Row( - children: [ - Icon( - Icons.info_outline_rounded, - color: context.secondaryColor, - ), - ], - ), - ), - subtitle: Text( - context.l10n.aniskip_requires_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), SwitchListTile( value: useLibass, title: Text(context.l10n.use_libass), @@ -396,6 +367,26 @@ class _PlayerScreenState extends ConsumerState { onExpansionChanged: (value) => ref.read(enableAniSkipStateProvider.notifier).set(value), children: [ + ListTile( + title: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + children: [ + Icon( + Icons.info_outline_rounded, + color: context.secondaryColor, + ), + ], + ), + ), + subtitle: Text( + context.l10n.aniskip_requires_info, + style: TextStyle( + fontSize: 11, + color: context.secondaryColor, + ), + ), + ), SwitchListTile( value: enableAutoSkip, title: Text(context.l10n.enable_auto_skip), @@ -473,38 +464,6 @@ class _PlayerScreenState extends ConsumerState { ), ], ), - SwitchListTile( - value: useMpvConfig, - title: Text(context.l10n.enable_mpv), - subtitle: Text( - context.l10n.mpv_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - onChanged: (value) async { - if (value && !(await _checkMpvConfig(context))) { - return; - } - ref.read(useMpvConfigStateProvider.notifier).set(value); - }, - ), - ListTile( - onTap: () { - _checkMpvConfig(context, redownload: true); - }, - title: Text(context.l10n.mpv_redownload), - subtitle: Text( - context.l10n.mpv_redownload_info, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), - ListTileWidget( - onTap: () { - context.push("/customButtonScreen"); - }, - icon: Icons.terminal, - title: context.l10n.custom_buttons, - subtitle: context.l10n.custom_buttons_info, - ), SwitchListTile( value: fullScreenPlayer, title: Text(context.l10n.full_screen_player), @@ -516,164 +475,9 @@ class _PlayerScreenState extends ConsumerState { ref.read(fullScreenPlayerStateProvider.notifier).set(value); }, ), - ListTile( - onTap: () { - final values = [ - ("no", ""), - ("auto", ""), - ("d3d11va", "(Windows 8+)"), - ("d3d11va-copy", "(Windows 8+)"), - ("videotoolbox", "(iOS 9.0+)"), - ("videotoolbox-copy", "(iOS 9.0+)"), - ("nvdec", "(CUDA)"), - ("nvdec-copy", "(CUDA)"), - ("mediacodec", "- HW (Android)"), - ("mediacodec-copy", "- HW+ (Android)"), - ("crystalhd", ""), - ]; - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(context.l10n.hwdec), - content: SizedBox( - width: context.width(0.8), - child: SuperListView.builder( - shrinkWrap: true, - itemCount: values.length, - itemBuilder: (context, index) { - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: values[index].$1, - groupValue: hwdecMode, - onChanged: (value) { - ref - .read( - hwdecModeStateProvider( - rawValue: true, - ).notifier, - ) - .set(value!); - Navigator.pop(context); - }, - title: Row( - children: [ - Text( - "${values[index].$1} ${values[index].$2}", - ), - ], - ), - ); - }, - ), - ), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () async { - Navigator.pop(context); - }, - child: Text( - context.l10n.cancel, - style: TextStyle(color: context.primaryColor), - ), - ), - ], - ), - ], - ); - }, - ); - }, - title: Text(context.l10n.hwdec), - subtitle: Text( - hwdecMode, - style: TextStyle(fontSize: 11, color: context.secondaryColor), - ), - ), ], ), ), ); } - - Future _checkMpvConfig( - BuildContext context, { - bool redownload = false, - }) async { - var status = await Permission.storage.status; - if (!status.isGranted) { - await Permission.storage.request(); - } - final provider = StorageProvider(); - final dir = await provider.getMpvDirectory(); - final mpvFile = File('${dir!.path}/mpv.conf'); - final inputFile = File('${dir.path}/input.conf'); - final filesMissing = - !(await mpvFile.exists()) && !(await inputFile.exists()); - if ((redownload || filesMissing) && context.mounted) { - final res = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Text(context.l10n.mpv_download), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: Text(context.l10n.cancel), - ), - const SizedBox(width: 15), - ElevatedButton( - onPressed: () async { - final bytes = await rootBundle.load( - "assets/mangayomi_mpv.zip", - ); - final archive = ZipDecoder().decodeBytes( - bytes.buffer.asUint8List(), - ); - String shadersDir = path.join(dir.path, 'shaders'); - await Directory(shadersDir).create(recursive: true); - String scriptsDir = path.join(dir.path, 'scripts'); - await Directory(scriptsDir).create(recursive: true); - for (final file in archive.files) { - if (file.name == "mpv.conf") { - await mpvFile.writeAsBytes(file.content); - } else if (file.name == "input.conf") { - await inputFile.writeAsBytes(file.content); - } else if (file.name.startsWith("shaders/") && - file.name.endsWith(".glsl")) { - final shaderFile = File( - '$shadersDir/${file.name.split("/").last}', - ); - await shaderFile.writeAsBytes(file.content); - } else if (file.name.startsWith("scripts/") && - file.name.endsWith(".js")) { - final scriptFile = File( - '$scriptsDir/${file.name.split("/").last}', - ); - await scriptFile.writeAsBytes(file.content); - } - } - if (context.mounted) { - Navigator.pop(context, "ok"); - } - }, - child: Text(context.l10n.download), - ), - ], - ), - ], - ); - }, - ); - return res != null && res == "ok"; - } - return context.mounted; - } } diff --git a/lib/modules/more/settings/player/providers/player_audio_state_provider.dart b/lib/modules/more/settings/player/providers/player_audio_state_provider.dart new file mode 100644 index 00000000..0bd54449 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_audio_state_provider.dart @@ -0,0 +1,86 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'player_audio_state_provider.g.dart'; + +@riverpod +class AudioPreferredLangState extends _$AudioPreferredLangState { + @override + String build() { + return isar.settings.getSync(227)!.audioPreferredLanguages ?? ""; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..audioPreferredLanguages = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class EnableAudioPitchCorrectionState + extends _$EnableAudioPitchCorrectionState { + @override + bool build() { + return isar.settings.getSync(227)!.enableAudioPitchCorrection ?? true; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableAudioPitchCorrection = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class AudioChannelState extends _$AudioChannelState { + @override + AudioChannel build() { + return isar.settings.getSync(227)!.audioChannels; + } + + void set(AudioChannel value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..audioChannels = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class VolumeBoostCapState extends _$VolumeBoostCapState { + @override + int build() { + return isar.settings.getSync(227)!.volumeBoostCap ?? 30; + } + + void set(int value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..volumeBoostCap = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} diff --git a/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart new file mode 100644 index 00000000..7d66dfe9 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_audio_state_provider.g.dart @@ -0,0 +1,77 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'player_audio_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$audioPreferredLangStateHash() => + r'9d70ec2677efb51b8e0c174b55114865853f12ea'; + +/// See also [AudioPreferredLangState]. +@ProviderFor(AudioPreferredLangState) +final audioPreferredLangStateProvider = + AutoDisposeNotifierProvider.internal( + AudioPreferredLangState.new, + name: r'audioPreferredLangStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioPreferredLangStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AudioPreferredLangState = AutoDisposeNotifier; +String _$enableAudioPitchCorrectionStateHash() => + r'6614f4b04ff8fe8ef57c9a6f160646d3d25e2f4d'; + +/// See also [EnableAudioPitchCorrectionState]. +@ProviderFor(EnableAudioPitchCorrectionState) +final enableAudioPitchCorrectionStateProvider = + AutoDisposeNotifierProvider.internal( + EnableAudioPitchCorrectionState.new, + name: r'enableAudioPitchCorrectionStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$enableAudioPitchCorrectionStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$EnableAudioPitchCorrectionState = AutoDisposeNotifier; +String _$audioChannelStateHash() => r'e71ffa85c37d545fb7b22e9539241b4926a2d384'; + +/// See also [AudioChannelState]. +@ProviderFor(AudioChannelState) +final audioChannelStateProvider = + AutoDisposeNotifierProvider.internal( + AudioChannelState.new, + name: r'audioChannelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$audioChannelStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AudioChannelState = AutoDisposeNotifier; +String _$volumeBoostCapStateHash() => + r'b0f5ad3bbb0e1a798ce229572b363465ad606a06'; + +/// See also [VolumeBoostCapState]. +@ProviderFor(VolumeBoostCapState) +final volumeBoostCapStateProvider = + AutoDisposeNotifierProvider.internal( + VolumeBoostCapState.new, + name: r'volumeBoostCapStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$volumeBoostCapStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$VolumeBoostCapState = AutoDisposeNotifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart new file mode 100644 index 00000000..60d2a35f --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.dart @@ -0,0 +1,110 @@ +import 'dart:io'; + +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'player_decoder_state_provider.g.dart'; + +final hwdecs = { + "no": ["all"], + "auto": ["all"], + "d3d11va": ["windows"], + "d3d11va-copy": ["windows"], + "videotoolbox": ["ios"], + "videotoolbox-copy": ["ios"], + "nvdec": ["all"], + "nvdec-copy": ["all"], + "mediacodec": ["android"], + "mediacodec-copy": ["android"], + "crystalhd": ["all"], +}; + +@riverpod +class HwdecModeState extends _$HwdecModeState { + @override + String build({bool rawValue = false}) { + final hwdecMode = isar.settings.getSync(227)!.hwdecMode ?? "auto"; + if (rawValue) { + return hwdecMode; + } + final hwdecSupport = hwdecs[hwdecMode] ?? []; + if (!hwdecSupport.contains("all") && + !hwdecSupport.contains(Platform.operatingSystem)) { + return Platform.isAndroid ? "auto-safe" : "auto"; + } + return hwdecMode; + } + + void set(String value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..hwdecMode = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class DebandingState extends _$DebandingState { + @override + DebandingType build() { + return isar.settings.getSync(227)!.debandingType; + } + + void set(DebandingType value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..debandingType = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class UseGpuNextState extends _$UseGpuNextState { + @override + bool build() { + return isar.settings.getSync(227)!.enableGpuNext ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..enableGpuNext = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} + +@riverpod +class UseYUV420PState extends _$UseYUV420PState { + @override + bool build() { + return isar.settings.getSync(227)!.useYUV420P ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync( + settings! + ..useYUV420P = value + ..updatedAt = DateTime.now().millisecondsSinceEpoch, + ), + ); + } +} diff --git a/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart new file mode 100644 index 00000000..79f0d622 --- /dev/null +++ b/lib/modules/more/settings/player/providers/player_decoder_state_provider.g.dart @@ -0,0 +1,223 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'player_decoder_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$HwdecModeState extends BuildlessAutoDisposeNotifier { + late final bool rawValue; + + String build({ + bool rawValue = false, + }); +} + +/// See also [HwdecModeState]. +@ProviderFor(HwdecModeState) +const hwdecModeStateProvider = HwdecModeStateFamily(); + +/// See also [HwdecModeState]. +class HwdecModeStateFamily extends Family { + /// See also [HwdecModeState]. + const HwdecModeStateFamily(); + + /// See also [HwdecModeState]. + HwdecModeStateProvider call({ + bool rawValue = false, + }) { + return HwdecModeStateProvider( + rawValue: rawValue, + ); + } + + @override + HwdecModeStateProvider getProviderOverride( + covariant HwdecModeStateProvider provider, + ) { + return call( + rawValue: provider.rawValue, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'hwdecModeStateProvider'; +} + +/// See also [HwdecModeState]. +class HwdecModeStateProvider + extends AutoDisposeNotifierProviderImpl { + /// See also [HwdecModeState]. + HwdecModeStateProvider({ + bool rawValue = false, + }) : this._internal( + () => HwdecModeState()..rawValue = rawValue, + from: hwdecModeStateProvider, + name: r'hwdecModeStateProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$hwdecModeStateHash, + dependencies: HwdecModeStateFamily._dependencies, + allTransitiveDependencies: + HwdecModeStateFamily._allTransitiveDependencies, + rawValue: rawValue, + ); + + HwdecModeStateProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.rawValue, + }) : super.internal(); + + final bool rawValue; + + @override + String runNotifierBuild( + covariant HwdecModeState notifier, + ) { + return notifier.build( + rawValue: rawValue, + ); + } + + @override + Override overrideWith(HwdecModeState Function() create) { + return ProviderOverride( + origin: this, + override: HwdecModeStateProvider._internal( + () => create()..rawValue = rawValue, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + rawValue: rawValue, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement createElement() { + return _HwdecModeStateProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is HwdecModeStateProvider && other.rawValue == rawValue; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, rawValue.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin HwdecModeStateRef on AutoDisposeNotifierProviderRef { + /// The parameter `rawValue` of this provider. + bool get rawValue; +} + +class _HwdecModeStateProviderElement + extends AutoDisposeNotifierProviderElement + with HwdecModeStateRef { + _HwdecModeStateProviderElement(super.provider); + + @override + bool get rawValue => (origin as HwdecModeStateProvider).rawValue; +} + +String _$debandingStateHash() => r'b93e2fc826d98cc8bce1aab9a92900353e4d3958'; + +/// See also [DebandingState]. +@ProviderFor(DebandingState) +final debandingStateProvider = + AutoDisposeNotifierProvider.internal( + DebandingState.new, + name: r'debandingStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$debandingStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$DebandingState = AutoDisposeNotifier; +String _$useGpuNextStateHash() => r'cfc109cd7db66e359e9523102a84aa8cf37bf243'; + +/// See also [UseGpuNextState]. +@ProviderFor(UseGpuNextState) +final useGpuNextStateProvider = + AutoDisposeNotifierProvider.internal( + UseGpuNextState.new, + name: r'useGpuNextStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useGpuNextStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseGpuNextState = AutoDisposeNotifier; +String _$useYUV420PStateHash() => r'c600001eff34b2b8df31ba604413b8b20edc3044'; + +/// See also [UseYUV420PState]. +@ProviderFor(UseYUV420PState) +final useYUV420PStateProvider = + AutoDisposeNotifierProvider.internal( + UseYUV420PState.new, + name: r'useYUV420PStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$useYUV420PStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$UseYUV420PState = AutoDisposeNotifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/player/providers/player_state_provider.dart b/lib/modules/more/settings/player/providers/player_state_provider.dart index 47494a7d..5660fc4a 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.dart @@ -233,46 +233,3 @@ class UseMpvConfigState extends _$UseMpvConfigState { ); } } - -final hwdecs = { - "no": ["all"], - "auto": ["all"], - "d3d11va": ["windows"], - "d3d11va-copy": ["windows"], - "videotoolbox": ["ios"], - "videotoolbox-copy": ["ios"], - "nvdec": ["all"], - "nvdec-copy": ["all"], - "mediacodec": ["android"], - "mediacodec-copy": ["android"], - "crystalhd": ["all"], -}; - -@riverpod -class HwdecModeState extends _$HwdecModeState { - @override - String build({bool rawValue = false}) { - final hwdecMode = isar.settings.getSync(227)!.hwdecMode ?? "auto"; - if (rawValue) { - return hwdecMode; - } - final hwdecSupport = hwdecs[hwdecMode] ?? []; - if (!hwdecSupport.contains("all") && - !hwdecSupport.contains(Platform.operatingSystem)) { - return Platform.isAndroid ? "auto-safe" : "auto"; - } - return hwdecMode; - } - - void set(String value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync( - settings! - ..hwdecMode = value - ..updatedAt = DateTime.now().millisecondsSinceEpoch, - ), - ); - } -} diff --git a/lib/modules/more/settings/player/providers/player_state_provider.g.dart b/lib/modules/more/settings/player/providers/player_state_provider.g.dart index 50e47082..58df635c 100644 --- a/lib/modules/more/settings/player/providers/player_state_provider.g.dart +++ b/lib/modules/more/settings/player/providers/player_state_provider.g.dart @@ -191,169 +191,5 @@ final useMpvConfigStateProvider = ); typedef _$UseMpvConfigState = AutoDisposeNotifier; -String _$hwdecModeStateHash() => r'8186e3c5f3db0e952f629d56b2e580e546aed65e'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -abstract class _$HwdecModeState extends BuildlessAutoDisposeNotifier { - late final bool rawValue; - - String build({ - bool rawValue = false, - }); -} - -/// See also [HwdecModeState]. -@ProviderFor(HwdecModeState) -const hwdecModeStateProvider = HwdecModeStateFamily(); - -/// See also [HwdecModeState]. -class HwdecModeStateFamily extends Family { - /// See also [HwdecModeState]. - const HwdecModeStateFamily(); - - /// See also [HwdecModeState]. - HwdecModeStateProvider call({ - bool rawValue = false, - }) { - return HwdecModeStateProvider( - rawValue: rawValue, - ); - } - - @override - HwdecModeStateProvider getProviderOverride( - covariant HwdecModeStateProvider provider, - ) { - return call( - rawValue: provider.rawValue, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'hwdecModeStateProvider'; -} - -/// See also [HwdecModeState]. -class HwdecModeStateProvider - extends AutoDisposeNotifierProviderImpl { - /// See also [HwdecModeState]. - HwdecModeStateProvider({ - bool rawValue = false, - }) : this._internal( - () => HwdecModeState()..rawValue = rawValue, - from: hwdecModeStateProvider, - name: r'hwdecModeStateProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$hwdecModeStateHash, - dependencies: HwdecModeStateFamily._dependencies, - allTransitiveDependencies: - HwdecModeStateFamily._allTransitiveDependencies, - rawValue: rawValue, - ); - - HwdecModeStateProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.rawValue, - }) : super.internal(); - - final bool rawValue; - - @override - String runNotifierBuild( - covariant HwdecModeState notifier, - ) { - return notifier.build( - rawValue: rawValue, - ); - } - - @override - Override overrideWith(HwdecModeState Function() create) { - return ProviderOverride( - origin: this, - override: HwdecModeStateProvider._internal( - () => create()..rawValue = rawValue, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - rawValue: rawValue, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement createElement() { - return _HwdecModeStateProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is HwdecModeStateProvider && other.rawValue == rawValue; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, rawValue.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin HwdecModeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `rawValue` of this provider. - bool get rawValue; -} - -class _HwdecModeStateProviderElement - extends AutoDisposeNotifierProviderElement - with HwdecModeStateRef { - _HwdecModeStateProviderElement(super.provider); - - @override - bool get rawValue => (origin as HwdecModeStateProvider).rawValue; -} // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/settings_screen.dart b/lib/modules/more/settings/settings_screen.dart index 8aec9eba..18c11eae 100644 --- a/lib/modules/more/settings/settings_screen.dart +++ b/lib/modules/more/settings/settings_screen.dart @@ -21,52 +21,43 @@ class SettingsScreen extends StatelessWidget { ), ListTileWidget( title: l10n.appearance, - subtitle: l10n.appearance_subtitle, icon: Icons.color_lens_rounded, onTap: () => context.push('/appearance'), ), ListTileWidget( title: l10n.reader, - subtitle: l10n.reader_subtitle, icon: Icons.chrome_reader_mode_rounded, onTap: () => context.push('/readerMode'), ), ListTileWidget( title: l10n.player, - subtitle: l10n.reader_subtitle, icon: Icons.play_circle_outline_outlined, - onTap: () => context.push('/playerMode'), + onTap: () => context.push('/playerOverview'), ), ListTileWidget( title: l10n.downloads, - subtitle: l10n.downloads_subtitle, icon: Icons.download_outlined, onTap: () => context.push('/downloads'), ), ListTileWidget( title: l10n.tracking, - subtitle: "", icon: Icons.sync_outlined, onTap: () => context.push('/track'), ), ListTileWidget( title: l10n.syncing, - subtitle: l10n.syncing_subtitle, icon: Icons.cloud_sync_outlined, onTap: () => context.push('/sync'), ), ListTileWidget( title: l10n.browse, - subtitle: l10n.browse_subtitle, icon: Icons.explore_rounded, onTap: () => context.push('/browseS'), ), ListTileWidget( - onTap: () { - context.push('/about'); - }, - icon: Icons.info_outline, title: l10n.about, + icon: Icons.info_outline, + onTap: () => context.push('/about'), ), ], ), diff --git a/lib/modules/tracker_library/tracker_item_card.dart b/lib/modules/tracker_library/tracker_item_card.dart index 42627b08..326c276b 100644 --- a/lib/modules/tracker_library/tracker_item_card.dart +++ b/lib/modules/tracker_library/tracker_item_card.dart @@ -15,11 +15,13 @@ import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class TrackerItemCard extends StatelessWidget { final TrackSearch track; final ItemType itemType; + final int? mangaId; const TrackerItemCard({ super.key, required this.track, required this.itemType, + this.mangaId, }); @override @@ -140,6 +142,12 @@ class TrackerItemCard extends StatelessWidget { initExpanded: false, onChanged: (value) {}, ), + if (mangaId != null) + TextButton.icon( + onPressed: () => _pushLocalLibrary(context), + label: Text(l10n.track_library_navigate), + icon: Icon(Icons.north_east), + ), TextButton.icon( onPressed: () => _pushMigrationScreen(context), label: Text(l10n.track_library_add), @@ -182,6 +190,12 @@ class TrackerItemCard extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + if (mangaId != null) + TextButton.icon( + onPressed: () => _pushLocalLibrary(context), + label: Text(l10n.track_library_navigate), + icon: Icon(Icons.north_east), + ), TextButton.icon( onPressed: () => _pushMigrationScreen(context), label: Text(l10n.track_library_add), @@ -250,6 +264,10 @@ class TrackerItemCard extends StatelessWidget { ); } + void _pushLocalLibrary(BuildContext context) { + context.push('/manga-reader/detail', extra: mangaId); + } + void _pushMigrationScreen(BuildContext context) { context.push( "/migrate/tracker", diff --git a/lib/modules/tracker_library/tracker_library_card.dart b/lib/modules/tracker_library/tracker_library_card.dart index daccc867..78ea1b1e 100644 --- a/lib/modules/tracker_library/tracker_library_card.dart +++ b/lib/modules/tracker_library/tracker_library_card.dart @@ -33,18 +33,18 @@ class _TrackerLibraryImageCardState Widget build(BuildContext context) { super.build(context); final trackData = widget.track; - return GestureDetector( - onTap: () => _showCard(context), - child: StreamBuilder( - stream: isar.tracks - .filter() - .mangaIdIsNotNull() - .mediaIdEqualTo(trackData.mediaId) - .itemTypeEqualTo(widget.itemType) - .watch(fireImmediately: true), - builder: (context, snapshot) { - final hasData = snapshot.hasData && snapshot.data!.isNotEmpty; - return Padding( + return StreamBuilder( + stream: isar.tracks + .filter() + .mangaIdIsNotNull() + .mediaIdEqualTo(trackData.mediaId) + .itemTypeEqualTo(widget.itemType) + .watch(fireImmediately: true), + builder: (context, snapshot) { + final hasData = snapshot.hasData && snapshot.data!.isNotEmpty; + return GestureDetector( + onTap: () => _showCard(context, snapshot.data?.firstOrNull?.mangaId), + child: Padding( padding: const EdgeInsets.only(left: 10), child: Stack( children: [ @@ -129,17 +129,20 @@ class _TrackerLibraryImageCardState ), ], ), - ); - }, - ), + ), + ); + }, ); } - void _showCard(BuildContext context) { + void _showCard(BuildContext context, int? mangaId) { showDialog( context: context, - builder: (context) => - TrackerItemCard(track: widget.track, itemType: widget.itemType), + builder: (context) => TrackerItemCard( + track: widget.track, + itemType: widget.itemType, + mangaId: mangaId, + ), ); } diff --git a/lib/router/router.dart b/lib/router/router.dart index c889dfb8..43b91888 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -17,6 +17,10 @@ import 'package:mangayomi/modules/more/data_and_storage/data_and_storage.dart'; import 'package:mangayomi/modules/more/settings/appearance/custom_navigation_settings.dart'; import 'package:mangayomi/modules/more/settings/browse/source_repositories.dart'; import 'package:mangayomi/modules/more/settings/player/custom_button_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_advanced_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_audio_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_decoder_screen.dart'; +import 'package:mangayomi/modules/more/settings/player/player_overview_screen.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/statistics/statistics_screen.dart'; import 'package:mangayomi/modules/novel/novel_reader_view.dart'; @@ -204,6 +208,7 @@ class RouterNotifier extends ChangeNotifier { name: "trackingDetail", builder: (trackerPref) => TrackingDetail(trackerPref: trackerPref), ), + _genericRoute(name: "playerOverview", child: const PlayerOverviewScreen()), _genericRoute(name: "playerMode", child: const PlayerScreen()), _genericRoute( name: "codeEditor", @@ -219,6 +224,15 @@ class RouterNotifier extends ChangeNotifier { name: "customButtonScreen", child: const CustomButtonScreen(), ), + _genericRoute( + name: "playerDecoderScreen", + child: const PlayerDecoderScreen(), + ), + _genericRoute(name: "playerAudioScreen", child: const PlayerAudioScreen()), + _genericRoute( + name: "playerAdvancedScreen", + child: const PlayerAdvancedScreen(), + ), _genericRoute( name: "migrate", builder: (manga) => MigrationScreen(manga: manga), diff --git a/pubspec.lock b/pubspec.lock index 0508a12d..c8bb50bd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "746465b7914fa524781813dc6e50ea87dcd686e5" + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1221,7 +1221,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "746465b7914fa524781813dc6e50ea87dcd686e5" + resolved-ref: a02ac2f7e6118cdab855ecacd194fa9ee6961a18 url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0"