Skip to content

Commit

Permalink
feat: use catcher to handle exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
KRTirtho committed Feb 1, 2023
1 parent 013aac4 commit 84d94b0
Show file tree
Hide file tree
Showing 23 changed files with 524 additions and 515 deletions.
43 changes: 19 additions & 24 deletions lib/collections/intents.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,33 +20,28 @@ class PlayPauseAction extends Action<PlayPauseIntent> {

@override
invoke(intent) async {
try {
if (PlayerControls.focusNode.canRequestFocus) {
PlayerControls.focusNode.requestFocus();
}
final playback = intent.ref.read(playbackProvider);
if (playback.track == null) {
return null;
} else if (playback.track != null &&
playback.currentDuration == Duration.zero &&
await playback.player.getCurrentPosition() == Duration.zero) {
if (playback.track!.ytUri.startsWith("http")) {
final track = Track.fromJson(playback.track!.toJson());
playback.track = null;
await playback.play(track);
} else {
final track = playback.track;
playback.track = null;
await playback.play(track!);
}
if (PlayerControls.focusNode.canRequestFocus) {
PlayerControls.focusNode.requestFocus();
}
final playback = intent.ref.read(playbackProvider);
if (playback.track == null) {
return null;
} else if (playback.track != null &&
playback.currentDuration == Duration.zero &&
await playback.player.getCurrentPosition() == Duration.zero) {
if (playback.track!.ytUri.startsWith("http")) {
final track = Track.fromJson(playback.track!.toJson());
playback.track = null;
await playback.play(track);
} else {
await playback.togglePlayPause();
final track = playback.track;
playback.track = null;
await playback.play(track!);
}
return null;
} catch (e, stack) {
logger.e("useTogglePlayPause", e, stack);
return null;
} else {
await playback.togglePlayPause();
}
return null;
}
}

Expand Down
3 changes: 2 additions & 1 deletion lib/collections/routes.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:catcher/catcher.dart';
import 'package:flutter/widgets.dart';
import 'package:go_router/go_router.dart';
import 'package:spotify/spotify.dart' hide Search;
Expand All @@ -19,7 +20,7 @@ import 'package:spotube/pages/search/search.dart';
import 'package:spotube/pages/settings/settings.dart';
import 'package:spotube/pages/mobile_login/mobile_login.dart';

final rootNavigatorKey = GlobalKey<NavigatorState>();
final rootNavigatorKey = Catcher.navigatorKey;
final shellRouteNavigatorKey = GlobalKey<NavigatorState>();
final router = GoRouter(
navigatorKey: rootNavigatorKey,
Expand Down
2 changes: 1 addition & 1 deletion lib/collections/spotube_icons.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,5 @@ abstract class SpotubeIcons {
static const info = FeatherIcons.info;
static const userRemove = FeatherIcons.userX;
static const close = FeatherIcons.x;
static const minimize = FeatherIcons.minimize2;
static const minimize = FeatherIcons.chevronDown;
}
10 changes: 5 additions & 5 deletions lib/components/library/user_local_tracks.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:io';

import 'package:catcher/catcher.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
Expand Down Expand Up @@ -98,12 +99,11 @@ final localTracksProvider = FutureProvider<List<Track>>((ref) async {
} on FfiException catch (e) {
if (e.message == "NoTag: reader does not contain an id3 tag") {
getLogger(FutureProvider<List<Track>>)
.w("[Fetching metadata]", e.message);
.v("[Fetching metadata]", e.message);
}
return {};
} on Exception catch (e, stack) {
getLogger(FutureProvider<List<Track>>)
.e("[Fetching metadata]", e, stack);
} catch (e, stack) {
Catcher.reportCheckedError(e, stack);
return {};
}
},
Expand All @@ -124,7 +124,7 @@ final localTracksProvider = FutureProvider<List<Track>>((ref) async {

return tracks;
} catch (e, stack) {
getLogger(FutureProvider).e("[LocalTracksProvider]", e, stack);
Catcher.reportCheckedError(e, stack);
return [];
}
});
Expand Down
10 changes: 1 addition & 9 deletions lib/components/player/player_controls.dart
Original file line number Diff line number Diff line change
Expand Up @@ -199,15 +199,7 @@ class PlayerControls extends HookConsumerWidget {
SpotubeIcons.stop,
color: iconColor,
),
onPressed: playback.track != null
? () async {
try {
await playback.stop();
} catch (e, stack) {
logger.e("onStop", e, stack);
}
}
: null,
onPressed: playback.track != null ? playback.stop : null,
),
PlatformIconButton(
tooltip:
Expand Down
12 changes: 4 additions & 8 deletions lib/components/root/bottom_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,10 @@ class BottomPlayer extends HookConsumerWidget {
volume.value = v;
},
onChangeEnd: (value) async {
try {
// You don't really need to know why but this
// way it works only
await playback.setVolume(value);
await playback.setVolume(value);
} catch (e, stack) {
logger.e("onChange", e, stack);
}
// You don't really need to know why but this
// way it works only
await playback.setVolume(value);
await playback.setVolume(value);
},
),
);
Expand Down
2 changes: 0 additions & 2 deletions lib/generated_plugin_registrant.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'package:audio_service_web/audio_service_web.dart';
import 'package:audio_session/audio_session_web.dart';
import 'package:audioplayers_web/audioplayers_web.dart';
import 'package:file_picker/_internal/file_picker_web.dart';
import 'package:package_info_plus_web/package_info_plus_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:url_launcher_web/url_launcher_web.dart';

