Skip to content

Commit

Permalink
fix #203, fixed musixmatch lyrics fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
theweavr committed Nov 15, 2017
1 parent afab809 commit 9a9f6df
Show file tree
Hide file tree
Showing 10 changed files with 94 additions and 50 deletions.
55 changes: 33 additions & 22 deletions BreadPlayer.Core/Engines/BASSEngine/BASSPlayerEngine.cs
Expand Up @@ -105,40 +105,51 @@ public async void Dispose()
public async Task ChangeDevice(string deviceName = null)
{
if (deviceName != null)
await InitializeSwitch.NotificationManager.ShowMessageAsync($"Transitioning to {deviceName}.", 5);
await InitializeSwitch.NotificationManager.ShowStatusBarMessageAsync($"Transitioning to {deviceName}.");

await Task.Run(() =>
await Task.Run(async () =>
{
var count = Bass.DeviceCount;
for (var i = 0; i < count; i++)
try
{
var deviceInfo = Bass.GetDeviceInfo(i);
if (deviceInfo.IsDefault && deviceInfo.IsEnabled)
var count = Bass.DeviceCount;
for (var i = 0; i < count; i++)
{
var isPlaying = PlayerState == PlayerState.Playing;
if (isPlaying)
var deviceInfo = Bass.GetDeviceInfo(i);
if (deviceInfo.IsDefault && deviceInfo.IsEnabled)
{
Bass.ChannelPause(_handle);
PlayerState = PlayerState.Paused;
}
var isPlaying = PlayerState == PlayerState.Playing;
if (isPlaying)
{
Bass.ChannelPause(_handle);
PlayerState = PlayerState.Paused;
}
if (InitializeSwitch.IsMobile)
NativeMethods.BASS_SetConfig(NativeMethods.BassConfigDevBuffer, (int)DeviceBufferSize);
if (InitializeSwitch.IsMobile)
NativeMethods.BASS_SetConfig(NativeMethods.BassConfigDevBuffer, (int)DeviceBufferSize);
Bass.Init();
Bass.ChannelSetDevice(_handle, i);
if (isPlaying)
{
Bass.ChannelPlay(_handle);
PlayerState = PlayerState.Playing;
Bass.Init();
Bass.ChannelSetDevice(_handle, i);
if (isPlaying)
{
Bass.ChannelPlay(_handle);
PlayerState = PlayerState.Playing;
}
return;
}
return;
}
}
catch(Exception ex)
{
BLogger.E($"Transition failed.", ex);
await InitializeSwitch.NotificationManager.ShowStatusBarMessageAsync($"Failed to transtion. Reason: {Bass.LastError}");
}
finally
{
if (deviceName != null)
await InitializeSwitch.NotificationManager.ShowStatusBarMessageAsync($"Transition to {deviceName} complete.");
}
});

if (deviceName != null)
await InitializeSwitch.NotificationManager.ShowMessageAsync($"Transition to {deviceName} complete.", 5);
}
public async Task<bool> LoadURLAsync(Mediafile mediafile, string uri)
{
Expand Down
3 changes: 2 additions & 1 deletion BreadPlayer.Core/Engines/BASSEngine/BassEqualizer.cs
Expand Up @@ -5,6 +5,7 @@
using ManagedBass;
using ManagedBass.Fx;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

Expand All @@ -23,7 +24,7 @@ public BassEqualizer(int coreHandle)
IsPreampAvailable = true;

Bands = new ObservableCollection<IEqualizerBand>();
Presets = new ObservableCollection<IEqualizerSettings>(new ConfigSaver().GetSettings());
Presets = new ObservableCollection<EqualizerSettings>((IEnumerable<EqualizerSettings>)new ConfigSaver().GetSettings());
EqualizerSettings = InitializeSwitch.EqualizerSettingsHelper.LoadEqualizerSettings("CustomEq").settings;
Name = EqualizerSettings.Name;
SelectedPreset = Presets.IndexOf(Presets.FirstOrDefault(t => t.Name == EqualizerSettings.Name));
Expand Down
2 changes: 1 addition & 1 deletion BreadPlayer.Core/Engines/Interfaces/IEqualizer.cs
Expand Up @@ -23,7 +23,7 @@ public abstract class Equalizer : ObservableObject
new[] {16000f, 1f, 0f }
};
public IEqualizerSettings EqualizerSettings { get; set; }
public ObservableCollection<IEqualizerSettings> Presets { get; set; }
public ObservableCollection<EqualizerSettings> Presets { get; set; }
private int _selectedPreset = -1;

public int SelectedPreset
Expand Down
2 changes: 1 addition & 1 deletion BreadPlayer.Interfaces/INotificationManager.cs
Expand Up @@ -8,7 +8,7 @@ public interface INotificationManager
Task ShowMessageBoxAsync(string message, string title);

Task ShowMessageAsync(string message, int duration = 10);

Task ShowStatusBarMessageAsync(string message);
void SendUpcomingSongNotification(IMediafile mediaFile);
}
}
22 changes: 21 additions & 1 deletion BreadPlayer.Views.UWP/Common/NotificationManager.cs
Expand Up @@ -9,9 +9,11 @@
using System.Threading.Tasks;
using Windows.ApplicationModel.Core;
using Windows.Data.Xml.Dom;
using Windows.Foundation.Metadata;
using Windows.UI.Core;
using Windows.UI.Notifications;
using Windows.UI.Popups;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;

