diff --git a/lib/provider/audio_player/audio_player.dart b/lib/provider/audio_player/audio_player.dart index 06081b19..e5db78c0 100644 --- a/lib/provider/audio_player/audio_player.dart +++ b/lib/provider/audio_player/audio_player.dart @@ -72,14 +72,18 @@ class AudioPlayerNotifier extends Notifier { ], ); }); - } else { + } else if (medias.isNotEmpty) { await audioPlayer.openPlaylist( medias - .map((media) => Media( + .map( + (media) => SpotubeMedia.fromMedia( + Media( media.uri, extras: media.extras, httpHeaders: media.httpHeaders, - )) + ), + ), + ) .toList(), initialIndex: playlist.index, ); diff --git a/lib/provider/audio_player/state.dart b/lib/provider/audio_player/state.dart index 685ce112..3572e289 100644 --- a/lib/provider/audio_player/state.dart +++ b/lib/provider/audio_player/state.dart @@ -33,11 +33,13 @@ class AudioPlayerState { shuffled: json['shuffled'], playlist: Playlist( json['playlist']['medias'] - .map((media) => Media( - media['uri'], - extras: media['extras'], - httpHeaders: media['httpHeaders'], - )) + .map( + (media) => SpotubeMedia.fromMedia(Media( + media['uri'], + extras: media['extras'], + httpHeaders: media['httpHeaders'], + )), + ) .toList(), index: json['playlist']['index'], ), diff --git a/lib/provider/server/server.dart b/lib/provider/server/server.dart index 5232bb17..131f1ea4 100644 --- a/lib/provider/server/server.dart +++ b/lib/provider/server/server.dart @@ -5,15 +5,16 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shelf/shelf_io.dart'; import 'package:spotube/provider/server/pipeline.dart'; import 'package:spotube/provider/server/router.dart'; +import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/logger/logger.dart'; -int serverPort = 0; final serverProvider = FutureProvider( (ref) async { final pipeline = ref.watch(pipelineProvider); final router = ref.watch(serverRouterProvider); + final port = Random().nextInt(17500) + 5000; - final port = Random().nextInt(17000) + 1500; + SpotubeMedia.serverPort = port; final server = await serve( pipeline.addHandler(router.call), @@ -28,8 +29,6 @@ final serverProvider = FutureProvider( server.close(); }); - serverPort = port; - return (server: server, port: port); }, ); diff --git a/lib/services/audio_player/audio_player.dart b/lib/services/audio_player/audio_player.dart index 713d518b..0b62c068 100644 --- a/lib/services/audio_player/audio_player.dart +++ b/lib/services/audio_player/audio_player.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:media_kit/media_kit.dart' hide Track; -import 'package:spotube/provider/server/server.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:flutter/foundation.dart'; import 'package:spotify/spotify.dart' hide Playlist; @@ -20,9 +19,11 @@ part 'audio_player_impl.dart'; class SpotubeMedia extends mk.Media { final Track track; + static int serverPort = 0; + SpotubeMedia( this.track, { - Map? extras, + Map? extras, super.httpHeaders, }) : super( track is LocalTrack @@ -38,11 +39,20 @@ class SpotubeMedia extends mk.Media { }, ); + @override + String get uri => track is LocalTrack + ? (track as LocalTrack).path + : "http://${InternetAddress.anyIPv4.address}:$serverPort/stream/${track.id}"; + factory SpotubeMedia.fromMedia(mk.Media media) { final track = media.uri.startsWith("http") ? Track.fromJson(media.extras?["track"]) : LocalTrack.fromJson(media.extras?["track"]); - return SpotubeMedia(track); + return SpotubeMedia( + track, + extras: media.extras, + httpHeaders: media.httpHeaders, + ); } }