mucke/lib/system/repositories/music_data_repository_impl.dart

82 lines
2.7 KiB
Dart
Raw Normal View History

2020-03-24 22:17:03 +01:00
import 'package:dartz/dartz.dart';
import 'package:meta/meta.dart';
import '../../core/error/failures.dart';
import '../../domain/entities/album.dart';
2020-06-28 10:40:53 +02:00
import '../../domain/entities/song.dart';
2020-03-24 22:17:03 +01:00
import '../../domain/repositories/music_data_repository.dart';
import '../datasources/local_music_fetcher_contract.dart';
import '../datasources/music_data_source_contract.dart';
2020-03-26 11:58:30 +01:00
import '../models/album_model.dart';
2020-06-28 10:40:53 +02:00
import '../models/song_model.dart';
2020-03-24 22:17:03 +01:00
class MusicDataRepositoryImpl implements MusicDataRepository {
2020-03-28 09:38:52 +01:00
MusicDataRepositoryImpl({
@required this.localMusicFetcher,
@required this.musicDataSource,
});
2020-03-24 22:17:03 +01:00
2020-03-26 11:58:30 +01:00
final LocalMusicFetcher localMusicFetcher;
final MusicDataSource musicDataSource;
2020-03-24 22:17:03 +01:00
@override
Future<Either<Failure, List<Album>>> getAlbums() async {
2020-03-26 11:58:30 +01:00
return musicDataSource.getAlbums().then(
(List<AlbumModel> albums) => Right<Failure, List<AlbumModel>>(albums));
2020-03-24 22:17:03 +01:00
}
@override
Future<Either<Failure, List<Song>>> getSongs() async {
return musicDataSource.getSongs().then(
(List<SongModel> songs) => Right<Failure, List<SongModel>>(songs));
}
2020-06-28 10:40:53 +02:00
@override
Future<Either<Failure, List<Song>>> getSongsFromAlbum(Album album) async {
return musicDataSource.getSongsFromAlbum(album as AlbumModel).then(
(List<SongModel> songs) => Right<Failure, List<SongModel>>(songs));
}
2020-03-24 22:17:03 +01:00
@override
Future<void> updateDatabase() async {
2020-03-26 11:58:30 +01:00
final List<AlbumModel> albums = await localMusicFetcher.getAlbums();
2020-03-24 22:17:03 +01:00
2020-06-28 10:40:53 +02:00
final Map<int, int> albumIdMap = {};
await musicDataSource.resetAlbumsPresentFlag();
2020-03-26 11:58:30 +01:00
for (final AlbumModel album in albums) {
2020-06-28 10:40:53 +02:00
final storedAlbum = await musicDataSource.getAlbumByTitleArtist(
album.title, album.artist);
if (storedAlbum != null) {
albumIdMap[album.id] = storedAlbum.id;
await musicDataSource.flagAlbumPresent(storedAlbum);
} else {
final int newAlbumId = await musicDataSource.insertAlbum(album);
albumIdMap[album.id] = newAlbumId;
2020-03-24 22:17:03 +01:00
}
}
2020-06-28 10:40:53 +02:00
await musicDataSource.removeNonpresentAlbums();
final List<SongModel> songs = await localMusicFetcher.getSongs();
2020-06-28 10:40:53 +02:00
await musicDataSource.resetSongsPresentFlag();
for (final SongModel song in songs) {
2020-06-28 10:40:53 +02:00
SongModel storedSong = await musicDataSource.getSongByPath(song.path);
storedSong ??= await musicDataSource.getSongByTitleAlbumArtist(
song.title, song.album, song.artist);
if (storedSong != null) {
await musicDataSource.flagSongPresent(storedSong);
} else {
2020-06-28 21:52:10 +02:00
final SongModel songToInsert = song.copyWith(albumId: albumIdMap[song.albumId]);
2020-06-28 10:40:53 +02:00
// TODO: fails if albumId is null
await musicDataSource.insertSong(songToInsert);
}
}
2020-06-28 10:40:53 +02:00
await musicDataSource.removeNonpresentSongs();
2020-03-24 22:17:03 +01:00
}
}