From b39a3b5972d241b95f7b0bd65a31fad27e6ed9eb Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Sun, 24 Jul 2016 10:51:49 -0500 Subject: [PATCH] added client for testing Signed-off-by: Matt Bruce --- KaraokePlayer.sln | 12 + KaraokePlayer/Classes/FirebaseController.cs | 65 ++++-- KaraokePlayer/Classes/Interfaces.cs | 1 + KaraokePlayer/Classes/PlayerDelegates.cs | 1 + KaraokePlayer/MainForm.cs | 7 +- TestSelector/App.config | 6 + TestSelector/Classes/Enums.cs | 21 ++ TestSelector/Classes/FirebaseController.cs | 216 ++++++++++++++++++ TestSelector/Classes/Interfaces.cs | 32 +++ TestSelector/Classes/PlayerDelegates.cs | 39 ++++ TestSelector/Form1.Designer.cs | 175 ++++++++++++++ TestSelector/Form1.cs | 158 +++++++++++++ TestSelector/Form1.resx | 123 ++++++++++ TestSelector/Program.cs | 22 ++ TestSelector/Properties/AssemblyInfo.cs | 36 +++ TestSelector/Properties/Resources.Designer.cs | 71 ++++++ TestSelector/Properties/Resources.resx | 117 ++++++++++ TestSelector/Properties/Settings.Designer.cs | 30 +++ TestSelector/Properties/Settings.settings | 7 + TestSelector/TestSelector.csproj | 133 +++++++++++ TestSelector/packages.config | 9 + 21 files changed, 1255 insertions(+), 26 deletions(-) create mode 100644 TestSelector/App.config create mode 100644 TestSelector/Classes/Enums.cs create mode 100644 TestSelector/Classes/FirebaseController.cs create mode 100644 TestSelector/Classes/Interfaces.cs create mode 100644 TestSelector/Classes/PlayerDelegates.cs create mode 100644 TestSelector/Form1.Designer.cs create mode 100644 TestSelector/Form1.cs create mode 100644 TestSelector/Form1.resx create mode 100644 TestSelector/Program.cs create mode 100644 TestSelector/Properties/AssemblyInfo.cs create mode 100644 TestSelector/Properties/Resources.Designer.cs create mode 100644 TestSelector/Properties/Resources.resx create mode 100644 TestSelector/Properties/Settings.Designer.cs create mode 100644 TestSelector/Properties/Settings.settings create mode 100644 TestSelector/TestSelector.csproj create mode 100644 TestSelector/packages.config diff --git a/KaraokePlayer.sln b/KaraokePlayer.sln index 8f52ca3..be89bcd 100644 --- a/KaraokePlayer.sln +++ b/KaraokePlayer.sln @@ -13,6 +13,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KaraokePlayer", "KaraokePla EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CdgPlayer", "CdgPlayer\CdgPlayer.csproj", "{A5324295-6BD2-4415-92CD-6EA77D708E00}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApplication1", "ConsoleApplication1\ConsoleApplication1.csproj", "{19F06EDF-92BA-40A9-BBFC-1DA75C894059}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestSelector", "TestSelector\TestSelector.csproj", "{B81665BC-A207-47F5-BBF4-2DE59965325F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,6 +35,14 @@ Global {A5324295-6BD2-4415-92CD-6EA77D708E00}.Debug|Any CPU.Build.0 = Debug|Any CPU {A5324295-6BD2-4415-92CD-6EA77D708E00}.Release|Any CPU.ActiveCfg = Release|Any CPU {A5324295-6BD2-4415-92CD-6EA77D708E00}.Release|Any CPU.Build.0 = Release|Any CPU + {19F06EDF-92BA-40A9-BBFC-1DA75C894059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19F06EDF-92BA-40A9-BBFC-1DA75C894059}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19F06EDF-92BA-40A9-BBFC-1DA75C894059}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19F06EDF-92BA-40A9-BBFC-1DA75C894059}.Release|Any CPU.Build.0 = Release|Any CPU + {B81665BC-A207-47F5-BBF4-2DE59965325F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B81665BC-A207-47F5-BBF4-2DE59965325F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B81665BC-A207-47F5-BBF4-2DE59965325F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B81665BC-A207-47F5-BBF4-2DE59965325F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/KaraokePlayer/Classes/FirebaseController.cs b/KaraokePlayer/Classes/FirebaseController.cs index 4f8f250..4ee2576 100644 --- a/KaraokePlayer/Classes/FirebaseController.cs +++ b/KaraokePlayer/Classes/FirebaseController.cs @@ -20,6 +20,7 @@ namespace KaraokePlayer.Classes public string Artist { get; set; } public FileType FileType { get; set; } public string Path { get; set; } + public string Description { get { return Artist + " - " + Title; } } } public class FirebaseController : IController @@ -32,11 +33,12 @@ namespace KaraokePlayer.Classes private IFirebaseClient client; private ControllerStateChangedEventHandler StateChanged; private ControllerSongChangedEventHandler SongChanged; - - public FirebaseController(ControllerStateChangedEventHandler stateChanged, ControllerSongChangedEventHandler songChanged) + private ControllerPlayQueueChangedEventHandler PlayQueueChanged; + public FirebaseController(ControllerStateChangedEventHandler stateChanged, ControllerSongChangedEventHandler songChanged, ControllerPlayQueueChangedEventHandler playQueueChanged) { StateChanged = stateChanged; SongChanged = songChanged; + PlayQueueChanged = playQueueChanged; PlayQueue = new List(); client = new FirebaseClient(config); client.DeleteAsync("controller/state"); @@ -46,15 +48,27 @@ namespace KaraokePlayer.Classes ListenToStream(); } - public int Id { get; set; } + public int Id { get; set; } + public ISong CurrentSong { get; set; } public List PlayQueue { get; set; } public void GetNextSong() { ISong song = PlayQueue.FirstOrDefault(); Stop(); client.DeleteAsync("controller/currentSong"); - client.PushAsync("controller/currentSong", song); + client.PushAsync("controller/currentSong", song); } + + public void PlaySong(ISong song) + { + client.DeleteAsync("controller/currentSong"); + client.PushAsync("controller/currentSong", song); + } + public void AddSongToQueue(ISong song) + { + client.PushAsync("controller/playQueue", song); + } + public void RemoveSong(ISong song) { ISong found = PlayQueue.FirstOrDefault(s => s.Id == song.Id); @@ -108,27 +122,30 @@ namespace KaraokePlayer.Classes removed: null ); - await client.OnAsync("controller/playQueue", - added: (s, args, obj) => - { - if (args.Path.Contains("Id")) - { - ReloadPlayQueue(); - } - }, - changed: (s, args, obj) => - { - if (args.Path.Contains("Id")) - { - ReloadPlayQueue(); - } - }, - removed: null - ); + await client.OnAsync("controller/playQueue", + added: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + ReloadPlayQueue(); + } + }, + changed: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + ReloadPlayQueue(); + } + }, + removed: (s, args, obj) => + { + ReloadPlayQueue(); + } + ); await client.OnAsync("controller/state", added: (s, args, obj) => - { + { RemoteStateChanged(args.Data); }, changed: (s, args, obj) => @@ -160,6 +177,7 @@ namespace KaraokePlayer.Classes GetNextSong(); } } + if (PlayQueueChanged != null) { PlayQueueChanged(); } } private void CurrentSongChanged() @@ -170,6 +188,7 @@ namespace KaraokePlayer.Classes var song = dict.Values.FirstOrDefault(); if (song != null) { + CurrentSong = song; SongChanged(new ControllerSongChangedEventArgs(false, song)); } } @@ -177,7 +196,7 @@ namespace KaraokePlayer.Classes private void RemoteStateChanged(string state) { PlayerState s = PlayerState.Play; - if(state.ToLower() == "pause") + if (state.ToLower() == "pause") { s = PlayerState.Pause; } diff --git a/KaraokePlayer/Classes/Interfaces.cs b/KaraokePlayer/Classes/Interfaces.cs index d628372..bcf947d 100644 --- a/KaraokePlayer/Classes/Interfaces.cs +++ b/KaraokePlayer/Classes/Interfaces.cs @@ -15,6 +15,7 @@ namespace KaraokePlayer.Interfaces string Artist { get; set; } FileType FileType { get; set; } string Path { get; set; } + string Description { get; } } public interface IController diff --git a/KaraokePlayer/Classes/PlayerDelegates.cs b/KaraokePlayer/Classes/PlayerDelegates.cs index df05338..007f3e7 100644 --- a/KaraokePlayer/Classes/PlayerDelegates.cs +++ b/KaraokePlayer/Classes/PlayerDelegates.cs @@ -34,5 +34,6 @@ namespace KaraokePlayer.Classes public delegate void ControllerStateChangedEventHandler(ControllerStateChangedEventArgs args); public delegate void ControllerSongChangedEventHandler(ControllerSongChangedEventArgs args); + public delegate void ControllerPlayQueueChangedEventHandler(); } diff --git a/KaraokePlayer/MainForm.cs b/KaraokePlayer/MainForm.cs index 3672bea..c8004c1 100644 --- a/KaraokePlayer/MainForm.cs +++ b/KaraokePlayer/MainForm.cs @@ -37,9 +37,9 @@ namespace KaraokePlayer controller = new FirebaseController( stateChanged: (args) => { - if(args.State == Enums.PlayerState.Play) + if (args.State == Enums.PlayerState.Play) { - this.Invoke(new Action(()=> { play(); })); + this.Invoke(new Action(() => { play(); })); } else if (args.State == Enums.PlayerState.Pause) { @@ -59,7 +59,8 @@ namespace KaraokePlayer this.Invoke(new Action(() => { stop(); })); currentSong = args.Song; this.Invoke(new Action(() => { previewSong(); })); - } + }, + playQueueChanged: null ); } diff --git a/TestSelector/App.config b/TestSelector/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/TestSelector/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestSelector/Classes/Enums.cs b/TestSelector/Classes/Enums.cs new file mode 100644 index 0000000..d5a9bc5 --- /dev/null +++ b/TestSelector/Classes/Enums.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace KaraokePlayer.Enums +{ + public enum PlayerState + { + Play, + Stop, + Pause, + Next + } + + public enum FileType + { + CDG, MP4, ZIP + } +} diff --git a/TestSelector/Classes/FirebaseController.cs b/TestSelector/Classes/FirebaseController.cs new file mode 100644 index 0000000..f8aa5a3 --- /dev/null +++ b/TestSelector/Classes/FirebaseController.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using KaraokePlayer.Interfaces; +using KaraokePlayer.Enums; +using FireSharp.Interfaces; +using FireSharp.Config; +using FireSharp; + +namespace KaraokePlayer.Classes +{ + public class FirebaseSong : ISong + { + public string FirebaseId { get; set; } + public int Id { get; set; } + public int Order { get; set; } + public string Title { get; set; } + public string Artist { get; set; } + public FileType FileType { get; set; } + public string Path { get; set; } + + public string Description { get { return Artist + " - " + Title; } } + } + + public class FirebaseController : IController + { + private IFirebaseConfig config = new FirebaseConfig + { + AuthSecret = "wj0ERDFZqNSysTtIXcCgCr8Itahr6pJOBeqCjvDF", + BasePath = "https://karaokecontroller.firebaseio.com/" + }; + private IFirebaseClient client; + private ControllerStateChangedEventHandler StateChanged; + private ControllerSongChangedEventHandler SongChanged; + private ControllerPlayQueueChangedEventHandler PlayQueueChanged; + public FirebaseController(ControllerStateChangedEventHandler stateChanged, ControllerSongChangedEventHandler songChanged, ControllerPlayQueueChangedEventHandler playQueueChanged) + { + StateChanged = stateChanged; + SongChanged = songChanged; + PlayQueueChanged = playQueueChanged; + PlayQueue = new List(); + client = new FirebaseClient(config); + client.DeleteAsync("controller/state"); + client.PushAsync("controller/state", "stop"); + client.DeleteAsync("controller/playQueue"); + client.DeleteAsync("controller/currentSong"); + ListenToStream(); + } + + public int Id { get; set; } + public ISong CurrentSong { get; set; } + public List PlayQueue { get; set; } + public void GetNextSong() + { + ISong song = PlayQueue.FirstOrDefault(); + Stop(); + client.DeleteAsync("controller/currentSong"); + client.PushAsync("controller/currentSong", song); + } + + public void PlaySong(ISong song) + { + client.DeleteAsync("controller/currentSong"); + client.PushAsync("controller/currentSong", song); + } + public void AddSongToQueue(ISong song) + { + client.PushAsync("controller/playQueue", song); + } + + public void RemoveSong(ISong song) + { + ISong found = PlayQueue.FirstOrDefault(s => s.Id == song.Id); + if (found != null) + { + PlayQueue.Remove(found); + client.DeleteAsync("controller/playQueue/" + ((FirebaseSong)song).FirebaseId); + } + } + public void Next() + { + client.DeleteAsync("controller/state"); + client.PushAsync("controller/state", "next"); + } + + public void Play() + { + client.DeleteAsync("controller/state"); + client.PushAsync("controller/state", "play"); + } + + public void Stop() + { + client.DeleteAsync("controller/state"); + client.PushAsync("controller/state", "stop"); + } + + public void Pause() + { + client.DeleteAsync("controller/state"); + client.PushAsync("controller/state", "pause"); + } + + private async void ListenToStream() + { + await client.OnAsync("controller/currentSong", + added: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + CurrentSongChanged(); + } + }, + changed: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + CurrentSongChanged(); + } + }, + removed: null + ); + + await client.OnAsync("controller/playQueue", + added: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + ReloadPlayQueue(); + } + }, + changed: (s, args, obj) => + { + if (args.Path.Contains("Id")) + { + ReloadPlayQueue(); + } + }, + removed: (s, args, obj) => + { + ReloadPlayQueue(); + } + ); + + await client.OnAsync("controller/state", + added: (s, args, obj) => + { + RemoteStateChanged(args.Data); + }, + changed: (s, args, obj) => + { + RemoteStateChanged(args.Data); + }, + removed: null + ); + } + + private void ReloadPlayQueue() + { + bool autoPlay = PlayQueue.Count() == 0; + var response = client.Get("controller/playQueue"); + var dict = response.ResultAs>(); + + PlayQueue.Clear(); + if (dict.Count() > 0) + { + foreach (KeyValuePair entry in dict) + { + entry.Value.FirebaseId = entry.Key; + } + + var array = dict.Values.OrderBy(s => s.Order).ToArray(); + PlayQueue.AddRange(array); + if (autoPlay) + { + GetNextSong(); + } + } + PlayQueueChanged(); + } + + private void CurrentSongChanged() + { + var response = client.Get("controller/currentSong"); + var dict = response.ResultAs>(); + + var song = dict.Values.FirstOrDefault(); + if (song != null) + { + CurrentSong = song; + SongChanged(new ControllerSongChangedEventArgs(false, song)); + } + } + + private void RemoteStateChanged(string state) + { + PlayerState s = PlayerState.Play; + if(state.ToLower() == "pause") + { + s = PlayerState.Pause; + } + else if (state.ToLower() == "stop") + { + s = PlayerState.Stop; + } + else if (state == "next") + { + s = PlayerState.Next; + } + StateChanged(new ControllerStateChangedEventArgs(s)); + } + + } +} diff --git a/TestSelector/Classes/Interfaces.cs b/TestSelector/Classes/Interfaces.cs new file mode 100644 index 0000000..bcf947d --- /dev/null +++ b/TestSelector/Classes/Interfaces.cs @@ -0,0 +1,32 @@ +using KaraokePlayer.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace KaraokePlayer.Interfaces +{ + public interface ISong + { + int Id { get; set; } + int Order { get; set; } + string Title { get; set; } + string Artist { get; set; } + FileType FileType { get; set; } + string Path { get; set; } + string Description { get; } + } + + public interface IController + { + int Id { get; set; } + List PlayQueue { get; set; } + void GetNextSong(); + void RemoveSong(ISong song); + void Play(); + void Pause(); + void Stop(); + void Next(); + } +} diff --git a/TestSelector/Classes/PlayerDelegates.cs b/TestSelector/Classes/PlayerDelegates.cs new file mode 100644 index 0000000..007f3e7 --- /dev/null +++ b/TestSelector/Classes/PlayerDelegates.cs @@ -0,0 +1,39 @@ +using KaraokePlayer.Enums; +using KaraokePlayer.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace KaraokePlayer.Classes +{ + public class ControllerStateChangedEventArgs: EventArgs + { + public ControllerStateChangedEventArgs(PlayerState state ) + { + State = state; + } + public PlayerState State { get; } + } + public class ControllerSongChangedEventArgs + { + public ControllerSongChangedEventArgs(ISong song) + { + ShouldPlay = true; + Song = song; + } + public ControllerSongChangedEventArgs(bool shouldPlay, ISong song) + { + ShouldPlay = shouldPlay; + Song = song; + } + public ISong Song { get; } + public bool ShouldPlay { get; } + } + + public delegate void ControllerStateChangedEventHandler(ControllerStateChangedEventArgs args); + public delegate void ControllerSongChangedEventHandler(ControllerSongChangedEventArgs args); + public delegate void ControllerPlayQueueChangedEventHandler(); + +} diff --git a/TestSelector/Form1.Designer.cs b/TestSelector/Form1.Designer.cs new file mode 100644 index 0000000..c3a029f --- /dev/null +++ b/TestSelector/Form1.Designer.cs @@ -0,0 +1,175 @@ +namespace TestSelector +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.listBox1 = new System.Windows.Forms.ListBox(); + this.browseDialog = new System.Windows.Forms.FolderBrowserDialog(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.listBox2 = new System.Windows.Forms.ListBox(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(13, 12); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(451, 20); + this.textBox1.TabIndex = 0; + this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // listBox1 + // + this.listBox1.FormattingEnabled = true; + this.listBox1.Location = new System.Drawing.Point(13, 39); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(451, 134); + this.listBox1.TabIndex = 1; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(488, 9); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 2; + this.button1.Text = "Browse"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(488, 39); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 3; + this.button2.Text = "Add Song"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(488, 68); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 4; + this.button3.Text = "Play"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(488, 97); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.TabIndex = 5; + this.button4.Text = "Stop"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(488, 126); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(75, 23); + this.button5.TabIndex = 6; + this.button5.Text = "Next"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // listBox2 + // + this.listBox2.FormattingEnabled = true; + this.listBox2.Location = new System.Drawing.Point(13, 192); + this.listBox2.Name = "listBox2"; + this.listBox2.Size = new System.Drawing.Size(451, 121); + this.listBox2.TabIndex = 7; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(488, 192); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(75, 23); + this.button6.TabIndex = 8; + this.button6.Text = "Play Song"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(488, 221); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(75, 23); + this.button7.TabIndex = 9; + this.button7.Text = "Remove"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(575, 325); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.listBox2); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.listBox1); + this.Controls.Add(this.textBox1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ListBox listBox1; + private System.Windows.Forms.FolderBrowserDialog browseDialog; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.ListBox listBox2; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + } +} + diff --git a/TestSelector/Form1.cs b/TestSelector/Form1.cs new file mode 100644 index 0000000..dd47f9e --- /dev/null +++ b/TestSelector/Form1.cs @@ -0,0 +1,158 @@ +using FireSharp; +using FireSharp.Config; +using FireSharp.Interfaces; +using KaraokePlayer.Classes; +using KaraokePlayer.Enums; +using KaraokePlayer.Interfaces; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; +using TagLib; + +namespace TestSelector +{ + + public partial class Form1 : Form + { + FirebaseController controller; + + public Form1() + { + + InitializeComponent(); + controller = new FirebaseController( + stateChanged: (args) => + { + if (args.State == KaraokePlayer.Enums.PlayerState.Play) + { + this.Invoke(new Action(() => { buttonUpdateForPause(); })); + } + else if (args.State == KaraokePlayer.Enums.PlayerState.Pause) + { + this.Invoke(new Action(() => { buttonUpdateForPlay(); })); + } + }, + songChanged: (args) => + { + this.Invoke(new Action(() => { buttonUpdateForPlay(); })); + }, + playQueueChanged:() => { + this.Invoke(new Action(() => { updatePlayQueue(); })); + } + ); + + } + private List _fileList; + private List _playQueue; + private void updatePlayQueue() + { + _playQueue = controller.PlayQueue; + listBox2.DataSource = null; + listBox2.DataSource = _playQueue; + listBox2.DisplayMember = "Description"; + } + + private void buttonUpdateForPlay() + { + button3.Text = "Play"; + } + + private void buttonUpdateForPause() + { + button3.Text = "Pause"; + } + + + private void button1_Click(object sender, EventArgs e) + { + if (browseDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + var files = GetFiles(browseDialog.SelectedPath, "*.cdg|*.mp4", searchOption: System.IO.SearchOption.AllDirectories); + var filtered = files.Where(f => f.Length < 248).ToList(); + _fileList = filtered.Select(file => new FileInfo(file)).ToList(); + listBox1.DataSource = _fileList; + listBox1.DisplayMember = "Name"; + + } + } + private static string[] GetFiles(string path, string searchPattern, SearchOption searchOption) + { + string[] searchPatterns = searchPattern.Split('|'); + List files = new List(); + foreach (string sp in searchPatterns) + files.AddRange(System.IO.Directory.GetFiles(path, sp, searchOption)); + files.Sort(); + return files.ToArray(); + } + + private void textBox1_TextChanged(object sender, EventArgs e) + { + listBox1.DataSource = _fileList.Where(file => Regex.IsMatch(file.Name, textBox1.Text, RegexOptions.IgnoreCase)).ToList(); + } + + private void button2_Click(object sender, EventArgs e) + { + FileInfo file = (FileInfo)listBox1.SelectedItem; + TagLib.File tag = null; + FirebaseSong song = new FirebaseSong(); + if (file.Extension.ToLower() == ".cdg") + { + tag = TagLib.File.Create(Path.ChangeExtension(file.FullName, ".mp3")); + song.FileType = FileType.CDG; + } + else if (file.Extension.ToLower() == ".mp4") + { + tag = TagLib.File.Create(file.FullName); + song.FileType = FileType.MP4; + } + song.Order = 1; + song.Id = new Random().Next(0, 50000); + song.Title = tag.Tag.Title; + song.Artist = tag.Tag.Performers[0]; + song.Path = file.FullName; + controller.AddSongToQueue(song); + } + + private void button3_Click(object sender, EventArgs e) + { + if (button3.Text == "Play") + { + controller.Play(); + } else + { + controller.Pause(); + } + } + + private void button4_Click(object sender, EventArgs e) + { + controller.Stop(); + } + + private void button5_Click(object sender, EventArgs e) + { + controller.RemoveSong(controller.CurrentSong); + controller.GetNextSong(); + } + + private void button6_Click(object sender, EventArgs e) + { + ISong song = (ISong)listBox2.SelectedItem; + controller.PlaySong(song); + } + + private void button7_Click(object sender, EventArgs e) + { + ISong song = (ISong)listBox2.SelectedItem; + controller.RemoveSong(song); + } + } +} diff --git a/TestSelector/Form1.resx b/TestSelector/Form1.resx new file mode 100644 index 0000000..5e9a346 --- /dev/null +++ b/TestSelector/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/TestSelector/Program.cs b/TestSelector/Program.cs new file mode 100644 index 0000000..67b339d --- /dev/null +++ b/TestSelector/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TestSelector +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/TestSelector/Properties/AssemblyInfo.cs b/TestSelector/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d501663 --- /dev/null +++ b/TestSelector/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TestSelector")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TestSelector")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b81665bc-a207-47f5-bbf4-2de59965325f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TestSelector/Properties/Resources.Designer.cs b/TestSelector/Properties/Resources.Designer.cs new file mode 100644 index 0000000..98f756c --- /dev/null +++ b/TestSelector/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TestSelector.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TestSelector.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/TestSelector/Properties/Resources.resx b/TestSelector/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/TestSelector/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TestSelector/Properties/Settings.Designer.cs b/TestSelector/Properties/Settings.Designer.cs new file mode 100644 index 0000000..d7a77ef --- /dev/null +++ b/TestSelector/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TestSelector.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/TestSelector/Properties/Settings.settings b/TestSelector/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/TestSelector/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TestSelector/TestSelector.csproj b/TestSelector/TestSelector.csproj new file mode 100644 index 0000000..335a6ea --- /dev/null +++ b/TestSelector/TestSelector.csproj @@ -0,0 +1,133 @@ + + + + + Debug + AnyCPU + {B81665BC-A207-47F5-BBF4-2DE59965325F} + WinExe + Properties + TestSelector + TestSelector + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\FireSharp.2.0.4\lib\portable-net45+sl5+wp8+win8\FireSharp.dll + True + + + ..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll + True + + + ..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll + True + + + ..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll + True + + + ..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll + True + + + + + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Extensions.dll + True + + + ..\packages\Microsoft.Net.Http.2.2.28\lib\net45\System.Net.Http.Primitives.dll + True + + + + + + + + + + + + + ..\KaraokePlayer\lib\taglib-sharp.dll + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestSelector/packages.config b/TestSelector/packages.config new file mode 100644 index 0000000..45a2770 --- /dev/null +++ b/TestSelector/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file