mirror of
https://github.com/austinried/subtracks.git
synced 2025-12-29 17:39:27 +01:00
Compare commits
No commits in common. "1c76293559e2c0c0b97001cfdc3a1ca76dda98e4" and "1ae29c5adeca3f603104f15f3cf93cf5b026e157" have entirely different histories.
1c76293559
...
1ae29c5ade
@ -22,8 +22,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -55,8 +53,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -66,12 +62,32 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"cs": [
|
"cs": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"settingsAboutShareLogs",
|
"resourcesSongListDeleteAllContent",
|
||||||
"settingsAboutChooseLog",
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsLicenses",
|
||||||
|
"settingsAboutActionsProjectHomepage",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutName",
|
||||||
|
"settingsAboutVersion",
|
||||||
"settingsMusicName",
|
"settingsMusicName",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn",
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
@ -80,7 +96,12 @@
|
|||||||
"settingsNetworkOptionsMinBufferTitle",
|
"settingsNetworkOptionsMinBufferTitle",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn"
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsResetActionsClearImageCache",
|
||||||
|
"settingsResetName",
|
||||||
|
"settingsServersFieldsName"
|
||||||
],
|
],
|
||||||
|
|
||||||
"da": [
|
"da": [
|
||||||
@ -112,8 +133,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
@ -144,8 +163,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -170,8 +187,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -203,8 +218,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -213,11 +226,6 @@
|
|||||||
"settingsServersFieldsName"
|
"settingsServersFieldsName"
|
||||||
],
|
],
|
||||||
|
|
||||||
"gl": [
|
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog"
|
|
||||||
],
|
|
||||||
|
|
||||||
"it": [
|
"it": [
|
||||||
"actionsCancel",
|
"actionsCancel",
|
||||||
"actionsDelete",
|
"actionsDelete",
|
||||||
@ -241,8 +249,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -294,8 +300,6 @@
|
|||||||
"settingsAboutActionsLicenses",
|
"settingsAboutActionsLicenses",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutName",
|
"settingsAboutName",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsAboutVersion",
|
"settingsAboutVersion",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOff",
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
"settingsMusicOptionsScrobbleDescriptionOn",
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
@ -352,8 +356,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -385,8 +387,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -418,8 +418,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -429,17 +427,32 @@
|
|||||||
],
|
],
|
||||||
|
|
||||||
"pt": [
|
"pt": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
"resourcesAlbumCount",
|
"resourcesAlbumCount",
|
||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
"resourcesFilterOwner",
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"resourcesSongListDeleteAllContent",
|
"resourcesSongListDeleteAllContent",
|
||||||
"resourcesSongListDeleteAllTitle",
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
"resourcesSortByAlbumCount",
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutShareLogs",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutChooseLog",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
"settingsNetworkOptionsStreamFormatServerDefault",
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
"settingsServersFieldsName"
|
"settingsServersFieldsName"
|
||||||
],
|
],
|
||||||
@ -467,8 +480,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -500,8 +511,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -533,8 +542,6 @@
|
|||||||
"resourcesSortByTitle",
|
"resourcesSortByTitle",
|
||||||
"resourcesSortByUpdated",
|
"resourcesSortByUpdated",
|
||||||
"settingsAboutActionsSupport",
|
"settingsAboutActionsSupport",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
@ -549,8 +556,6 @@
|
|||||||
"resourcesArtistCount",
|
"resourcesArtistCount",
|
||||||
"resourcesPlaylistCount",
|
"resourcesPlaylistCount",
|
||||||
"resourcesSongCount",
|
"resourcesSongCount",
|
||||||
"settingsAboutShareLogs",
|
|
||||||
"settingsAboutChooseLog",
|
|
||||||
"settingsNetworkOptionsOfflineMode",
|
"settingsNetworkOptionsOfflineMode",
|
||||||
"settingsNetworkOptionsOfflineModeOff",
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
"settingsNetworkOptionsOfflineModeOn",
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
|||||||
@ -1,16 +1,11 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:path/path.dart' as p;
|
|
||||||
import 'package:share_plus/share_plus.dart';
|
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
import '../../log.dart';
|
|
||||||
import '../../models/support.dart';
|
import '../../models/support.dart';
|
||||||
import '../../services/settings_service.dart';
|
import '../../services/settings_service.dart';
|
||||||
import '../../state/init.dart';
|
import '../../state/init.dart';
|
||||||
@ -167,54 +162,6 @@ class _About extends HookConsumerWidget {
|
|||||||
mode: LaunchMode.externalApplication,
|
mode: LaunchMode.externalApplication,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
|
||||||
const _ShareLogsButton(),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ShareLogsButton extends StatelessWidget {
|
|
||||||
const _ShareLogsButton();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final l = AppLocalizations.of(context);
|
|
||||||
|
|
||||||
return Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
OutlinedButton.icon(
|
|
||||||
icon: const Icon(Icons.share),
|
|
||||||
label: Text(l.settingsAboutShareLogs),
|
|
||||||
onPressed: () async {
|
|
||||||
final files = await logFiles();
|
|
||||||
if (files.isEmpty) return;
|
|
||||||
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
final value = await showDialog<String>(
|
|
||||||
context: context,
|
|
||||||
builder: (context) => MultipleChoiceDialog<String>(
|
|
||||||
title: l.settingsAboutChooseLog,
|
|
||||||
current: files.first.path,
|
|
||||||
options: files
|
|
||||||
.map((e) => MultiChoiceOption.string(
|
|
||||||
title: p.basename(e.path),
|
|
||||||
option: e.path,
|
|
||||||
))
|
|
||||||
.toIList(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (value == null) return;
|
|
||||||
Share.shareXFiles(
|
|
||||||
[XFile(value, mimeType: 'text/plain')],
|
|
||||||
subject: 'Logs from subtracks: ${String.fromCharCodes(
|
|
||||||
List.generate(8, (_) => Random().nextInt(26) + 65),
|
|
||||||
)}',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
|
||||||
import '../../database/database.dart';
|
import '../../database/database.dart';
|
||||||
import '../../log.dart';
|
|
||||||
import '../../models/settings.dart';
|
import '../../models/settings.dart';
|
||||||
import '../../services/settings_service.dart';
|
import '../../services/settings_service.dart';
|
||||||
import '../items.dart';
|
import '../items.dart';
|
||||||
@ -65,7 +64,7 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
required: true,
|
required: true,
|
||||||
);
|
);
|
||||||
|
|
||||||
final forcePlaintextPassword = useState(!(source?.useTokenAuth ?? true));
|
final forcePlaintextPassword = useState(!(source?.useTokenAuth ?? false));
|
||||||
final forcePlaintextSwitch = SwitchListTile(
|
final forcePlaintextSwitch = SwitchListTile(
|
||||||
value: forcePlaintextPassword.value,
|
value: forcePlaintextPassword.value,
|
||||||
title: Text(l.settingsServersOptionsForcePlaintextPasswordTitle),
|
title: Text(l.settingsServersOptionsForcePlaintextPasswordTitle),
|
||||||
@ -162,9 +161,8 @@ class SourcePage extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (e, st) {
|
} catch (err) {
|
||||||
// TOOD: toast the error or whatever
|
// TOOD: toast the error or whatever
|
||||||
log.severe('Saving source', e, st);
|
|
||||||
error = true;
|
error = true;
|
||||||
} finally {
|
} finally {
|
||||||
isSaving.value = false;
|
isSaving.value = false;
|
||||||
|
|||||||
@ -9,13 +9,11 @@ import 'package:path/path.dart' as p;
|
|||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
import '../log.dart';
|
|
||||||
import '../models/music.dart';
|
import '../models/music.dart';
|
||||||
import '../models/query.dart';
|
import '../models/query.dart';
|
||||||
import '../models/settings.dart';
|
import '../models/settings.dart';
|
||||||
import '../models/support.dart';
|
import '../models/support.dart';
|
||||||
import 'converters.dart';
|
import 'converters.dart';
|
||||||
import 'error_logging_database.dart';
|
|
||||||
|
|
||||||
part 'database.g.dart';
|
part 'database.g.dart';
|
||||||
|
|
||||||
@ -437,11 +435,7 @@ LazyDatabase _openConnection() {
|
|||||||
final dbFolder = await getApplicationDocumentsDirectory();
|
final dbFolder = await getApplicationDocumentsDirectory();
|
||||||
final file = File(p.join(dbFolder.path, 'subtracks.sqlite'));
|
final file = File(p.join(dbFolder.path, 'subtracks.sqlite'));
|
||||||
// return NativeDatabase.createInBackground(file, logStatements: true);
|
// return NativeDatabase.createInBackground(file, logStatements: true);
|
||||||
|
return NativeDatabase.createInBackground(file);
|
||||||
return ErrorLoggingDatabase(
|
|
||||||
NativeDatabase.createInBackground(file),
|
|
||||||
(e, s) => log.severe('SQL error', e, s),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,94 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:drift/drift.dart';
|
|
||||||
import 'package:drift/isolate.dart';
|
|
||||||
|
|
||||||
/// https://github.com/simolus3/drift/issues/2326#issuecomment-1445138730
|
|
||||||
class ErrorLoggingDatabase implements QueryExecutor {
|
|
||||||
final QueryExecutor inner;
|
|
||||||
final void Function(Object, StackTrace) onError;
|
|
||||||
|
|
||||||
ErrorLoggingDatabase(this.inner, this.onError);
|
|
||||||
|
|
||||||
Future<T> _handleErrors<T>(Future<T> Function() body) {
|
|
||||||
return Future.sync(body)
|
|
||||||
.onError<DriftWrappedException>((error, stackTrace) {
|
|
||||||
onError(error, error.trace ?? stackTrace);
|
|
||||||
throw error;
|
|
||||||
}).onError<DriftRemoteException>((error, stackTrace) {
|
|
||||||
onError(error, error.remoteStackTrace ?? stackTrace);
|
|
||||||
throw error;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
TransactionExecutor beginTransaction() {
|
|
||||||
return _ErrorLoggingTransactionExecutor(inner.beginTransaction(), onError);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> close() {
|
|
||||||
return _handleErrors(inner.close);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
SqlDialect get dialect => inner.dialect;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> ensureOpen(QueryExecutorUser user) {
|
|
||||||
return _handleErrors(() => inner.ensureOpen(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> runBatched(BatchedStatements statements) {
|
|
||||||
return _handleErrors(() => inner.runBatched(statements));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> runCustom(String statement, [List<Object?>? args]) {
|
|
||||||
return _handleErrors(() => inner.runCustom(statement, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int> runDelete(String statement, List<Object?> args) {
|
|
||||||
return _handleErrors(() => inner.runDelete(statement, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int> runInsert(String statement, List<Object?> args) {
|
|
||||||
return _handleErrors(() => inner.runInsert(statement, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<List<Map<String, Object?>>> runSelect(
|
|
||||||
String statement, List<Object?> args) {
|
|
||||||
return _handleErrors(() => inner.runSelect(statement, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int> runUpdate(String statement, List<Object?> args) {
|
|
||||||
return _handleErrors(() => inner.runUpdate(statement, args));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ErrorLoggingTransactionExecutor extends ErrorLoggingDatabase
|
|
||||||
implements TransactionExecutor {
|
|
||||||
final TransactionExecutor transaction;
|
|
||||||
|
|
||||||
_ErrorLoggingTransactionExecutor(
|
|
||||||
this.transaction, void Function(Object, StackTrace) onError)
|
|
||||||
: super(transaction, onError);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> rollback() {
|
|
||||||
return _handleErrors(transaction.rollback);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> send() {
|
|
||||||
return _handleErrors(transaction.send);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get supportsNestedTransactions => transaction.supportsNestedTransactions;
|
|
||||||
}
|
|
||||||
@ -1,8 +1,7 @@
|
|||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
import '../log.dart';
|
|
||||||
|
|
||||||
part 'client.g.dart';
|
part 'client.g.dart';
|
||||||
|
|
||||||
const Map<String, String> subtracksHeaders = {
|
const Map<String, String> subtracksHeaders = {
|
||||||
@ -15,26 +14,11 @@ class SubtracksHttpClient extends BaseClient {
|
|||||||
@override
|
@override
|
||||||
Future<StreamedResponse> send(BaseRequest request) {
|
Future<StreamedResponse> send(BaseRequest request) {
|
||||||
request.headers.addAll(subtracksHeaders);
|
request.headers.addAll(subtracksHeaders);
|
||||||
log.info('${request.method} ${_redactUri(request.url)}');
|
if (kDebugMode) print('${request.method} ${request.url}');
|
||||||
return request.send();
|
return request.send();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String _redactUri(Uri uri) {
|
|
||||||
var redacted = uri.toString();
|
|
||||||
redacted = _redactParam(redacted, 'u');
|
|
||||||
redacted = _redactParam(redacted, 'p');
|
|
||||||
redacted = _redactParam(redacted, 's');
|
|
||||||
redacted = _redactParam(redacted, 't');
|
|
||||||
|
|
||||||
return redacted.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
RegExp _queryReplace(String key) => RegExp('$key=([^&|\\n|\\t\\s]+)');
|
|
||||||
|
|
||||||
String _redactParam(String url, String key) =>
|
|
||||||
url.replaceFirst(_queryReplace(key), '$key=REDACTED');
|
|
||||||
|
|
||||||
@Riverpod(keepAlive: true)
|
@Riverpod(keepAlive: true)
|
||||||
BaseClient httpClient(HttpClientRef ref) {
|
BaseClient httpClient(HttpClientRef ref) {
|
||||||
return SubtracksHttpClient();
|
return SubtracksHttpClient();
|
||||||
|
|||||||
@ -173,10 +173,6 @@
|
|||||||
"@settingsAboutActionsSupport": {},
|
"@settingsAboutActionsSupport": {},
|
||||||
"settingsAboutName": "About",
|
"settingsAboutName": "About",
|
||||||
"@settingsAboutName": {},
|
"@settingsAboutName": {},
|
||||||
"settingsAboutShareLogs": "Share logs",
|
|
||||||
"@settingsAboutShareLogs": {},
|
|
||||||
"settingsAboutChooseLog": "Choose a log file",
|
|
||||||
"@settingsAboutChooseLog": {},
|
|
||||||
"settingsAboutVersion": "version {version}",
|
"settingsAboutVersion": "version {version}",
|
||||||
"@settingsAboutVersion": {
|
"@settingsAboutVersion": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|||||||
169
lib/log.dart
169
lib/log.dart
@ -1,169 +0,0 @@
|
|||||||
// import 'dart:convert';
|
|
||||||
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:logging/logging.dart';
|
|
||||||
import 'package:path/path.dart' as p;
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
|
|
||||||
class AnsiColor {
|
|
||||||
/// ANSI Control Sequence Introducer, signals the terminal for new settings.
|
|
||||||
static const ansiEsc = '\x1B[';
|
|
||||||
|
|
||||||
/// Reset all colors and options for current SGRs to terminal defaults.
|
|
||||||
static const ansiDefault = '${ansiEsc}0m';
|
|
||||||
|
|
||||||
final int? fg;
|
|
||||||
final int? bg;
|
|
||||||
final bool color;
|
|
||||||
|
|
||||||
AnsiColor.none()
|
|
||||||
: fg = null,
|
|
||||||
bg = null,
|
|
||||||
color = false;
|
|
||||||
|
|
||||||
AnsiColor.fg(this.fg)
|
|
||||||
: bg = null,
|
|
||||||
color = true;
|
|
||||||
|
|
||||||
AnsiColor.bg(this.bg)
|
|
||||||
: fg = null,
|
|
||||||
color = true;
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
if (fg != null) {
|
|
||||||
return '${ansiEsc}38;5;${fg}m';
|
|
||||||
} else if (bg != null) {
|
|
||||||
return '${ansiEsc}48;5;${bg}m';
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String call(String msg) {
|
|
||||||
if (color) {
|
|
||||||
// ignore: unnecessary_brace_in_string_interps
|
|
||||||
return '${this}$msg$ansiDefault';
|
|
||||||
} else {
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AnsiColor toFg() => AnsiColor.fg(bg);
|
|
||||||
|
|
||||||
AnsiColor toBg() => AnsiColor.bg(fg);
|
|
||||||
|
|
||||||
/// Defaults the terminal's foreground color without altering the background.
|
|
||||||
String get resetForeground => color ? '${ansiEsc}39m' : '';
|
|
||||||
|
|
||||||
/// Defaults the terminal's background color without altering the foreground.
|
|
||||||
String get resetBackground => color ? '${ansiEsc}49m' : '';
|
|
||||||
|
|
||||||
static int grey(double level) => 232 + (level.clamp(0.0, 1.0) * 23).round();
|
|
||||||
}
|
|
||||||
|
|
||||||
final levelColors = {
|
|
||||||
Level.FINEST: AnsiColor.fg(AnsiColor.grey(0.5)),
|
|
||||||
Level.FINER: AnsiColor.fg(AnsiColor.grey(0.5)),
|
|
||||||
Level.FINE: AnsiColor.fg(AnsiColor.grey(0.5)),
|
|
||||||
Level.CONFIG: AnsiColor.fg(81),
|
|
||||||
Level.INFO: AnsiColor.fg(12),
|
|
||||||
Level.WARNING: AnsiColor.fg(208),
|
|
||||||
Level.SEVERE: AnsiColor.fg(196),
|
|
||||||
Level.SHOUT: AnsiColor.fg(199),
|
|
||||||
};
|
|
||||||
|
|
||||||
class LogData {
|
|
||||||
final String? message;
|
|
||||||
final Object? data;
|
|
||||||
|
|
||||||
const LogData(this.message, this.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
String _format(
|
|
||||||
LogRecord event, {
|
|
||||||
bool color = false,
|
|
||||||
bool time = true,
|
|
||||||
bool level = true,
|
|
||||||
}) {
|
|
||||||
var message = '';
|
|
||||||
if (time) message += '${event.time.toIso8601String()} ';
|
|
||||||
if (level) message += '${event.level.name} ';
|
|
||||||
|
|
||||||
final object = event.object;
|
|
||||||
if (object is LogData) {
|
|
||||||
message += '${object.message}';
|
|
||||||
message += '\n${object.data}';
|
|
||||||
} else if (object != null) {
|
|
||||||
message += 'Object';
|
|
||||||
message += '\n$object';
|
|
||||||
} else {
|
|
||||||
message += event.message;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.error != null) {
|
|
||||||
message += '\n${event.error}';
|
|
||||||
}
|
|
||||||
if (event.stackTrace != null) {
|
|
||||||
message += '\n${event.stackTrace}';
|
|
||||||
}
|
|
||||||
|
|
||||||
return color
|
|
||||||
? message.split('\n').map((e) => levelColors[event.level]!(e)).join('\n')
|
|
||||||
: message;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _printFile(String event, String dir) async {
|
|
||||||
final now = DateTime.now();
|
|
||||||
final file = File(p.join(dir, '${now.year}-${now.month}-${now.day}.txt'));
|
|
||||||
|
|
||||||
if (!event.endsWith('\n')) {
|
|
||||||
event += '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
await file.writeAsString(event, mode: FileMode.writeOnlyAppend, flush: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Directory> logDirectory() async {
|
|
||||||
return Directory(
|
|
||||||
p.join((await getApplicationDocumentsDirectory()).path, 'logs'),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<List<File>> logFiles() async {
|
|
||||||
final dir = await logDirectory();
|
|
||||||
return dir.listSync().whereType<File>().toList()
|
|
||||||
..sort(
|
|
||||||
(a, b) => b.statSync().modified.compareTo(a.statSync().modified),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final log = Logger('default');
|
|
||||||
|
|
||||||
Future<void> initLogging() async {
|
|
||||||
final dir = (await logDirectory())..create();
|
|
||||||
|
|
||||||
final files = await logFiles();
|
|
||||||
if (files.length > 7) {
|
|
||||||
for (var file in files.slice(7)) {
|
|
||||||
await file.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.root.level = kDebugMode ? Level.ALL : Level.INFO;
|
|
||||||
Logger.root.onRecord.asyncMap((event) async {
|
|
||||||
if (kDebugMode) {
|
|
||||||
print(_format(event, color: true, time: false, level: false));
|
|
||||||
} else {
|
|
||||||
await _printFile(
|
|
||||||
_format(event, color: false, time: true, level: true),
|
|
||||||
dir.path,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}).listen((_) {}, cancelOnError: false);
|
|
||||||
|
|
||||||
log.info('start');
|
|
||||||
}
|
|
||||||
@ -4,7 +4,6 @@ import 'package:stack_trace/stack_trace.dart' as stack_trace;
|
|||||||
import 'package:worker_manager/worker_manager.dart';
|
import 'package:worker_manager/worker_manager.dart';
|
||||||
|
|
||||||
import 'app/app.dart';
|
import 'app/app.dart';
|
||||||
import 'log.dart';
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
// TOOD: probably remove before live
|
// TOOD: probably remove before live
|
||||||
@ -19,8 +18,5 @@ void main() async {
|
|||||||
await Executor().warmUp();
|
await Executor().warmUp();
|
||||||
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
await initLogging();
|
|
||||||
|
|
||||||
runApp(const ProviderScope(child: MyApp()));
|
runApp(const ProviderScope(child: MyApp()));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import 'dart:math';
|
|||||||
import 'package:audio_service/audio_service.dart';
|
import 'package:audio_service/audio_service.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:drift/drift.dart' show Value;
|
import 'package:drift/drift.dart' show Value;
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:just_audio/just_audio.dart';
|
import 'package:just_audio/just_audio.dart';
|
||||||
import 'package:pool/pool.dart';
|
import 'package:pool/pool.dart';
|
||||||
@ -13,7 +14,6 @@ import 'package:synchronized/synchronized.dart';
|
|||||||
|
|
||||||
import '../cache/image_cache.dart';
|
import '../cache/image_cache.dart';
|
||||||
import '../database/database.dart';
|
import '../database/database.dart';
|
||||||
import '../log.dart';
|
|
||||||
import '../models/music.dart';
|
import '../models/music.dart';
|
||||||
import '../models/query.dart';
|
import '../models/query.dart';
|
||||||
import '../models/support.dart';
|
import '../models/support.dart';
|
||||||
@ -95,8 +95,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
int get _sourceId => _ref.read(sourceIdProvider);
|
int get _sourceId => _ref.read(sourceIdProvider);
|
||||||
|
|
||||||
AudioControl(this._player, this._ref) {
|
AudioControl(this._player, this._ref) {
|
||||||
_player.playbackEventStream.listen(
|
_player.playbackEventStream.listen((PlaybackEvent event) {
|
||||||
(PlaybackEvent event) {
|
|
||||||
final playing = _player.playing;
|
final playing = _player.playing;
|
||||||
playbackState.add(playbackState.value.copyWith(
|
playbackState.add(playbackState.value.copyWith(
|
||||||
controls: [
|
controls: [
|
||||||
@ -121,10 +120,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
bufferedPosition: _player.bufferedPosition,
|
bufferedPosition: _player.bufferedPosition,
|
||||||
queueIndex: event.currentIndex,
|
queueIndex: event.currentIndex,
|
||||||
));
|
));
|
||||||
},
|
});
|
||||||
onError: (e, st) => log.warning('Audio playback error', e, st),
|
|
||||||
cancelOnError: false,
|
|
||||||
);
|
|
||||||
|
|
||||||
shuffleIndicies.listen((value) {
|
shuffleIndicies.listen((value) {
|
||||||
playbackState.add(playbackState.value.copyWith(
|
playbackState.add(playbackState.value.copyWith(
|
||||||
@ -141,7 +137,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
_player.processingStateStream.listen((event) async {
|
_player.processingStateStream.listen((event) async {
|
||||||
if (event == ProcessingState.completed) {
|
if (event == ProcessingState.completed) {
|
||||||
if (_audioSource.length > 0) {
|
if (_audioSource.length > 0) {
|
||||||
log.fine('completed');
|
yell('completed');
|
||||||
await stop();
|
await stop();
|
||||||
await seek(Duration.zero);
|
await seek(Duration.zero);
|
||||||
}
|
}
|
||||||
@ -390,7 +386,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
mediaItem.add(slice.current!.mediaItem);
|
mediaItem.add(slice.current!.mediaItem);
|
||||||
queue.add(list.map((e) => e.mediaItem).toList());
|
queue.add(list.map((e) => e.mediaItem).toList());
|
||||||
|
|
||||||
log.fine('addAll');
|
yell('addAll');
|
||||||
await _audioSource.addAll(list.map((e) => e.audioSource).toList());
|
await _audioSource.addAll(list.map((e) => e.audioSource).toList());
|
||||||
await _player.seek(Duration.zero, index: list.indexOf(slice.current!));
|
await _player.seek(Duration.zero, index: list.indexOf(slice.current!));
|
||||||
}
|
}
|
||||||
@ -414,7 +410,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
final sourceNeedsPrev = sourceIndex == 0;
|
final sourceNeedsPrev = sourceIndex == 0;
|
||||||
|
|
||||||
if (sourceNeedsNext && slice.next != null) {
|
if (sourceNeedsNext && slice.next != null) {
|
||||||
log.fine('add');
|
yell('add');
|
||||||
await _audioSource.add(slice.next!.audioSource);
|
await _audioSource.add(slice.next!.audioSource);
|
||||||
}
|
}
|
||||||
if (sourceNeedsPrev && slice.prev != null) {
|
if (sourceNeedsPrev && slice.prev != null) {
|
||||||
@ -501,7 +497,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _insertFirstAudioSource(AudioSource source) {
|
Future<void> _insertFirstAudioSource(AudioSource source) {
|
||||||
log.fine('insert');
|
yell('insert');
|
||||||
final wait = _audioSource.insert(0, source);
|
final wait = _audioSource.insert(0, source);
|
||||||
_currentIndexIgnore.add(1);
|
_currentIndexIgnore.add(1);
|
||||||
return wait;
|
return wait;
|
||||||
@ -509,20 +505,20 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
|
|
||||||
Future<void> _pruneAudioSources(int keepIndex) async {
|
Future<void> _pruneAudioSources(int keepIndex) async {
|
||||||
if (keepIndex > 0) {
|
if (keepIndex > 0) {
|
||||||
log.fine('removeRange 0');
|
yell('removeRange 0');
|
||||||
final wait = _audioSource.removeRange(0, keepIndex);
|
final wait = _audioSource.removeRange(0, keepIndex);
|
||||||
_currentIndexIgnore.add(0);
|
_currentIndexIgnore.add(0);
|
||||||
await wait;
|
await wait;
|
||||||
}
|
}
|
||||||
if (_audioSource.length > 1) {
|
if (_audioSource.length > 1) {
|
||||||
log.fine('removeRange 1');
|
yell('removeRange 1');
|
||||||
await _audioSource.removeRange(1, _audioSource.length);
|
await _audioSource.removeRange(1, _audioSource.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _clearAudioSource([bool clearMetadata = false]) async {
|
Future<void> _clearAudioSource([bool clearMetadata = false]) async {
|
||||||
// await _player.stop();
|
// await _player.stop();
|
||||||
log.fine('_clearAudioSource');
|
yell('_clearAudioSource');
|
||||||
await _audioSource.clear();
|
await _audioSource.clear();
|
||||||
|
|
||||||
if (clearMetadata) {
|
if (clearMetadata) {
|
||||||
@ -701,3 +697,11 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void yell(String msg) {
|
||||||
|
if (kDebugMode) {
|
||||||
|
print('=================================================================<');
|
||||||
|
print(msg);
|
||||||
|
print('=================================================================>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import 'package:crypto/crypto.dart';
|
|||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:xml/xml.dart';
|
import 'package:xml/xml.dart';
|
||||||
|
|
||||||
import '../../log.dart';
|
|
||||||
import '../../models/settings.dart';
|
import '../../models/settings.dart';
|
||||||
import 'xml.dart';
|
import 'xml.dart';
|
||||||
|
|
||||||
@ -90,9 +89,7 @@ class SubsonicClient {
|
|||||||
final subsonicResponse =
|
final subsonicResponse =
|
||||||
SubsonicResponse(XmlDocument.parse(utf8.decode(res.bodyBytes)));
|
SubsonicResponse(XmlDocument.parse(utf8.decode(res.bodyBytes)));
|
||||||
if (subsonicResponse.status == Status.failed) {
|
if (subsonicResponse.status == Status.failed) {
|
||||||
final error = SubsonicException(subsonicResponse.xml);
|
throw SubsonicException(subsonicResponse.xml);
|
||||||
log.severe('Subsonic error', error);
|
|
||||||
throw error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return subsonicResponse;
|
return subsonicResponse;
|
||||||
|
|||||||
34
pubspec.lock
34
pubspec.lock
@ -290,14 +290,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.6.3"
|
version: "1.6.3"
|
||||||
cross_file:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: cross_file
|
|
||||||
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.3.3+4"
|
|
||||||
crypto:
|
crypto:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -687,7 +679,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "2.0.1"
|
||||||
logging:
|
logging:
|
||||||
dependency: "direct main"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: logging
|
name: logging
|
||||||
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
|
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
|
||||||
@ -842,10 +834,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_windows
|
name: path_provider_windows
|
||||||
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
|
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.6"
|
version: "2.1.5"
|
||||||
pedantic:
|
pedantic:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -958,22 +950,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.27.7"
|
version: "0.27.7"
|
||||||
share_plus:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: share_plus
|
|
||||||
sha256: "322a1ec9d9fe07e2e2252c098ce93d12dbd06133cc4c00ffe6a4ef505c295c17"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "7.0.0"
|
|
||||||
share_plus_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: share_plus_platform_interface
|
|
||||||
sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.2.1"
|
|
||||||
shelf:
|
shelf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1343,10 +1319,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
|
sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.4"
|
version: "3.1.4"
|
||||||
worker_manager:
|
worker_manager:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@ -57,8 +57,6 @@ dependencies:
|
|||||||
connectivity_plus: ^3.0.4
|
connectivity_plus: ^3.0.4
|
||||||
package_info_plus: ^3.1.1
|
package_info_plus: ^3.1.1
|
||||||
url_launcher: ^6.1.10
|
url_launcher: ^6.1.10
|
||||||
logging: ^1.1.1
|
|
||||||
share_plus: ^7.0.0
|
|
||||||
|
|
||||||
# https://github.com/dart-lang/intl/issues/522#issuecomment-1469961807
|
# https://github.com/dart-lang/intl/issues/522#issuecomment-1469961807
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user