Skip to content

Commit

Permalink
Try to fix async server issues 1
Browse files Browse the repository at this point in the history
  • Loading branch information
WindingMotor committed Sep 8, 2024
1 parent e0384be commit ef1148e
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 29 deletions.
34 changes: 29 additions & 5 deletions lib/audio/nplayer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:ui';
import 'package:audioplayers/audioplayers.dart';
import 'package:blossom/audio/audio_handler.dart';
import 'package:blossom/audio/nplaylist.dart';
import 'package:blossom/audio/nserver.dart';
import 'package:blossom/tools/settings.dart';
import 'package:flutter/foundation.dart';
import 'package:fuzzy/fuzzy.dart';
Expand Down Expand Up @@ -113,9 +114,31 @@ class NPlayer extends ChangeNotifier {

List<String> get playlists => PlaylistManager.playlistNames;

final _songChangeController = StreamController<void>.broadcast();
NServer? _server;
NServer? get server => _server;

bool _isServerOn = false;

bool get isServerOn => _isServerOn;
final StreamController<void> _songChangeController = StreamController<void>.broadcast();
Stream<void> get songChangeStream => _songChangeController.stream;

void notifySongChange() {
_songChangeController.add(null);
}

Future<void> toggleServer() async {
if (_isServerOn) {
await _server?.stop();
_server = null;
} else {
_server = NServer(this);
await _server!.start();
}
_isServerOn = !_isServerOn;
notifyListeners();
}


// SECTION: Constructor and Initialization
NPlayer() {
Expand Down Expand Up @@ -237,7 +260,7 @@ class NPlayer extends ChangeNotifier {
await Settings.setLastPlayingSong(selectedSong.path);
await _updateMetadata();
await _updatePlaybackState(playing: true);
_songChangeController.add(null);
notifySongChange();
notifyListeners();
}

Expand Down Expand Up @@ -329,7 +352,7 @@ class NPlayer extends ChangeNotifier {
await _updateMetadata();
await _updatePlaybackState(playing: true);
await _audioHandler.play();
_songChangeController.add(null);
notifySongChange();
notifyListeners();
} else {
_log("No songs to play");
Expand All @@ -353,7 +376,7 @@ class NPlayer extends ChangeNotifier {
await _updateMetadata();
await _updatePlaybackState(playing: true);
await _audioHandler.play();
_songChangeController.add(null);
notifySongChange();
notifyListeners();
}
} else {
Expand Down Expand Up @@ -801,6 +824,7 @@ class NPlayer extends ChangeNotifier {
await nextSong();
break;
}
notifySongChange();
}

void _log(String message) {
Expand All @@ -810,8 +834,8 @@ class NPlayer extends ChangeNotifier {
@override
void dispose() {
_log("Disposing NPlayer");
_audioPlayer.dispose();
_songChangeController.close();
_audioPlayer.dispose();
super.dispose();
}

Expand Down
9 changes: 6 additions & 3 deletions lib/audio/nserver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:blossom/audio/nplayer.dart';
import 'package:metadata_god/metadata_god.dart';
import 'package:http/http.dart' as http;


class NServer {
HttpServer? _server;
final NPlayer _nplayer;
Expand Down Expand Up @@ -159,9 +158,11 @@ class NServer {

static Future<bool> isValidServer(String ip) async {
try {
final response = await http.get(Uri.parse('http://$ip:8080'))
final response = await http
.get(Uri.parse('http://$ip:8080'))
.timeout(Duration(seconds: 5));
return response.statusCode == 200 && response.body.contains('Blossom Music Server');
return response.statusCode == 200 &&
response.body.contains('Blossom Music Server');
} catch (_) {
return false;
}
Expand All @@ -175,4 +176,6 @@ class NServer {
throw Exception('Failed to load metadata');
}
}

void notifySongChange() {}
}
52 changes: 31 additions & 21 deletions lib/pages/server_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../audio/nplayer.dart';
Expand All @@ -13,35 +15,44 @@ class ServerPage extends StatefulWidget {
}

class _ServerPageState extends State<ServerPage> {
NServer? _server;
String _status = 'Server not started';
List<String> _availableServers = [];
bool _isScanning = false;
bool _isServerRunning = false;
final TextEditingController _ipController = TextEditingController();

@override
StreamSubscription? _songChangeSubscription;

@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_updateServerStatus();
_listenToSongChanges();
});
}

Future<void> _toggleServer() async {
void _updateServerStatus() {
final nplayer = Provider.of<NPlayer>(context, listen: false);

if (_isServerRunning) {
_server?.stop();
setState(() {
_isServerRunning = false;
_status = 'Server stopped';
});
} else {
_server = NServer(nplayer);
await _server!.start();
setState(() {
_status = nplayer.isServerOn
? 'Server running on ${nplayer.server!.currentIp}:8080'
: 'Server not started';
});
}

void _listenToSongChanges() {
final nplayer = Provider.of<NPlayer>(context, listen: false);
_songChangeSubscription = nplayer.songChangeStream.listen((_) {
setState(() {
_isServerRunning = true;
_status = 'Server running on ${_server!.currentIp}:8080';
// Update UI if needed when song changes
});
}
});
}


Future<void> _toggleServer() async {
final nplayer = Provider.of<NPlayer>(context, listen: false);
await nplayer.toggleServer();
_updateServerStatus();
}

Future<void> _scanForServers() async {
Expand Down Expand Up @@ -91,9 +102,9 @@ class _ServerPageState extends State<ServerPage> {
),
ElevatedButton(
onPressed: _toggleServer,
child: Text(_isServerRunning ? 'Stop Server' : 'Start Server'),
child: Text(nplayer.isServerOn ? 'Stop Server' : 'Start Server'),
),
if (_isServerRunning && currentSong != null)
if (nplayer.isServerOn && currentSong != null)
Padding(
padding: const EdgeInsets.all(8.0),
child: Text('Currently streaming: ${currentSong.title} by ${currentSong.artist}'),
Expand Down Expand Up @@ -133,7 +144,6 @@ class _ServerPageState extends State<ServerPage> {

@override
void dispose() {
_server?.stop();
super.dispose();
}
}

0 comments on commit ef1148e

Please sign in to comment.