Expand All @@ -22,7 +21,6 @@ void registerPlugins(Registrar registrar) {
AudioSessionWeb.registerWith(registrar);
AudioplayersPlugin.registerWith(registrar);
FilePickerWeb.registerWith(registrar);
PackageInfoPlugin.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar);
UrlLauncherPlugin.registerWith(registrar);
registrar.registerMessageHandler();
Expand Down
27 changes: 8 additions & 19 deletions lib/hooks/playback_hooks.dart
Original file line number Diff line number Diff line change
@@ -1,31 +1,20 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotube/models/logger.dart';
import 'package:spotube/provider/playback_provider.dart';

final logger = getLogger("PlaybackHook");

Future<void> Function() useNextTrack(WidgetRef ref) {
return () async {
try {
final playback = ref.read(playbackProvider);
await playback.player.pause();
await playback.player.seek(Duration.zero);
playback.seekForward();
} catch (e, stack) {
logger.e("useNextTrack", e, stack);
}
final playback = ref.read(playbackProvider);
await playback.player.pause();
await playback.player.seek(Duration.zero);
playback.seekForward();
};
}

Future<void> Function() usePreviousTrack(WidgetRef ref) {
return () async {
try {
final playback = ref.read(playbackProvider);
await playback.player.pause();
await playback.player.seek(Duration.zero);
playback.seekBackward();
} catch (e, stack) {
logger.e("onPrevious", e, stack);
}
final playback = ref.read(playbackProvider);
await playback.player.pause();
await playback.player.seek(Duration.zero);
playback.seekBackward();
};
}
157 changes: 87 additions & 70 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:convert';

