Implemented shuffling. #23 #34

This commit is contained in:
amazing-username
2019-06-21 18:36:32 -07:00
parent 3923f81ed4
commit 64c2b3a692
7 changed files with 245 additions and 22 deletions
+49
View File
@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Newtonsoft.Json;
using RestSharp;
using Mear.Constants.API;
using Mear.Models;
using Mear.Repositories.Database;
namespace Mear.Managers
{
public class SongManager
{
#region Methods
public bool DownloadStream(ref Song song)
{
try
{
using (var writer = File.OpenWrite(song.SongPath))
{
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);
return true;
}
}
catch (Exception ex)
{
var msg = ex.Message;
}
return false;
}
#endregion
}
}
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Mear.Models.PlayerControls
{
public enum Shuffle
{
Off = 0,
All
}
}
+149 -17
View File
@@ -12,6 +12,7 @@ using RestSharp;
using Mear.Constants; using Mear.Constants;
using Mear.Constants.API; using Mear.Constants.API;
using Mear.Managers;
using Mear.Models; using Mear.Models;
using Mear.Models.Authentication; using Mear.Models.Authentication;
using Mear.Models.PlayerControls; using Mear.Models.PlayerControls;
@@ -87,7 +88,7 @@ namespace Mear.Playback
case PlayControls.PLAYOFFLINE: case PlayControls.PLAYOFFLINE:
DeterminePlayType(); DeterminePlayType();
var plyCountRepo = new DBPlayCountRepository(); var plyCountRepo = new DBPlayCountRepository();
plyCountRepo.AffectPlayCount(song); plyCountRepo.AffectPlayCount(_song);
InitializeRepeatMode(); InitializeRepeatMode();
break; break;
case PlayControls.PAUSE: case PlayControls.PAUSE:
@@ -98,21 +99,31 @@ namespace Mear.Playback
break; break;
case PlayControls.STREAM: case PlayControls.STREAM:
InitializeRepeatMode(); InitializeRepeatMode();
return StreamSong(song); return StreamSong().Result; ;
case PlayControls.REPEAT: case PlayControls.REPEAT:
ToggleRepeat(); ToggleRepeat();
break; break;
case PlayControls.SHUFFLE: case PlayControls.SHUFFLE:
// TODO: Implement shuffling ToggleShuffle();
break; break;
case PlayControls.NEXT: case PlayControls.NEXT:
_song = _mearQueue.ToArray()[++QueueIndex]; var res = DetermineControlFlow();
if (!res)
{
QueueIndex++;
}
_song = _mearQueue.ToArray()[QueueIndex];
DeterminePlayType(); DeterminePlayType();
_songChanged[MusicViews.Player] = true; _songChanged[MusicViews.Player] = true;
break; break;
case PlayControls.PREVIOUS: case PlayControls.PREVIOUS:
_song = _mearQueue.ToArray()[--QueueIndex]; var prevRes = DetermineControlFlow();
if (!prevRes)
{
QueueIndex--;
}
_song = _mearQueue.ToArray()[QueueIndex];
DeterminePlayType(); DeterminePlayType();
_songChanged[MusicViews.Player] = true; _songChanged[MusicViews.Player] = true;
@@ -218,13 +229,13 @@ namespace Mear.Playback
{ {
var controlRepo = new DBMusicControlsRepository(); var controlRepo = new DBMusicControlsRepository();
var shuffleOn = controlRepo.IsShuffleOn(); var shuffleOn = controlRepo.IsShuffleOn();
try
switch (shuffleOn)
{ {
return shuffleOn ? "ShfOn" : "ShfOff"; case Shuffle.Off:
} return "ShfOff";
catch (Exception ex) case Shuffle.All:
{ return "ShfOn";
var msg = ex.Message;
} }
return string.Empty; return string.Empty;
@@ -253,6 +264,37 @@ namespace Mear.Playback
InitializeRepeatMode(); InitializeRepeatMode();
} }
private static Task<Song> StreamSong()
{
var tmpFile = Path.GetTempPath() + "track.mp3";
if (File.Exists(tmpFile))
File.Delete(tmpFile);
try
{
var songMgr = new SongManager();
_song.SongPath = tmpFile;
var downloaded = songMgr.DownloadStream(ref _song);
if (downloaded)
{
PlaySong();
}
return Task.Run(() =>
{
return _song;
});
}
catch (Exception ex)
{
var msg = ex.Message;
}
return null;
}
private static Song StreamSong(Song song) private static Song StreamSong(Song song)
{ {
string tmpFile = Path.GetTempPath() + "track.mp3"; string tmpFile = Path.GetTempPath() + "track.mp3";
@@ -294,15 +336,67 @@ namespace Mear.Playback
return null; return null;
} }
private static bool DetermineControlFlow()
{
var ctrlRepo = new DBMusicControlsRepository();
var repeatMode = ctrlRepo.IsRepeatOn();
var repRes = DetermineControlFlow(repeatMode);
if (repRes)
{
return true;
}
var shuffleMode = ctrlRepo.IsShuffleOn();
var shfRes = DetermineControlFlow(shuffleMode);
if (shfRes)
{
return true;
}
else
{
return false;
}
}
private static bool DetermineControlFlow(Repeat repeatMode)
{
switch (repeatMode)
{
case Repeat.ONE:
CrossMediaManager.Current.SeekToStart();
PlaySong();
return true;
case Repeat.ALL:
PlaySong();
return true;
}
return false;
}
private static bool DetermineControlFlow(Shuffle shuffleMode)
{
switch (shuffleMode)
{
case Shuffle.Off:
return false;
case Shuffle.All:
var rnd = new Random();
var rando = rnd.Next(QueueCount);
QueueIndex = rando;
return true;
}
return false;
}
private static void DeterminePlayType() private static void DeterminePlayType()
{ {
if (!_song.Downloaded) if (!_song.Downloaded)
{ {
StreamSong(_song); StreamSong();
} }
else else
{ {
PlaySong(_song.SongPath); PlaySong();
} }
} }
private static void InitializeModes() private static void InitializeModes()
@@ -322,6 +416,20 @@ namespace Mear.Playback
{ {
await CrossMediaManager.Current.Pause(); await CrossMediaManager.Current.Pause();
} }
private static async Task PlaySong()
{
await CrossMediaManager.Current.Play(_song.SongPath);
if (_initialized == null)
{
CrossMediaManager.Current.MediaItemFinished += Current_MediaItemFinished;
_initialized = true;
}
_songChanged[MusicViews.Song] = true;
_songChanged[MusicViews.Album] = true;
_songChanged[MusicViews.Artist] = true;
}
private static async Task PlaySong(string songPath) private static async Task PlaySong(string songPath)
{ {
await CrossMediaManager.Current.Play(songPath); await CrossMediaManager.Current.Play(songPath);
@@ -347,6 +455,14 @@ namespace Mear.Playback
CrossMediaManager.Current.RepeatMode = RepeatUtility.RetrieveRepeatMode(repeatMode); CrossMediaManager.Current.RepeatMode = RepeatUtility.RetrieveRepeatMode(repeatMode);
} }
private static void ToggleShuffle()
{
var musicCtrl = new DBMusicControlsRepository();
musicCtrl.UpdateShuffle();
var shuffleMode = musicCtrl.IsShuffleOn();
CrossMediaManager.Current.ShuffleMode = ShuffleUtility.RetrieveShuffleMode(shuffleMode);
}
#region Background #region Background
private static async Task BackgroundWork() private static async Task BackgroundWork()
@@ -371,6 +487,8 @@ namespace Mear.Playback
var ctrlRepo = new DBMusicControlsRepository(); var ctrlRepo = new DBMusicControlsRepository();
var repeatMode = ctrlRepo.IsRepeatOn(); var repeatMode = ctrlRepo.IsRepeatOn();
DetermineControlFlow();
switch(repeatMode) switch(repeatMode)
{ {
case Repeat.ONE: case Repeat.ONE:
@@ -383,14 +501,28 @@ namespace Mear.Playback
return; return;
} }
var song = _mearQueue.ToArray()[++QueueIndex]; var shuffleMode = ctrlRepo.IsShuffleOn();
if (song.Downloaded)
switch (shuffleMode)
{ {
PlaySong(song.SongPath); case Shuffle.Off:
QueueIndex++;
break;
case Shuffle.All:
Random rnd = new Random();
var rando = rnd.Next(QueueCount);
QueueIndex = rando;
break;
}
_song = _mearQueue.ToArray()[QueueIndex];
if (_song.Downloaded)
{
PlaySong();
} }
else else
{ {
StreamSong(song); StreamSong();
} }
_songChanged[MusicViews.Player] = true; _songChanged[MusicViews.Player] = true;
@@ -28,7 +28,7 @@ namespace Mear.Repositories.Database
#region Methods #region Methods
public bool IsShuffleOn() public Shuffle IsShuffleOn()
{ {
try try
{ {
@@ -38,7 +38,7 @@ namespace Mear.Repositories.Database
if (shuffle != null) if (shuffle != null)
{ {
return shuffle.Value; ; return shuffle.Value ? Shuffle.All : Shuffle.Off;
} }
} }
} }
@@ -47,7 +47,7 @@ namespace Mear.Repositories.Database
var msg = ex.Message; var msg = ex.Message;
} }
return false; return Shuffle.Off;
} }
public Repeat IsRepeatOn() public Repeat IsRepeatOn()
{ {
+28
View File
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Text;
using MediaManager;
using Mear.Models.PlayerControls;
namespace Mear.Utilities
{
public class ShuffleUtility
{
#region Methods
public static MediaManager.Queue.ShuffleMode RetrieveShuffleMode(Shuffle shuffleMode)
{
switch (shuffleMode)
{
case Shuffle.Off:
return MediaManager.Queue.ShuffleMode.Off;
case Shuffle.All:
return MediaManager.Queue.ShuffleMode.All;
}
return MediaManager.Queue.ShuffleMode.Off;
}
#endregion
}
}
+3 -2
View File
@@ -250,8 +250,9 @@ namespace Mear.Views
} }
private void Shuffle_Clicked(object sender, EventArgs e) private void Shuffle_Clicked(object sender, EventArgs e)
{ {
var musicCtrl = new DBMusicControlsRepository(); //var musicCtrl = new DBMusicControlsRepository();
musicCtrl.UpdateShuffle(); //musicCtrl.UpdateShuffle();
MearPlayer.ControlMusic(null, PlayControls.SHUFFLE);
Shuffle.Text = MearPlayer.RetrieveShuffleString(); Shuffle.Text = MearPlayer.RetrieveShuffleString();
} }
+1
View File
@@ -150,6 +150,7 @@ namespace Mear.Views
try try
{ {
var song = (Song)SongListView.SelectedItem; var song = (Song)SongListView.SelectedItem;
MearPlayer.OnSong = song;
if (song.Downloaded) if (song.Downloaded)
{ {
await MearPlayer.ControlMusic(song, PlayControls.PLAYOFFLINE); await MearPlayer.ControlMusic(song, PlayControls.PLAYOFFLINE);