improved error handling
This commit is contained in:
BIN
assets/audio/internet_error.mp3
Normal file
BIN
assets/audio/internet_error.mp3
Normal file
Binary file not shown.
@@ -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);
|
||||
if (resp.statusCode == 200) {
|
||||
_radioUrl = resp.body.trim();
|
||||
print('Loaded remote url');
|
||||
} else {
|
||||
_radioUrl = _fallback;
|
||||
print('Request for current streaming url failed, using fallback url');
|
||||
Future<String?> loadStringFromUrl(Uri remote) async {
|
||||
try {
|
||||
final resp = await http.get(remote);
|
||||
if (resp.statusCode == 200) {
|
||||
var ret = resp.body.trim();
|
||||
print('Loaded remote url: $remote - $ret');
|
||||
return ret;
|
||||
} else {
|
||||
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,10 +102,20 @@ 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);
|
||||
}
|
||||
|
||||
@@ -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()) {
|
||||
//setSource followed by resume does not work on Android or web
|
||||
//play works everywhere though
|
||||
_player.play(_radioSource, mode: PlayerMode.mediaPlayer);
|
||||
try {
|
||||
//setSource followed by resume does not work on Android or web
|
||||
//play works everywhere though
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user