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
This commit is contained in:
@@ -52,8 +52,4 @@
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Repositories\Local\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,21 @@ namespace Mear.Repositories.Database
|
||||
|
||||
|
||||
#region Methods
|
||||
public List<Song> RetrieveSongs()
|
||||
{
|
||||
try
|
||||
{
|
||||
var songs = _Db.Table<Song>().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<Song>();
|
||||
}
|
||||
|
||||
_Db.Insert(song);
|
||||
try
|
||||
{
|
||||
_Db.Insert(song);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var msg = ex.Message;
|
||||
}
|
||||
}
|
||||
public void UpdateSong(Song song)
|
||||
{
|
||||
|
||||
@@ -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<Song> 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
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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<Song>();
|
||||
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<Song> MergeSongs(List<Song> local, List<Song> 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<Song>();
|
||||
if (lclSongs != null)
|
||||
{
|
||||
lclSongs = lclSongs.OrderBy(s => s.Title).ToList();
|
||||
songs = MergeSongs(lclSongs, rmtSongs);
|
||||
}
|
||||
else
|
||||
{
|
||||
songs = rmtSongs;
|
||||
}
|
||||
|
||||
_songItems.Clear();
|
||||
|
||||
|
||||
@@ -8,10 +8,6 @@
|
||||
xmlns:vm="clr-namespace:Mear.ViewModels"
|
||||
Title="{Binding Title}">
|
||||
|
||||
|
||||
<!--
|
||||
<ContentPage.Content>
|
||||
-->
|
||||
<StackLayout>
|
||||
<StackLayout Padding="10" VerticalOptions="EndAndExpand">
|
||||
<StackLayout VerticalOptions="End">
|
||||
@@ -31,21 +27,6 @@
|
||||
<Label x:Name="AlbumName"
|
||||
Text="{Binding Album}"/>
|
||||
</StackLayout>
|
||||
<!--
|
||||
<StackLayout>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
|
||||
</Grid>
|
||||
</StackLayout>
|
||||
-->
|
||||
</DataTemplate>
|
||||
</BindableLayout.ItemTemplate>
|
||||
</StackLayout>
|
||||
@@ -86,9 +67,6 @@
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
<!--
|
||||
</ContentPage.Content>
|
||||
-->
|
||||
<ContentPage.ToolbarItems>
|
||||
<ToolbarItem Name="Download" Order="Secondary" Priority="1" Clicked="Download_Clicked" />
|
||||
</ContentPage.ToolbarItems>
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user