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_service/audio_service.dart';
|
||||||
import 'package:audio_session/audio_session.dart';
|
import 'package:audio_session/audio_session.dart';
|
||||||
import 'package:audioplayers/audioplayers.dart';
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import 'ListenHandler.dart';
|
import 'ListenHandler.dart';
|
||||||
|
|
||||||
late final ListenHandler _listenHandler;
|
late final ListenHandler _listenHandler;
|
||||||
late final AudioSession _session;
|
late final AudioSession _session;
|
||||||
|
|
||||||
const String _fallback =
|
final _fallbackSource =
|
||||||
"https://generic.ything.app/music/separation-185196.mp3";
|
Uri.parse("https://generic.ything.app/music/fallback.url");
|
||||||
final _urlSource = Uri.parse("https://generic.ything.app/music/player.url");
|
final _urlSource = Uri.parse("https://generic.ything.app/music/player.url");
|
||||||
late final String _radioUrl;
|
|
||||||
|
|
||||||
Future<void> loadCurrentUrl() async {
|
Future<String?> loadStringFromUrl(Uri remote) async {
|
||||||
final resp = await http.get(_urlSource);
|
try {
|
||||||
|
final resp = await http.get(remote);
|
||||||
if (resp.statusCode == 200) {
|
if (resp.statusCode == 200) {
|
||||||
_radioUrl = resp.body.trim();
|
var ret = resp.body.trim();
|
||||||
print('Loaded remote url');
|
print('Loaded remote url: $remote - $ret');
|
||||||
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
_radioUrl = _fallback;
|
print(
|
||||||
print('Request for current streaming url failed, using fallback url');
|
'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 =
|
final _urlAboutIOS =
|
||||||
Uri.parse("https://generic.ything.app/ything_radio/about_ios.txt");
|
Uri.parse("https://generic.ything.app/ything_radio/about_ios.txt");
|
||||||
|
|
||||||
late final String _remoteAbout;
|
late final String _displayAbout;
|
||||||
|
|
||||||
Future<void> loadAboutUrl() async {
|
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) {
|
var about = await loadStringFromUrl(reqUrl);
|
||||||
_remoteAbout = resp.body;
|
|
||||||
print('Loaded remote about');
|
if (about != null) {
|
||||||
|
_displayAbout = about;
|
||||||
} else {
|
} else {
|
||||||
_remoteAbout = _fallbackAbout;
|
_displayAbout = _fallbackAbout;
|
||||||
print('Request for remote about failed, using fallback about');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getAboutText() => _remoteAbout;
|
String getAboutText() => _displayAbout;
|
||||||
|
|
||||||
Future<void> setupListenHandler() async {
|
Future<void> setupListenHandler() async {
|
||||||
_listenHandler = await AudioService.init(
|
_listenHandler = await AudioService.init(
|
||||||
@@ -96,9 +102,19 @@ Future<void> setupListenHandler() async {
|
|||||||
|
|
||||||
ListenHandler getListenHandlder() => _listenHandler;
|
ListenHandler getListenHandlder() => _listenHandler;
|
||||||
|
|
||||||
UrlSource getUrlSource() {
|
Future<Source> getSource({bool fallback = false}) async {
|
||||||
return UrlSource(_radioUrl, mimeType: "audio/mpeg");
|
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 {
|
Future<bool> startAudioSession() async {
|
||||||
return await _session.setActive(true);
|
return await _session.setActive(true);
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import 'package:ything_radio/Globals.dart';
|
|||||||
class ListenHandler extends BaseAudioHandler {
|
class ListenHandler extends BaseAudioHandler {
|
||||||
final _player = AudioPlayer();
|
final _player = AudioPlayer();
|
||||||
|
|
||||||
final UrlSource _radioSource = getUrlSource();
|
|
||||||
|
|
||||||
setup_player() {
|
setup_player() {
|
||||||
_player.setReleaseMode(ReleaseMode.release);
|
_player.setReleaseMode(ReleaseMode.release);
|
||||||
_player.onPlayerStateChanged.listen((event) {
|
_player.onPlayerStateChanged.listen((event) {
|
||||||
@@ -64,10 +62,22 @@ class ListenHandler extends BaseAudioHandler {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> play() async {
|
Future<void> play() async {
|
||||||
|
print('Starting playback');
|
||||||
if (await startAudioSession()) {
|
if (await startAudioSession()) {
|
||||||
|
try {
|
||||||
//setSource followed by resume does not work on Android or web
|
//setSource followed by resume does not work on Android or web
|
||||||
//play works everywhere though
|
//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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'Globals.dart';
|
import 'Globals.dart';
|
||||||
import 'YthingRadio.dart';
|
import 'YthingRadio.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
await loadCurrentUrl();
|
AudioLogger.logLevel = AudioLogLevel.info;
|
||||||
await loadAboutUrl();
|
await loadAboutUrl();
|
||||||
await setupListenHandler();
|
await setupListenHandler();
|
||||||
runApp(const YthingRadio());
|
runApp(const YthingRadio());
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ flutter:
|
|||||||
- assets/images/app-background.jpg
|
- assets/images/app-background.jpg
|
||||||
- assets/images/app-background2.jpg
|
- assets/images/app-background2.jpg
|
||||||
- assets/images/app-background3.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
|
# An image asset can refer to one or more resolution-specific "variants", see
|
||||||
# https://flutter.dev/to/resolution-aware-images
|
# https://flutter.dev/to/resolution-aware-images
|
||||||
|
|||||||
Reference in New Issue
Block a user