namespace BreadPlayer.NotificationManager
Expand All @@ -22,7 +24,7 @@ public class BreadNotificationManager : ObservableObject, INotificationManager
private ICommand _closeCommand;
private DispatcherTimer _hideTimer;
private string _status = string.Empty;

private StatusBar statusBar;
public ICommand CloseCommand
{
get => _closeCommand ?? (_closeCommand = new DelegateCommand(HideStaticMessage));
Expand Down Expand Up @@ -120,5 +122,23 @@ private async void HideTimer_Tick(object sender, object e)
await ShowMessageAsync(NotificationQueue.Dequeue()).ConfigureAwait(false);
}
}

public async Task ShowStatusBarMessageAsync(string message)
{
if (ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract", 1))
{
await BreadDispatcher.InvokeAsync(async () =>
{
if(statusBar == null)
statusBar = Windows.UI.ViewManagement.StatusBar.GetForCurrentView();
await statusBar.ShowAsync();
statusBar.ProgressIndicator.Text = message;
await statusBar.ProgressIndicator.ShowAsync();
await Task.Delay(3000);
await statusBar.ProgressIndicator.HideAsync();
await statusBar.HideAsync();
});
}
}
}
}
4 changes: 2 additions & 2 deletions BreadPlayer.Views.UWP/Helpers/SettingsHelper.cs
Expand Up @@ -32,7 +32,7 @@ public static T GetLocalSetting<T>(string key, object def)
public (IEqualizerSettings settings, float PreAMP) LoadEqualizerSettings(string eqConfigName)
{
var eqJson = GetRoamingSetting<string>(eqConfigName, "{}");
var settings = JsonConvert.DeserializeObject<IEqualizerSettings>(eqJson);
var settings = JsonConvert.DeserializeObject<EqualizerSettings>(eqJson);
return (settings, GetRoamingSetting<float>("PreAMP", 1.0f));
}

Expand All @@ -51,7 +51,7 @@ public void SaveEqualizerPresets(IEnumerable<IEqualizerSettings> presets)

public IEnumerable<IEqualizerSettings> LoadEqualizerPresets()
{
var presets = JsonConvert.DeserializeObject<IEnumerable<IEqualizerSettings>>(GetLocalSetting<string>("Presets", "[]"));
var presets = JsonConvert.DeserializeObject<IEnumerable<EqualizerSettings>>(GetLocalSetting<string>("Presets", "[]"));
return presets;
}
}
Expand Down
11 changes: 7 additions & 4 deletions BreadPlayer.Views.UWP/ViewModels/ShellViewModel.cs
Expand Up @@ -103,6 +103,7 @@ public ShellViewModel()
PropertyChanged += ShellViewModel_PropertyChanged;
SharedLogic.Instance.Player.MediaAboutToEnd += Player_MediaAboutToEnd;
SharedLogic.Instance.Player.MediaChanging += OnMediaChanging;