import 'package:audio_service/audio_service.dart';
import 'package:catcher/catcher.dart';
import 'package:fl_query/fl_query.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -61,82 +62,98 @@ void main() async {
});
}
MobileAudioService? audioServiceHandler;
runApp(
Builder(
builder: (context) {
return ProviderScope(
overrides: [
playbackProvider.overrideWith(
(ref) {
final youtube = ref.watch(youtubeProvider);
final player = ref.watch(audioPlayerProvider);

final playback = Playback(
player: player,
youtube: youtube,
ref: ref,
);
Catcher(
debugConfig: CatcherOptions(
SilentReportMode(),
[
ConsoleHandler(
enableDeviceParameters: false,
enableApplicationParameters: false,
),
FileHandler(await getLogsPath(), printLogs: false),
SnackbarHandler(const Duration(seconds: 5)),
],
),
releaseConfig: CatcherOptions(SilentReportMode(), [
FileHandler(await getLogsPath(), printLogs: false),
]),
runAppFunction: () {
runApp(
Builder(
builder: (context) {
return ProviderScope(
overrides: [
playbackProvider.overrideWith(
(ref) {
final youtube = ref.watch(youtubeProvider);
final player = ref.watch(audioPlayerProvider);

if (audioServiceHandler == null) {
AudioService.init(
builder: () => MobileAudioService(playback),
config: const AudioServiceConfig(
androidNotificationChannelId: 'com.krtirtho.Spotube',
androidNotificationChannelName: 'Spotube',
androidNotificationOngoing: true,
),
).then(
(value) {
playback.mobileAudioService = value;
audioServiceHandler = value;
},
);
}
final playback = Playback(
player: player,
youtube: youtube,
ref: ref,
);

return playback;
},
),
downloaderProvider.overrideWith(
(ref) {
return Downloader(
ref,
queueInstance,
yt: ref.watch(youtubeProvider),
downloadPath: ref.watch(
userPreferencesProvider.select(
(s) => s.downloadLocation,
),
),
onFileExists: (track) {
final logger = getLogger(Downloader);
try {
logger.v(
"[onFileExists] download confirmation for ${track.name}",
);
return showPlatformAlertDialog<bool>(
context,
builder: (_) => ReplaceDownloadedDialog(track: track),
).then((s) => s ?? false);
} catch (e, stack) {
logger.e(
"onFileExists",
e,
stack,
if (audioServiceHandler == null) {
AudioService.init(
builder: () => MobileAudioService(playback),
config: const AudioServiceConfig(
androidNotificationChannelId: 'com.krtirtho.Spotube',
androidNotificationChannelName: 'Spotube',
androidNotificationOngoing: true,
),
).then(
(value) {
playback.mobileAudioService = value;
audioServiceHandler = value;
},
);
return false;
}

return playback;
},
);
},
)
],
child: QueryBowlScope(
bowl: bowl,
child: const Spotube(),
),
);
},
),
),
downloaderProvider.overrideWith(
(ref) {
return Downloader(
ref,
queueInstance,
yt: ref.watch(youtubeProvider),
downloadPath: ref.watch(
userPreferencesProvider.select(
(s) => s.downloadLocation,
),
),
onFileExists: (track) {
final logger = getLogger(Downloader);
try {
logger.v(
"[onFileExists] download confirmation for ${track.name}",
);
return showPlatformAlertDialog<bool>(
context,
builder: (_) =>
ReplaceDownloadedDialog(track: track),
).then((s) => s ?? false);
} catch (e, stack) {
Catcher.reportCheckedError(e, stack);
return false;
}
},
);
},
)
],
child: QueryBowlScope(
bowl: bowl,
child: const Spotube(),
),
);
},
),
);
},
);
}

Expand Down
16 changes: 16 additions & 0 deletions lib/models/logger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ SpotubeLogger getLogger<T>(T owner) {
return _loggerFactory;
}

Future<File> getLogsPath() async {
String dir = (await getApplicationDocumentsDirectory()).path;
if (kIsAndroid) {
dir = (await getExternalStorageDirectory())?.path ?? "";
}

if (kIsMacOS) {
dir = path.join((await getLibraryDirectory()).path, "Logs");
}
final file = File(path.join(dir, ".spotube_logs"));
if (!await file.exists()) {
await file.create();
}
return file;
}

class SpotubeLogger extends Logger {
String? owner;
SpotubeLogger([this.owner]) : super(filter: _SpotubeLogFilter());
Expand Down
Loading

0 comments on commit 84d94b0

Please sign in to comment.