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 Newtonsoft.Json;
|
||||||
using RestSharp;
|
using RestSharp;
|
||||||
|
|
||||||
|
using Mear.Constants;
|
||||||
using Mear.Constants.API;
|
using Mear.Constants.API;
|
||||||
using Mear.Models;
|
using Mear.Models;
|
||||||
using Mear.Models.Authentication;
|
using Mear.Models.Authentication;
|
||||||
@@ -81,6 +82,79 @@ namespace Mear.Playback
|
|||||||
var msg = ex.Message;
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,31 @@ namespace Mear.ViewModels
|
|||||||
#region INotifyPropertyChanged
|
#region INotifyPropertyChanged
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
#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
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,6 +121,8 @@ namespace Mear.ViewModels
|
|||||||
{
|
{
|
||||||
var msg = ex.Message;
|
var msg = ex.Message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IsRefreshing = false;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ using MediaManager;
|
|||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
using Xamarin.Forms.Xaml;
|
using Xamarin.Forms.Xaml;
|
||||||
|
|
||||||
|
using Mear.Constants;
|
||||||
using Mear.Models;
|
using Mear.Models;
|
||||||
|
using Mear.Playback;
|
||||||
using Mear.Repositories.Database;
|
using Mear.Repositories.Database;
|
||||||
using Mear.Repositories.Remote;
|
using Mear.Repositories.Remote;
|
||||||
using Mear.Utilities;
|
using Mear.Utilities;
|
||||||
@@ -55,24 +57,36 @@ namespace Mear.Views
|
|||||||
|
|
||||||
|
|
||||||
#region Methods
|
#region Methods
|
||||||
private void InitializeOptions()
|
private ToolbarItem DownloadOption()
|
||||||
{
|
|
||||||
if (!_song.Downloaded)
|
|
||||||
{
|
{
|
||||||
var dnloadOpt = new ToolbarItem();
|
var dnloadOpt = new ToolbarItem();
|
||||||
dnloadOpt.Text = "Download";
|
dnloadOpt.Text = "Download";
|
||||||
dnloadOpt.Order = ToolbarItemOrder.Secondary;
|
dnloadOpt.Order = ToolbarItemOrder.Secondary;
|
||||||
dnloadOpt.Priority = 1;
|
dnloadOpt.Priority = 1;
|
||||||
dnloadOpt.Clicked += Download_Clicked;
|
dnloadOpt.Clicked += Download_Clicked;
|
||||||
ToolbarItems.Add(dnloadOpt);
|
|
||||||
|
return dnloadOpt;
|
||||||
}
|
}
|
||||||
else
|
private ToolbarItem RemoveOption()
|
||||||
{
|
{
|
||||||
var rmvOpt = new ToolbarItem();
|
var rmvOpt = new ToolbarItem();
|
||||||
rmvOpt.Text = "Remove";
|
rmvOpt.Text = "Remove";
|
||||||
rmvOpt.Order = ToolbarItemOrder.Secondary;
|
rmvOpt.Order = ToolbarItemOrder.Secondary;
|
||||||
rmvOpt.Priority = 1;
|
rmvOpt.Priority = 1;
|
||||||
rmvOpt.Clicked += Remove_Clicked;
|
rmvOpt.Clicked += Remove_Clicked;
|
||||||
|
|
||||||
|
return rmvOpt;
|
||||||
|
}
|
||||||
|
private void InitializeOptions()
|
||||||
|
{
|
||||||
|
if (!_song.Downloaded)
|
||||||
|
{
|
||||||
|
var dnloadOpt = DownloadOption();
|
||||||
|
ToolbarItems.Add(dnloadOpt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var rmvOpt = RemoveOption();
|
||||||
ToolbarItems.Add(rmvOpt);
|
ToolbarItems.Add(rmvOpt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,11 +165,11 @@ namespace Mear.Views
|
|||||||
{
|
{
|
||||||
if (CrossMediaManager.Current.IsPlaying())
|
if (CrossMediaManager.Current.IsPlaying())
|
||||||
{
|
{
|
||||||
await CrossMediaManager.Current.Pause();
|
await MearPlayer.ControlMusic(_song, PlayControls.PAUSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await CrossMediaManager.Current.Play();
|
await MearPlayer.ControlMusic(_song, PlayControls.RESUME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void Next_Clicked(object sender, EventArgs e)
|
private void Next_Clicked(object sender, EventArgs e)
|
||||||
@@ -181,11 +195,17 @@ namespace Mear.Views
|
|||||||
|
|
||||||
private void Download_Clicked(object sender, EventArgs e)
|
private void Download_Clicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
var act = ToolbarItems.Where(tl => tl.Priority == 1).First();
|
||||||
|
ToolbarItems.Remove(act);
|
||||||
var songRepo = new RemoteSongRepository();
|
var songRepo = new RemoteSongRepository();
|
||||||
songRepo.DownloadSong(_song);
|
songRepo.DownloadSong(_song);
|
||||||
|
ToolbarItems.Add(RemoveOption());
|
||||||
}
|
}
|
||||||
private async void Remove_Clicked(object sender, EventArgs e)
|
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 dbSongRepo = new DBSongRepository();
|
||||||
var plyCount = new DBPlayCountRepository();
|
var plyCount = new DBPlayCountRepository();
|
||||||
dbSongRepo.DeleteSong(_song);
|
dbSongRepo.DeleteSong(_song);
|
||||||
@@ -193,6 +213,8 @@ namespace Mear.Views
|
|||||||
_song.Downloaded = false;
|
_song.Downloaded = false;
|
||||||
|
|
||||||
File.Delete(_song.SongPath);
|
File.Delete(_song.SongPath);
|
||||||
|
|
||||||
|
ToolbarItems.Add(DownloadOption());
|
||||||
}
|
}
|
||||||
private async void PlayCount_Clicked(object sender, EventArgs e)
|
private async void PlayCount_Clicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
IsPullToRefreshEnabled="True"
|
IsPullToRefreshEnabled="True"
|
||||||
RowHeight="75"
|
RowHeight="75"
|
||||||
RefreshCommand="{Binding RefreshSongs}"
|
RefreshCommand="{Binding RefreshSongs}"
|
||||||
|
IsRefreshing="{Binding IsRefreshing}"
|
||||||
ItemSelected="SongListView_ItemSelected" >
|
ItemSelected="SongListView_ItemSelected" >
|
||||||
<ListView.ItemTemplate>
|
<ListView.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using MediaManager;
|
|||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
using Xamarin.Forms.Xaml;
|
using Xamarin.Forms.Xaml;
|
||||||
|
|
||||||
|
using Mear.Constants;
|
||||||
using Mear.Models;
|
using Mear.Models;
|
||||||
using Mear.Playback;
|
using Mear.Playback;
|
||||||
using Mear.Repositories.Database;
|
using Mear.Repositories.Database;
|
||||||
@@ -54,11 +55,11 @@ namespace Mear.Views
|
|||||||
var song = (Song)SongListView.SelectedItem;
|
var song = (Song)SongListView.SelectedItem;
|
||||||
if (song.Downloaded)
|
if (song.Downloaded)
|
||||||
{
|
{
|
||||||
await MearPlayer.PlaySong(song);
|
await MearPlayer.ControlMusic(song, PlayControls.PLAYOFFLINE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
song = await MearPlayer.StreamSongDemoAsync(song);
|
song = await MearPlayer.ControlMusic(song, PlayControls.STREAM);
|
||||||
var plyCountRepo = new DBPlayCountRepository();
|
var plyCountRepo = new DBPlayCountRepository();
|
||||||
plyCountRepo.AffectPlayCount(song);
|
plyCountRepo.AffectPlayCount(song);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user