//these events are for detecting when the default audio
//device is changed in PC and Mobile.
if (ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract", 1))
Expand Down Expand Up @@ -647,7 +648,10 @@ private Mediafile GetNextOrPrevSongInGroup(bool prev = false)

//get next/prev group index
int nextGroupIndex = prev ? TracksCollection.IndexOf(currentGroup) - 1 : TracksCollection.IndexOf(currentGroup) + 1;

if (nextGroupIndex >= TracksCollection.Count - 1)
{
nextGroupIndex = 0;
}
//get next/prev group.
Grouping<IGroupKey, Mediafile> nextGroup = nextGroupCondition ? TracksCollection.ElementAt(nextGroupIndex) : currentGroup;

Expand Down Expand Up @@ -760,16 +764,15 @@ private async void Open(object para)
#region Events

private int eventCount = 0; //used in AudioEndpointChangedEvent

private void OnAudioEndpointChanged(AudioRoutingManager sender, object args)
private async void OnAudioEndpointChanged(AudioRoutingManager sender, object args)
{
var currentEndpoint = sender.GetAudioEndpoint();
//when this event is initialized, it is invoked 2 times.
//to avoid changing the device at that time, we use this statement.
if (eventCount > 1)
{
BLogger.I($"Switching audio render device to [{currentEndpoint.ToString()}].");
SharedLogic.Instance.Player.ChangeDevice(currentEndpoint.ToString());
await SharedLogic.Instance.Player.ChangeDevice(currentEndpoint.ToString());
}
//increase the event count
eventCount += 1;
Expand Down
2 changes: 1 addition & 1 deletion BreadPlayer.Web/Musixmatch/HttpHelper.cs
Expand Up @@ -16,7 +16,7 @@ public static HttpClient MusixmatchHttpClient
{
if (musixmatchHttpClient == null)
{
musixmatchHttpClient = new HttpClient();
musixmatchHttpClient = new HttpClient(new HttpClientHandler() { AllowAutoRedirect = false});
musixmatchHttpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Musixmatch/0.19.4 Chrome/56.0.2924.87 Electron/1.6.10 Safari/537.36");
musixmatchHttpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
}
Expand Down
41 changes: 24 additions & 17 deletions BreadPlayer.Web/Musixmatch/MusixmatchClient.cs
Expand Up @@ -9,31 +9,38 @@
using System.IO.Compression;
using Newtonsoft.Json;
using BreadPlayer.Web.Musixmatch.Models;
using RestSharp.Portable.HttpClient;
using RestSharp.Portable;

namespace BreadPlayer.Web.Musixmatch
{
public class MusixmatchClient : ILyricAPI
{
public async Task<string> FetchLyrics(Mediafile mediaFile)
{
HttpHelper.MusixmatchHttpClient.CancelPendingRequests();
string requestURI = string.Format(@"http://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&q_track={0}&q_artist={1}&q_album={2}&user_language=en&f_subtitle_length=0&f_subtitle_length_max_deviation=0&subtitle_format=lrc&app_id=web-desktop-app-v1.0&usertoken=1710149d15ba9db2a5a545aadd4f93928e90c783ab83565d105693", mediaFile.Title, mediaFile.LeadArtist, mediaFile.Album);
{
string requestURI = string.Format(@"https://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&q_track={0}&q_artist={1}&q_album={2}&user_language=en&f_subtitle_length=0&f_subtitle_length_max_deviation=0&subtitle_format=lrc&app_id=web-desktop-app-v1.0&guid=e08e6c63-edd1-4207-86dc-d350cdf7f4bc&usertoken=1710144894f79b194e5a5866d9e084d48f227d257dcd8438261277", mediaFile.Title, mediaFile.LeadArtist, mediaFile.Album);

//Send to the server
var result = await HttpHelper.MusixmatchHttpClient.GetAsync(requestURI);
if (!result.IsSuccessStatusCode)
return null;
//Read the content of the result response from the server
using (Stream stream = await result.Content.ReadAsStreamAsync())
using (Stream decompressed = new GZipStream(stream, CompressionMode.Decompress))
using (StreamReader reader = new StreamReader(decompressed))
using (var client = new RestClient(requestURI))
{
var request = new RestRequest(Method.GET);
request.AddHeader("connection", "keep-alive");
request.AddHeader("cookie", "x-mxm-user-id=; x-mxm-token-guid=e08e6c63-edd1-4207-86dc-d350cdf7f4bc; mxm-encrypted-token=; AWSELB=55578B011601B1EF8BC274C33F9043CA947F99DCFF6AB1B746DBF1E96A6F2B997493EE03F2DD5F516C3BC8E8DE7FE9C81FF414E8E76CF57330A3F26A0D86825F74794F3C94");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36");
request.AddHeader("upgrade-insecure-requests", "1");
request.AddHeader("accept-language", "en-US,en;q=0.8");
request.AddHeader("accept-encoding", "gzip, deflate");
request.AddHeader("dnt", "1");
IRestResponse response = await client.Execute(request);
try
{
var json = await reader.ReadToEndAsync().ConfigureAwait(false);
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
settings.MissingMemberHandling = MissingMemberHandling.Ignore;
var json = response.Content;
JsonSerializerSettings settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
var lyrics = JsonConvert.DeserializeObject<Lyrics>(json, settings).Message?.Body?.MacroCalls?.Subtitles?.Message?.Body?.SubtitleList;
if (lyrics?.Any() == true)
{
Expand All @@ -42,11 +49,11 @@ public async Task<string> FetchLyrics(Mediafile mediaFile)
else
return null;
}
catch(JsonSerializationException)
catch (JsonSerializationException)
{
return null;
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions BreadPlayer.Web/project.json
Expand Up @@ -2,6 +2,8 @@
"supports": {},
"dependencies": {
"AngleSharp": "0.9.9",
"FubarCoder.RestSharp.Portable": "3.3.0",
"FubarCoder.RestSharp.Portable.HttpClient": "4.0.8",
"Inflatable.Lastfm": "1.0.1.307",
"LiteDB": "4.0.0",
"Microsoft.NETCore.Portable.Compatibility": "1.0.1",
Expand Down

0 comments on commit 9a9f6df

Please sign in to comment.