@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user