204 lines
6.4 KiB
C#
204 lines
6.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using FireSharp.Interfaces;
|
|
using FireSharp.Config;
|
|
using FireSharp;
|
|
using Newtonsoft.Json;
|
|
using System.Configuration;
|
|
using Herse.Models;
|
|
|
|
namespace KaraokePlayer.Classes
|
|
{
|
|
public class FirebaseController
|
|
{
|
|
private IFirebaseConfig config = new FirebaseConfig
|
|
{
|
|
AuthSecret = ConfigurationManager.AppSettings["Firebase.Secret"],
|
|
BasePath = ConfigurationManager.AppSettings["Firebase.Path"]
|
|
};
|
|
private string _state = "play";
|
|
private IFirebaseClient _client;
|
|
private ControllerStateChangedEventHandler _stateChanged;
|
|
private ControllerSongChangedEventHandler _songChanged;
|
|
private ControllerPlayQueueChangedEventHandler _playQueueChanged;
|
|
|
|
private string StatePath
|
|
{
|
|
get { return string.Format("controllers/{0}/state/", this.Id); }
|
|
}
|
|
private string PlayQueuePath
|
|
{
|
|
get { return string.Format("controllers/{0}/queue/", this.Id); }
|
|
}
|
|
private string CurrentSongPath
|
|
{
|
|
get { return string.Format("controllers/{0}/queue/0/", this.Id); }
|
|
}
|
|
|
|
public string Id { get; set; }
|
|
public Song CurrentSong { get; set; }
|
|
public List<Song> PlayQueue { get; set; }
|
|
|
|
public string State {
|
|
get { return State; }
|
|
set {
|
|
_state = value;
|
|
Update(string.Format("controllers/{0}", this.Id), new { state = _state });
|
|
}
|
|
}
|
|
|
|
public FirebaseController(string clientId, ControllerStateChangedEventHandler stateChanged, ControllerSongChangedEventHandler songChanged, ControllerPlayQueueChangedEventHandler playQueueChanged)
|
|
{
|
|
Id = clientId;
|
|
_stateChanged = stateChanged;
|
|
_songChanged = songChanged;
|
|
_playQueueChanged = playQueueChanged;
|
|
PlayQueue = new List<Song>();
|
|
_client = new FirebaseClient(config);
|
|
Reset();
|
|
SetupListener();
|
|
}
|
|
|
|
public void NextSong()
|
|
{
|
|
Song song = PlayQueue.FirstOrDefault();
|
|
Stop();
|
|
if(song != null) { PlaySong(song); }
|
|
}
|
|
|
|
public void PlaySong(Song song) { Update(string.Format("Controllers/{0}", this.Id), new { CurrentSong = song }); }
|
|
|
|
public void Next() { this.State = "next"; }
|
|
|
|
public void Play() { this.State = "play"; }
|
|
|
|
public void Stop() { this.State = "stop"; }
|
|
|
|
public void Pause() { this.State = "pause"; }
|
|
|
|
private void Delete(string path) { _client.DeleteAsync(path); }
|
|
|
|
private void Update(string path, object data) { _client.UpdateAsync(path, data); }
|
|
|
|
private void Reset()
|
|
{
|
|
Stop();
|
|
Delete(PlayQueuePath);
|
|
Delete(CurrentSongPath);
|
|
}
|
|
|
|
private async void SetupListener()
|
|
{
|
|
await _client.OnAsync(CurrentSongPath,
|
|
added: (s, args, obj) =>
|
|
{
|
|
Console.WriteLine("added " + args.Path + " " + args.Data);
|
|
CurrentSongDidChange();
|
|
},
|
|
removed: (s, args, obj) =>
|
|
{
|
|
//TODO: the current song was removed from the queue
|
|
}
|
|
);
|
|
|
|
await _client.OnAsync(StatePath,
|
|
added: (s, args, obj) =>
|
|
{
|
|
Console.WriteLine("state added");
|
|
StateDidChange(args.Data);
|
|
},
|
|
changed: (s, args, obj) =>
|
|
{
|
|
Console.WriteLine("state changed");
|
|
StateDidChange(args.Data);
|
|
},
|
|
removed: null
|
|
);
|
|
/*
|
|
await _client.OnAsync(PlayQueuePath,
|
|
added: (s, args, obj) =>
|
|
{
|
|
Console.WriteLine(args.Path);
|
|
if (args.Path.Contains("Id"))
|
|
{
|
|
PlayQueueDidChange();
|
|
}
|
|
},
|
|
changed: (s, args, obj) =>
|
|
{
|
|
if (args.Path.Contains("Id"))
|
|
{
|
|
PlayQueueDidChange();
|
|
}
|
|
},
|
|
removed: (s, args, obj) =>
|
|
{
|
|
PlayQueueDidChange();
|
|
}
|
|
);
|
|
|
|
await _client.OnAsync(StatePath,
|
|
added: (s, args, obj) =>
|
|
{
|
|
StateDidChange(args.Data);
|
|
},
|
|
changed: (s, args, obj) =>
|
|
{
|
|
StateDidChange(args.Data);
|
|
},
|
|
removed: null
|
|
);
|
|
*/
|
|
}
|
|
|
|
private void PlayQueueDidChange()
|
|
{
|
|
bool autoPlay = PlayQueue.Count() == 0;
|
|
var response = _client.Get(PlayQueuePath);
|
|
var dict = response.ResultAs<Dictionary<string, Song>>();
|
|
|
|
PlayQueue.Clear();
|
|
if (dict != null && dict.Count() > 0)
|
|
{
|
|
var array = dict.Values.ToArray();
|
|
PlayQueue.AddRange(array);
|
|
if (autoPlay)
|
|
{
|
|
NextSong();
|
|
}
|
|
}
|
|
if (_playQueueChanged != null) { _playQueueChanged(); }
|
|
}
|
|
|
|
private void CurrentSongDidChange()
|
|
{
|
|
var item = _client.Get(CurrentSongPath).ResultAs<QueueItem>();
|
|
if (item == null) return;
|
|
if (CurrentSong == null || CurrentSong.Path != item.Song.Path)
|
|
{
|
|
CurrentSong = item.Song;
|
|
_songChanged(new ControllerSongChangedEventArgs(item.Song));
|
|
}
|
|
}
|
|
|
|
private void StateDidChange(string state)
|
|
{
|
|
_state = state;
|
|
switch(state)
|
|
{
|
|
case "pause":
|
|
_stateChanged(new ControllerStateChangedEventArgs(PlayerState.Pause));
|
|
break;
|
|
case "stop":
|
|
_stateChanged(new ControllerStateChangedEventArgs(PlayerState.Stop));
|
|
break;
|
|
case "play":
|
|
_stateChanged(new ControllerStateChangedEventArgs(PlayerState.Play));
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|