diff --git a/just_audio/lib/just_audio.dart b/just_audio/lib/just_audio.dart index 591fcf781..a8b27b243 100644 --- a/just_audio/lib/just_audio.dart +++ b/just_audio/lib/just_audio.dart @@ -872,6 +872,16 @@ class AudioPlayer { return duration; } on PlatformException catch (e) { try { + // cant connect to servers + if (e.code == "-1004" && source is LockCachingAudioSource) { + // proxy is offline + try { + await _proxy._server.close(force: true); + } catch (_) { + // ignore err + } + await _proxy.start(); + } throw PlayerException(int.parse(e.code), e.message, (e.details as Map?)?.cast()); } on FormatException catch (_) { @@ -2120,18 +2130,28 @@ class _ProxyHttpServer { /// Starts the server. Future start() async { _running = true; - _server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); - _server.listen((request) async { - if (request.method == 'GET') { - final uriPath = _requestKey(request.uri); - final handler = _handlerMap[uriPath]!; - handler(this, request); - } - }, onDone: () { - _running = false; - }, onError: (Object e, StackTrace st) { + try { + _server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); + _server.listen((request) async { + if (request.method == 'GET') { + final uriPath = _requestKey(request.uri); + final handler = _handlerMap[uriPath]!; + handler(this, request); + } + }, onDone: () { + _running = false; + }, onError: (Object e, StackTrace st) async { + _running = false; + try { + await _server.close(force: true); + } catch (_) { + // ignore + } + }, cancelOnError: true); + } catch (_) { + // ignore _running = false; - }); + } } /// Stops the server @@ -3009,7 +3029,6 @@ class LockCachingAudioSource extends StreamAudioSource { _downloadProgressSubject.add(percentProgress / 100); } } - _progress = 0; subscription = response.listen((data) async { _progress += data.length;