chore: player skipping all tracks from cache

This commit is contained in:
Kingkor Roy Tirtho 2024-06-24 22:26:44 +06:00
parent a621a45f0b
commit 1b420e661b
4 changed files with 30 additions and 15 deletions

View File

@ -72,14 +72,18 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
],
);
});
} 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,
);

View File

@ -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'],
),

View File

@ -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);
},
);

View File

@ -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<String, String>? extras,
Map<String, dynamic>? 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,
);
}
}