improved error handling

This commit is contained in:
2024-10-08 14:59:05 -04:00
parent a41dec33d3
commit 93075b9d72
5 changed files with 57 additions and 28 deletions

Binary file not shown.

View File

@@ -3,27 +3,33 @@ import 'dart:io' show Platform;
import 'package:audio_service/audio_service.dart';
import 'package:audio_session/audio_session.dart';
import 'package:audioplayers/audioplayers.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:http/http.dart' as http;
import 'ListenHandler.dart';
late final ListenHandler _listenHandler;
late final AudioSession _session;
const String _fallback =
"https://generic.ything.app/music/separation-185196.mp3";
final _fallbackSource =
Uri.parse("https://generic.ything.app/music/fallback.url");
final _urlSource = Uri.parse("https://generic.ything.app/music/player.url");
late final String _radioUrl;
Future<void> loadCurrentUrl() async {
final resp = await http.get(_urlSource);
Future<String?> loadStringFromUrl(Uri remote) async {
try {
final resp = await http.get(remote);
if (resp.statusCode == 200) {
_radioUrl = resp.body.trim();
print('Loaded remote url');
var ret = resp.body.trim();
print('Loaded remote url: $remote - $ret');
return ret;
} else {
_radioUrl = _fallback;
print('Request for current streaming url failed, using fallback url');
print(
'Request to load remote url: $remote - failed - Status Code: ${resp.statusCode} - Body: ${resp.body}');
return null;
}
} catch (e) {
print("Exception - unable to load remote url: $remote - $e");
return null;
}
}
@@ -35,21 +41,21 @@ final _urlAbout =
final _urlAboutIOS =
Uri.parse("https://generic.ything.app/ything_radio/about_ios.txt");
late final String _remoteAbout;
late final String _displayAbout;
Future<void> loadAboutUrl() async {
final resp = await http.get(kIsWeb || !Platform.isIOS ? _urlAbout : _urlAboutIOS);
final reqUrl = kIsWeb || !Platform.isIOS ? _urlAbout : _urlAboutIOS;
if (resp.statusCode == 200) {
_remoteAbout = resp.body;
print('Loaded remote about');
var about = await loadStringFromUrl(reqUrl);
if (about != null) {
_displayAbout = about;
} else {
_remoteAbout = _fallbackAbout;
print('Request for remote about failed, using fallback about');
_displayAbout = _fallbackAbout;
}
}
String getAboutText() => _remoteAbout;
String getAboutText() => _displayAbout;
Future<void> setupListenHandler() async {
_listenHandler = await AudioService.init(
@@ -96,9 +102,19 @@ Future<void> setupListenHandler() async {
ListenHandler getListenHandlder() => _listenHandler;
UrlSource getUrlSource() {
return UrlSource(_radioUrl, mimeType: "audio/mpeg");
Future<Source> getSource({bool fallback = false}) async {
var radioUrl = fallback == false
? await loadStringFromUrl(_urlSource)
: await loadStringFromUrl(_fallbackSource);
if (radioUrl != null) {
return UrlSource(radioUrl, mimeType: "audio/mpeg");
} else {
return getInternetError();
}
}
Source getInternetError() =>
AssetSource("audio/internet_error.mp3", mimeType: "audio/mpeg");
Future<bool> startAudioSession() async {
return await _session.setActive(true);

View File

@@ -5,8 +5,6 @@ import 'package:ything_radio/Globals.dart';
class ListenHandler extends BaseAudioHandler {
final _player = AudioPlayer();
final UrlSource _radioSource = getUrlSource();
setup_player() {
_player.setReleaseMode(ReleaseMode.release);
_player.onPlayerStateChanged.listen((event) {
@@ -64,10 +62,22 @@ class ListenHandler extends BaseAudioHandler {
@override
Future<void> play() async {
print('Starting playback');
if (await startAudioSession()) {
try {
//setSource followed by resume does not work on Android or web
//play works everywhere though
_player.play(_radioSource, mode: PlayerMode.mediaPlayer);
await _player.play(await getSource(), mode: PlayerMode.mediaPlayer);
} catch (e) {
print("Exception $e - loading fallback");
try {
await _player.play(await getSource(fallback: true),
mode: PlayerMode.mediaPlayer);
} catch (e) {
print("Exception $e - playing internet connectivity problem");
await _player.play(getInternetError());
}
}
}
}

View File

@@ -1,10 +1,11 @@
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';
import 'Globals.dart';
import 'YthingRadio.dart';
Future<void> main() async {
await loadCurrentUrl();
AudioLogger.logLevel = AudioLogLevel.info;
await loadAboutUrl();
await setupListenHandler();
runApp(const YthingRadio());

View File

@@ -73,6 +73,8 @@ flutter:
- assets/images/app-background.jpg
- assets/images/app-background2.jpg
- assets/images/app-background3.jpg
- assets/images/app-background4.jpg
- assets/audio/internet_error.mp3
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/to/resolution-aware-images