mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
fix: remote path traversal through websocket when devices are on same network
This commit is contained in:
parent
b6c0926efc
commit
7c26d29d06
1
drift_schemas/app_db/drift_schema_v6.json
Normal file
1
drift_schemas/app_db/drift_schema_v6.json
Normal file
File diff suppressed because one or more lines are too long
@ -15,8 +15,7 @@ class TextFormBuilderField extends StatelessWidget {
|
|||||||
// final AlignmentGeometry? leadingAlignment;
|
// final AlignmentGeometry? leadingAlignment;
|
||||||
// final AlignmentGeometry? trailingAlignment;
|
// final AlignmentGeometry? trailingAlignment;
|
||||||
final bool border;
|
final bool border;
|
||||||
final Widget? leading;
|
final List<InputFeature> features;
|
||||||
final Widget? trailing;
|
|
||||||
final EdgeInsetsGeometry? padding;
|
final EdgeInsetsGeometry? padding;
|
||||||
final ValueChanged<String>? onSubmitted;
|
final ValueChanged<String>? onSubmitted;
|
||||||
final VoidCallback? onEditingComplete;
|
final VoidCallback? onEditingComplete;
|
||||||
@ -63,8 +62,6 @@ class TextFormBuilderField extends StatelessWidget {
|
|||||||
this.filled = false,
|
this.filled = false,
|
||||||
this.placeholder,
|
this.placeholder,
|
||||||
this.border = true,
|
this.border = true,
|
||||||
this.leading,
|
|
||||||
this.trailing,
|
|
||||||
this.padding,
|
this.padding,
|
||||||
this.onSubmitted,
|
this.onSubmitted,
|
||||||
this.onEditingComplete,
|
this.onEditingComplete,
|
||||||
@ -96,6 +93,7 @@ class TextFormBuilderField extends StatelessWidget {
|
|||||||
// this.leadingAlignment,
|
// this.leadingAlignment,
|
||||||
// this.trailingAlignment,
|
// this.trailingAlignment,
|
||||||
this.statesController,
|
this.statesController,
|
||||||
|
this.features = const [],
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -130,10 +128,7 @@ class TextFormBuilderField extends StatelessWidget {
|
|||||||
filled: filled,
|
filled: filled,
|
||||||
placeholder: placeholder,
|
placeholder: placeholder,
|
||||||
border: border,
|
border: border,
|
||||||
features: [
|
features: features,
|
||||||
if (leading != null) InputFeature.leading(leading!),
|
|
||||||
if (trailing != null) InputFeature.trailing(trailing!),
|
|
||||||
],
|
|
||||||
padding: padding,
|
padding: padding,
|
||||||
onSubmitted: (value) {
|
onSubmitted: (value) {
|
||||||
field.validate();
|
field.validate();
|
||||||
|
@ -424,5 +424,7 @@
|
|||||||
"download": "Download",
|
"download": "Download",
|
||||||
"file_not_found": "File not found",
|
"file_not_found": "File not found",
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"add_custom_url": "Add custom URL"
|
"add_custom_url": "Add custom URL",
|
||||||
|
"edit_port": "Edit port",
|
||||||
|
"port_helper_msg": "Default is -1 which indicates random number. If you've firewall configured, setting this is recommended."
|
||||||
}
|
}
|
||||||
|
@ -2704,6 +2704,18 @@ abstract class AppLocalizations {
|
|||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Add custom URL'**
|
/// **'Add custom URL'**
|
||||||
String get add_custom_url;
|
String get add_custom_url;
|
||||||
|
|
||||||
|
/// No description provided for @edit_port.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Edit port'**
|
||||||
|
String get edit_port;
|
||||||
|
|
||||||
|
/// No description provided for @port_helper_msg.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.'**
|
||||||
|
String get port_helper_msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
|
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsAr extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'إضافة URL مخصص';
|
String get add_custom_url => 'إضافة URL مخصص';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsBn extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'কাস্টম URL যোগ করুন';
|
String get add_custom_url => 'কাস্টম URL যোগ করুন';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsCa extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Afegir URL personalitzada';
|
String get add_custom_url => 'Afegir URL personalitzada';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsCs extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Přidat vlastní URL';
|
String get add_custom_url => 'Přidat vlastní URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Benutzerdefinierte URL hinzufügen';
|
String get add_custom_url => 'Benutzerdefinierte URL hinzufügen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Add custom URL';
|
String get add_custom_url => 'Add custom URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsEs extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Agregar URL personalizada';
|
String get add_custom_url => 'Agregar URL personalizada';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsEu extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Gehitu URL pertsonalizatua';
|
String get add_custom_url => 'Gehitu URL pertsonalizatua';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsFa extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'اضافه کردن URL سفارشی';
|
String get add_custom_url => 'اضافه کردن URL سفارشی';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsFi extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Lisää mukautettu URL';
|
String get add_custom_url => 'Lisää mukautettu URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsFr extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Ajouter une URL personnalisée';
|
String get add_custom_url => 'Ajouter une URL personnalisée';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsHi extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'कस्टम URL जोड़ें';
|
String get add_custom_url => 'कस्टम URL जोड़ें';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsId extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Add custom URL';
|
String get add_custom_url => 'Add custom URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsIt extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Aggiungi URL personalizzato';
|
String get add_custom_url => 'Aggiungi URL personalizzato';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsJa extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'カスタムURLを追加';
|
String get add_custom_url => 'カスタムURLを追加';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsKa extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'დამატება პერსონალური URL';
|
String get add_custom_url => 'დამატება პერსონალური URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsKo extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => '사용자 정의 URL 추가';
|
String get add_custom_url => '사용자 정의 URL 추가';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsNe extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'कस्टम URL जोड़ें';
|
String get add_custom_url => 'कस्टम URL जोड़ें';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Voeg aangepaste URL toe';
|
String get add_custom_url => 'Voeg aangepaste URL toe';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Dodaj niestandardowy URL';
|
String get add_custom_url => 'Dodaj niestandardowy URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Adicionar URL personalizada';
|
String get add_custom_url => 'Adicionar URL personalizada';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Добавить пользовательский URL';
|
String get add_custom_url => 'Добавить пользовательский URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsTa extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'தனிப்பயன் URL ஐச் சேர்க்கவும்';
|
String get add_custom_url => 'தனிப்பயன் URL ஐச் சேர்க்கவும்';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsTh extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'เพิ่ม URL แบบกำหนดเอง';
|
String get add_custom_url => 'เพิ่ม URL แบบกำหนดเอง';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsTl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Magdagdag ng custom URL';
|
String get add_custom_url => 'Magdagdag ng custom URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsTr extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Özel URL ekle';
|
String get add_custom_url => 'Özel URL ekle';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Додати користувацький URL';
|
String get add_custom_url => 'Додати користувацький URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsVi extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => 'Thêm URL tùy chỉnh';
|
String get add_custom_url => 'Thêm URL tùy chỉnh';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -1371,4 +1371,10 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get add_custom_url => '添加自定义 URL';
|
String get add_custom_url => '添加自定义 URL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get edit_port => 'Edit port';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ class AppDatabase extends _$AppDatabase {
|
|||||||
AppDatabase() : super(_openConnection());
|
AppDatabase() : super(_openConnection());
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get schemaVersion => 5;
|
int get schemaVersion => 6;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MigrationStrategy get migration {
|
MigrationStrategy get migration {
|
||||||
@ -114,6 +114,13 @@ class AppDatabase extends _$AppDatabase {
|
|||||||
"SET $columnName = 'Orange:0xFFf97315' WHERE $columnName = 'Blue:0xFF2196F3'",
|
"SET $columnName = 'Orange:0xFFf97315' WHERE $columnName = 'Blue:0xFF2196F3'",
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
from5To6: (m, schema) async {
|
||||||
|
// Add new column to preferences table
|
||||||
|
await m.addColumn(
|
||||||
|
schema.preferencesTable,
|
||||||
|
schema.preferencesTable.connectPort,
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -823,6 +823,14 @@ class $PreferencesTableTable extends PreferencesTable
|
|||||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||||
'CHECK ("enable_connect" IN (0, 1))'),
|
'CHECK ("enable_connect" IN (0, 1))'),
|
||||||
defaultValue: const Constant(false));
|
defaultValue: const Constant(false));
|
||||||
|
static const VerificationMeta _connectPortMeta =
|
||||||
|
const VerificationMeta('connectPort');
|
||||||
|
@override
|
||||||
|
late final GeneratedColumn<int> connectPort = GeneratedColumn<int>(
|
||||||
|
'connect_port', aliasedName, false,
|
||||||
|
type: DriftSqlType.int,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultValue: const Constant(-1));
|
||||||
static const VerificationMeta _cacheMusicMeta =
|
static const VerificationMeta _cacheMusicMeta =
|
||||||
const VerificationMeta('cacheMusic');
|
const VerificationMeta('cacheMusic');
|
||||||
@override
|
@override
|
||||||
@ -862,6 +870,7 @@ class $PreferencesTableTable extends PreferencesTable
|
|||||||
discordPresence,
|
discordPresence,
|
||||||
endlessPlayback,
|
endlessPlayback,
|
||||||
enableConnect,
|
enableConnect,
|
||||||
|
connectPort,
|
||||||
cacheMusic
|
cacheMusic
|
||||||
];
|
];
|
||||||
@override
|
@override
|
||||||
@ -971,6 +980,12 @@ class $PreferencesTableTable extends PreferencesTable
|
|||||||
enableConnect.isAcceptableOrUnknown(
|
enableConnect.isAcceptableOrUnknown(
|
||||||
data['enable_connect']!, _enableConnectMeta));
|
data['enable_connect']!, _enableConnectMeta));
|
||||||
}
|
}
|
||||||
|
if (data.containsKey('connect_port')) {
|
||||||
|
context.handle(
|
||||||
|
_connectPortMeta,
|
||||||
|
connectPort.isAcceptableOrUnknown(
|
||||||
|
data['connect_port']!, _connectPortMeta));
|
||||||
|
}
|
||||||
if (data.containsKey('cache_music')) {
|
if (data.containsKey('cache_music')) {
|
||||||
context.handle(
|
context.handle(
|
||||||
_cacheMusicMeta,
|
_cacheMusicMeta,
|
||||||
@ -1054,6 +1069,8 @@ class $PreferencesTableTable extends PreferencesTable
|
|||||||
.read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!,
|
.read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!,
|
||||||
enableConnect: attachedDatabase.typeMapping
|
enableConnect: attachedDatabase.typeMapping
|
||||||
.read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!,
|
.read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!,
|
||||||
|
connectPort: attachedDatabase.typeMapping
|
||||||
|
.read(DriftSqlType.int, data['${effectivePrefix}connect_port'])!,
|
||||||
cacheMusic: attachedDatabase.typeMapping
|
cacheMusic: attachedDatabase.typeMapping
|
||||||
.read(DriftSqlType.bool, data['${effectivePrefix}cache_music'])!,
|
.read(DriftSqlType.bool, data['${effectivePrefix}cache_music'])!,
|
||||||
);
|
);
|
||||||
@ -1126,6 +1143,7 @@ class PreferencesTableData extends DataClass
|
|||||||
final bool discordPresence;
|
final bool discordPresence;
|
||||||
final bool endlessPlayback;
|
final bool endlessPlayback;
|
||||||
final bool enableConnect;
|
final bool enableConnect;
|
||||||
|
final int connectPort;
|
||||||
final bool cacheMusic;
|
final bool cacheMusic;
|
||||||
const PreferencesTableData(
|
const PreferencesTableData(
|
||||||
{required this.id,
|
{required this.id,
|
||||||
@ -1155,6 +1173,7 @@ class PreferencesTableData extends DataClass
|
|||||||
required this.discordPresence,
|
required this.discordPresence,
|
||||||
required this.endlessPlayback,
|
required this.endlessPlayback,
|
||||||
required this.enableConnect,
|
required this.enableConnect,
|
||||||
|
required this.connectPort,
|
||||||
required this.cacheMusic});
|
required this.cacheMusic});
|
||||||
@override
|
@override
|
||||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||||
@ -1230,6 +1249,7 @@ class PreferencesTableData extends DataClass
|
|||||||
map['discord_presence'] = Variable<bool>(discordPresence);
|
map['discord_presence'] = Variable<bool>(discordPresence);
|
||||||
map['endless_playback'] = Variable<bool>(endlessPlayback);
|
map['endless_playback'] = Variable<bool>(endlessPlayback);
|
||||||
map['enable_connect'] = Variable<bool>(enableConnect);
|
map['enable_connect'] = Variable<bool>(enableConnect);
|
||||||
|
map['connect_port'] = Variable<int>(connectPort);
|
||||||
map['cache_music'] = Variable<bool>(cacheMusic);
|
map['cache_music'] = Variable<bool>(cacheMusic);
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
@ -1263,6 +1283,7 @@ class PreferencesTableData extends DataClass
|
|||||||
discordPresence: Value(discordPresence),
|
discordPresence: Value(discordPresence),
|
||||||
endlessPlayback: Value(endlessPlayback),
|
endlessPlayback: Value(endlessPlayback),
|
||||||
enableConnect: Value(enableConnect),
|
enableConnect: Value(enableConnect),
|
||||||
|
connectPort: Value(connectPort),
|
||||||
cacheMusic: Value(cacheMusic),
|
cacheMusic: Value(cacheMusic),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1310,6 +1331,7 @@ class PreferencesTableData extends DataClass
|
|||||||
discordPresence: serializer.fromJson<bool>(json['discordPresence']),
|
discordPresence: serializer.fromJson<bool>(json['discordPresence']),
|
||||||
endlessPlayback: serializer.fromJson<bool>(json['endlessPlayback']),
|
endlessPlayback: serializer.fromJson<bool>(json['endlessPlayback']),
|
||||||
enableConnect: serializer.fromJson<bool>(json['enableConnect']),
|
enableConnect: serializer.fromJson<bool>(json['enableConnect']),
|
||||||
|
connectPort: serializer.fromJson<int>(json['connectPort']),
|
||||||
cacheMusic: serializer.fromJson<bool>(json['cacheMusic']),
|
cacheMusic: serializer.fromJson<bool>(json['cacheMusic']),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1358,6 +1380,7 @@ class PreferencesTableData extends DataClass
|
|||||||
'discordPresence': serializer.toJson<bool>(discordPresence),
|
'discordPresence': serializer.toJson<bool>(discordPresence),
|
||||||
'endlessPlayback': serializer.toJson<bool>(endlessPlayback),
|
'endlessPlayback': serializer.toJson<bool>(endlessPlayback),
|
||||||
'enableConnect': serializer.toJson<bool>(enableConnect),
|
'enableConnect': serializer.toJson<bool>(enableConnect),
|
||||||
|
'connectPort': serializer.toJson<int>(connectPort),
|
||||||
'cacheMusic': serializer.toJson<bool>(cacheMusic),
|
'cacheMusic': serializer.toJson<bool>(cacheMusic),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1390,6 +1413,7 @@ class PreferencesTableData extends DataClass
|
|||||||
bool? discordPresence,
|
bool? discordPresence,
|
||||||
bool? endlessPlayback,
|
bool? endlessPlayback,
|
||||||
bool? enableConnect,
|
bool? enableConnect,
|
||||||
|
int? connectPort,
|
||||||
bool? cacheMusic}) =>
|
bool? cacheMusic}) =>
|
||||||
PreferencesTableData(
|
PreferencesTableData(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@ -1419,6 +1443,7 @@ class PreferencesTableData extends DataClass
|
|||||||
discordPresence: discordPresence ?? this.discordPresence,
|
discordPresence: discordPresence ?? this.discordPresence,
|
||||||
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
|
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
|
||||||
enableConnect: enableConnect ?? this.enableConnect,
|
enableConnect: enableConnect ?? this.enableConnect,
|
||||||
|
connectPort: connectPort ?? this.connectPort,
|
||||||
cacheMusic: cacheMusic ?? this.cacheMusic,
|
cacheMusic: cacheMusic ?? this.cacheMusic,
|
||||||
);
|
);
|
||||||
PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) {
|
PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) {
|
||||||
@ -1492,6 +1517,8 @@ class PreferencesTableData extends DataClass
|
|||||||
enableConnect: data.enableConnect.present
|
enableConnect: data.enableConnect.present
|
||||||
? data.enableConnect.value
|
? data.enableConnect.value
|
||||||
: this.enableConnect,
|
: this.enableConnect,
|
||||||
|
connectPort:
|
||||||
|
data.connectPort.present ? data.connectPort.value : this.connectPort,
|
||||||
cacheMusic:
|
cacheMusic:
|
||||||
data.cacheMusic.present ? data.cacheMusic.value : this.cacheMusic,
|
data.cacheMusic.present ? data.cacheMusic.value : this.cacheMusic,
|
||||||
);
|
);
|
||||||
@ -1527,6 +1554,7 @@ class PreferencesTableData extends DataClass
|
|||||||
..write('discordPresence: $discordPresence, ')
|
..write('discordPresence: $discordPresence, ')
|
||||||
..write('endlessPlayback: $endlessPlayback, ')
|
..write('endlessPlayback: $endlessPlayback, ')
|
||||||
..write('enableConnect: $enableConnect, ')
|
..write('enableConnect: $enableConnect, ')
|
||||||
|
..write('connectPort: $connectPort, ')
|
||||||
..write('cacheMusic: $cacheMusic')
|
..write('cacheMusic: $cacheMusic')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@ -1561,6 +1589,7 @@ class PreferencesTableData extends DataClass
|
|||||||
discordPresence,
|
discordPresence,
|
||||||
endlessPlayback,
|
endlessPlayback,
|
||||||
enableConnect,
|
enableConnect,
|
||||||
|
connectPort,
|
||||||
cacheMusic
|
cacheMusic
|
||||||
]);
|
]);
|
||||||
@override
|
@override
|
||||||
@ -1594,6 +1623,7 @@ class PreferencesTableData extends DataClass
|
|||||||
other.discordPresence == this.discordPresence &&
|
other.discordPresence == this.discordPresence &&
|
||||||
other.endlessPlayback == this.endlessPlayback &&
|
other.endlessPlayback == this.endlessPlayback &&
|
||||||
other.enableConnect == this.enableConnect &&
|
other.enableConnect == this.enableConnect &&
|
||||||
|
other.connectPort == this.connectPort &&
|
||||||
other.cacheMusic == this.cacheMusic);
|
other.cacheMusic == this.cacheMusic);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1625,6 +1655,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
final Value<bool> discordPresence;
|
final Value<bool> discordPresence;
|
||||||
final Value<bool> endlessPlayback;
|
final Value<bool> endlessPlayback;
|
||||||
final Value<bool> enableConnect;
|
final Value<bool> enableConnect;
|
||||||
|
final Value<int> connectPort;
|
||||||
final Value<bool> cacheMusic;
|
final Value<bool> cacheMusic;
|
||||||
const PreferencesTableCompanion({
|
const PreferencesTableCompanion({
|
||||||
this.id = const Value.absent(),
|
this.id = const Value.absent(),
|
||||||
@ -1654,6 +1685,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
this.discordPresence = const Value.absent(),
|
this.discordPresence = const Value.absent(),
|
||||||
this.endlessPlayback = const Value.absent(),
|
this.endlessPlayback = const Value.absent(),
|
||||||
this.enableConnect = const Value.absent(),
|
this.enableConnect = const Value.absent(),
|
||||||
|
this.connectPort = const Value.absent(),
|
||||||
this.cacheMusic = const Value.absent(),
|
this.cacheMusic = const Value.absent(),
|
||||||
});
|
});
|
||||||
PreferencesTableCompanion.insert({
|
PreferencesTableCompanion.insert({
|
||||||
@ -1684,6 +1716,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
this.discordPresence = const Value.absent(),
|
this.discordPresence = const Value.absent(),
|
||||||
this.endlessPlayback = const Value.absent(),
|
this.endlessPlayback = const Value.absent(),
|
||||||
this.enableConnect = const Value.absent(),
|
this.enableConnect = const Value.absent(),
|
||||||
|
this.connectPort = const Value.absent(),
|
||||||
this.cacheMusic = const Value.absent(),
|
this.cacheMusic = const Value.absent(),
|
||||||
});
|
});
|
||||||
static Insertable<PreferencesTableData> custom({
|
static Insertable<PreferencesTableData> custom({
|
||||||
@ -1714,6 +1747,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
Expression<bool>? discordPresence,
|
Expression<bool>? discordPresence,
|
||||||
Expression<bool>? endlessPlayback,
|
Expression<bool>? endlessPlayback,
|
||||||
Expression<bool>? enableConnect,
|
Expression<bool>? enableConnect,
|
||||||
|
Expression<int>? connectPort,
|
||||||
Expression<bool>? cacheMusic,
|
Expression<bool>? cacheMusic,
|
||||||
}) {
|
}) {
|
||||||
return RawValuesInsertable({
|
return RawValuesInsertable({
|
||||||
@ -1748,6 +1782,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
if (discordPresence != null) 'discord_presence': discordPresence,
|
if (discordPresence != null) 'discord_presence': discordPresence,
|
||||||
if (endlessPlayback != null) 'endless_playback': endlessPlayback,
|
if (endlessPlayback != null) 'endless_playback': endlessPlayback,
|
||||||
if (enableConnect != null) 'enable_connect': enableConnect,
|
if (enableConnect != null) 'enable_connect': enableConnect,
|
||||||
|
if (connectPort != null) 'connect_port': connectPort,
|
||||||
if (cacheMusic != null) 'cache_music': cacheMusic,
|
if (cacheMusic != null) 'cache_music': cacheMusic,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1780,6 +1815,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
Value<bool>? discordPresence,
|
Value<bool>? discordPresence,
|
||||||
Value<bool>? endlessPlayback,
|
Value<bool>? endlessPlayback,
|
||||||
Value<bool>? enableConnect,
|
Value<bool>? enableConnect,
|
||||||
|
Value<int>? connectPort,
|
||||||
Value<bool>? cacheMusic}) {
|
Value<bool>? cacheMusic}) {
|
||||||
return PreferencesTableCompanion(
|
return PreferencesTableCompanion(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
@ -1809,6 +1845,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
discordPresence: discordPresence ?? this.discordPresence,
|
discordPresence: discordPresence ?? this.discordPresence,
|
||||||
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
|
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
|
||||||
enableConnect: enableConnect ?? this.enableConnect,
|
enableConnect: enableConnect ?? this.enableConnect,
|
||||||
|
connectPort: connectPort ?? this.connectPort,
|
||||||
cacheMusic: cacheMusic ?? this.cacheMusic,
|
cacheMusic: cacheMusic ?? this.cacheMusic,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1918,6 +1955,9 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
if (enableConnect.present) {
|
if (enableConnect.present) {
|
||||||
map['enable_connect'] = Variable<bool>(enableConnect.value);
|
map['enable_connect'] = Variable<bool>(enableConnect.value);
|
||||||
}
|
}
|
||||||
|
if (connectPort.present) {
|
||||||
|
map['connect_port'] = Variable<int>(connectPort.value);
|
||||||
|
}
|
||||||
if (cacheMusic.present) {
|
if (cacheMusic.present) {
|
||||||
map['cache_music'] = Variable<bool>(cacheMusic.value);
|
map['cache_music'] = Variable<bool>(cacheMusic.value);
|
||||||
}
|
}
|
||||||
@ -1954,6 +1994,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
|||||||
..write('discordPresence: $discordPresence, ')
|
..write('discordPresence: $discordPresence, ')
|
||||||
..write('endlessPlayback: $endlessPlayback, ')
|
..write('endlessPlayback: $endlessPlayback, ')
|
||||||
..write('enableConnect: $enableConnect, ')
|
..write('enableConnect: $enableConnect, ')
|
||||||
|
..write('connectPort: $connectPort, ')
|
||||||
..write('cacheMusic: $cacheMusic')
|
..write('cacheMusic: $cacheMusic')
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
@ -4626,6 +4667,7 @@ typedef $$PreferencesTableTableCreateCompanionBuilder
|
|||||||
Value<bool> discordPresence,
|
Value<bool> discordPresence,
|
||||||
Value<bool> endlessPlayback,
|
Value<bool> endlessPlayback,
|
||||||
Value<bool> enableConnect,
|
Value<bool> enableConnect,
|
||||||
|
Value<int> connectPort,
|
||||||
Value<bool> cacheMusic,
|
Value<bool> cacheMusic,
|
||||||
});
|
});
|
||||||
typedef $$PreferencesTableTableUpdateCompanionBuilder
|
typedef $$PreferencesTableTableUpdateCompanionBuilder
|
||||||
@ -4657,6 +4699,7 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder
|
|||||||
Value<bool> discordPresence,
|
Value<bool> discordPresence,
|
||||||
Value<bool> endlessPlayback,
|
Value<bool> endlessPlayback,
|
||||||
Value<bool> enableConnect,
|
Value<bool> enableConnect,
|
||||||
|
Value<int> connectPort,
|
||||||
Value<bool> cacheMusic,
|
Value<bool> cacheMusic,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -4786,6 +4829,9 @@ class $$PreferencesTableTableFilterComposer
|
|||||||
ColumnFilters<bool> get enableConnect => $composableBuilder(
|
ColumnFilters<bool> get enableConnect => $composableBuilder(
|
||||||
column: $table.enableConnect, builder: (column) => ColumnFilters(column));
|
column: $table.enableConnect, builder: (column) => ColumnFilters(column));
|
||||||
|
|
||||||
|
ColumnFilters<int> get connectPort => $composableBuilder(
|
||||||
|
column: $table.connectPort, builder: (column) => ColumnFilters(column));
|
||||||
|
|
||||||
ColumnFilters<bool> get cacheMusic => $composableBuilder(
|
ColumnFilters<bool> get cacheMusic => $composableBuilder(
|
||||||
column: $table.cacheMusic, builder: (column) => ColumnFilters(column));
|
column: $table.cacheMusic, builder: (column) => ColumnFilters(column));
|
||||||
}
|
}
|
||||||
@ -4899,6 +4945,9 @@ class $$PreferencesTableTableOrderingComposer
|
|||||||
column: $table.enableConnect,
|
column: $table.enableConnect,
|
||||||
builder: (column) => ColumnOrderings(column));
|
builder: (column) => ColumnOrderings(column));
|
||||||
|
|
||||||
|
ColumnOrderings<int> get connectPort => $composableBuilder(
|
||||||
|
column: $table.connectPort, builder: (column) => ColumnOrderings(column));
|
||||||
|
|
||||||
ColumnOrderings<bool> get cacheMusic => $composableBuilder(
|
ColumnOrderings<bool> get cacheMusic => $composableBuilder(
|
||||||
column: $table.cacheMusic, builder: (column) => ColumnOrderings(column));
|
column: $table.cacheMusic, builder: (column) => ColumnOrderings(column));
|
||||||
}
|
}
|
||||||
@ -5003,6 +5052,9 @@ class $$PreferencesTableTableAnnotationComposer
|
|||||||
GeneratedColumn<bool> get enableConnect => $composableBuilder(
|
GeneratedColumn<bool> get enableConnect => $composableBuilder(
|
||||||
column: $table.enableConnect, builder: (column) => column);
|
column: $table.enableConnect, builder: (column) => column);
|
||||||
|
|
||||||
|
GeneratedColumn<int> get connectPort => $composableBuilder(
|
||||||
|
column: $table.connectPort, builder: (column) => column);
|
||||||
|
|
||||||
GeneratedColumn<bool> get cacheMusic => $composableBuilder(
|
GeneratedColumn<bool> get cacheMusic => $composableBuilder(
|
||||||
column: $table.cacheMusic, builder: (column) => column);
|
column: $table.cacheMusic, builder: (column) => column);
|
||||||
}
|
}
|
||||||
@ -5063,6 +5115,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
|||||||
Value<bool> discordPresence = const Value.absent(),
|
Value<bool> discordPresence = const Value.absent(),
|
||||||
Value<bool> endlessPlayback = const Value.absent(),
|
Value<bool> endlessPlayback = const Value.absent(),
|
||||||
Value<bool> enableConnect = const Value.absent(),
|
Value<bool> enableConnect = const Value.absent(),
|
||||||
|
Value<int> connectPort = const Value.absent(),
|
||||||
Value<bool> cacheMusic = const Value.absent(),
|
Value<bool> cacheMusic = const Value.absent(),
|
||||||
}) =>
|
}) =>
|
||||||
PreferencesTableCompanion(
|
PreferencesTableCompanion(
|
||||||
@ -5093,6 +5146,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
|||||||
discordPresence: discordPresence,
|
discordPresence: discordPresence,
|
||||||
endlessPlayback: endlessPlayback,
|
endlessPlayback: endlessPlayback,
|
||||||
enableConnect: enableConnect,
|
enableConnect: enableConnect,
|
||||||
|
connectPort: connectPort,
|
||||||
cacheMusic: cacheMusic,
|
cacheMusic: cacheMusic,
|
||||||
),
|
),
|
||||||
createCompanionCallback: ({
|
createCompanionCallback: ({
|
||||||
@ -5124,6 +5178,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
|||||||
Value<bool> discordPresence = const Value.absent(),
|
Value<bool> discordPresence = const Value.absent(),
|
||||||
Value<bool> endlessPlayback = const Value.absent(),
|
Value<bool> endlessPlayback = const Value.absent(),
|
||||||
Value<bool> enableConnect = const Value.absent(),
|
Value<bool> enableConnect = const Value.absent(),
|
||||||
|
Value<int> connectPort = const Value.absent(),
|
||||||
Value<bool> cacheMusic = const Value.absent(),
|
Value<bool> cacheMusic = const Value.absent(),
|
||||||
}) =>
|
}) =>
|
||||||
PreferencesTableCompanion.insert(
|
PreferencesTableCompanion.insert(
|
||||||
@ -5154,6 +5209,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
|||||||
discordPresence: discordPresence,
|
discordPresence: discordPresence,
|
||||||
endlessPlayback: endlessPlayback,
|
endlessPlayback: endlessPlayback,
|
||||||
enableConnect: enableConnect,
|
enableConnect: enableConnect,
|
||||||
|
connectPort: connectPort,
|
||||||
cacheMusic: cacheMusic,
|
cacheMusic: cacheMusic,
|
||||||
),
|
),
|
||||||
withReferenceMapper: (p0) => p0
|
withReferenceMapper: (p0) => p0
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
// dart format width=80
|
// dart format width=80
|
||||||
import 'package:drift/internal/versioned_schema.dart' as i0;
|
import 'package:drift/internal/versioned_schema.dart' as i0;
|
||||||
import 'package:drift/drift.dart' as i1;
|
import 'package:drift/drift.dart' as i1;
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/models/database/database.dart';
|
import 'package:spotube/models/database/database.dart';
|
||||||
import 'package:spotube/services/sourced_track/enums.dart'; // ignore_for_file: type=lint,unused_import
|
import 'package:spotube/services/sourced_track/enums.dart';
|
||||||
|
|
||||||
// GENERATED BY drift_dev, DO NOT MODIFY.
|
// GENERATED BY drift_dev, DO NOT MODIFY.
|
||||||
final class Schema2 extends i0.VersionedSchema {
|
final class Schema2 extends i0.VersionedSchema {
|
||||||
@ -1409,11 +1409,295 @@ i1.GeneratedColumn<String> _column_55(String aliasedName) =>
|
|||||||
i1.GeneratedColumn<String>('accent_color_scheme', aliasedName, false,
|
i1.GeneratedColumn<String>('accent_color_scheme', aliasedName, false,
|
||||||
type: i1.DriftSqlType.string,
|
type: i1.DriftSqlType.string,
|
||||||
defaultValue: const Constant("Orange:0xFFf97315"));
|
defaultValue: const Constant("Orange:0xFFf97315"));
|
||||||
|
|
||||||
|
final class Schema6 extends i0.VersionedSchema {
|
||||||
|
Schema6({required super.database}) : super(version: 6);
|
||||||
|
@override
|
||||||
|
late final List<i1.DatabaseSchemaEntity> entities = [
|
||||||
|
authenticationTable,
|
||||||
|
blacklistTable,
|
||||||
|
preferencesTable,
|
||||||
|
scrobblerTable,
|
||||||
|
skipSegmentTable,
|
||||||
|
sourceMatchTable,
|
||||||
|
audioPlayerStateTable,
|
||||||
|
playlistTable,
|
||||||
|
playlistMediaTable,
|
||||||
|
historyTable,
|
||||||
|
lyricsTable,
|
||||||
|
uniqueBlacklist,
|
||||||
|
uniqTrackMatch,
|
||||||
|
];
|
||||||
|
late final Shape0 authenticationTable = Shape0(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'authentication_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_1,
|
||||||
|
_column_2,
|
||||||
|
_column_3,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape1 blacklistTable = Shape1(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'blacklist_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_4,
|
||||||
|
_column_5,
|
||||||
|
_column_6,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape13 preferencesTable = Shape13(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'preferences_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_7,
|
||||||
|
_column_8,
|
||||||
|
_column_9,
|
||||||
|
_column_10,
|
||||||
|
_column_11,
|
||||||
|
_column_12,
|
||||||
|
_column_13,
|
||||||
|
_column_14,
|
||||||
|
_column_15,
|
||||||
|
_column_55,
|
||||||
|
_column_17,
|
||||||
|
_column_18,
|
||||||
|
_column_19,
|
||||||
|
_column_20,
|
||||||
|
_column_21,
|
||||||
|
_column_22,
|
||||||
|
_column_23,
|
||||||
|
_column_24,
|
||||||
|
_column_25,
|
||||||
|
_column_26,
|
||||||
|
_column_54,
|
||||||
|
_column_27,
|
||||||
|
_column_28,
|
||||||
|
_column_29,
|
||||||
|
_column_30,
|
||||||
|
_column_31,
|
||||||
|
_column_56,
|
||||||
|
_column_53,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape3 scrobblerTable = Shape3(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'scrobbler_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_32,
|
||||||
|
_column_33,
|
||||||
|
_column_34,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape4 skipSegmentTable = Shape4(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'skip_segment_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_35,
|
||||||
|
_column_36,
|
||||||
|
_column_37,
|
||||||
|
_column_32,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape5 sourceMatchTable = Shape5(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'source_match_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_37,
|
||||||
|
_column_38,
|
||||||
|
_column_39,
|
||||||
|
_column_32,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape6 audioPlayerStateTable = Shape6(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'audio_player_state_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_40,
|
||||||
|
_column_41,
|
||||||
|
_column_42,
|
||||||
|
_column_43,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape7 playlistTable = Shape7(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'playlist_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_44,
|
||||||
|
_column_45,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape8 playlistMediaTable = Shape8(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'playlist_media_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_46,
|
||||||
|
_column_47,
|
||||||
|
_column_48,
|
||||||
|
_column_49,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape9 historyTable = Shape9(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'history_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_32,
|
||||||
|
_column_50,
|
||||||
|
_column_51,
|
||||||
|
_column_52,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
late final Shape10 lyricsTable = Shape10(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'lyrics_table',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_37,
|
||||||
|
_column_52,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null);
|
||||||
|
final i1.Index uniqueBlacklist = i1.Index('unique_blacklist',
|
||||||
|
'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)');
|
||||||
|
final i1.Index uniqTrackMatch = i1.Index('uniq_track_match',
|
||||||
|
'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)');
|
||||||
|
}
|
||||||
|
|
||||||
|
class Shape13 extends i0.VersionedTable {
|
||||||
|
Shape13({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<int> get id =>
|
||||||
|
columnsByName['id']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<String> get audioQuality =>
|
||||||
|
columnsByName['audio_quality']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<bool> get albumColorSync =>
|
||||||
|
columnsByName['album_color_sync']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get amoledDarkTheme =>
|
||||||
|
columnsByName['amoled_dark_theme']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get checkUpdate =>
|
||||||
|
columnsByName['check_update']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get normalizeAudio =>
|
||||||
|
columnsByName['normalize_audio']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get showSystemTrayIcon =>
|
||||||
|
columnsByName['show_system_tray_icon']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get systemTitleBar =>
|
||||||
|
columnsByName['system_title_bar']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get skipNonMusic =>
|
||||||
|
columnsByName['skip_non_music']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<String> get closeBehavior =>
|
||||||
|
columnsByName['close_behavior']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get accentColorScheme =>
|
||||||
|
columnsByName['accent_color_scheme']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get layoutMode =>
|
||||||
|
columnsByName['layout_mode']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get locale =>
|
||||||
|
columnsByName['locale']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get market =>
|
||||||
|
columnsByName['market']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get searchMode =>
|
||||||
|
columnsByName['search_mode']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get downloadLocation =>
|
||||||
|
columnsByName['download_location']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get localLibraryLocation =>
|
||||||
|
columnsByName['local_library_location']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get pipedInstance =>
|
||||||
|
columnsByName['piped_instance']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get invidiousInstance =>
|
||||||
|
columnsByName['invidious_instance']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get themeMode =>
|
||||||
|
columnsByName['theme_mode']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get audioSource =>
|
||||||
|
columnsByName['audio_source']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get youtubeClientEngine =>
|
||||||
|
columnsByName['youtube_client_engine']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get streamMusicCodec =>
|
||||||
|
columnsByName['stream_music_codec']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get downloadMusicCodec =>
|
||||||
|
columnsByName['download_music_codec']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<bool> get discordPresence =>
|
||||||
|
columnsByName['discord_presence']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get endlessPlayback =>
|
||||||
|
columnsByName['endless_playback']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<bool> get enableConnect =>
|
||||||
|
columnsByName['enable_connect']! as i1.GeneratedColumn<bool>;
|
||||||
|
i1.GeneratedColumn<int> get connectPort =>
|
||||||
|
columnsByName['connect_port']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<bool> get cacheMusic =>
|
||||||
|
columnsByName['cache_music']! as i1.GeneratedColumn<bool>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<int> _column_56(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>('connect_port', aliasedName, false,
|
||||||
|
type: i1.DriftSqlType.int, defaultValue: const Constant(-1));
|
||||||
i0.MigrationStepWithVersion migrationSteps({
|
i0.MigrationStepWithVersion migrationSteps({
|
||||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||||
|
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
|
||||||
}) {
|
}) {
|
||||||
return (currentVersion, database) async {
|
return (currentVersion, database) async {
|
||||||
switch (currentVersion) {
|
switch (currentVersion) {
|
||||||
@ -1437,6 +1721,11 @@ i0.MigrationStepWithVersion migrationSteps({
|
|||||||
final migrator = i1.Migrator(database, schema);
|
final migrator = i1.Migrator(database, schema);
|
||||||
await from4To5(migrator, schema);
|
await from4To5(migrator, schema);
|
||||||
return 5;
|
return 5;
|
||||||
|
case 5:
|
||||||
|
final schema = Schema6(database: database);
|
||||||
|
final migrator = i1.Migrator(database, schema);
|
||||||
|
await from5To6(migrator, schema);
|
||||||
|
return 6;
|
||||||
default:
|
default:
|
||||||
throw ArgumentError.value('Unknown migration from $currentVersion');
|
throw ArgumentError.value('Unknown migration from $currentVersion');
|
||||||
}
|
}
|
||||||
@ -1448,6 +1737,7 @@ i1.OnUpgrade stepByStep({
|
|||||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||||
|
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
|
||||||
}) =>
|
}) =>
|
||||||
i0.VersionedSchema.stepByStepHelper(
|
i0.VersionedSchema.stepByStepHelper(
|
||||||
step: migrationSteps(
|
step: migrationSteps(
|
||||||
@ -1455,4 +1745,5 @@ i1.OnUpgrade stepByStep({
|
|||||||
from2To3: from2To3,
|
from2To3: from2To3,
|
||||||
from3To4: from3To4,
|
from3To4: from3To4,
|
||||||
from4To5: from4To5,
|
from4To5: from4To5,
|
||||||
|
from5To6: from5To6,
|
||||||
));
|
));
|
||||||
|
@ -115,6 +115,7 @@ class PreferencesTable extends Table {
|
|||||||
boolean().withDefault(const Constant(true))();
|
boolean().withDefault(const Constant(true))();
|
||||||
BoolColumn get enableConnect =>
|
BoolColumn get enableConnect =>
|
||||||
boolean().withDefault(const Constant(false))();
|
boolean().withDefault(const Constant(false))();
|
||||||
|
IntColumn get connectPort => integer().withDefault(const Constant(-1))();
|
||||||
BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))();
|
BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))();
|
||||||
|
|
||||||
// Default values as PreferencesTableData
|
// Default values as PreferencesTableData
|
||||||
@ -148,6 +149,7 @@ class PreferencesTable extends Table {
|
|||||||
endlessPlayback: true,
|
endlessPlayback: true,
|
||||||
enableConnect: false,
|
enableConnect: false,
|
||||||
cacheMusic: true,
|
cacheMusic: true,
|
||||||
|
connectPort: -1,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
81
lib/modules/settings/playback/edit_connect_port_dialog.dart
Normal file
81
lib/modules/settings/playback/edit_connect_port_dialog.dart
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||||
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
import 'package:spotube/components/form/text_form_field.dart';
|
||||||
|
import 'package:spotube/extensions/context.dart';
|
||||||
|
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
|
||||||
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
|
|
||||||
|
class SettingsPlaybackEditConnectPortDialog extends HookConsumerWidget {
|
||||||
|
const SettingsPlaybackEditConnectPortDialog({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, ref) {
|
||||||
|
final connectPort = ref.watch(
|
||||||
|
userPreferencesProvider.select((s) => s.connectPort),
|
||||||
|
);
|
||||||
|
final controller = useShadcnTextEditingController(
|
||||||
|
text: connectPort.toString(),
|
||||||
|
);
|
||||||
|
final formKey = useMemoized(() => GlobalKey<FormBuilderState>(), []);
|
||||||
|
|
||||||
|
return ConstrainedBox(
|
||||||
|
constraints: const BoxConstraints(maxWidth: 400),
|
||||||
|
child: Alert(
|
||||||
|
title: Text(context.l10n.edit_port).h4(),
|
||||||
|
content: FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const Gap(10),
|
||||||
|
TextFormBuilderField(
|
||||||
|
name: "port",
|
||||||
|
controller: controller,
|
||||||
|
placeholder: const Text("3000"),
|
||||||
|
validator: FormBuilderValidators.integer(radix: 10),
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
inputFormatters: [
|
||||||
|
FilteringTextInputFormatter.digitsOnly,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Gap(5),
|
||||||
|
Text(context.l10n.port_helper_msg).small.muted,
|
||||||
|
const Gap(20),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Button.secondary(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text(context.l10n.cancel),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
Expanded(
|
||||||
|
child: Button.primary(
|
||||||
|
onPressed: () {
|
||||||
|
if (!formKey.currentState!.saveAndValidate()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final port = int.parse(controller.text);
|
||||||
|
ref
|
||||||
|
.read(userPreferencesProvider.notifier)
|
||||||
|
.setConnectPort(port);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text(context.l10n.save),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
75
lib/modules/settings/playback/edit_instance_url_dialog.dart
Normal file
75
lib/modules/settings/playback/edit_instance_url_dialog.dart
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||||
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
import 'package:spotube/components/form/text_form_field.dart';
|
||||||
|
import 'package:spotube/extensions/context.dart';
|
||||||
|
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
|
||||||
|
|
||||||
|
class SettingsPlaybackEditInstanceUrlDialog extends HookConsumerWidget {
|
||||||
|
final String title;
|
||||||
|
final String? initialValue;
|
||||||
|
final ValueChanged<String> onSave;
|
||||||
|
|
||||||
|
const SettingsPlaybackEditInstanceUrlDialog({
|
||||||
|
super.key,
|
||||||
|
required this.title,
|
||||||
|
required this.onSave,
|
||||||
|
this.initialValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, ref) {
|
||||||
|
final controller = useShadcnTextEditingController(
|
||||||
|
text: initialValue,
|
||||||
|
);
|
||||||
|
final formKey = useMemoized(() => GlobalKey<FormBuilderState>(), []);
|
||||||
|
|
||||||
|
return Alert(
|
||||||
|
title: Text(title).h4(),
|
||||||
|
content: FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const Gap(10),
|
||||||
|
TextFormBuilderField(
|
||||||
|
name: "url",
|
||||||
|
controller: controller,
|
||||||
|
placeholder: Text(title),
|
||||||
|
validator: FormBuilderValidators.url(),
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Button.secondary(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text(context.l10n.cancel),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
Expanded(
|
||||||
|
child: Button.primary(
|
||||||
|
onPressed: () {
|
||||||
|
if (!formKey.currentState!.saveAndValidate()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onSave(
|
||||||
|
controller.text,
|
||||||
|
);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text(context.l10n.save),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -4,9 +4,6 @@ import 'package:auto_route/auto_route.dart';
|
|||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart' show ListTile;
|
import 'package:flutter/material.dart' show ListTile;
|
||||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
||||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
|
||||||
|
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
@ -14,9 +11,9 @@ import 'package:piped_client/piped_client.dart';
|
|||||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||||
import 'package:spotube/collections/routes.gr.dart';
|
import 'package:spotube/collections/routes.gr.dart';
|
||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/form/text_form_field.dart';
|
|
||||||
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
|
|
||||||
import 'package:spotube/models/database/database.dart';
|
import 'package:spotube/models/database/database.dart';
|
||||||
|
import 'package:spotube/modules/settings/playback/edit_connect_port_dialog.dart';
|
||||||
|
import 'package:spotube/modules/settings/playback/edit_instance_url_dialog.dart';
|
||||||
import 'package:spotube/modules/settings/section_card_with_heading.dart';
|
import 'package:spotube/modules/settings/section_card_with_heading.dart';
|
||||||
import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
|
import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
@ -114,67 +111,12 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
|||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||||
builder: (context) => HookBuilder(
|
builder: (context) =>
|
||||||
builder: (context) {
|
SettingsPlaybackEditInstanceUrlDialog(
|
||||||
final controller =
|
title: context.l10n.piped_instance,
|
||||||
useShadcnTextEditingController(
|
initialValue: preferences.pipedInstance,
|
||||||
text: preferences.pipedInstance,
|
onSave: (value) {
|
||||||
);
|
preferencesNotifier.setPipedInstance(value);
|
||||||
final formKey = useMemoized(
|
|
||||||
() => GlobalKey<FormBuilderState>(), []);
|
|
||||||
|
|
||||||
return Alert(
|
|
||||||
title:
|
|
||||||
Text(context.l10n.piped_instance).h4(),
|
|
||||||
content: FormBuilder(
|
|
||||||
key: formKey,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
const Gap(10),
|
|
||||||
TextFormBuilderField(
|
|
||||||
name: "url",
|
|
||||||
controller: controller,
|
|
||||||
placeholder: Text(
|
|
||||||
context.l10n.piped_instance),
|
|
||||||
validator:
|
|
||||||
FormBuilderValidators.url(),
|
|
||||||
),
|
|
||||||
const Gap(10),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Button.secondary(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
child:
|
|
||||||
Text(context.l10n.cancel),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const Gap(10),
|
|
||||||
Expanded(
|
|
||||||
child: Button.primary(
|
|
||||||
onPressed: () {
|
|
||||||
if (!formKey.currentState!
|
|
||||||
.saveAndValidate()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
preferencesNotifier
|
|
||||||
.setPipedInstance(
|
|
||||||
controller.text,
|
|
||||||
);
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
child:
|
|
||||||
Text(context.l10n.save),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -269,67 +211,13 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
|||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||||
builder: (context) => HookBuilder(
|
builder: (context) =>
|
||||||
builder: (context) {
|
SettingsPlaybackEditInstanceUrlDialog(
|
||||||
final controller =
|
title: context.l10n.invidious_instance,
|
||||||
useShadcnTextEditingController(
|
initialValue: preferences.invidiousInstance,
|
||||||
text: preferences.invidiousInstance,
|
onSave: (value) {
|
||||||
);
|
preferencesNotifier
|
||||||
final formKey = useMemoized(
|
.setInvidiousInstance(value);
|
||||||
() => GlobalKey<FormBuilderState>(), []);
|
|
||||||
|
|
||||||
return Alert(
|
|
||||||
title: Text(context.l10n.invidious_instance)
|
|
||||||
.h4(),
|
|
||||||
content: FormBuilder(
|
|
||||||
key: formKey,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
const Gap(10),
|
|
||||||
TextFormBuilderField(
|
|
||||||
name: "url",
|
|
||||||
controller: controller,
|
|
||||||
placeholder: Text(context
|
|
||||||
.l10n.invidious_instance),
|
|
||||||
validator:
|
|
||||||
FormBuilderValidators.url(),
|
|
||||||
),
|
|
||||||
const Gap(10),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Button.secondary(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
child:
|
|
||||||
Text(context.l10n.cancel),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const Gap(10),
|
|
||||||
Expanded(
|
|
||||||
child: Button.primary(
|
|
||||||
onPressed: () {
|
|
||||||
if (!formKey.currentState!
|
|
||||||
.saveAndValidate()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
preferencesNotifier
|
|
||||||
.setInvidiousInstance(
|
|
||||||
controller.text,
|
|
||||||
);
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
child:
|
|
||||||
Text(context.l10n.save),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -561,9 +449,32 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
|||||||
title: Text(context.l10n.enable_connect),
|
title: Text(context.l10n.enable_connect),
|
||||||
subtitle: Text(context.l10n.enable_connect_description),
|
subtitle: Text(context.l10n.enable_connect_description),
|
||||||
leading: const Icon(SpotubeIcons.connect),
|
leading: const Icon(SpotubeIcons.connect),
|
||||||
trailing: Switch(
|
trailing: Row(
|
||||||
value: preferences.enableConnect,
|
mainAxisSize: MainAxisSize.min,
|
||||||
onChanged: preferencesNotifier.setEnableConnect,
|
spacing: 10,
|
||||||
|
children: [
|
||||||
|
Tooltip(
|
||||||
|
tooltip: TooltipContainer(
|
||||||
|
child: Text(context.l10n.edit_port),
|
||||||
|
).call,
|
||||||
|
child: IconButton.outline(
|
||||||
|
icon: const Icon(SpotubeIcons.edit),
|
||||||
|
size: ButtonSize.small,
|
||||||
|
onPressed: () {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||||
|
builder: (context) =>
|
||||||
|
const SettingsPlaybackEditConnectPortDialog(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Switch(
|
||||||
|
value: preferences.enableConnect,
|
||||||
|
onChanged: preferencesNotifier.setEnableConnect,
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -15,6 +15,7 @@ import 'package:spotube/models/local_track.dart';
|
|||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
// ignore: depend_on_referenced_packages
|
// ignore: depend_on_referenced_packages
|
||||||
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException;
|
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException;
|
||||||
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
|
|
||||||
const supportedAudioTypes = [
|
const supportedAudioTypes = [
|
||||||
"audio/webm",
|
"audio/webm",
|
||||||
@ -90,12 +91,15 @@ final localTracksProvider =
|
|||||||
try {
|
try {
|
||||||
final metadata = await MetadataGod.readMetadata(file: file.path);
|
final metadata = await MetadataGod.readMetadata(file: file.path);
|
||||||
|
|
||||||
final imageFile = File(join(
|
final imageFile = File(
|
||||||
(await getTemporaryDirectory()).path,
|
join(
|
||||||
"spotube",
|
(await getTemporaryDirectory()).path,
|
||||||
basenameWithoutExtension(file.path) +
|
"spotube",
|
||||||
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
ServiceUtils.sanitizeFilename(
|
||||||
));
|
basenameWithoutExtension(file.path)) +
|
||||||
|
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
||||||
|
),
|
||||||
|
);
|
||||||
if (!await imageFile.exists() && metadata.picture != null) {
|
if (!await imageFile.exists() && metadata.picture != null) {
|
||||||
await imageFile.create(recursive: true);
|
await imageFile.create(recursive: true);
|
||||||
await imageFile.writeAsBytes(
|
await imageFile.writeAsBytes(
|
||||||
|
@ -54,7 +54,9 @@ class ServerPlaybackRoutes {
|
|||||||
final trackCacheFile = File(
|
final trackCacheFile = File(
|
||||||
join(
|
join(
|
||||||
await UserPreferencesNotifier.getMusicCacheDir(),
|
await UserPreferencesNotifier.getMusicCacheDir(),
|
||||||
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
|
ServiceUtils.sanitizeFilename(
|
||||||
|
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final trackPartialCacheFile = File("${trackCacheFile.path}.part");
|
final trackPartialCacheFile = File("${trackCacheFile.path}.part");
|
||||||
|
@ -5,30 +5,51 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:shelf/shelf_io.dart';
|
import 'package:shelf/shelf_io.dart';
|
||||||
import 'package:spotube/provider/server/pipeline.dart';
|
import 'package:spotube/provider/server/pipeline.dart';
|
||||||
import 'package:spotube/provider/server/router.dart';
|
import 'package:spotube/provider/server/router.dart';
|
||||||
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||||
import 'package:spotube/services/logger/logger.dart';
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
|
|
||||||
final serverProvider = FutureProvider(
|
final serverProvider = FutureProvider(
|
||||||
(ref) async {
|
(ref) async {
|
||||||
|
final enabledRemoteConnect = ref.watch(
|
||||||
|
userPreferencesProvider.select((value) => value.enableConnect),
|
||||||
|
);
|
||||||
|
final connectPort = ref.watch(
|
||||||
|
userPreferencesProvider.select((value) => value.connectPort),
|
||||||
|
);
|
||||||
final pipeline = ref.watch(pipelineProvider);
|
final pipeline = ref.watch(pipelineProvider);
|
||||||
final router = ref.watch(serverRouterProvider);
|
final router = ref.watch(serverRouterProvider);
|
||||||
final port = Random().nextInt(17500) + 5000;
|
|
||||||
|
|
||||||
SpotubeMedia.serverPort = port;
|
// When connect port is -1, we need to generate a random port
|
||||||
|
// but we shouldn't reset it if it's already been set (caused by a state change)
|
||||||
|
if (connectPort == -1) {
|
||||||
|
if (SpotubeMedia.serverPort == 0) {
|
||||||
|
final port = Random().nextInt(17500) + 5000;
|
||||||
|
SpotubeMedia.serverPort = port;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SpotubeMedia.serverPort = connectPort;
|
||||||
|
}
|
||||||
|
|
||||||
final server = await serve(
|
final server = await serve(
|
||||||
pipeline.addHandler(router.call),
|
pipeline.addHandler(router.call),
|
||||||
InternetAddress.anyIPv4,
|
enabledRemoteConnect
|
||||||
port,
|
? InternetAddress.anyIPv4
|
||||||
|
: InternetAddress.loopbackIPv4,
|
||||||
|
SpotubeMedia.serverPort,
|
||||||
);
|
);
|
||||||
|
|
||||||
AppLogger.log
|
AppLogger.log.t(
|
||||||
.t('Playback server at http://${server.address.host}:${server.port}');
|
'Playback server at http://${server.address.host}:${server.port}',
|
||||||
|
);
|
||||||
|
|
||||||
ref.onDispose(() {
|
ref.onDispose(() {
|
||||||
server.close();
|
server.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
return (server: server, port: port);
|
return (
|
||||||
|
server: server,
|
||||||
|
port: SpotubeMedia.serverPort,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -240,6 +240,14 @@ class UserPreferencesNotifier extends Notifier<PreferencesTableData> {
|
|||||||
setData(PreferencesTableCompanion(enableConnect: Value(enable)));
|
setData(PreferencesTableCompanion(enableConnect: Value(enable)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setConnectPort(int port) {
|
||||||
|
assert(
|
||||||
|
port >= -1 && port <= 65535,
|
||||||
|
"Port must be between -1 and 65535, got $port",
|
||||||
|
);
|
||||||
|
setData(PreferencesTableCompanion(connectPort: Value(port)));
|
||||||
|
}
|
||||||
|
|
||||||
void setCacheMusic(bool cache) {
|
void setCacheMusic(bool cache) {
|
||||||
setData(PreferencesTableCompanion(cacheMusic: Value(cache)));
|
setData(PreferencesTableCompanion(cacheMusic: Value(cache)));
|
||||||
}
|
}
|
||||||
|
@ -434,4 +434,37 @@ abstract class ServiceUtils {
|
|||||||
return "Mozilla/5.0 (Linux; Android ${randomNumber(8, 13)}) AppleWebKit/${randomNumber(530, 537)}.${randomNumber(30, 36)} (KHTML, like Gecko) Chrome/${randomNumber(101, 116)}.0.${randomNumber(3000, 6000)}.${randomNumber(60, 125)} Mobile Safari/${randomNumber(530, 537)}.${randomNumber(30, 36)}";
|
return "Mozilla/5.0 (Linux; Android ${randomNumber(8, 13)}) AppleWebKit/${randomNumber(530, 537)}.${randomNumber(30, 36)} (KHTML, like Gecko) Chrome/${randomNumber(101, 116)}.0.${randomNumber(3000, 6000)}.${randomNumber(60, 125)} Mobile Safari/${randomNumber(530, 537)}.${randomNumber(30, 36)}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String sanitizeFilename(String input, {String replacement = ''}) {
|
||||||
|
final result = input
|
||||||
|
// illegalRe
|
||||||
|
.replaceAll(
|
||||||
|
RegExp(r'[\/\?<>\\:\*\|"]'),
|
||||||
|
replacement,
|
||||||
|
)
|
||||||
|
// controlRe
|
||||||
|
.replaceAll(
|
||||||
|
RegExp(
|
||||||
|
r'[\x00-\x1f\x80-\x9f]',
|
||||||
|
),
|
||||||
|
replacement,
|
||||||
|
)
|
||||||
|
// reservedRe
|
||||||
|
.replaceFirst(
|
||||||
|
RegExp(r'^\.+$'),
|
||||||
|
replacement,
|
||||||
|
)
|
||||||
|
// windowsReservedRe
|
||||||
|
.replaceFirst(
|
||||||
|
RegExp(
|
||||||
|
r'^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$',
|
||||||
|
caseSensitive: false,
|
||||||
|
),
|
||||||
|
replacement,
|
||||||
|
)
|
||||||
|
// windowsTrailingRe
|
||||||
|
.replaceFirst(RegExp(r'[\. ]+$'), replacement);
|
||||||
|
|
||||||
|
return result.length > 255 ? result.substring(0, 255) : result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import 'package:drift/drift.dart';
|
|||||||
import 'package:drift/internal/migrations.dart';
|
import 'package:drift/internal/migrations.dart';
|
||||||
import 'schema_v3.dart' as v3;
|
import 'schema_v3.dart' as v3;
|
||||||
import 'schema_v5.dart' as v5;
|
import 'schema_v5.dart' as v5;
|
||||||
|
import 'schema_v6.dart' as v6;
|
||||||
import 'schema_v1.dart' as v1;
|
import 'schema_v1.dart' as v1;
|
||||||
import 'schema_v2.dart' as v2;
|
import 'schema_v2.dart' as v2;
|
||||||
import 'schema_v4.dart' as v4;
|
import 'schema_v4.dart' as v4;
|
||||||
@ -17,6 +18,8 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
|||||||
return v3.DatabaseAtV3(db);
|
return v3.DatabaseAtV3(db);
|
||||||
case 5:
|
case 5:
|
||||||
return v5.DatabaseAtV5(db);
|
return v5.DatabaseAtV5(db);
|
||||||
|
case 6:
|
||||||
|
return v6.DatabaseAtV6(db);
|
||||||
case 1:
|
case 1:
|
||||||
return v1.DatabaseAtV1(db);
|
return v1.DatabaseAtV1(db);
|
||||||
case 2:
|
case 2:
|
||||||
@ -28,5 +31,5 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const versions = const [1, 2, 3, 4, 5];
|
static const versions = const [1, 2, 3, 4, 5, 6];
|
||||||
}
|
}
|
||||||
|
3465
test/drift/app_db/generated/schema_v6.dart
Normal file
3465
test/drift/app_db/generated/schema_v6.dart
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1,141 @@
|
|||||||
{}
|
{
|
||||||
|
"ar": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"bn": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ca": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"cs": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"de": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"es": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"eu": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"fa": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"fi": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"fr": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"hi": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"id": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"it": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ja": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ka": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ko": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ne": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"nl": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"pl": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"pt": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ru": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ta": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"th": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"tl": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"tr": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"uk": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"vi": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
],
|
||||||
|
|
||||||
|
"zh": [
|
||||||
|
"edit_port",
|
||||||
|
"port_helper_msg"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user