From 9c2b8a71b7c6db76836468c873c13a6395f94882 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Sat, 1 Jun 2019 14:17:10 -0400 Subject: [PATCH] Implemented Download functionality and retrieving the song metadata from the local database. Next is to indicate which songs are download on the UI and then the ability to delete the downloaded music. #16 and #49 --- Mear/Mear/Mear.csproj | 4 -- Mear/Mear/Models/Song.cs | 2 + Mear/Mear/Playback/MearPlayer.cs | 17 ++++++- .../Repositories/Database/DBSongRepository.cs | 24 ++++++++- .../Repositories/Local/LocalSongRepository.cs | 48 ++++++++++++++++++ .../Remote/RemoteSongRepository.cs | 5 ++ Mear/Mear/ViewModels/SongViewModel.cs | 49 ++++++++++++++++++- Mear/Mear/Views/MearPlayerView.xaml | 22 --------- Mear/Mear/Views/SongView.xaml.cs | 9 +++- 9 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 Mear/Mear/Repositories/Local/LocalSongRepository.cs diff --git a/Mear/Mear/Mear.csproj b/Mear/Mear/Mear.csproj index f1bbd5e..5b40e62 100644 --- a/Mear/Mear/Mear.csproj +++ b/Mear/Mear/Mear.csproj @@ -52,8 +52,4 @@ MSBuild:UpdateDesignTimeXaml - - - - \ No newline at end of file diff --git a/Mear/Mear/Models/Song.cs b/Mear/Mear/Models/Song.cs index 2b6c2cc..49a6cdf 100644 --- a/Mear/Mear/Models/Song.cs +++ b/Mear/Mear/Models/Song.cs @@ -31,5 +31,7 @@ namespace Mear.Models public string Filename { get; set; } [JsonIgnore] public string SongPath { set; get; } + [JsonIgnore] + public bool Downloaded { get; set; } = false; } } diff --git a/Mear/Mear/Playback/MearPlayer.cs b/Mear/Mear/Playback/MearPlayer.cs index 4bf6a31..3c07f0c 100644 --- a/Mear/Mear/Playback/MearPlayer.cs +++ b/Mear/Mear/Playback/MearPlayer.cs @@ -56,9 +56,9 @@ namespace Mear.Playback await CrossMediaManager.Current.Play(tmpFile); song.SongPath = tmpFile; - - return song; } + + return song; } catch (Exception ex) { @@ -67,6 +67,19 @@ namespace Mear.Playback return null; } + public static async Task PlaySong(Song song) + { + try + { + var songPath = song.SongPath; + + await CrossMediaManager.Current.Play(songPath); + } + catch (Exception ex) + { + var msg = ex.Message; + } + } #endregion } } diff --git a/Mear/Mear/Repositories/Database/DBSongRepository.cs b/Mear/Mear/Repositories/Database/DBSongRepository.cs index 088ce53..3095095 100644 --- a/Mear/Mear/Repositories/Database/DBSongRepository.cs +++ b/Mear/Mear/Repositories/Database/DBSongRepository.cs @@ -29,6 +29,21 @@ namespace Mear.Repositories.Database #region Methods + public List RetrieveSongs() + { + try + { + var songs = _Db.Table().ToList(); + + return songs; + } + catch (Exception ex) + { + var msg = ex.Message; + } + + return null; + } public Song RetrieveSong(int id) { try @@ -68,7 +83,14 @@ namespace Mear.Repositories.Database _Db.CreateTable(); } - _Db.Insert(song); + try + { + _Db.Insert(song); + } + catch (Exception ex) + { + var msg = ex.Message; + } } public void UpdateSong(Song song) { diff --git a/Mear/Mear/Repositories/Local/LocalSongRepository.cs b/Mear/Mear/Repositories/Local/LocalSongRepository.cs new file mode 100644 index 0000000..ef5234c --- /dev/null +++ b/Mear/Mear/Repositories/Local/LocalSongRepository.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using Mear.Models; +using Mear.Repositories.Database; + +namespace Mear.Repositories.Local +{ + public class LocalSongRepository + { + #region Fields + #endregion + + + #region Properties + #endregion + + + #region Contructors + #endregion + + + #region Methods + public List RetrieveSongs() + { + try + { + var dbSongRepo = new DBSongRepository(); + + var songs = dbSongRepo.RetrieveSongs(); + + if (songs == null) + { + throw new Exception("Unable to retrieve song metadata from the local database"); + } + + return songs; + } + catch (Exception ex) + { + var msg = ex.Message; + } + return null; + } + #endregion + } +} diff --git a/Mear/Mear/Repositories/Remote/RemoteSongRepository.cs b/Mear/Mear/Repositories/Remote/RemoteSongRepository.cs index 977644b..30982ba 100644 --- a/Mear/Mear/Repositories/Remote/RemoteSongRepository.cs +++ b/Mear/Mear/Repositories/Remote/RemoteSongRepository.cs @@ -74,6 +74,11 @@ namespace Mear.Repositories.Remote var response = client.DownloadData(request); } + song.Downloaded = true; + song.SongPath = path; + + var dbSongRepo = new DBSongRepository(); + dbSongRepo.SaveSong(song); } catch (Exception ex) { diff --git a/Mear/Mear/ViewModels/SongViewModel.cs b/Mear/Mear/ViewModels/SongViewModel.cs index 0d5bc97..bd29fb8 100644 --- a/Mear/Mear/ViewModels/SongViewModel.cs +++ b/Mear/Mear/ViewModels/SongViewModel.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Xamarin.Forms; using Mear.Models; +using Mear.Repositories.Local; using Mear.Repositories.Remote; namespace Mear.ViewModels @@ -50,7 +51,19 @@ namespace Mear.ViewModels public void PopulateSongs() { var songRepo = new RemoteSongRepository(); - var songs = songRepo.RetrieveSongs().OrderBy(s => s.Title).ToList(); + var localSongRepo = new LocalSongRepository(); + var lclSongs = localSongRepo.RetrieveSongs(); + var rmtSongs = songRepo.RetrieveSongs().OrderBy(s => s.Title).ToList(); + var songs = new List(); + if (lclSongs != null) + { + lclSongs = lclSongs.OrderBy(s => s.Title).ToList(); + songs = MergeSongs(lclSongs, rmtSongs); + } + else + { + songs = rmtSongs; + } foreach (var song in songs) { @@ -58,12 +71,44 @@ namespace Mear.ViewModels } } + private List MergeSongs(List local, List remote) + { + try + { + foreach (Song lclSong in local) + { + Song song = remote.Find(s => (s.Title.Equals(lclSong.Title))); + remote.Remove(song); + remote.Add(lclSong); + } + + return remote; + } + catch (Exception ex) + { + var msg = ex.Message; + } + + return null; + } private async Task PopulateSongsAsync() { try { var songRepo = new RemoteSongRepository(); - var songs = songRepo.RetrieveSongs().OrderBy(s => s.Title).ToList(); + var localSongRepo = new LocalSongRepository(); + var lclSongs = localSongRepo.RetrieveSongs(); + var rmtSongs = songRepo.RetrieveSongs().OrderBy(s => s.Title).ToList(); + var songs = new List(); + if (lclSongs != null) + { + lclSongs = lclSongs.OrderBy(s => s.Title).ToList(); + songs = MergeSongs(lclSongs, rmtSongs); + } + else + { + songs = rmtSongs; + } _songItems.Clear(); diff --git a/Mear/Mear/Views/MearPlayerView.xaml b/Mear/Mear/Views/MearPlayerView.xaml index 6b7490d..895ae12 100644 --- a/Mear/Mear/Views/MearPlayerView.xaml +++ b/Mear/Mear/Views/MearPlayerView.xaml @@ -8,10 +8,6 @@ xmlns:vm="clr-namespace:Mear.ViewModels" Title="{Binding Title}"> - - @@ -31,21 +27,6 @@ - @@ -86,9 +67,6 @@ - diff --git a/Mear/Mear/Views/SongView.xaml.cs b/Mear/Mear/Views/SongView.xaml.cs index 09ab616..74b8d67 100644 --- a/Mear/Mear/Views/SongView.xaml.cs +++ b/Mear/Mear/Views/SongView.xaml.cs @@ -49,7 +49,14 @@ namespace Mear.Views try { var song = (Song)SongListView.SelectedItem; - song = await MearPlayer.StreamSongDemoAsync(song); + if (song.Downloaded) + { + await MearPlayer.PlaySong(song); + } + else + { + song = await MearPlayer.StreamSongDemoAsync(song); + } await Navigation.PushModalAsync(new NavigationPage(new MearPlayerView(song))); } catch (Exception ex)