shuffleArtist, playAlbum

This commit is contained in:
Moritz Weber 2021-04-16 18:58:27 +02:00
parent b612b343a4
commit 44b746e3df
8 changed files with 113 additions and 50 deletions

View file

@ -6,6 +6,7 @@ abstract class MusicDataInfoRepository {
Future<Song> getSongByPath(String path);
Stream<List<Song>> get songStream;
Stream<List<Song>> getAlbumSongStream(Album album);
Stream<List<Song>> getArtistSongStream(Artist artist);
Stream<List<Album>> get albumStream;
Stream<List<Album>> getArtistAlbumStream(Artist artist);

View file

@ -0,0 +1,25 @@
import '../entities/album.dart';
import '../entities/shuffle_mode.dart';
import '../repositories/music_data_repository.dart';
import 'play_songs.dart';
import 'set_shuffle_mode.dart';
class PlayAlbum {
PlayAlbum(
this._musicDataRepository,
this._playSongs,
this._setShuffleMode,
);
final PlaySongs _playSongs;
final SetShuffleMode _setShuffleMode;
final MusicDataRepository _musicDataRepository;
Future<void> call(Album album) async {
final songs = await _musicDataRepository.getAlbumSongStream(album).first;
await _setShuffleMode(ShuffleMode.none, updateQueue: false);
_playSongs(songs: songs, initialIndex: 0);
}
}

View file

@ -0,0 +1,29 @@
import 'dart:math';
import '../entities/artist.dart';
import '../entities/shuffle_mode.dart';
import '../repositories/music_data_repository.dart';
import 'play_songs.dart';
import 'set_shuffle_mode.dart';
class PlayArtist {
PlayArtist(
this._musicDataRepository,
this._playSongs,
this._setShuffleMode,
);
final PlaySongs _playSongs;
final SetShuffleMode _setShuffleMode;
final MusicDataRepository _musicDataRepository;
Future<void> call(Artist artist) async {
final songs = await _musicDataRepository.getArtistSongStream(artist).first;
final rng = Random();
final index = rng.nextInt(songs.length);
await _setShuffleMode(ShuffleMode.plus, updateQueue: false);
_playSongs(songs: songs, initialIndex: index);
}
}

View file

@ -18,23 +18,25 @@ class SetShuffleMode {
final QueueManagerModule _queueManagerModule;
Future<void> call(ShuffleMode shuffleMode) async {
Future<void> call(ShuffleMode shuffleMode, {bool updateQueue = true}) async {
_audioPlayerRepository.setShuffleMode(shuffleMode);
final currentIndex = _audioPlayerRepository.currentIndexStream.value;
final originalIndex = _queueManagerModule.queue[currentIndex].originalIndex;
if (updateQueue) {
final currentIndex = _audioPlayerRepository.currentIndexStream.value;
final originalIndex = _queueManagerModule.queue[currentIndex].originalIndex;
await _queueManagerModule.reshuffleQueue(shuffleMode, currentIndex);
final queue = _queueManagerModule.queue;
await _queueManagerModule.reshuffleQueue(shuffleMode, currentIndex);
final queue = _queueManagerModule.queue;
final songList = queue.map((e) => e.song).toList();
final splitIndex = shuffleMode == ShuffleMode.none ? originalIndex : 0;
_audioPlayerRepository.replaceQueueAroundIndex(
index: currentIndex,
before: songList.sublist(0, splitIndex),
after: songList.sublist(splitIndex + 1),
);
final songList = queue.map((e) => e.song).toList();
final splitIndex = shuffleMode == ShuffleMode.none ? originalIndex : 0;
_audioPlayerRepository.replaceQueueAroundIndex(
index: currentIndex,
before: songList.sublist(0, splitIndex),
after: songList.sublist(splitIndex + 1),
);
_platformIntegrationRepository.setQueue(songList);
_platformIntegrationRepository.setQueue(songList);
}
}
}

View file

@ -2,54 +2,30 @@ import 'dart:math';
import '../entities/shuffle_mode.dart';
import '../entities/song.dart';
import '../modules/queue_manager.dart';
import '../repositories/audio_player_repository.dart';
import '../repositories/music_data_repository.dart';
import '../repositories/persistent_player_state_repository.dart';
import '../repositories/platform_integration_repository.dart';
import 'play_songs.dart';
import 'set_shuffle_mode.dart';
const SHUFFLE_MODE = ShuffleMode.plus;
class ShuffleAll {
ShuffleAll(
this._audioPlayerRepository,
this._musicDataRepository,
this._platformIntegrationRepository,
this._playerStateRepository,
this._queueGenerationModule,
this._playSongs,
this._setShuffleMode,
);
final AudioPlayerRepository _audioPlayerRepository;
final MusicDataRepository _musicDataRepository;
final PlatformIntegrationRepository _platformIntegrationRepository;
final PlayerStateRepository _playerStateRepository;
final PlaySongs _playSongs;
final SetShuffleMode _setShuffleMode;
final QueueManagerModule _queueGenerationModule;
final MusicDataRepository _musicDataRepository;
Future<void> call() async {
final List<Song> songs = await _musicDataRepository.songStream.first;
final rng = Random();
final index = rng.nextInt(songs.length);
_audioPlayerRepository.setShuffleMode(SHUFFLE_MODE);
await _queueGenerationModule.setQueue(
SHUFFLE_MODE,
songs,
index,
);
final queueItems = _queueGenerationModule.queue;
final songList = queueItems.map((e) => e.song).toList();
await _audioPlayerRepository.loadQueue(
initialIndex: 0,
queue: songList,
);
_audioPlayerRepository.play();
_platformIntegrationRepository.setCurrentSong(songs[index]);
// _platformIntegrationRepository.play();
_platformIntegrationRepository.setQueue(songList);
await _setShuffleMode(SHUFFLE_MODE, updateQueue: false);
_playSongs(songs: songs, initialIndex: index);
}
}

View file

@ -18,6 +18,8 @@ import 'domain/usecases/handle_playback_state.dart';
import 'domain/usecases/move_queue_item.dart';
import 'domain/usecases/pause.dart';
import 'domain/usecases/play.dart';
import 'domain/usecases/play_album.dart';
import 'domain/usecases/play_artist.dart';
import 'domain/usecases/play_next.dart';
import 'domain/usecases/play_songs.dart';
import 'domain/usecases/remove_queue_index.dart';
@ -74,6 +76,8 @@ Future<void> setupGetIt() async {
moveQueueItem: getIt(),
pause: getIt(),
play: getIt(),
playAlbum: getIt(),
playArtist: getIt(),
playNext: getIt(),
playSongs: getIt(),
removeQueueIndex: getIt(),
@ -126,6 +130,20 @@ Future<void> setupGetIt() async {
getIt(),
),
);
getIt.registerLazySingleton<PlayAlbum>(
() => PlayAlbum(
getIt(),
getIt(),
getIt(),
),
);
getIt.registerLazySingleton<PlayArtist>(
() => PlayArtist(
getIt(),
getIt(),
getIt(),
),
);
getIt.registerLazySingleton<PlayNext>(
() => PlayNext(
getIt(),
@ -188,8 +206,6 @@ Future<void> setupGetIt() async {
getIt(),
getIt(),
getIt(),
getIt(),
getIt(),
),
);
getIt.registerLazySingleton<UpdateDatabase>(

View file

@ -11,6 +11,8 @@ import '../../domain/usecases/add_to_queue.dart';
import '../../domain/usecases/move_queue_item.dart';
import '../../domain/usecases/pause.dart';
import '../../domain/usecases/play.dart';
import '../../domain/usecases/play_album.dart';
import '../../domain/usecases/play_artist.dart';
import '../../domain/usecases/play_next.dart';
import '../../domain/usecases/play_songs.dart';
import '../../domain/usecases/remove_queue_index.dart';
@ -29,6 +31,8 @@ class AudioStore extends _AudioStore with _$AudioStore {
@required MoveQueueItem moveQueueItem,
@required Pause pause,
@required Play play,
@required PlayAlbum playAlbum,
@required PlayArtist playArtist,
@required PlayNext playNext,
@required PlaySongs playSongs,
@required RemoveQueueIndex removeQueueIndex,
@ -46,6 +50,8 @@ class AudioStore extends _AudioStore with _$AudioStore {
audioPlayerInfoRepository,
pause,
play,
playAlbum,
playArtist,
playNext,
removeQueueIndex,
seekToIndex,
@ -65,6 +71,8 @@ abstract class _AudioStore with Store {
this._audioPlayerInfoRepository,
this._pause,
this._play,
this._playAlbum,
this._playArtist,
this._playNext,
this._removeQueueIndex,
this._seekToIndex,
@ -96,6 +104,8 @@ abstract class _AudioStore with Store {
final MoveQueueItem _moveQueueItem;
final Pause _pause;
final Play _play;
final PlayAlbum _playAlbum;
final PlayArtist _playArtist;
final PlayNext _playNext;
final PlaySongs _playSongs;
final RemoveQueueIndex _removeQueueIndex;
@ -182,10 +192,10 @@ abstract class _AudioStore with Store {
}
Future<void> playAlbum(Album album) async {
// _audioInterface.playAlbum(album);
_playAlbum(album);
}
Future<void> shuffleArtist(Artist artist) async {
// _audioInterface.playArtist(artist, shuffleMode: ShuffleMode.plus);
_playArtist(artist);
}
}

View file

@ -42,6 +42,10 @@ class MusicDataRepositoryImpl implements MusicDataRepository {
Stream<List<Song>> getAlbumSongStream(Album album) =>
_musicDataSource.getAlbumSongStream(album as AlbumModel);
@override
Stream<List<Song>> getArtistSongStream(Artist artist) =>
_musicDataSource.getArtistSongStream(artist as ArtistModel);
@override
Stream<List<Album>> getArtistAlbumStream(Artist artist) =>
_musicDataSource.getArtistAlbumStream(artist as ArtistModel);