Changed how songs are being played and the songs are refreshed when pulled down.
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Mear.Constants
|
||||
{
|
||||
public enum PlayControls
|
||||
{
|
||||
PLAYOFFLINE = 1,
|
||||
PAUSE,
|
||||
RESUME,
|
||||
STREAM,
|
||||
PREVIOUS,
|
||||
NEXT,
|
||||
REPEAT,
|
||||
SHUFFLE
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ using MediaManager;
|
||||
using Newtonsoft.Json;
|
||||
using RestSharp;
|
||||
|
||||
using Mear.Constants;
|
||||
using Mear.Constants.API;
|
||||
using Mear.Models;
|
||||
using Mear.Models.Authentication;
|
||||
@@ -81,6 +82,79 @@ namespace Mear.Playback
|
||||
var msg = ex.Message;
|
||||
}
|
||||
}
|
||||
public static async Task<Song> ControlMusic(Song song, PlayControls control)
|
||||
{
|
||||
switch (control)
|
||||
{
|
||||
case PlayControls.PLAYOFFLINE:
|
||||
var songPath = song.SongPath;
|
||||
await CrossMediaManager.Current.Play(songPath);
|
||||
break;
|
||||
case PlayControls.PAUSE:
|
||||
await CrossMediaManager.Current.Pause();
|
||||
break;
|
||||
case PlayControls.RESUME:
|
||||
await CrossMediaManager.Current.Play();
|
||||
break;
|
||||
case PlayControls.STREAM:
|
||||
return StreamSong(song);
|
||||
break;
|
||||
case PlayControls.REPEAT:
|
||||
// TODO: Implement repeat
|
||||
break;
|
||||
case PlayControls.SHUFFLE:
|
||||
// TODO: Implement shuffling
|
||||
break;
|
||||
case PlayControls.NEXT:
|
||||
// TODO: Implement Next
|
||||
break;
|
||||
case PlayControls.PREVIOUS:
|
||||
break;
|
||||
// TODO: Implement Next
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Song StreamSong(Song song)
|
||||
{
|
||||
string tmpFile = Path.GetTempPath() + "track.mp3";
|
||||
|
||||
if (File.Exists(tmpFile))
|
||||
{
|
||||
File.Delete(tmpFile);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using (var writer = File.OpenWrite(tmpFile))
|
||||
{
|
||||
var client = new RestClient(API.ApiUrl);
|
||||
var apiEndpoint = $@"api/{API.APIVersion}/song/stream/{song.Id}"; ;
|
||||
|
||||
var request = new RestRequest(apiEndpoint, Method.GET);
|
||||
var tokRepo = new DBTokenRepository();
|
||||
var token = tokRepo.RetrieveToken();
|
||||
|
||||
request.AddHeader("Authorization", $"Bearer {token.AccessToken}");
|
||||
request.ResponseWriter = (responseStream) =>
|
||||
responseStream.CopyTo(writer);
|
||||
|
||||
var response = client.DownloadData(request);
|
||||
|
||||
CrossMediaManager.Current.Play(tmpFile);
|
||||
song.SongPath = tmpFile;
|
||||
}
|
||||
|
||||
return song;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var msg = ex.Message;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,32 @@ namespace Mear.ViewModels
|
||||
#region Fields
|
||||
#region INotifyPropertyChanged
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
#endregion
|
||||
private bool _isRefreshing;
|
||||
#endregion
|
||||
|
||||
|
||||
#region Properties
|
||||
public bool IsRefreshing
|
||||
{
|
||||
get => _isRefreshing;
|
||||
set
|
||||
{
|
||||
_isRefreshing = value;
|
||||
NotifyPropertyChanged("IsRefreshing");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region Methods
|
||||
private void NotifyPropertyChanged(string propertyName)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace Mear.ViewModels
|
||||
songs = rmtSongs;
|
||||
}
|
||||
|
||||
_songItems.Clear();
|
||||
_songItems.Clear();
|
||||
|
||||
foreach (var song in songs)
|
||||
{
|
||||
@@ -121,6 +121,8 @@ namespace Mear.ViewModels
|
||||
{
|
||||
var msg = ex.Message;
|
||||
}
|
||||
|
||||
IsRefreshing = false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -10,7 +10,9 @@ using MediaManager;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Xaml;
|
||||
|
||||
using Mear.Constants;
|
||||
using Mear.Models;
|
||||
using Mear.Playback;
|
||||
using Mear.Repositories.Database;
|
||||
using Mear.Repositories.Remote;
|
||||
using Mear.Utilities;
|
||||
@@ -55,24 +57,36 @@ namespace Mear.Views
|
||||
|
||||
|
||||
#region Methods
|
||||
private ToolbarItem DownloadOption()
|
||||
{
|
||||
var dnloadOpt = new ToolbarItem();
|
||||
dnloadOpt.Text = "Download";
|
||||
dnloadOpt.Order = ToolbarItemOrder.Secondary;
|
||||
dnloadOpt.Priority = 1;
|
||||
dnloadOpt.Clicked += Download_Clicked;
|
||||
|
||||
return dnloadOpt;
|
||||
}
|
||||
private ToolbarItem RemoveOption()
|
||||
{
|
||||
var rmvOpt = new ToolbarItem();
|
||||
rmvOpt.Text = "Remove";
|
||||
rmvOpt.Order = ToolbarItemOrder.Secondary;
|
||||
rmvOpt.Priority = 1;
|
||||
rmvOpt.Clicked += Remove_Clicked;
|
||||
|
||||
return rmvOpt;
|
||||
}
|
||||
private void InitializeOptions()
|
||||
{
|
||||
if (!_song.Downloaded)
|
||||
{
|
||||
var dnloadOpt = new ToolbarItem();
|
||||
dnloadOpt.Text = "Download";
|
||||
dnloadOpt.Order = ToolbarItemOrder.Secondary;
|
||||
dnloadOpt.Priority = 1;
|
||||
dnloadOpt.Clicked += Download_Clicked;
|
||||
var dnloadOpt = DownloadOption();
|
||||
ToolbarItems.Add(dnloadOpt);
|
||||
}
|
||||
else
|
||||
{
|
||||
var rmvOpt = new ToolbarItem();
|
||||
rmvOpt.Text = "Remove";
|
||||
rmvOpt.Order = ToolbarItemOrder.Secondary;
|
||||
rmvOpt.Priority = 1;
|
||||
rmvOpt.Clicked += Remove_Clicked;
|
||||
var rmvOpt = RemoveOption();
|
||||
ToolbarItems.Add(rmvOpt);
|
||||
}
|
||||
}
|
||||
@@ -151,11 +165,11 @@ namespace Mear.Views
|
||||
{
|
||||
if (CrossMediaManager.Current.IsPlaying())
|
||||
{
|
||||
await CrossMediaManager.Current.Pause();
|
||||
await MearPlayer.ControlMusic(_song, PlayControls.PAUSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
await CrossMediaManager.Current.Play();
|
||||
await MearPlayer.ControlMusic(_song, PlayControls.RESUME);
|
||||
}
|
||||
}
|
||||
private void Next_Clicked(object sender, EventArgs e)
|
||||
@@ -181,11 +195,17 @@ namespace Mear.Views
|
||||
|
||||
private void Download_Clicked(object sender, EventArgs e)
|
||||
{
|
||||
var act = ToolbarItems.Where(tl => tl.Priority == 1).First();
|
||||
ToolbarItems.Remove(act);
|
||||
var songRepo = new RemoteSongRepository();
|
||||
songRepo.DownloadSong(_song);
|
||||
ToolbarItems.Add(RemoveOption());
|
||||
}
|
||||
private async void Remove_Clicked(object sender, EventArgs e)
|
||||
{
|
||||
var act = ToolbarItems.Where(tl => tl.Priority == 1).First();
|
||||
|
||||
ToolbarItems.Remove(act);
|
||||
var dbSongRepo = new DBSongRepository();
|
||||
var plyCount = new DBPlayCountRepository();
|
||||
dbSongRepo.DeleteSong(_song);
|
||||
@@ -193,6 +213,8 @@ namespace Mear.Views
|
||||
_song.Downloaded = false;
|
||||
|
||||
File.Delete(_song.SongPath);
|
||||
|
||||
ToolbarItems.Add(DownloadOption());
|
||||
}
|
||||
private async void PlayCount_Clicked(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
IsPullToRefreshEnabled="True"
|
||||
RowHeight="75"
|
||||
RefreshCommand="{Binding RefreshSongs}"
|
||||
IsRefreshing="{Binding IsRefreshing}"
|
||||
ItemSelected="SongListView_ItemSelected" >
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate>
|
||||
|
||||
@@ -8,6 +8,7 @@ using MediaManager;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Xaml;
|
||||
|
||||
using Mear.Constants;
|
||||
using Mear.Models;
|
||||
using Mear.Playback;
|
||||
using Mear.Repositories.Database;
|
||||
@@ -54,11 +55,11 @@ namespace Mear.Views
|
||||
var song = (Song)SongListView.SelectedItem;
|
||||
if (song.Downloaded)
|
||||
{
|
||||
await MearPlayer.PlaySong(song);
|
||||
await MearPlayer.ControlMusic(song, PlayControls.PLAYOFFLINE);
|
||||
}
|
||||
else
|
||||
{
|
||||
song = await MearPlayer.StreamSongDemoAsync(song);
|
||||
song = await MearPlayer.ControlMusic(song, PlayControls.STREAM);
|
||||
var plyCountRepo = new DBPlayCountRepository();
|
||||
plyCountRepo.AffectPlayCount(song);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user