Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6659e2dff7 | ||
|
|
4788a80b78 | ||
|
|
2f82bd96c6 | ||
|
|
f385ff773f | ||
|
|
3ea423c87e | ||
|
|
9fb8550dbf | ||
|
|
f07b9e0fdb | ||
|
|
d4b916137b | ||
|
|
e7eba01ac7 | ||
|
|
8e64b6e5b6 | ||
|
|
96683d3b57 | ||
|
|
c760e5a559 | ||
|
|
5a07e6251b | ||
|
|
b9b300b14d | ||
|
|
4e9d2222cf | ||
|
|
4a869f3399 | ||
|
|
0d0a92f33a | ||
|
|
66c5285418 | ||
|
|
292405cf4d | ||
|
|
8d7d8eaabc | ||
|
|
40cb55d7f6 | ||
|
|
56586355d3 | ||
|
|
56a2cb91a4 | ||
|
|
a4031daae8 | ||
|
|
a1bfb15e6b | ||
|
|
c2229db72a | ||
|
|
f81c526255 | ||
|
|
7b712460d2 | ||
|
|
515f17eb62 | ||
|
|
98f6ab9bc0 | ||
|
|
90f35de242 | ||
|
|
aa85ca5d26 | ||
|
|
270db2d1a4 | ||
|
|
fd629f54ff | ||
|
|
d774e250c5 | ||
|
|
93f9879c14 | ||
|
|
a6514189b0 | ||
|
|
192e132f1d | ||
|
|
d8a900ecb9 | ||
|
|
7e5dcb3cef | ||
|
|
17eaac40bf | ||
|
|
dad829d1dd | ||
|
|
e218b58421 | ||
|
|
7f45afe80f |
@@ -20,6 +20,19 @@ namespace MusicPlayer
|
|||||||
defaultCover = Image.FromStream(nw.downloadArtwork("default-cover.png"));
|
defaultCover = Image.FromStream(nw.downloadArtwork("default-cover.png"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JObject GetAllBySearch(string search, string album, string artist, string genre)
|
||||||
|
{
|
||||||
|
// Q artist genre album
|
||||||
|
JObject o = nw.SendString($"search?q={search}&album={album}&genre={genre}&artist={artist}");
|
||||||
|
if (o != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(o.PropertyValues().ToString());
|
||||||
|
if (o["result"].ToString() == "OK") { return o; }
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public string GetSongURLByID(string id)
|
public string GetSongURLByID(string id)
|
||||||
{
|
{
|
||||||
JObject o = nw.SendString("getsongbyid?id=" + id);
|
JObject o = nw.SendString("getsongbyid?id=" + id);
|
||||||
@@ -49,6 +62,66 @@ namespace MusicPlayer
|
|||||||
return GetSongsByArgs("album=" + year);
|
return GetSongsByArgs("album=" + year);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Song> GetSongsBySearch(string search)
|
||||||
|
{
|
||||||
|
return GetSongsByArgs("search=" + search);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Genre> Genrify(JObject o)
|
||||||
|
{
|
||||||
|
List<Genre> genreslist = new List<Genre>();
|
||||||
|
if (o["result"].ToString() == "OK")
|
||||||
|
{
|
||||||
|
for (int i = 0; i < o["genres"].Count(); i++)
|
||||||
|
{
|
||||||
|
genreslist.Add(new Genre(o["genres"][i][0].ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return genreslist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Artist> Artistify(JObject o)
|
||||||
|
{
|
||||||
|
List<Artist> artistlist = new List<Artist>();
|
||||||
|
if (o["result"].ToString() == "OK")
|
||||||
|
{
|
||||||
|
for (int i = 0; i < o["artists"].Count(); i++)
|
||||||
|
{
|
||||||
|
artistlist.Add(new Artist(o["artists"][i][0].ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return artistlist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Song> Songify(JObject o)
|
||||||
|
{
|
||||||
|
List<Song> allsongslist = new List<Song>();
|
||||||
|
if (o["result"].ToString() == "OK")
|
||||||
|
{
|
||||||
|
dynamic songs = o["songs"];
|
||||||
|
for (int i = 0; i < songs.Count; i++)
|
||||||
|
{
|
||||||
|
allsongslist.Add(new Song(songs[i][0].ToString(), songs[i][3].ToString(), songs[i][5].ToString(), songs[i][4].ToString(), songs[i][1].ToString(), (int)songs[i][9], this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return allsongslist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Album> Albumify(JObject o)
|
||||||
|
{
|
||||||
|
List<Album> albumlist = new List<Album>();
|
||||||
|
|
||||||
|
if (o["result"].ToString() == "OK")
|
||||||
|
{
|
||||||
|
for (int i = 0; i < o["albums"].Count(); i++)
|
||||||
|
{
|
||||||
|
albumlist.Add(new Album(o["albums"][i][0].ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return albumlist;
|
||||||
|
}
|
||||||
|
|
||||||
public List<Song> GetAllSongs()
|
public List<Song> GetAllSongs()
|
||||||
{
|
{
|
||||||
List<Song> allsongslist = new List<Song>();
|
List<Song> allsongslist = new List<Song>();
|
||||||
@@ -85,7 +158,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
List<Artist> artistlist = new List<Artist>();
|
List<Artist> artistlist = new List<Artist>();
|
||||||
|
|
||||||
JObject o = nw.SendString("getartists?id=hallo");
|
JObject o = nw.SendString("getartists?");
|
||||||
if (o["result"].ToString() == "OK")
|
if (o["result"].ToString() == "OK")
|
||||||
{
|
{
|
||||||
for (int i = 0; i < o["artists"].Count(); i++) {
|
for (int i = 0; i < o["artists"].Count(); i++) {
|
||||||
@@ -109,7 +182,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
List<Album> albumlist = new List<Album>();
|
List<Album> albumlist = new List<Album>();
|
||||||
|
|
||||||
JObject o = nw.SendString("getalbums?id=hallo");
|
JObject o = nw.SendString("getalbums?");
|
||||||
if (o["result"].ToString() == "OK")
|
if (o["result"].ToString() == "OK")
|
||||||
{
|
{
|
||||||
for (int i = 0; i < o["albums"].Count(); i++)
|
for (int i = 0; i < o["albums"].Count(); i++)
|
||||||
@@ -124,7 +197,7 @@ namespace MusicPlayer
|
|||||||
public List<Year> GetYears()
|
public List<Year> GetYears()
|
||||||
{
|
{
|
||||||
List<Year> yearlist = new List<Year> ();
|
List<Year> yearlist = new List<Year> ();
|
||||||
JObject o = nw.SendString("getyears?id=hallo");
|
JObject o = nw.SendString("getyears?");
|
||||||
if (o["result"].ToString() == "OK")
|
if (o["result"].ToString() == "OK")
|
||||||
{
|
{
|
||||||
for (int i = 0; i < o["years"].Count(); i++)
|
for (int i = 0; i < o["years"].Count(); i++)
|
||||||
@@ -138,7 +211,7 @@ namespace MusicPlayer
|
|||||||
public List<Genre> GetGenres()
|
public List<Genre> GetGenres()
|
||||||
{
|
{
|
||||||
List<Genre> genreslist = new List<Genre>();
|
List<Genre> genreslist = new List<Genre>();
|
||||||
JObject o = nw.SendString("getgenres?id=hallo");
|
JObject o = nw.SendString("getgenres?");
|
||||||
if (o["result"].ToString() == "OK")
|
if (o["result"].ToString() == "OK")
|
||||||
{
|
{
|
||||||
for (int i = 0; i < o["genres"].Count(); i++)
|
for (int i = 0; i < o["genres"].Count(); i++)
|
||||||
|
|||||||
+177
@@ -0,0 +1,177 @@
|
|||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
partial class AdvancedSearch
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedSearch));
|
||||||
|
this.SearchTermTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.AlbumTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
this.ArtistTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.GenreTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
|
this.SearchButton = new System.Windows.Forms.Button();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// SearchTermTextBox
|
||||||
|
//
|
||||||
|
this.SearchTermTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.SearchTermTextBox.Location = new System.Drawing.Point(12, 29);
|
||||||
|
this.SearchTermTextBox.Name = "SearchTermTextBox";
|
||||||
|
this.SearchTermTextBox.Size = new System.Drawing.Size(210, 20);
|
||||||
|
this.SearchTermTextBox.TabIndex = 0;
|
||||||
|
this.SearchTermTextBox.KeyDown += TextBox_KeyDown;
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(12, 13);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(68, 13);
|
||||||
|
this.label1.TabIndex = 1;
|
||||||
|
this.label1.Text = "Search Term";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(12, 70);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.label2.TabIndex = 2;
|
||||||
|
this.label2.Text = "Album";
|
||||||
|
//
|
||||||
|
// AlbumTextBox
|
||||||
|
//
|
||||||
|
this.AlbumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.AlbumTextBox.Location = new System.Drawing.Point(12, 86);
|
||||||
|
this.AlbumTextBox.Name = "AlbumTextBox";
|
||||||
|
this.AlbumTextBox.Size = new System.Drawing.Size(210, 20);
|
||||||
|
this.AlbumTextBox.TabIndex = 3;
|
||||||
|
this.AlbumTextBox.KeyDown += TextBox_KeyDown;
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
this.label3.AutoSize = true;
|
||||||
|
this.label3.Location = new System.Drawing.Point(12, 119);
|
||||||
|
this.label3.Name = "label3";
|
||||||
|
this.label3.Size = new System.Drawing.Size(30, 13);
|
||||||
|
this.label3.TabIndex = 4;
|
||||||
|
this.label3.Text = "Artist";
|
||||||
|
//
|
||||||
|
// ArtistTextBox
|
||||||
|
//
|
||||||
|
this.ArtistTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.ArtistTextBox.Location = new System.Drawing.Point(12, 135);
|
||||||
|
this.ArtistTextBox.Name = "ArtistTextBox";
|
||||||
|
this.ArtistTextBox.Size = new System.Drawing.Size(210, 20);
|
||||||
|
this.ArtistTextBox.TabIndex = 5;
|
||||||
|
this.ArtistTextBox.KeyDown += TextBox_KeyDown;
|
||||||
|
//
|
||||||
|
// GenreTextBox
|
||||||
|
//
|
||||||
|
this.GenreTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.GenreTextBox.Location = new System.Drawing.Point(12, 187);
|
||||||
|
this.GenreTextBox.Name = "GenreTextBox";
|
||||||
|
this.GenreTextBox.Size = new System.Drawing.Size(210, 20);
|
||||||
|
this.GenreTextBox.TabIndex = 6;
|
||||||
|
this.GenreTextBox.KeyDown += TextBox_KeyDown;
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
this.label4.AutoSize = true;
|
||||||
|
this.label4.Location = new System.Drawing.Point(13, 168);
|
||||||
|
this.label4.Name = "label4";
|
||||||
|
this.label4.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.label4.TabIndex = 7;
|
||||||
|
this.label4.Text = "Genre";
|
||||||
|
//
|
||||||
|
// SearchButton
|
||||||
|
//
|
||||||
|
this.SearchButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.SearchButton.Location = new System.Drawing.Point(12, 226);
|
||||||
|
this.SearchButton.Name = "SearchButton";
|
||||||
|
this.SearchButton.Size = new System.Drawing.Size(210, 23);
|
||||||
|
this.SearchButton.TabIndex = 8;
|
||||||
|
this.SearchButton.Text = "Search";
|
||||||
|
this.SearchButton.UseVisualStyleBackColor = true;
|
||||||
|
this.SearchButton.Click += new System.EventHandler(this.SearchButton_Click);
|
||||||
|
//
|
||||||
|
// AdvancedSearch
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(234, 261);
|
||||||
|
this.Controls.Add(this.SearchButton);
|
||||||
|
this.Controls.Add(this.label4);
|
||||||
|
this.Controls.Add(this.GenreTextBox);
|
||||||
|
this.Controls.Add(this.ArtistTextBox);
|
||||||
|
this.Controls.Add(this.label3);
|
||||||
|
this.Controls.Add(this.AlbumTextBox);
|
||||||
|
this.Controls.Add(this.label2);
|
||||||
|
this.Controls.Add(this.label1);
|
||||||
|
this.Controls.Add(this.SearchTermTextBox);
|
||||||
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
|
this.MaximumSize = new System.Drawing.Size(450, 300);
|
||||||
|
this.MinimumSize = new System.Drawing.Size(250, 300);
|
||||||
|
this.Name = "AdvancedSearch";
|
||||||
|
this.Text = "Advanced Search";
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TextBox_KeyDown(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
if(e.KeyCode == Keys.Enter)
|
||||||
|
{
|
||||||
|
SearchButton_Click(sender, new System.EventArgs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private TextBox SearchTermTextBox;
|
||||||
|
private Label label1;
|
||||||
|
private Label label2;
|
||||||
|
private TextBox AlbumTextBox;
|
||||||
|
private Label label3;
|
||||||
|
private TextBox ArtistTextBox;
|
||||||
|
private TextBox GenreTextBox;
|
||||||
|
private Label label4;
|
||||||
|
private Button SearchButton;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
public partial class AdvancedSearch : Form
|
||||||
|
{
|
||||||
|
private Main main;
|
||||||
|
|
||||||
|
public AdvancedSearch(Main main)
|
||||||
|
{
|
||||||
|
this.main = main;
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SearchButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(SearchTermTextBox.Text.Length > 1)
|
||||||
|
{
|
||||||
|
SearchTermTextBox.ForeColor = Color.Black;
|
||||||
|
main.AdvancedSearchFilter(SearchTermTextBox.Text, AlbumTextBox.Text, ArtistTextBox.Text, GenreTextBox.Text);
|
||||||
|
this.Close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SearchTermTextBox.ForeColor = Color.Red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -17,7 +17,13 @@ namespace MusicPlayer
|
|||||||
public AudioState AState { get; set; }
|
public AudioState AState { get; set; }
|
||||||
public BufferState BState { get; set; }
|
public BufferState BState { get; set; }
|
||||||
|
|
||||||
public int Buffered { get { return Math.Min((int)((bufpos / (double)LengthBuffer) * 1000), 1000); } }
|
public int Buffered { get
|
||||||
|
{
|
||||||
|
if(CurrentSong is RadioStation)
|
||||||
|
return Math.Min((int)((bufpos - ms.Position) / 1000), 1000);
|
||||||
|
else
|
||||||
|
return Math.Min((int)((bufpos / (double)LengthBuffer) * 1000), 1000);
|
||||||
|
} }
|
||||||
private long LengthBuffer { get; set; }
|
private long LengthBuffer { get; set; }
|
||||||
private long bufpos = 0;
|
private long bufpos = 0;
|
||||||
|
|
||||||
@@ -33,7 +39,7 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
private long seek = 0;
|
private long seek = 0;
|
||||||
|
|
||||||
private Stream ms;
|
private MemoryStream ms;
|
||||||
|
|
||||||
private Thread network;
|
private Thread network;
|
||||||
private Thread audio;
|
private Thread audio;
|
||||||
@@ -55,7 +61,7 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
CurrentSong = null;
|
CurrentSong = null;
|
||||||
|
|
||||||
Thread.Sleep(11);
|
Thread.Sleep(10);
|
||||||
|
|
||||||
ms = new MemoryStream();
|
ms = new MemoryStream();
|
||||||
|
|
||||||
@@ -122,7 +128,7 @@ namespace MusicPlayer
|
|||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
AState = AudioState.STOPPED;
|
AState = AudioState.STOPPED;
|
||||||
main.form.SongFinished();
|
//main.form.SongFinished();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,6 +141,9 @@ namespace MusicPlayer
|
|||||||
waveOut.Init(blockAlignedStream);
|
waveOut.Init(blockAlignedStream);
|
||||||
waveOut.Play();
|
waveOut.Play();
|
||||||
|
|
||||||
|
if (CurrentSong == null || CurrentSong.Seconds == 0)
|
||||||
|
Length = ms.Length / waveOut.OutputWaveFormat.AverageBytesPerSecond;
|
||||||
|
else
|
||||||
Length = CurrentSong.Seconds * waveOut.OutputWaveFormat.AverageBytesPerSecond;
|
Length = CurrentSong.Seconds * waveOut.OutputWaveFormat.AverageBytesPerSecond;
|
||||||
CurrentTime = (int)(ms.Position / waveOut.OutputWaveFormat.AverageBytesPerSecond);
|
CurrentTime = (int)(ms.Position / waveOut.OutputWaveFormat.AverageBytesPerSecond);
|
||||||
|
|
||||||
@@ -163,19 +172,26 @@ namespace MusicPlayer
|
|||||||
waveOut.Stop();
|
waveOut.Stop();
|
||||||
}
|
}
|
||||||
if (BState == BufferState.DONE && firstrun )
|
if (BState == BufferState.DONE && firstrun )
|
||||||
|
{
|
||||||
|
if( ! (CurrentSong is RadioStation))
|
||||||
{
|
{
|
||||||
position = mp3fr.Position;
|
position = mp3fr.Position;
|
||||||
mp3fr.Close();
|
mp3fr.Close();
|
||||||
StreamFromMP3(ms, position, false);
|
StreamFromMP3(ms, position, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AState = AudioState.STOPPED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
playpos = blockAlignedStream.Position;
|
playpos = blockAlignedStream.Position;
|
||||||
CurrentTime = (int)(playpos / waveOut.OutputWaveFormat.AverageBytesPerSecond);
|
CurrentTime = (int)(playpos / waveOut.OutputWaveFormat.AverageBytesPerSecond);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(AState == AudioState.PLAYING)
|
if(AState == AudioState.PLAYING && !firstrun)
|
||||||
main.form.SongFinished();
|
main.form.SongFinished();
|
||||||
AState = AudioState.STOPPED;
|
AState = AudioState.STOPPED;
|
||||||
playpos = 0;
|
playpos = 0;
|
||||||
@@ -187,7 +203,14 @@ namespace MusicPlayer
|
|||||||
private void PlayAudio()
|
private void PlayAudio()
|
||||||
{
|
{
|
||||||
AState = AudioState.WAITING;
|
AState = AudioState.WAITING;
|
||||||
while (ms.Length < 65536 * 10 && BState != BufferState.DONE)
|
|
||||||
|
int buffertime = 0;
|
||||||
|
if (CurrentSong is RadioStation)
|
||||||
|
buffertime = 32768 * 10;
|
||||||
|
else
|
||||||
|
buffertime = 65536 * 10;
|
||||||
|
|
||||||
|
while (ms.Length < buffertime && BState != BufferState.DONE)
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
AState = AudioState.PLAYING;
|
AState = AudioState.PLAYING;
|
||||||
|
|
||||||
@@ -218,7 +241,7 @@ namespace MusicPlayer
|
|||||||
using (var stream = response.GetResponseStream())
|
using (var stream = response.GetResponseStream())
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[65536]; // 64KB chunks
|
byte[] buffer = new byte[65536]; // 64KB chunks
|
||||||
//byte[] buffer = new byte[65536*4]; // 256KB chunks
|
|
||||||
int read;
|
int read;
|
||||||
BState = BufferState.BUFFERING;
|
BState = BufferState.BUFFERING;
|
||||||
AState = AudioState.WAITING;
|
AState = AudioState.WAITING;
|
||||||
@@ -230,7 +253,6 @@ namespace MusicPlayer
|
|||||||
ms.Write(buffer, 0, read);
|
ms.Write(buffer, 0, read);
|
||||||
ms.Position = pos;
|
ms.Position = pos;
|
||||||
|
|
||||||
|
|
||||||
this.bufpos = ms.Length;
|
this.bufpos = ms.Length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
partial class Form1
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// Form1
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(284, 261);
|
||||||
|
this.Name = "Form1";
|
||||||
|
this.Text = "Form1";
|
||||||
|
this.Load += new System.EventHandler(this.Form1_Load);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
partial class Form1
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Text = "Form1";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
partial class Form1
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// Form1
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(284, 261);
|
||||||
|
this.Name = "Form1";
|
||||||
|
this.Text = "Form1";
|
||||||
|
this.Load += new System.EventHandler(this.Form1_Load);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
partial class Form1
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// Form1
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(284, 261);
|
||||||
|
this.Name = "Form1";
|
||||||
|
this.Text = "Form1";
|
||||||
|
this.Load += new System.EventHandler(this.Form1_Load);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -5,6 +5,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace MusicPlayer
|
namespace MusicPlayer
|
||||||
{
|
{
|
||||||
@@ -15,7 +16,6 @@ namespace MusicPlayer
|
|||||||
public NetworkHandler nw;
|
public NetworkHandler nw;
|
||||||
public PlaylistHandler pl;
|
public PlaylistHandler pl;
|
||||||
public AudioHandler audio;
|
public AudioHandler audio;
|
||||||
|
|
||||||
public SongsTable table;
|
public SongsTable table;
|
||||||
|
|
||||||
private List<string> genres;
|
private List<string> genres;
|
||||||
@@ -29,6 +29,8 @@ namespace MusicPlayer
|
|||||||
this.api = api;
|
this.api = api;
|
||||||
this.form = form;
|
this.form = form;
|
||||||
form.main = this;
|
form.main = this;
|
||||||
|
pl.main = this;
|
||||||
|
pl.Populate();
|
||||||
this.pl = pl;
|
this.pl = pl;
|
||||||
|
|
||||||
audio = new AudioHandler(this);
|
audio = new AudioHandler(this);
|
||||||
@@ -77,15 +79,29 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
BackgroundWorker b = o as BackgroundWorker;
|
BackgroundWorker b = o as BackgroundWorker;
|
||||||
ImageList imagelist = new ImageList();
|
ImageList imagelist = new ImageList();
|
||||||
|
List<string> templist = new List<string>();
|
||||||
|
Action action = () =>
|
||||||
|
{
|
||||||
foreach (ListViewItem item in form.AlbumListView.Items)
|
foreach (ListViewItem item in form.AlbumListView.Items)
|
||||||
{
|
{
|
||||||
imagelist.Images.Add(item.ToString(), api.getAlbumCover(item.Text));
|
templist.Add(item.Text);
|
||||||
}
|
}
|
||||||
Action action = () => {
|
};
|
||||||
|
form.Invoke(action);
|
||||||
|
|
||||||
|
foreach (string item in templist)
|
||||||
|
{
|
||||||
|
imagelist.Images.Add(item, api.getAlbumCover(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
action = () => {
|
||||||
|
imagelist.ImageSize = new System.Drawing.Size(64,64);
|
||||||
|
imagelist.ColorDepth = ColorDepth.Depth32Bit;
|
||||||
|
form.AlbumListView.View = View.LargeIcon;
|
||||||
form.AlbumListView.LargeImageList = imagelist;
|
form.AlbumListView.LargeImageList = imagelist;
|
||||||
foreach (ListViewItem item in form.AlbumListView.Items)
|
foreach (ListViewItem item in form.AlbumListView.Items)
|
||||||
{
|
{
|
||||||
item.ImageKey = item.ToString();
|
item.ImageKey = item.Text;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
form.Invoke(action);
|
form.Invoke(action);
|
||||||
@@ -99,7 +115,8 @@ namespace MusicPlayer
|
|||||||
form.ArtistListBox.Items.Clear();
|
form.ArtistListBox.Items.Clear();
|
||||||
form.GenreListBox.Items.Clear();
|
form.GenreListBox.Items.Clear();
|
||||||
form.PlaylistBox.Items.Clear();
|
form.PlaylistBox.Items.Clear();
|
||||||
this.api.GetAlbums().ForEach(a => form.AlbumListView.Items.Add(a.albumnaam));
|
|
||||||
|
this.api.GetAlbums().ForEach(a => form.AlbumListView.Items.Add(a.albumnaam,a.albumnaam));
|
||||||
this.api.GetArtists().ForEach(a => form.ArtistListBox.Items.Add(a.naam));
|
this.api.GetArtists().ForEach(a => form.ArtistListBox.Items.Add(a.naam));
|
||||||
this.api.GetGenres().ForEach(g => form.GenreListBox.Items.Add(g.name));
|
this.api.GetGenres().ForEach(g => form.GenreListBox.Items.Add(g.name));
|
||||||
this.pl.GetPlaylists().ForEach(p => form.PlaylistBox.Items.Add(p.name));
|
this.pl.GetPlaylists().ForEach(p => form.PlaylistBox.Items.Add(p.name));
|
||||||
@@ -114,6 +131,40 @@ namespace MusicPlayer
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SearchFilter(string search)
|
||||||
|
{
|
||||||
|
table.Clear();
|
||||||
|
api.GetSongsBySearch(search).ForEach(s =>
|
||||||
|
{
|
||||||
|
table.Add(s);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AdvancedSearchFilter(string search, string album, string artist, string genre)
|
||||||
|
{
|
||||||
|
JObject o = api.GetAllBySearch(search, album, artist, genre);
|
||||||
|
if (o != null)
|
||||||
|
{
|
||||||
|
//q
|
||||||
|
form.AlbumListView.Items.Clear();
|
||||||
|
form.ArtistListBox.Items.Clear();
|
||||||
|
form.GenreListBox.Items.Clear();
|
||||||
|
form.PlaylistBox.Items.Clear();
|
||||||
|
table.Clear();
|
||||||
|
api.Songify(o).ForEach(s => table.Add(s));
|
||||||
|
|
||||||
|
//albums
|
||||||
|
api.Albumify(o).ForEach(a => form.AlbumListView.Items.Add(a.albumnaam, a.albumnaam));
|
||||||
|
|
||||||
|
//artists
|
||||||
|
api.Artistify(o).ForEach(a => form.ArtistListBox.Items.Add(a.naam));
|
||||||
|
|
||||||
|
//genres
|
||||||
|
api.Genrify(o).ForEach(g => form.GenreListBox.Items.Add(g.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void FilterCurrentPlaying()
|
public void FilterCurrentPlaying()
|
||||||
{
|
{
|
||||||
table.Clear();
|
table.Clear();
|
||||||
@@ -214,6 +265,18 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool CheckURLValid(string source)
|
||||||
|
{
|
||||||
|
Uri uriResult;
|
||||||
|
return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetDomain(string url)
|
||||||
|
{
|
||||||
|
Uri uri = new Uri(url);
|
||||||
|
return uri.Host;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+230
-37
@@ -38,6 +38,7 @@ namespace MusicPlayer
|
|||||||
this.AlbumListView = new System.Windows.Forms.ListView();
|
this.AlbumListView = new System.Windows.Forms.ListView();
|
||||||
this.ArtistListBox = new System.Windows.Forms.ListBox();
|
this.ArtistListBox = new System.Windows.Forms.ListBox();
|
||||||
this.MainPanel = new System.Windows.Forms.Panel();
|
this.MainPanel = new System.Windows.Forms.Panel();
|
||||||
|
this.AddToQueueLabel = new System.Windows.Forms.Label();
|
||||||
this.SplitContainer = new System.Windows.Forms.SplitContainer();
|
this.SplitContainer = new System.Windows.Forms.SplitContainer();
|
||||||
this.PlaylistBox = new System.Windows.Forms.ListBox();
|
this.PlaylistBox = new System.Windows.Forms.ListBox();
|
||||||
this.AlbumListLabel = new System.Windows.Forms.Label();
|
this.AlbumListLabel = new System.Windows.Forms.Label();
|
||||||
@@ -52,13 +53,15 @@ namespace MusicPlayer
|
|||||||
this.overviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.overviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.playlistsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.playlistsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.ViewCurrentPlaylistButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.ViewQueueButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.playbackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.playbackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.PlayNextSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.PlayNextSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.LoopSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.LoopSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.ShuffleSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.ShuffleSongButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.playlistToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.playlistToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.makeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.makeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
this.viewPlaylistToolstripMenuButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SearchGenresToolStripLabel = new System.Windows.Forms.ToolStripMenuItem();
|
this.SearchGenresToolStripLabel = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SearchGenresTextBox = new System.Windows.Forms.ToolStripTextBox();
|
this.SearchGenresTextBox = new System.Windows.Forms.ToolStripTextBox();
|
||||||
@@ -66,10 +69,26 @@ namespace MusicPlayer
|
|||||||
this.SearchArtistToolStripLabel = new System.Windows.Forms.ToolStripMenuItem();
|
this.SearchArtistToolStripLabel = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SearchArtistsTextBox = new System.Windows.Forms.ToolStripTextBox();
|
this.SearchArtistsTextBox = new System.Windows.Forms.ToolStripTextBox();
|
||||||
this.ClearArtistSearchButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.ClearArtistSearchButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.songsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.SearchSongsTextBox = new System.Windows.Forms.ToolStripTextBox();
|
||||||
|
this.SearchSongsButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
this.AdvancedSearchButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.resetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.serverToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.serverToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SelectServerJancoButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.SelectServerJancoButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SelectServerYorickButton = new System.Windows.Forms.ToolStripMenuItem();
|
this.SelectServerYorickButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.radioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.fMToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.slamFMToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.qDanceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
this.customToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.RadioStationTextBox = new System.Windows.Forms.ToolStripTextBox();
|
||||||
|
this.SetRadioStationButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.ControlsPanel = new System.Windows.Forms.Panel();
|
this.ControlsPanel = new System.Windows.Forms.Panel();
|
||||||
|
this.pictureBox1 = new System.Windows.Forms.PictureBox();
|
||||||
this.NextButton = new System.Windows.Forms.Button();
|
this.NextButton = new System.Windows.Forms.Button();
|
||||||
this.PreviousButton = new System.Windows.Forms.Button();
|
this.PreviousButton = new System.Windows.Forms.Button();
|
||||||
this.CurrentSongLabel = new System.Windows.Forms.Label();
|
this.CurrentSongLabel = new System.Windows.Forms.Label();
|
||||||
@@ -101,6 +120,7 @@ namespace MusicPlayer
|
|||||||
this.SplitContainer.SuspendLayout();
|
this.SplitContainer.SuspendLayout();
|
||||||
this.MenuStrip.SuspendLayout();
|
this.MenuStrip.SuspendLayout();
|
||||||
this.ControlsPanel.SuspendLayout();
|
this.ControlsPanel.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).BeginInit();
|
||||||
this.NotifyMenuStrip.SuspendLayout();
|
this.NotifyMenuStrip.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@@ -144,7 +164,7 @@ namespace MusicPlayer
|
|||||||
this.GenreListBox.FormattingEnabled = true;
|
this.GenreListBox.FormattingEnabled = true;
|
||||||
this.GenreListBox.Location = new System.Drawing.Point(0, 0);
|
this.GenreListBox.Location = new System.Drawing.Point(0, 0);
|
||||||
this.GenreListBox.Name = "GenreListBox";
|
this.GenreListBox.Name = "GenreListBox";
|
||||||
this.GenreListBox.Size = new System.Drawing.Size(150, 121);
|
this.GenreListBox.Size = new System.Drawing.Size(175, 121);
|
||||||
this.GenreListBox.Sorted = true;
|
this.GenreListBox.Sorted = true;
|
||||||
this.GenreListBox.TabIndex = 1;
|
this.GenreListBox.TabIndex = 1;
|
||||||
this.GenreListBox.SelectedIndexChanged += new System.EventHandler(this.GenreListBox_SelectedIndexChanged);
|
this.GenreListBox.SelectedIndexChanged += new System.EventHandler(this.GenreListBox_SelectedIndexChanged);
|
||||||
@@ -155,13 +175,13 @@ namespace MusicPlayer
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.AlbumListView.BackColor = System.Drawing.SystemColors.Control;
|
this.AlbumListView.BackColor = System.Drawing.SystemColors.Control;
|
||||||
this.AlbumListView.Location = new System.Drawing.Point(312, 0);
|
this.AlbumListView.Location = new System.Drawing.Point(362, 0);
|
||||||
this.AlbumListView.MultiSelect = false;
|
this.AlbumListView.MultiSelect = false;
|
||||||
this.AlbumListView.Name = "AlbumListView";
|
this.AlbumListView.Name = "AlbumListView";
|
||||||
this.AlbumListView.Size = new System.Drawing.Size(448, 121);
|
this.AlbumListView.Size = new System.Drawing.Size(398, 121);
|
||||||
this.AlbumListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
|
this.AlbumListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
|
||||||
this.AlbumListView.TabIndex = 2;
|
this.AlbumListView.TabIndex = 2;
|
||||||
this.AlbumListView.TileSize = new System.Drawing.Size(140, 30);
|
this.AlbumListView.TileSize = new System.Drawing.Size(185, 30);
|
||||||
this.AlbumListView.UseCompatibleStateImageBehavior = false;
|
this.AlbumListView.UseCompatibleStateImageBehavior = false;
|
||||||
this.AlbumListView.View = System.Windows.Forms.View.Tile;
|
this.AlbumListView.View = System.Windows.Forms.View.Tile;
|
||||||
this.AlbumListView.SelectedIndexChanged += new System.EventHandler(this.AlbumListView_SelectedIndexChanged);
|
this.AlbumListView.SelectedIndexChanged += new System.EventHandler(this.AlbumListView_SelectedIndexChanged);
|
||||||
@@ -172,9 +192,9 @@ namespace MusicPlayer
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)));
|
| System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.ArtistListBox.BackColor = System.Drawing.SystemColors.Control;
|
this.ArtistListBox.BackColor = System.Drawing.SystemColors.Control;
|
||||||
this.ArtistListBox.FormattingEnabled = true;
|
this.ArtistListBox.FormattingEnabled = true;
|
||||||
this.ArtistListBox.Location = new System.Drawing.Point(156, 0);
|
this.ArtistListBox.Location = new System.Drawing.Point(181, 0);
|
||||||
this.ArtistListBox.Name = "ArtistListBox";
|
this.ArtistListBox.Name = "ArtistListBox";
|
||||||
this.ArtistListBox.Size = new System.Drawing.Size(150, 121);
|
this.ArtistListBox.Size = new System.Drawing.Size(175, 121);
|
||||||
this.ArtistListBox.Sorted = true;
|
this.ArtistListBox.Sorted = true;
|
||||||
this.ArtistListBox.TabIndex = 3;
|
this.ArtistListBox.TabIndex = 3;
|
||||||
this.ArtistListBox.SelectedIndexChanged += new System.EventHandler(this.ArtistListBox_SelectedIndexChanged);
|
this.ArtistListBox.SelectedIndexChanged += new System.EventHandler(this.ArtistListBox_SelectedIndexChanged);
|
||||||
@@ -185,6 +205,7 @@ namespace MusicPlayer
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.MainPanel.BackColor = System.Drawing.SystemColors.Window;
|
this.MainPanel.BackColor = System.Drawing.SystemColors.Window;
|
||||||
|
this.MainPanel.Controls.Add(this.AddToQueueLabel);
|
||||||
this.MainPanel.Controls.Add(this.SplitContainer);
|
this.MainPanel.Controls.Add(this.SplitContainer);
|
||||||
this.MainPanel.Controls.Add(this.AlbumListLabel);
|
this.MainPanel.Controls.Add(this.AlbumListLabel);
|
||||||
this.MainPanel.Controls.Add(this.ArtistListLabel);
|
this.MainPanel.Controls.Add(this.ArtistListLabel);
|
||||||
@@ -195,6 +216,20 @@ namespace MusicPlayer
|
|||||||
this.MainPanel.Size = new System.Drawing.Size(784, 351);
|
this.MainPanel.Size = new System.Drawing.Size(784, 351);
|
||||||
this.MainPanel.TabIndex = 5;
|
this.MainPanel.TabIndex = 5;
|
||||||
//
|
//
|
||||||
|
// AddToQueueLabel
|
||||||
|
//
|
||||||
|
this.AddToQueueLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.AddToQueueLabel.AutoSize = true;
|
||||||
|
this.AddToQueueLabel.BackColor = System.Drawing.SystemColors.Control;
|
||||||
|
this.AddToQueueLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||||
|
this.AddToQueueLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.AddToQueueLabel.Location = new System.Drawing.Point(668, 4);
|
||||||
|
this.AddToQueueLabel.Name = "AddToQueueLabel";
|
||||||
|
this.AddToQueueLabel.Size = new System.Drawing.Size(104, 18);
|
||||||
|
this.AddToQueueLabel.TabIndex = 10;
|
||||||
|
this.AddToQueueLabel.Text = "Add to Queue";
|
||||||
|
this.AddToQueueLabel.Visible = false;
|
||||||
|
//
|
||||||
// SplitContainer
|
// SplitContainer
|
||||||
//
|
//
|
||||||
this.SplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.SplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
@@ -234,7 +269,7 @@ namespace MusicPlayer
|
|||||||
// AlbumListLabel
|
// AlbumListLabel
|
||||||
//
|
//
|
||||||
this.AlbumListLabel.AutoSize = true;
|
this.AlbumListLabel.AutoSize = true;
|
||||||
this.AlbumListLabel.Location = new System.Drawing.Point(321, 8);
|
this.AlbumListLabel.Location = new System.Drawing.Point(371, 9);
|
||||||
this.AlbumListLabel.Name = "AlbumListLabel";
|
this.AlbumListLabel.Name = "AlbumListLabel";
|
||||||
this.AlbumListLabel.Size = new System.Drawing.Size(36, 13);
|
this.AlbumListLabel.Size = new System.Drawing.Size(36, 13);
|
||||||
this.AlbumListLabel.TabIndex = 6;
|
this.AlbumListLabel.TabIndex = 6;
|
||||||
@@ -243,7 +278,7 @@ namespace MusicPlayer
|
|||||||
// ArtistListLabel
|
// ArtistListLabel
|
||||||
//
|
//
|
||||||
this.ArtistListLabel.AutoSize = true;
|
this.ArtistListLabel.AutoSize = true;
|
||||||
this.ArtistListLabel.Location = new System.Drawing.Point(165, 8);
|
this.ArtistListLabel.Location = new System.Drawing.Point(190, 9);
|
||||||
this.ArtistListLabel.Name = "ArtistListLabel";
|
this.ArtistListLabel.Name = "ArtistListLabel";
|
||||||
this.ArtistListLabel.Size = new System.Drawing.Size(30, 13);
|
this.ArtistListLabel.Size = new System.Drawing.Size(30, 13);
|
||||||
this.ArtistListLabel.TabIndex = 5;
|
this.ArtistListLabel.TabIndex = 5;
|
||||||
@@ -252,7 +287,7 @@ namespace MusicPlayer
|
|||||||
// GenreListLabel
|
// GenreListLabel
|
||||||
//
|
//
|
||||||
this.GenreListLabel.AutoSize = true;
|
this.GenreListLabel.AutoSize = true;
|
||||||
this.GenreListLabel.Location = new System.Drawing.Point(9, 8);
|
this.GenreListLabel.Location = new System.Drawing.Point(9, 9);
|
||||||
this.GenreListLabel.Name = "GenreListLabel";
|
this.GenreListLabel.Name = "GenreListLabel";
|
||||||
this.GenreListLabel.Size = new System.Drawing.Size(36, 13);
|
this.GenreListLabel.Size = new System.Drawing.Size(36, 13);
|
||||||
this.GenreListLabel.TabIndex = 4;
|
this.GenreListLabel.TabIndex = 4;
|
||||||
@@ -270,14 +305,15 @@ namespace MusicPlayer
|
|||||||
//
|
//
|
||||||
// MenuStrip
|
// MenuStrip
|
||||||
//
|
//
|
||||||
this.MenuStrip.BackColor = System.Drawing.SystemColors.WindowFrame;
|
this.MenuStrip.BackColor = System.Drawing.SystemColors.GrayText;
|
||||||
this.MenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.MenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
this.fileToolStripMenuItem,
|
this.fileToolStripMenuItem,
|
||||||
this.viewToolStripMenuItem,
|
this.viewToolStripMenuItem,
|
||||||
this.playbackToolStripMenuItem,
|
this.playbackToolStripMenuItem,
|
||||||
this.playlistToolStripMenuItem,
|
this.playlistToolStripMenuItem,
|
||||||
this.searchToolStripMenuItem,
|
this.searchToolStripMenuItem,
|
||||||
this.serverToolStripMenuItem});
|
this.serverToolStripMenuItem,
|
||||||
|
this.radioToolStripMenuItem});
|
||||||
this.MenuStrip.Location = new System.Drawing.Point(0, 0);
|
this.MenuStrip.Location = new System.Drawing.Point(0, 0);
|
||||||
this.MenuStrip.Name = "MenuStrip";
|
this.MenuStrip.Name = "MenuStrip";
|
||||||
this.MenuStrip.Size = new System.Drawing.Size(784, 24);
|
this.MenuStrip.Size = new System.Drawing.Size(784, 24);
|
||||||
@@ -311,7 +347,7 @@ namespace MusicPlayer
|
|||||||
this.overviewToolStripMenuItem,
|
this.overviewToolStripMenuItem,
|
||||||
this.playlistsToolStripMenuItem,
|
this.playlistsToolStripMenuItem,
|
||||||
this.toolStripSeparator4,
|
this.toolStripSeparator4,
|
||||||
this.ViewCurrentPlaylistButton});
|
this.ViewQueueButton});
|
||||||
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
|
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
|
||||||
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
|
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
|
||||||
this.viewToolStripMenuItem.Text = "View";
|
this.viewToolStripMenuItem.Text = "View";
|
||||||
@@ -319,28 +355,28 @@ namespace MusicPlayer
|
|||||||
// overviewToolStripMenuItem
|
// overviewToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.overviewToolStripMenuItem.Name = "overviewToolStripMenuItem";
|
this.overviewToolStripMenuItem.Name = "overviewToolStripMenuItem";
|
||||||
this.overviewToolStripMenuItem.Size = new System.Drawing.Size(154, 22);
|
this.overviewToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
|
||||||
this.overviewToolStripMenuItem.Text = "Overview";
|
this.overviewToolStripMenuItem.Text = "Overview";
|
||||||
this.overviewToolStripMenuItem.Click += new System.EventHandler(this.overviewToolStripMenuItem_Click);
|
this.overviewToolStripMenuItem.Click += new System.EventHandler(this.overviewToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// playlistsToolStripMenuItem
|
// playlistsToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.playlistsToolStripMenuItem.Name = "playlistsToolStripMenuItem";
|
this.playlistsToolStripMenuItem.Name = "playlistsToolStripMenuItem";
|
||||||
this.playlistsToolStripMenuItem.Size = new System.Drawing.Size(154, 22);
|
this.playlistsToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
|
||||||
this.playlistsToolStripMenuItem.Text = "Playlists";
|
this.playlistsToolStripMenuItem.Text = "Playlists";
|
||||||
this.playlistsToolStripMenuItem.Click += new System.EventHandler(this.playlistsToolStripMenuItem_Click);
|
this.playlistsToolStripMenuItem.Click += new System.EventHandler(this.playlistsToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// toolStripSeparator4
|
// toolStripSeparator4
|
||||||
//
|
//
|
||||||
this.toolStripSeparator4.Name = "toolStripSeparator4";
|
this.toolStripSeparator4.Name = "toolStripSeparator4";
|
||||||
this.toolStripSeparator4.Size = new System.Drawing.Size(151, 6);
|
this.toolStripSeparator4.Size = new System.Drawing.Size(120, 6);
|
||||||
//
|
//
|
||||||
// ViewCurrentPlaylistButton
|
// ViewQueueButton
|
||||||
//
|
//
|
||||||
this.ViewCurrentPlaylistButton.Name = "ViewCurrentPlaylistButton";
|
this.ViewQueueButton.Name = "ViewQueueButton";
|
||||||
this.ViewCurrentPlaylistButton.Size = new System.Drawing.Size(154, 22);
|
this.ViewQueueButton.Size = new System.Drawing.Size(123, 22);
|
||||||
this.ViewCurrentPlaylistButton.Text = "Current Playlist";
|
this.ViewQueueButton.Text = "Queue";
|
||||||
this.ViewCurrentPlaylistButton.Click += new System.EventHandler(this.ViewCurrentPlaylistButton_Click);
|
this.ViewQueueButton.Click += new System.EventHandler(this.ViewCurrentPlaylistButton_Click);
|
||||||
//
|
//
|
||||||
// playbackToolStripMenuItem
|
// playbackToolStripMenuItem
|
||||||
//
|
//
|
||||||
@@ -381,7 +417,9 @@ namespace MusicPlayer
|
|||||||
// playlistToolStripMenuItem
|
// playlistToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.playlistToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.playlistToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
this.makeToolStripMenuItem});
|
this.makeToolStripMenuItem,
|
||||||
|
this.toolStripSeparator6,
|
||||||
|
this.viewPlaylistToolstripMenuButton});
|
||||||
this.playlistToolStripMenuItem.Name = "playlistToolStripMenuItem";
|
this.playlistToolStripMenuItem.Name = "playlistToolStripMenuItem";
|
||||||
this.playlistToolStripMenuItem.Size = new System.Drawing.Size(56, 20);
|
this.playlistToolStripMenuItem.Size = new System.Drawing.Size(56, 20);
|
||||||
this.playlistToolStripMenuItem.Text = "Playlist";
|
this.playlistToolStripMenuItem.Text = "Playlist";
|
||||||
@@ -393,11 +431,27 @@ namespace MusicPlayer
|
|||||||
this.makeToolStripMenuItem.Text = "Create / Edit";
|
this.makeToolStripMenuItem.Text = "Create / Edit";
|
||||||
this.makeToolStripMenuItem.Click += new System.EventHandler(this.makeToolStripMenuItem_Click);
|
this.makeToolStripMenuItem.Click += new System.EventHandler(this.makeToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
|
// toolStripSeparator6
|
||||||
|
//
|
||||||
|
this.toolStripSeparator6.Name = "toolStripSeparator6";
|
||||||
|
this.toolStripSeparator6.Size = new System.Drawing.Size(136, 6);
|
||||||
|
//
|
||||||
|
// viewPlaylistToolstripMenuButton
|
||||||
|
//
|
||||||
|
this.viewPlaylistToolstripMenuButton.Name = "viewPlaylistToolstripMenuButton";
|
||||||
|
this.viewPlaylistToolstripMenuButton.Size = new System.Drawing.Size(139, 22);
|
||||||
|
this.viewPlaylistToolstripMenuButton.Text = "View";
|
||||||
|
this.viewPlaylistToolstripMenuButton.Click += new System.EventHandler(this.playlistsToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
// searchToolStripMenuItem
|
// searchToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
this.SearchGenresToolStripLabel,
|
this.SearchGenresToolStripLabel,
|
||||||
this.SearchArtistToolStripLabel});
|
this.SearchArtistToolStripLabel,
|
||||||
|
this.songsToolStripMenuItem,
|
||||||
|
this.toolStripSeparator7,
|
||||||
|
this.AdvancedSearchButton,
|
||||||
|
this.resetToolStripMenuItem});
|
||||||
this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
|
this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
|
||||||
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
|
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
|
||||||
this.searchToolStripMenuItem.Text = "Search";
|
this.searchToolStripMenuItem.Text = "Search";
|
||||||
@@ -408,7 +462,7 @@ namespace MusicPlayer
|
|||||||
this.SearchGenresTextBox,
|
this.SearchGenresTextBox,
|
||||||
this.ClearGenreSearchButton});
|
this.ClearGenreSearchButton});
|
||||||
this.SearchGenresToolStripLabel.Name = "SearchGenresToolStripLabel";
|
this.SearchGenresToolStripLabel.Name = "SearchGenresToolStripLabel";
|
||||||
this.SearchGenresToolStripLabel.Size = new System.Drawing.Size(110, 22);
|
this.SearchGenresToolStripLabel.Size = new System.Drawing.Size(127, 22);
|
||||||
this.SearchGenresToolStripLabel.Text = "Genres";
|
this.SearchGenresToolStripLabel.Text = "Genres";
|
||||||
//
|
//
|
||||||
// SearchGenresTextBox
|
// SearchGenresTextBox
|
||||||
@@ -431,7 +485,7 @@ namespace MusicPlayer
|
|||||||
this.SearchArtistsTextBox,
|
this.SearchArtistsTextBox,
|
||||||
this.ClearArtistSearchButton});
|
this.ClearArtistSearchButton});
|
||||||
this.SearchArtistToolStripLabel.Name = "SearchArtistToolStripLabel";
|
this.SearchArtistToolStripLabel.Name = "SearchArtistToolStripLabel";
|
||||||
this.SearchArtistToolStripLabel.Size = new System.Drawing.Size(110, 22);
|
this.SearchArtistToolStripLabel.Size = new System.Drawing.Size(127, 22);
|
||||||
this.SearchArtistToolStripLabel.Text = "Artists";
|
this.SearchArtistToolStripLabel.Text = "Artists";
|
||||||
//
|
//
|
||||||
// SearchArtistsTextBox
|
// SearchArtistsTextBox
|
||||||
@@ -448,6 +502,47 @@ namespace MusicPlayer
|
|||||||
this.ClearArtistSearchButton.Text = "Clear Search";
|
this.ClearArtistSearchButton.Text = "Clear Search";
|
||||||
this.ClearArtistSearchButton.Click += new System.EventHandler(this.ClearArtistSearchButton_Click);
|
this.ClearArtistSearchButton.Click += new System.EventHandler(this.ClearArtistSearchButton_Click);
|
||||||
//
|
//
|
||||||
|
// songsToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.songsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.SearchSongsTextBox,
|
||||||
|
this.SearchSongsButton});
|
||||||
|
this.songsToolStripMenuItem.Name = "songsToolStripMenuItem";
|
||||||
|
this.songsToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
|
||||||
|
this.songsToolStripMenuItem.Text = "Songs";
|
||||||
|
//
|
||||||
|
// SearchSongsTextBox
|
||||||
|
//
|
||||||
|
this.SearchSongsTextBox.Name = "SearchSongsTextBox";
|
||||||
|
this.SearchSongsTextBox.Size = new System.Drawing.Size(100, 23);
|
||||||
|
//
|
||||||
|
// SearchSongsButton
|
||||||
|
//
|
||||||
|
this.SearchSongsButton.Enabled = false;
|
||||||
|
this.SearchSongsButton.Name = "SearchSongsButton";
|
||||||
|
this.SearchSongsButton.Size = new System.Drawing.Size(160, 22);
|
||||||
|
this.SearchSongsButton.Text = "Search";
|
||||||
|
this.SearchSongsButton.Click += new System.EventHandler(this.SearchSongsButton_Click);
|
||||||
|
//
|
||||||
|
// toolStripSeparator7
|
||||||
|
//
|
||||||
|
this.toolStripSeparator7.Name = "toolStripSeparator7";
|
||||||
|
this.toolStripSeparator7.Size = new System.Drawing.Size(124, 6);
|
||||||
|
//
|
||||||
|
// AdvancedSearchButton
|
||||||
|
//
|
||||||
|
this.AdvancedSearchButton.Name = "AdvancedSearchButton";
|
||||||
|
this.AdvancedSearchButton.Size = new System.Drawing.Size(127, 22);
|
||||||
|
this.AdvancedSearchButton.Text = "Advanced";
|
||||||
|
this.AdvancedSearchButton.Click += new System.EventHandler(this.AdvancedSearchButton_Click);
|
||||||
|
//
|
||||||
|
// resetToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.resetToolStripMenuItem.Name = "resetToolStripMenuItem";
|
||||||
|
this.resetToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
|
||||||
|
this.resetToolStripMenuItem.Text = "Reset";
|
||||||
|
this.resetToolStripMenuItem.Click += new System.EventHandler(this.resetToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
// serverToolStripMenuItem
|
// serverToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.serverToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.serverToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
@@ -471,9 +566,77 @@ namespace MusicPlayer
|
|||||||
this.SelectServerYorickButton.Text = "imegumii.nl";
|
this.SelectServerYorickButton.Text = "imegumii.nl";
|
||||||
this.SelectServerYorickButton.Click += new System.EventHandler(this.SelectServerYorickButton_Click);
|
this.SelectServerYorickButton.Click += new System.EventHandler(this.SelectServerYorickButton_Click);
|
||||||
//
|
//
|
||||||
|
// radioToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.radioToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.toolStripMenuItem2,
|
||||||
|
this.fMToolStripMenuItem,
|
||||||
|
this.slamFMToolStripMenuItem,
|
||||||
|
this.qDanceToolStripMenuItem,
|
||||||
|
this.toolStripSeparator5,
|
||||||
|
this.customToolStripMenuItem});
|
||||||
|
this.radioToolStripMenuItem.Name = "radioToolStripMenuItem";
|
||||||
|
this.radioToolStripMenuItem.Size = new System.Drawing.Size(49, 20);
|
||||||
|
this.radioToolStripMenuItem.Text = "Radio";
|
||||||
|
//
|
||||||
|
// toolStripMenuItem2
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
||||||
|
this.toolStripMenuItem2.Size = new System.Drawing.Size(122, 22);
|
||||||
|
this.toolStripMenuItem2.Text = "538";
|
||||||
|
this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click);
|
||||||
|
//
|
||||||
|
// fMToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.fMToolStripMenuItem.Name = "fMToolStripMenuItem";
|
||||||
|
this.fMToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
|
||||||
|
this.fMToolStripMenuItem.Text = "3FM";
|
||||||
|
this.fMToolStripMenuItem.Click += new System.EventHandler(this.fMToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
|
// slamFMToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.slamFMToolStripMenuItem.Name = "slamFMToolStripMenuItem";
|
||||||
|
this.slamFMToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
|
||||||
|
this.slamFMToolStripMenuItem.Text = "Slam-FM";
|
||||||
|
this.slamFMToolStripMenuItem.Click += new System.EventHandler(this.slamFMToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
|
// qDanceToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.qDanceToolStripMenuItem.Name = "qDanceToolStripMenuItem";
|
||||||
|
this.qDanceToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
|
||||||
|
this.qDanceToolStripMenuItem.Text = "Q-Dance";
|
||||||
|
this.qDanceToolStripMenuItem.Click += new System.EventHandler(this.qDanceToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
|
// toolStripSeparator5
|
||||||
|
//
|
||||||
|
this.toolStripSeparator5.Name = "toolStripSeparator5";
|
||||||
|
this.toolStripSeparator5.Size = new System.Drawing.Size(119, 6);
|
||||||
|
//
|
||||||
|
// customToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.customToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.RadioStationTextBox,
|
||||||
|
this.SetRadioStationButton});
|
||||||
|
this.customToolStripMenuItem.Name = "customToolStripMenuItem";
|
||||||
|
this.customToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
|
||||||
|
this.customToolStripMenuItem.Text = "Custom";
|
||||||
|
//
|
||||||
|
// RadioStationTextBox
|
||||||
|
//
|
||||||
|
this.RadioStationTextBox.Name = "RadioStationTextBox";
|
||||||
|
this.RadioStationTextBox.Size = new System.Drawing.Size(100, 23);
|
||||||
|
//
|
||||||
|
// SetRadioStationButton
|
||||||
|
//
|
||||||
|
this.SetRadioStationButton.Name = "SetRadioStationButton";
|
||||||
|
this.SetRadioStationButton.Size = new System.Drawing.Size(160, 22);
|
||||||
|
this.SetRadioStationButton.Text = "Set";
|
||||||
|
this.SetRadioStationButton.Click += new System.EventHandler(this.SetRadioStationButton_Click);
|
||||||
|
//
|
||||||
// ControlsPanel
|
// ControlsPanel
|
||||||
//
|
//
|
||||||
this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame;
|
this.ControlsPanel.BackColor = System.Drawing.SystemColors.GrayText;
|
||||||
|
this.ControlsPanel.Controls.Add(this.pictureBox1);
|
||||||
this.ControlsPanel.Controls.Add(this.NextButton);
|
this.ControlsPanel.Controls.Add(this.NextButton);
|
||||||
this.ControlsPanel.Controls.Add(this.PreviousButton);
|
this.ControlsPanel.Controls.Add(this.PreviousButton);
|
||||||
this.ControlsPanel.Controls.Add(this.CurrentSongLabel);
|
this.ControlsPanel.Controls.Add(this.CurrentSongLabel);
|
||||||
@@ -491,9 +654,19 @@ namespace MusicPlayer
|
|||||||
this.ControlsPanel.Size = new System.Drawing.Size(784, 83);
|
this.ControlsPanel.Size = new System.Drawing.Size(784, 83);
|
||||||
this.ControlsPanel.TabIndex = 4;
|
this.ControlsPanel.TabIndex = 4;
|
||||||
//
|
//
|
||||||
|
// pictureBox1
|
||||||
|
//
|
||||||
|
this.pictureBox1.BackColor = System.Drawing.SystemColors.Control;
|
||||||
|
this.pictureBox1.Location = new System.Drawing.Point(5, 5);
|
||||||
|
this.pictureBox1.Name = "pictureBox1";
|
||||||
|
this.pictureBox1.Size = new System.Drawing.Size(72, 72);
|
||||||
|
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
|
this.pictureBox1.TabIndex = 14;
|
||||||
|
this.pictureBox1.TabStop = false;
|
||||||
|
//
|
||||||
// NextButton
|
// NextButton
|
||||||
//
|
//
|
||||||
this.NextButton.Location = new System.Drawing.Point(214, 51);
|
this.NextButton.Location = new System.Drawing.Point(295, 54);
|
||||||
this.NextButton.Name = "NextButton";
|
this.NextButton.Name = "NextButton";
|
||||||
this.NextButton.Size = new System.Drawing.Size(31, 23);
|
this.NextButton.Size = new System.Drawing.Size(31, 23);
|
||||||
this.NextButton.TabIndex = 13;
|
this.NextButton.TabIndex = 13;
|
||||||
@@ -503,7 +676,7 @@ namespace MusicPlayer
|
|||||||
//
|
//
|
||||||
// PreviousButton
|
// PreviousButton
|
||||||
//
|
//
|
||||||
this.PreviousButton.Location = new System.Drawing.Point(177, 51);
|
this.PreviousButton.Location = new System.Drawing.Point(258, 54);
|
||||||
this.PreviousButton.Name = "PreviousButton";
|
this.PreviousButton.Name = "PreviousButton";
|
||||||
this.PreviousButton.Size = new System.Drawing.Size(31, 23);
|
this.PreviousButton.Size = new System.Drawing.Size(31, 23);
|
||||||
this.PreviousButton.TabIndex = 12;
|
this.PreviousButton.TabIndex = 12;
|
||||||
@@ -514,7 +687,7 @@ namespace MusicPlayer
|
|||||||
// CurrentSongLabel
|
// CurrentSongLabel
|
||||||
//
|
//
|
||||||
this.CurrentSongLabel.AutoSize = true;
|
this.CurrentSongLabel.AutoSize = true;
|
||||||
this.CurrentSongLabel.Location = new System.Drawing.Point(256, 56);
|
this.CurrentSongLabel.Location = new System.Drawing.Point(338, 59);
|
||||||
this.CurrentSongLabel.Name = "CurrentSongLabel";
|
this.CurrentSongLabel.Name = "CurrentSongLabel";
|
||||||
this.CurrentSongLabel.Size = new System.Drawing.Size(111, 13);
|
this.CurrentSongLabel.Size = new System.Drawing.Size(111, 13);
|
||||||
this.CurrentSongLabel.TabIndex = 11;
|
this.CurrentSongLabel.TabIndex = 11;
|
||||||
@@ -533,7 +706,7 @@ namespace MusicPlayer
|
|||||||
// LabelCurrentTime
|
// LabelCurrentTime
|
||||||
//
|
//
|
||||||
this.LabelCurrentTime.AutoSize = true;
|
this.LabelCurrentTime.AutoSize = true;
|
||||||
this.LabelCurrentTime.Location = new System.Drawing.Point(12, 26);
|
this.LabelCurrentTime.Location = new System.Drawing.Point(93, 29);
|
||||||
this.LabelCurrentTime.Name = "LabelCurrentTime";
|
this.LabelCurrentTime.Name = "LabelCurrentTime";
|
||||||
this.LabelCurrentTime.Size = new System.Drawing.Size(49, 13);
|
this.LabelCurrentTime.Size = new System.Drawing.Size(49, 13);
|
||||||
this.LabelCurrentTime.TabIndex = 8;
|
this.LabelCurrentTime.TabIndex = 8;
|
||||||
@@ -544,10 +717,10 @@ namespace MusicPlayer
|
|||||||
this.PositionTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.PositionTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.PositionTrackBar.Enabled = false;
|
this.PositionTrackBar.Enabled = false;
|
||||||
this.PositionTrackBar.Location = new System.Drawing.Point(3, 3);
|
this.PositionTrackBar.Location = new System.Drawing.Point(83, 3);
|
||||||
this.PositionTrackBar.Maximum = 1000;
|
this.PositionTrackBar.Maximum = 1000;
|
||||||
this.PositionTrackBar.Name = "PositionTrackBar";
|
this.PositionTrackBar.Name = "PositionTrackBar";
|
||||||
this.PositionTrackBar.Size = new System.Drawing.Size(778, 45);
|
this.PositionTrackBar.Size = new System.Drawing.Size(698, 45);
|
||||||
this.PositionTrackBar.TabIndex = 7;
|
this.PositionTrackBar.TabIndex = 7;
|
||||||
this.PositionTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
|
this.PositionTrackBar.TickStyle = System.Windows.Forms.TickStyle.None;
|
||||||
this.PositionTrackBar.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PositionTrackBar_MouseDown);
|
this.PositionTrackBar.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PositionTrackBar_MouseDown);
|
||||||
@@ -573,7 +746,7 @@ namespace MusicPlayer
|
|||||||
// StopButton
|
// StopButton
|
||||||
//
|
//
|
||||||
this.StopButton.Enabled = false;
|
this.StopButton.Enabled = false;
|
||||||
this.StopButton.Location = new System.Drawing.Point(122, 51);
|
this.StopButton.Location = new System.Drawing.Point(203, 54);
|
||||||
this.StopButton.Name = "StopButton";
|
this.StopButton.Name = "StopButton";
|
||||||
this.StopButton.Size = new System.Drawing.Size(49, 23);
|
this.StopButton.Size = new System.Drawing.Size(49, 23);
|
||||||
this.StopButton.TabIndex = 2;
|
this.StopButton.TabIndex = 2;
|
||||||
@@ -584,7 +757,7 @@ namespace MusicPlayer
|
|||||||
// PauseButton
|
// PauseButton
|
||||||
//
|
//
|
||||||
this.PauseButton.Enabled = false;
|
this.PauseButton.Enabled = false;
|
||||||
this.PauseButton.Location = new System.Drawing.Point(67, 51);
|
this.PauseButton.Location = new System.Drawing.Point(148, 54);
|
||||||
this.PauseButton.Name = "PauseButton";
|
this.PauseButton.Name = "PauseButton";
|
||||||
this.PauseButton.Size = new System.Drawing.Size(49, 23);
|
this.PauseButton.Size = new System.Drawing.Size(49, 23);
|
||||||
this.PauseButton.TabIndex = 1;
|
this.PauseButton.TabIndex = 1;
|
||||||
@@ -594,7 +767,7 @@ namespace MusicPlayer
|
|||||||
//
|
//
|
||||||
// PlayButton
|
// PlayButton
|
||||||
//
|
//
|
||||||
this.PlayButton.Location = new System.Drawing.Point(12, 51);
|
this.PlayButton.Location = new System.Drawing.Point(93, 54);
|
||||||
this.PlayButton.Name = "PlayButton";
|
this.PlayButton.Name = "PlayButton";
|
||||||
this.PlayButton.Size = new System.Drawing.Size(49, 23);
|
this.PlayButton.Size = new System.Drawing.Size(49, 23);
|
||||||
this.PlayButton.TabIndex = 0;
|
this.PlayButton.TabIndex = 0;
|
||||||
@@ -611,7 +784,7 @@ namespace MusicPlayer
|
|||||||
//
|
//
|
||||||
this.NotifyIcon.ContextMenuStrip = this.NotifyMenuStrip;
|
this.NotifyIcon.ContextMenuStrip = this.NotifyMenuStrip;
|
||||||
this.NotifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIcon.Icon")));
|
this.NotifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIcon.Icon")));
|
||||||
this.NotifyIcon.Text = "NotifyIcon";
|
this.NotifyIcon.Text = "YJMPD Music Player";
|
||||||
this.NotifyIcon.Visible = true;
|
this.NotifyIcon.Visible = true;
|
||||||
this.NotifyIcon.MouseUp += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_Click);
|
this.NotifyIcon.MouseUp += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon_Click);
|
||||||
//
|
//
|
||||||
@@ -719,6 +892,7 @@ namespace MusicPlayer
|
|||||||
this.MenuStrip.PerformLayout();
|
this.MenuStrip.PerformLayout();
|
||||||
this.ControlsPanel.ResumeLayout(false);
|
this.ControlsPanel.ResumeLayout(false);
|
||||||
this.ControlsPanel.PerformLayout();
|
this.ControlsPanel.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).EndInit();
|
||||||
this.NotifyMenuStrip.ResumeLayout(false);
|
this.NotifyMenuStrip.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@@ -784,10 +958,29 @@ namespace MusicPlayer
|
|||||||
private System.Windows.Forms.ToolStripMenuItem NotifyMenuStripNextButton;
|
private System.Windows.Forms.ToolStripMenuItem NotifyMenuStripNextButton;
|
||||||
private System.Windows.Forms.ToolStripMenuItem NotifyMenuStripPreviousButton;
|
private System.Windows.Forms.ToolStripMenuItem NotifyMenuStripPreviousButton;
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
|
||||||
private System.Windows.Forms.ToolStripMenuItem ViewCurrentPlaylistButton;
|
private System.Windows.Forms.ToolStripMenuItem ViewQueueButton;
|
||||||
private System.Windows.Forms.ToolStripMenuItem serverToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem serverToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem SelectServerJancoButton;
|
private System.Windows.Forms.ToolStripMenuItem SelectServerJancoButton;
|
||||||
private System.Windows.Forms.ToolStripMenuItem SelectServerYorickButton;
|
private System.Windows.Forms.ToolStripMenuItem SelectServerYorickButton;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem radioToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem qDanceToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem customToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripTextBox RadioStationTextBox;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem SetRadioStationButton;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem fMToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem slamFMToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem viewPlaylistToolstripMenuButton;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem songsToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripTextBox SearchSongsTextBox;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem SearchSongsButton;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem AdvancedSearchButton;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem resetToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.PictureBox pictureBox1;
|
||||||
|
private System.Windows.Forms.Label AddToQueueLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ namespace MusicPlayer
|
|||||||
PositionTrackBar.Value = Math.Max(main.audio.Position, 0);
|
PositionTrackBar.Value = Math.Max(main.audio.Position, 0);
|
||||||
|
|
||||||
//Buffer display
|
//Buffer display
|
||||||
|
if(main.audio.Buffered / 10 >= BufferBar.Minimum && main.audio.Buffered / 10 <= BufferBar.Maximum)
|
||||||
BufferBar.Value = main.audio.Buffered / 10;
|
BufferBar.Value = main.audio.Buffered / 10;
|
||||||
|
|
||||||
//Time labels
|
//Time labels
|
||||||
@@ -109,6 +110,13 @@ namespace MusicPlayer
|
|||||||
CurrentSongLabel.Text = "Currently playing: " + main.audio.CurrentSong.Name;
|
CurrentSongLabel.Text = "Currently playing: " + main.audio.CurrentSong.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//image box
|
||||||
|
if (AlbumListView.LargeImageList != null && main.audio.CurrentSong != null)
|
||||||
|
{
|
||||||
|
//Console.WriteLine(AlbumListView.LargeImageList.Images["Get Wet"]);
|
||||||
|
pictureBox1.Image = AlbumListView.LargeImageList.Images[main.audio.CurrentSong.Album];
|
||||||
|
}
|
||||||
|
|
||||||
//Buttons and context menu
|
//Buttons and context menu
|
||||||
if (main.audio.AState == AudioHandler.AudioState.PLAYING)
|
if (main.audio.AState == AudioHandler.AudioState.PLAYING)
|
||||||
{
|
{
|
||||||
@@ -136,6 +144,11 @@ namespace MusicPlayer
|
|||||||
else
|
else
|
||||||
SelectServerYorickButton.Enabled = true;
|
SelectServerYorickButton.Enabled = true;
|
||||||
|
|
||||||
|
if (SearchSongsTextBox.Text.Length == 0)
|
||||||
|
SearchSongsButton.Enabled = false;
|
||||||
|
else
|
||||||
|
SearchSongsButton.Enabled = true;
|
||||||
|
|
||||||
if (main.audio.AState == AudioHandler.AudioState.PAUSED)
|
if (main.audio.AState == AudioHandler.AudioState.PAUSED)
|
||||||
{
|
{
|
||||||
PauseButton.Enabled = false;
|
PauseButton.Enabled = false;
|
||||||
@@ -166,6 +179,11 @@ namespace MusicPlayer
|
|||||||
NotifyMenuStripStopButton.Enabled = true;
|
NotifyMenuStripStopButton.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RadioStationTextBox.Text.Length <= 10)
|
||||||
|
SetRadioStationButton.Enabled = false;
|
||||||
|
else
|
||||||
|
SetRadioStationButton.Enabled = true;
|
||||||
|
|
||||||
if(PlayNextSongButton.Checked)
|
if(PlayNextSongButton.Checked)
|
||||||
{
|
{
|
||||||
ShuffleSongButton.Enabled = true;
|
ShuffleSongButton.Enabled = true;
|
||||||
@@ -184,6 +202,12 @@ namespace MusicPlayer
|
|||||||
NotifyMenuStripNextButton.Enabled = false;
|
NotifyMenuStripNextButton.Enabled = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (main.audio.CurrentSong is RadioStation)
|
||||||
|
{
|
||||||
|
main.currentPlayingList.Clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
NextButton.Enabled = true;
|
NextButton.Enabled = true;
|
||||||
NotifyMenuStripNextButton.Enabled = true;
|
NotifyMenuStripNextButton.Enabled = true;
|
||||||
@@ -199,8 +223,11 @@ namespace MusicPlayer
|
|||||||
NotifyMenuStripPreviousButton.Enabled = true;
|
NotifyMenuStripPreviousButton.Enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (songFinished)
|
if (songFinished)
|
||||||
|
{
|
||||||
|
if (! (main.audio.CurrentSong is RadioStation) )
|
||||||
{
|
{
|
||||||
Thread.Sleep(20);
|
Thread.Sleep(20);
|
||||||
|
|
||||||
@@ -212,6 +239,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
main.audio.Play(main.audio.CurrentSong);
|
main.audio.Play(main.audio.CurrentSong);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
songFinished = false;
|
songFinished = false;
|
||||||
}
|
}
|
||||||
@@ -393,8 +421,10 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
private void PositionTrackBar_MouseDown(object sender, MouseEventArgs e)
|
private void PositionTrackBar_MouseDown(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
|
clicked = true;
|
||||||
double dblValue;
|
double dblValue;
|
||||||
dblValue = ((double)(e.X+PositionTrackBar.Location.X) / (double)(PositionTrackBar.Width + PositionTrackBar.Location.X)) * (PositionTrackBar.Maximum - PositionTrackBar.Minimum);
|
//dblValue = ((double)(e.X+PositionTrackBar.Location.X) / (double)(PositionTrackBar.Width + PositionTrackBar.Location.X)) * (PositionTrackBar.Maximum - PositionTrackBar.Minimum);
|
||||||
|
dblValue = ((double)e.X / (double)PositionTrackBar.Width) * (PositionTrackBar.Maximum - PositionTrackBar.Minimum);
|
||||||
PositionTrackBar.Value = Convert.ToInt32(dblValue);
|
PositionTrackBar.Value = Convert.ToInt32(dblValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,7 +488,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
main.FilterCurrentPlaying();
|
main.FilterCurrentPlaying();
|
||||||
int selected = main.currentPlayingList.IndexOf(main.audio.CurrentSong);
|
int selected = main.currentPlayingList.IndexOf(main.audio.CurrentSong);
|
||||||
if(main.currentPlayingList.Count >= 1)
|
if(main.currentPlayingList.Count >= 1 && selected >= 0)
|
||||||
SongsTableView.CurrentCell = SongsTableView.Rows[selected].Cells[0];
|
SongsTableView.CurrentCell = SongsTableView.Rows[selected].Cells[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,13 +507,30 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
Cursor.Current = Cursors.Default;
|
Cursor.Current = Cursors.Default;
|
||||||
Point point = PlaylistBox.PointToClient(Cursor.Position);
|
Point point = PlaylistBox.PointToClient(Cursor.Position);
|
||||||
|
Point point2 = AddToQueueLabel.PointToClient(Cursor.Position);
|
||||||
|
bool queue = AddToQueueLabel.ClientRectangle.Contains(point2);
|
||||||
int index = PlaylistBox.IndexFromPoint(point);
|
int index = PlaylistBox.IndexFromPoint(point);
|
||||||
if (index < 0) //nope, niet op een playlist gesleept
|
if (index < 0 && !queue) //nope, niet op een playlist gesleept
|
||||||
{
|
{
|
||||||
draggedstarted = false;
|
draggedstarted = false;
|
||||||
draggedcompleted = false;
|
draggedcompleted = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (queue)
|
||||||
|
{
|
||||||
|
SongsTable s = new SongsTable();
|
||||||
|
if (SongsTableView.SelectedRows.Count > 0)
|
||||||
|
{
|
||||||
|
var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView;
|
||||||
|
var row = drv.Row as DataRow;
|
||||||
|
s.ImportRow(row);
|
||||||
|
main.currentPlayingList.Add((s.Rows[0][5] as Song));
|
||||||
|
ViewCurrentPlaylistButton_Click(this, new EventArgs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
Playlist currentPlaylist = main.pl.GetPlaylistByName(PlaylistBox.Items[index].ToString());
|
Playlist currentPlaylist = main.pl.GetPlaylistByName(PlaylistBox.Items[index].ToString());
|
||||||
SongsTable s = new SongsTable();
|
SongsTable s = new SongsTable();
|
||||||
if (SongsTableView.SelectedRows.Count > 0)
|
if (SongsTableView.SelectedRows.Count > 0)
|
||||||
@@ -496,6 +543,9 @@ namespace MusicPlayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AddToQueueLabel.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
draggedcompleted = false;
|
draggedcompleted = false;
|
||||||
draggedstarted = false;
|
draggedstarted = false;
|
||||||
}
|
}
|
||||||
@@ -509,6 +559,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
draggedcompleted = true;
|
draggedcompleted = true;
|
||||||
playlistsToolStripMenuItem_Click(this, new EventArgs());
|
playlistsToolStripMenuItem_Click(this, new EventArgs());
|
||||||
|
AddToQueueLabel.Visible = true;
|
||||||
Cursor.Current = Cursors.Hand;
|
Cursor.Current = Cursors.Hand;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -522,5 +573,57 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
main.SwitchServer("http://imegumii.nl");
|
main.SwitchServer("http://imegumii.nl");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem2_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
main.audio.Play(new RadioStation("538", main.api, "http://vip-icecast.538.lw.triple-it.nl:80/RADIO538_MP3"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void qDanceToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
main.audio.Play(new RadioStation("Q-Dance", main.api, "http://stream01.platform02.true.nl:8000/qdance-hard"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fMToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
main.audio.Play(new RadioStation("3FM", main.api, "http://icecast.omroep.nl:80/3fm-bb-mp3"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void slamFMToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
main.audio.Play(new RadioStation("Slam-FM", main.api, "http://vip-icecast.538.lw.triple-it.nl/SLAMFM_MP3"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetRadioStationButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
string input = RadioStationTextBox.Text;
|
||||||
|
|
||||||
|
if(Main.CheckURLValid(input))
|
||||||
|
{
|
||||||
|
main.audio.Play(new RadioStation(Main.GetDomain(input), main.api, input));
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioStationTextBox.Text = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SearchSongsButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(SearchSongsTextBox.Text.Length > 0)
|
||||||
|
{
|
||||||
|
main.SearchFilter(SearchSongsTextBox.Text);
|
||||||
|
SearchSongsTextBox.Text = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AdvancedSearchButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
AdvancedSearch av = new AdvancedSearch(main);
|
||||||
|
av.ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
main.Repopulate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,12 @@
|
|||||||
<Compile Include="NetworkHandler.cs" />
|
<Compile Include="NetworkHandler.cs" />
|
||||||
<Compile Include="Playlist.cs" />
|
<Compile Include="Playlist.cs" />
|
||||||
<Compile Include="PlaylistHandler.cs" />
|
<Compile Include="PlaylistHandler.cs" />
|
||||||
|
<Compile Include="AdvancedSearch.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="AdvancedSearch.Designer.cs">
|
||||||
|
<DependentUpon>AdvancedSearch.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="PlaylistMaker.cs">
|
<Compile Include="PlaylistMaker.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -85,6 +91,7 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="RadioStation.cs" />
|
||||||
<Compile Include="Song.cs" />
|
<Compile Include="Song.cs" />
|
||||||
<Compile Include="SongsTable.cs">
|
<Compile Include="SongsTable.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
@@ -93,6 +100,9 @@
|
|||||||
<EmbeddedResource Include="MainForm.resx">
|
<EmbeddedResource Include="MainForm.resx">
|
||||||
<DependentUpon>MainForm.cs</DependentUpon>
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="AdvancedSearch.resx">
|
||||||
|
<DependentUpon>AdvancedSearch.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="PlaylistMaker.resx">
|
<EmbeddedResource Include="PlaylistMaker.resx">
|
||||||
<DependentUpon>PlaylistMaker.cs</DependentUpon>
|
<DependentUpon>PlaylistMaker.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{E2B99339-3251-48BE-91C9-FAB21CD07A39}</ProjectGuid>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>MusicPlayer</RootNamespace>
|
||||||
|
<AssemblyName>MusicPlayer</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Deployment" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="MainForm.cs" >
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Album.cs" />
|
||||||
|
<Compile Include="APIHandler.cs" />
|
||||||
|
<Compile Include="Artist.cs" />
|
||||||
|
<Compile Include="MainForm.Designer.cs">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="NetworkHandler.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<<<<<<< HEAD
|
||||||
|
<EmbeddedResource Include="MainForm.resx">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
=======
|
||||||
|
<EmbeddedResource Include="Form1.resx">
|
||||||
|
<DependentUpon>Form1.cs</DependentUpon>
|
||||||
|
>>>>>>> origin/api
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<None Include="Properties\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<Compile Include="Properties\Settings.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -24,9 +24,9 @@ namespace MusicPlayer
|
|||||||
public JObject SendString(string m)
|
public JObject SendString(string m)
|
||||||
{
|
{
|
||||||
string encodedstring = Microsoft.Security.Application.Encoder.HtmlEncode(m);
|
string encodedstring = Microsoft.Security.Application.Encoder.HtmlEncode(m);
|
||||||
Console.WriteLine(encodedstring);
|
|
||||||
HttpWebRequest server = (HttpWebRequest)WebRequest.Create(ip+":"+port+"/"+encodedstring);
|
HttpWebRequest server = (HttpWebRequest)WebRequest.Create(ip+":"+port+"/"+encodedstring);
|
||||||
server.KeepAlive = false;
|
server.KeepAlive = false;
|
||||||
|
try {
|
||||||
HttpWebResponse respond = (HttpWebResponse)server.GetResponse();
|
HttpWebResponse respond = (HttpWebResponse)server.GetResponse();
|
||||||
Stream streamResponse = respond.GetResponseStream();
|
Stream streamResponse = respond.GetResponseStream();
|
||||||
StreamReader streamRead = new StreamReader(streamResponse);
|
StreamReader streamRead = new StreamReader(streamResponse);
|
||||||
@@ -45,12 +45,26 @@ namespace MusicPlayer
|
|||||||
streamRead.Close();
|
streamRead.Close();
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
catch(WebException e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Server is offline");
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Er is iets fout gegaan bij het communiceren met de server.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public MemoryStream downloadArtwork(string album)
|
public MemoryStream downloadArtwork(string album)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
WebRequest req = WebRequest.Create((ip + "/music/artwork/"+album).Replace(" ", "%20"));
|
string encodedstring = Microsoft.Security.Application.Encoder.HtmlEncode(ip + "/music/.artwork/" + album);
|
||||||
|
WebRequest req = WebRequest.Create(encodedstring);
|
||||||
|
//WebRequest req = WebRequest.Create((ip + "/music/.artwork/" + album).Replace(" ","%20"));
|
||||||
WebResponse response = req.GetResponse();
|
WebResponse response = req.GetResponse();
|
||||||
Stream stream = response.GetResponseStream();
|
Stream stream = response.GetResponseStream();
|
||||||
|
|
||||||
|
|||||||
@@ -9,14 +9,16 @@ namespace MusicPlayer
|
|||||||
public string name { get; }
|
public string name { get; }
|
||||||
private string basedir;
|
private string basedir;
|
||||||
public List<Song> songs;
|
public List<Song> songs;
|
||||||
|
public string server;
|
||||||
|
|
||||||
private APIHandler api;
|
private APIHandler api;
|
||||||
public Playlist(string name, string basedir, APIHandler api)
|
public Playlist(string name, string basedir, string server, APIHandler api)
|
||||||
{
|
{
|
||||||
this.songs = new List<Song>();
|
this.songs = new List<Song>();
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.basedir = basedir;
|
this.basedir = basedir;
|
||||||
|
this.server = server;
|
||||||
this.ReadFromFile();
|
this.ReadFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,6 +37,8 @@ namespace MusicPlayer
|
|||||||
try {
|
try {
|
||||||
using (StreamReader str = new StreamReader(basedir + name + ".txt"))
|
using (StreamReader str = new StreamReader(basedir + name + ".txt"))
|
||||||
{
|
{
|
||||||
|
server = str.ReadLine();
|
||||||
|
|
||||||
string readline;
|
string readline;
|
||||||
while ((readline = str.ReadLine()) != null)
|
while ((readline = str.ReadLine()) != null)
|
||||||
{
|
{
|
||||||
@@ -48,6 +52,7 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
FileStream fs = new FileStream(basedir + name + ".txt", FileMode.CreateNew);
|
FileStream fs = new FileStream(basedir + name + ".txt", FileMode.CreateNew);
|
||||||
fs.Close();
|
fs.Close();
|
||||||
|
File.WriteAllText(basedir + name + ".txt", server);
|
||||||
ReadFromFile();
|
ReadFromFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,6 +62,8 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
using (StreamWriter stw = new StreamWriter(basedir + name + ".txt"))
|
using (StreamWriter stw = new StreamWriter(basedir + name + ".txt"))
|
||||||
{
|
{
|
||||||
|
stw.WriteLine(server.ToString());
|
||||||
|
|
||||||
this.songs.ForEach(s =>
|
this.songs.ForEach(s =>
|
||||||
{
|
{
|
||||||
stw.WriteLine(s.ToString());
|
stw.WriteLine(s.ToString());
|
||||||
@@ -64,5 +71,21 @@ namespace MusicPlayer
|
|||||||
stw.Flush();
|
stw.Flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Delete()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
System.IO.File.Move(basedir + name + ".txt", basedir + name + ".txt.old");
|
||||||
|
}
|
||||||
|
catch(Exception)
|
||||||
|
{
|
||||||
|
//Already removed.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void RemoveSong(Song s)
|
||||||
|
{
|
||||||
|
this.songs.Remove(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,23 +8,26 @@ namespace MusicPlayer
|
|||||||
public class PlaylistHandler
|
public class PlaylistHandler
|
||||||
{
|
{
|
||||||
private List<Playlist> playlists;
|
private List<Playlist> playlists;
|
||||||
private APIHandler api;
|
public Main main
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
private readonly string basedir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\.mpplaylists\\";
|
private readonly string basedir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\.mpplaylists\\";
|
||||||
public PlaylistHandler(APIHandler api)
|
public PlaylistHandler()
|
||||||
{
|
{
|
||||||
this.playlists = new List<Playlist>();
|
this.playlists = new List<Playlist>();
|
||||||
this.api = api;
|
|
||||||
Populate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Populate()
|
public void Populate()
|
||||||
{
|
{
|
||||||
|
playlists.Clear();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Directory.GetFiles(basedir).ToList().ForEach(f =>
|
Directory.GetFiles(basedir).ToList().ForEach(f =>
|
||||||
{
|
{
|
||||||
if (f.EndsWith(".txt"))
|
if (f.EndsWith(".txt"))
|
||||||
{
|
{
|
||||||
playlists.Add(new Playlist(Path.GetFileName(f.Replace(".txt","")) ,basedir, api));
|
playlists.Add(new Playlist(Path.GetFileName(f.Replace(".txt","")) ,basedir, main.nw.ip, main.api));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -39,7 +42,7 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
public void MakeNewPlaylistByName(string name)
|
public void MakeNewPlaylistByName(string name)
|
||||||
{
|
{
|
||||||
playlists.Add(new Playlist(name, basedir, api));
|
playlists.Add(new Playlist(name, basedir, main.nw.ip, main.api));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Playlist GetPlaylistByName(string name)
|
public Playlist GetPlaylistByName(string name)
|
||||||
@@ -54,7 +57,28 @@ namespace MusicPlayer
|
|||||||
|
|
||||||
public List<Playlist> GetPlaylists()
|
public List<Playlist> GetPlaylists()
|
||||||
{
|
{
|
||||||
return playlists;
|
List<Playlist> currentPlaylists = new List<Playlist>();
|
||||||
|
foreach(Playlist pl in playlists)
|
||||||
|
{
|
||||||
|
if (pl.server == main.nw.ip)
|
||||||
|
currentPlaylists.Add(pl);
|
||||||
|
}
|
||||||
|
return currentPlaylists;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void RemovePlaylistByName(string name)
|
||||||
|
{
|
||||||
|
Playlist toRemove = null;
|
||||||
|
playlists.ForEach(p =>
|
||||||
|
{
|
||||||
|
if (p.name == name) { toRemove = p; }
|
||||||
|
});
|
||||||
|
|
||||||
|
if(toRemove != null)
|
||||||
|
{
|
||||||
|
toRemove.Delete();
|
||||||
|
playlists.Remove(toRemove);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+31
-2
@@ -43,6 +43,8 @@ namespace MusicPlayer
|
|||||||
this.label4 = new System.Windows.Forms.Label();
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
this.FilterTextBox = new System.Windows.Forms.TextBox();
|
this.FilterTextBox = new System.Windows.Forms.TextBox();
|
||||||
this.label5 = new System.Windows.Forms.Label();
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
|
this.DeletePlaylistButton = new System.Windows.Forms.Button();
|
||||||
|
this.DeleteSongsButton = new System.Windows.Forms.Button();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// PlaylistSelectBox
|
// PlaylistSelectBox
|
||||||
@@ -87,6 +89,7 @@ namespace MusicPlayer
|
|||||||
this.PlaylistSongContainer.FormattingEnabled = true;
|
this.PlaylistSongContainer.FormattingEnabled = true;
|
||||||
this.PlaylistSongContainer.Location = new System.Drawing.Point(10, 319);
|
this.PlaylistSongContainer.Location = new System.Drawing.Point(10, 319);
|
||||||
this.PlaylistSongContainer.Name = "PlaylistSongContainer";
|
this.PlaylistSongContainer.Name = "PlaylistSongContainer";
|
||||||
|
this.PlaylistSongContainer.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
|
||||||
this.PlaylistSongContainer.Size = new System.Drawing.Size(306, 82);
|
this.PlaylistSongContainer.Size = new System.Drawing.Size(306, 82);
|
||||||
this.PlaylistSongContainer.TabIndex = 3;
|
this.PlaylistSongContainer.TabIndex = 3;
|
||||||
//
|
//
|
||||||
@@ -123,7 +126,7 @@ namespace MusicPlayer
|
|||||||
// label2
|
// label2
|
||||||
//
|
//
|
||||||
this.label2.AutoSize = true;
|
this.label2.AutoSize = true;
|
||||||
this.label2.Location = new System.Drawing.Point(10, 80);
|
this.label2.Location = new System.Drawing.Point(8, 75);
|
||||||
this.label2.Name = "label2";
|
this.label2.Name = "label2";
|
||||||
this.label2.Size = new System.Drawing.Size(97, 13);
|
this.label2.Size = new System.Drawing.Size(97, 13);
|
||||||
this.label2.TabIndex = 7;
|
this.label2.TabIndex = 7;
|
||||||
@@ -133,7 +136,7 @@ namespace MusicPlayer
|
|||||||
//
|
//
|
||||||
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.label3.AutoSize = true;
|
this.label3.AutoSize = true;
|
||||||
this.label3.Location = new System.Drawing.Point(7, 303);
|
this.label3.Location = new System.Drawing.Point(11, 297);
|
||||||
this.label3.Name = "label3";
|
this.label3.Name = "label3";
|
||||||
this.label3.Size = new System.Drawing.Size(82, 13);
|
this.label3.Size = new System.Drawing.Size(82, 13);
|
||||||
this.label3.TabIndex = 8;
|
this.label3.TabIndex = 8;
|
||||||
@@ -165,11 +168,35 @@ namespace MusicPlayer
|
|||||||
this.label5.TabIndex = 11;
|
this.label5.TabIndex = 11;
|
||||||
this.label5.Text = "Filter";
|
this.label5.Text = "Filter";
|
||||||
//
|
//
|
||||||
|
// DeletePlaylistButton
|
||||||
|
//
|
||||||
|
this.DeletePlaylistButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.DeletePlaylistButton.Location = new System.Drawing.Point(225, 70);
|
||||||
|
this.DeletePlaylistButton.Name = "DeletePlaylistButton";
|
||||||
|
this.DeletePlaylistButton.Size = new System.Drawing.Size(92, 23);
|
||||||
|
this.DeletePlaylistButton.TabIndex = 12;
|
||||||
|
this.DeletePlaylistButton.Text = "Delete Playlist";
|
||||||
|
this.DeletePlaylistButton.UseVisualStyleBackColor = true;
|
||||||
|
this.DeletePlaylistButton.Click += new System.EventHandler(this.DeletePlaylistButton_Click);
|
||||||
|
//
|
||||||
|
// DeleteSongsButton
|
||||||
|
//
|
||||||
|
this.DeleteSongsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.DeleteSongsButton.Location = new System.Drawing.Point(172, 292);
|
||||||
|
this.DeleteSongsButton.Name = "DeleteSongsButton";
|
||||||
|
this.DeleteSongsButton.Size = new System.Drawing.Size(143, 23);
|
||||||
|
this.DeleteSongsButton.TabIndex = 13;
|
||||||
|
this.DeleteSongsButton.Text = "Delete Selected Songs";
|
||||||
|
this.DeleteSongsButton.UseVisualStyleBackColor = true;
|
||||||
|
this.DeleteSongsButton.Click += new System.EventHandler(this.DeleteSongsButton_Click);
|
||||||
|
//
|
||||||
// PlaylistMaker
|
// PlaylistMaker
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(334, 411);
|
this.ClientSize = new System.Drawing.Size(334, 411);
|
||||||
|
this.Controls.Add(this.DeleteSongsButton);
|
||||||
|
this.Controls.Add(this.DeletePlaylistButton);
|
||||||
this.Controls.Add(this.label5);
|
this.Controls.Add(this.label5);
|
||||||
this.Controls.Add(this.FilterTextBox);
|
this.Controls.Add(this.FilterTextBox);
|
||||||
this.Controls.Add(this.label4);
|
this.Controls.Add(this.label4);
|
||||||
@@ -206,5 +233,7 @@ namespace MusicPlayer
|
|||||||
private Label label4;
|
private Label label4;
|
||||||
private TextBox FilterTextBox;
|
private TextBox FilterTextBox;
|
||||||
private Label label5;
|
private Label label5;
|
||||||
|
private Button DeletePlaylistButton;
|
||||||
|
private Button DeleteSongsButton;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,12 +47,17 @@ namespace MusicPlayer
|
|||||||
PlaylistSelectBox.SelectedIndex = PlaylistSelectBox.Items.Count - 1;
|
PlaylistSelectBox.SelectedIndex = PlaylistSelectBox.Items.Count - 1;
|
||||||
else
|
else
|
||||||
PlaylistSelectBox.SelectedIndex = selection;
|
PlaylistSelectBox.SelectedIndex = selection;
|
||||||
|
PlaylistSongContainer.Items.Clear();
|
||||||
if (PlaylistSelectBox.SelectedItem != null)
|
if (PlaylistSelectBox.SelectedItem != null)
|
||||||
{
|
{
|
||||||
PlaylistSongContainer.Items.Clear();
|
|
||||||
allPlaylistSongs = pl.GetPlaylistByName(PlaylistSelectBox.SelectedItem.ToString()).GetSongs();
|
allPlaylistSongs = pl.GetPlaylistByName(PlaylistSelectBox.SelectedItem.ToString()).GetSongs();
|
||||||
allPlaylistSongs.ForEach(s => PlaylistSongContainer.Items.Add(s.Name));
|
allPlaylistSongs.ForEach(s => PlaylistSongContainer.Items.Add(s.Name));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PlaylistSelectBox.SelectedIndex = -1;
|
||||||
|
PlaylistSelectBox.Text = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Repopulate()
|
public void Repopulate()
|
||||||
@@ -145,5 +150,38 @@ namespace MusicPlayer
|
|||||||
PlaylistNewButton_Click(sender, new EventArgs());
|
PlaylistNewButton_Click(sender, new EventArgs());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DeletePlaylistButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (PlaylistSelectBox.SelectedItem != null)
|
||||||
|
if (MessageBox.Show("Are you sure to delete " + PlaylistSelectBox.SelectedItem.ToString() + "?", "Confirm Delete!", MessageBoxButtons.YesNo) == DialogResult.Yes)
|
||||||
|
{
|
||||||
|
pl.RemovePlaylistByName(PlaylistSelectBox.SelectedItem.ToString());
|
||||||
|
Repopulate(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteSongsButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (PlaylistSelectBox.SelectedItem != null)
|
||||||
|
{
|
||||||
|
Playlist currentPlaylist = pl.GetPlaylistByName(PlaylistSelectBox.SelectedItem.ToString());
|
||||||
|
foreach (string song in PlaylistSongSelector.SelectedItems)
|
||||||
|
{
|
||||||
|
for (int i = currentPlaylist.GetSongs().Count - 1; i > 0; i--)
|
||||||
|
{
|
||||||
|
Song s = currentPlaylist.GetSongs()[i];
|
||||||
|
if (s.Name == song)
|
||||||
|
{
|
||||||
|
currentPlaylist.RemoveSong(s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentPlaylist.WriteToFile();
|
||||||
|
}
|
||||||
|
Thread.Sleep(10);
|
||||||
|
Repopulate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,10 @@ namespace MusicPlayer
|
|||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
NetworkHandler nw = new NetworkHandler("http://jancokock.me");
|
NetworkHandler nw = new NetworkHandler("http://imegumii.nl");
|
||||||
//NetworkHandler nw = new NetworkHandler("http://imegumii.nl");
|
|
||||||
APIHandler api = new APIHandler(nw);
|
APIHandler api = new APIHandler(nw);
|
||||||
MainForm form = new MainForm();
|
MainForm form = new MainForm();
|
||||||
PlaylistHandler pl = new PlaylistHandler(api);
|
PlaylistHandler pl = new PlaylistHandler();
|
||||||
new Main(nw, api, form,pl);
|
new Main(nw, api, form,pl);
|
||||||
|
|
||||||
Application.Run(form);
|
Application.Run(form);
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MusicPlayer
|
||||||
|
{
|
||||||
|
class RadioStation :Song
|
||||||
|
{
|
||||||
|
string radiourl;
|
||||||
|
public RadioStation(string name, APIHandler api, string url):base("-1", name,"","","",0,api)
|
||||||
|
{
|
||||||
|
radiourl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string GetURL()
|
||||||
|
{
|
||||||
|
return radiourl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Executable → Regular
+25
-1
@@ -34,7 +34,7 @@ namespace MusicPlayer
|
|||||||
url = "";
|
url = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetURL()
|
protected virtual string GetURL()
|
||||||
{
|
{
|
||||||
if (url == "")
|
if (url == "")
|
||||||
{
|
{
|
||||||
@@ -53,5 +53,29 @@ namespace MusicPlayer
|
|||||||
{
|
{
|
||||||
return $"{this.SongID}|{this.Name}|{this.Album}|{this.Artist}|{this.Genre}|{this.Seconds}";
|
return $"{this.SongID}|{this.Name}|{this.Album}|{this.Artist}|{this.Genre}|{this.Seconds}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool Equals(System.Object obj)
|
||||||
|
{
|
||||||
|
// If parameter is null return false.
|
||||||
|
if (obj == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If parameter cannot be cast to Point return false.
|
||||||
|
Song s = obj as Song;
|
||||||
|
if ((System.Object)s == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return true if the fields match:
|
||||||
|
return (s.Name == Name) && (s.SongID == SongID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return int.Parse(this.SongID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ namespace MusicPlayer
|
|||||||
public SongsTable() : base()
|
public SongsTable() : base()
|
||||||
{
|
{
|
||||||
this.Columns.Clear();
|
this.Columns.Clear();
|
||||||
this.Columns.Add("Naam", typeof(string));
|
this.Columns.Add("Name", typeof(string));
|
||||||
this.Columns.Add("Album", typeof(string));
|
this.Columns.Add("Album", typeof(string));
|
||||||
this.Columns.Add("Artiest", typeof(string));
|
this.Columns.Add("Artist", typeof(string));
|
||||||
this.Columns.Add("Genre", typeof(string));
|
this.Columns.Add("Genre", typeof(string));
|
||||||
this.Columns.Add("Duration", typeof(string));
|
this.Columns.Add("Duration", typeof(string));
|
||||||
this.Columns.Add("song", typeof(Song));
|
this.Columns.Add("song", typeof(Song));
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
[HTTP]
|
|
||||||
port = 8585
|
|
||||||
|
|
||||||
[Daemon]
|
|
||||||
port = 17170
|
|
||||||
|
|
||||||
[Library]
|
|
||||||
musicdir = /media/USBHDD/shares/Music/English
|
|
||||||
jancodir = /mnt/Muziek/
|
|
||||||
|
|
||||||
[Database]
|
|
||||||
username = yjmpd
|
|
||||||
password = qLjStxr6xncrfcna
|
|
||||||
host = imegumii.nl
|
|
||||||
database = yjmpd
|
|
||||||
port = 3306
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
configparser
|
|
||||||
mutagen
|
|
||||||
PyMySQL
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
import configparser
|
|
||||||
|
|
||||||
from yjdaemon.yjmpd import YJMPD
|
|
||||||
from yjdaemon.HTTPServer import HTTPServerThread
|
|
||||||
from yjdaemon.Database import Database
|
|
||||||
from yjdaemon.libraryscanner import LibraryScanner
|
|
||||||
|
|
||||||
debug = True
|
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
try:
|
|
||||||
config.read("config.cfg")
|
|
||||||
HTTP_PORT = int(config.get("HTTP", "port"))
|
|
||||||
DAEMON_PORT = int(config.get("Daemon","port"))
|
|
||||||
MUSIC_DIR = str(config.get("Library", "musicdir"))
|
|
||||||
DB_USERNAME = config.get("Database", "username")
|
|
||||||
DB_PASSWORD = config.get("Database", "password")
|
|
||||||
DB_HOST = config.get("Database", "host")
|
|
||||||
DB_DATABASE = config.get("Database", "database")
|
|
||||||
DB_PORT = config.getint("Database", "port")
|
|
||||||
except Exception as e:
|
|
||||||
print(e.with_traceback())
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
class MainDaemon(YJMPD):
|
|
||||||
def run(self):
|
|
||||||
HTTP_thread = HTTPServerThread(HTTP_PORT)
|
|
||||||
HTTP_thread.start()
|
|
||||||
|
|
||||||
|
|
||||||
def Test():
|
|
||||||
print("Test")
|
|
||||||
|
|
||||||
# socket_thread = ServiceSocket(DAEMON_PORT)
|
|
||||||
# socket_thread.start()
|
|
||||||
#HTTP_thread = HTTPServerThread(HTTP_PORT)
|
|
||||||
#HTTP_thread.start()
|
|
||||||
db = Database(DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE)
|
|
||||||
LibraryScanner(db, MUSIC_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if debug:
|
|
||||||
Test()
|
|
||||||
else:
|
|
||||||
if __name__ == "__main__":
|
|
||||||
username = os.getenv('USER')
|
|
||||||
if None == username:
|
|
||||||
dir = "/tmp/.pydaemon.pid"
|
|
||||||
else:
|
|
||||||
dir = "/home/" + username + "/.pydaemon.pid"
|
|
||||||
daemon = MainDaemon(dir, MUSIC_DIR)
|
|
||||||
if len(sys.argv) == 2:
|
|
||||||
if 'start' == sys.argv[1]:
|
|
||||||
daemon.start()
|
|
||||||
elif 'stop' == sys.argv[1]:
|
|
||||||
daemon.stop()
|
|
||||||
elif 'restart' == sys.argv[1]:
|
|
||||||
daemon.restart()
|
|
||||||
elif 'status' == sys.argv[1]:
|
|
||||||
daemon.status()
|
|
||||||
else:
|
|
||||||
print("Unknown command")
|
|
||||||
sys.exit(2)
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
print("usage: %s start|stop|status|restart" % sys.argv[0])
|
|
||||||
sys.exit(2)
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
import configparser
|
|
||||||
|
|
||||||
from yjdaemon.yjmpd import YJMPD
|
|
||||||
from yjdaemon.HTTPServer import HTTPServerThread
|
|
||||||
from yjdaemon.Database import Database
|
|
||||||
from yjdaemon.libraryscanner import LibraryScanner
|
|
||||||
|
|
||||||
debug = True
|
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
try:
|
|
||||||
config.read("config.cfg")
|
|
||||||
HTTP_PORT = int(config.get("HTTP", "port"))
|
|
||||||
DAEMON_PORT = int(config.get("Daemon","port"))
|
|
||||||
MUSIC_DIR = str(config.get("Library", "musicdir"))
|
|
||||||
DB_USERNAME = config.get("Database", "username")
|
|
||||||
DB_PASSWORD = config.get("Database", "password")
|
|
||||||
DB_HOST = config.get("Database", "host")
|
|
||||||
DB_DATABASE = config.get("Database", "database")
|
|
||||||
DB_PORT = config.getint("Database", "port")
|
|
||||||
except Exception as e:
|
|
||||||
print(e.with_traceback())
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
class MainDaemon(YJMPD):
|
|
||||||
def run(self):
|
|
||||||
HTTP_thread = HTTPServerThread(HTTP_PORT)
|
|
||||||
HTTP_thread.start()
|
|
||||||
|
|
||||||
|
|
||||||
def Test():
|
|
||||||
print("Test")
|
|
||||||
|
|
||||||
# socket_thread = ServiceSocket(DAEMON_PORT)
|
|
||||||
# socket_thread.start()
|
|
||||||
HTTP_thread = HTTPServerThread(HTTP_PORT)
|
|
||||||
HTTP_thread.start()
|
|
||||||
#db = Database(DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE)
|
|
||||||
#LibraryScanner(db, MUSIC_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if debug:
|
|
||||||
Test()
|
|
||||||
else:
|
|
||||||
if __name__ == "__main__":
|
|
||||||
username = os.getenv('USER')
|
|
||||||
if None == username:
|
|
||||||
dir = "/tmp/.pydaemon.pid"
|
|
||||||
else:
|
|
||||||
dir = "/home/" + username + "/.pydaemon.pid"
|
|
||||||
daemon = MainDaemon(dir, MUSIC_DIR)
|
|
||||||
if len(sys.argv) == 2:
|
|
||||||
if 'start' == sys.argv[1]:
|
|
||||||
daemon.start()
|
|
||||||
elif 'stop' == sys.argv[1]:
|
|
||||||
daemon.stop()
|
|
||||||
elif 'restart' == sys.argv[1]:
|
|
||||||
daemon.restart()
|
|
||||||
elif 'status' == sys.argv[1]:
|
|
||||||
daemon.status()
|
|
||||||
else:
|
|
||||||
print("Unknown command")
|
|
||||||
sys.exit(2)
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
print("usage: %s start|stop|status|restart" % sys.argv[0])
|
|
||||||
sys.exit(2)
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
import json
|
|
||||||
|
|
||||||
from yjdaemon.Database import Database as db
|
|
||||||
import configparser
|
|
||||||
import string
|
|
||||||
"""
|
|
||||||
Add a key to the validAPIcalls dictionary, with a corresponding function
|
|
||||||
Function should return jsonified data, so that it can then be passed on to the client.
|
|
||||||
example:
|
|
||||||
|
|
||||||
Add this to the dictionary
|
|
||||||
"getsongs": calls.getsongs
|
|
||||||
|
|
||||||
then implement this function
|
|
||||||
@staticmethod
|
|
||||||
def getsongs():
|
|
||||||
return calls.jsonify({"song": song})
|
|
||||||
|
|
||||||
And the jsonified data will be returned to the client.
|
|
||||||
|
|
||||||
Every function MUST return jsonified data!
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class calls:
|
|
||||||
@staticmethod
|
|
||||||
def APIcall(sanitizedpath):
|
|
||||||
if sanitizedpath in validAPIcalls:
|
|
||||||
return validAPIcalls[sanitizedpath]
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getfromrawjson(data, param):
|
|
||||||
return calls.dejsonify(data)[param]
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def jsonify(data):
|
|
||||||
return json.dumps(data, sort_keys=True, indent=4).encode("utf-8")
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def dejsonify(rawdata):
|
|
||||||
return json.loads(rawdata.decode("utf-8"))
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getallsongs(args):
|
|
||||||
return calls.jsonify({"songs": db.executequerystatic("SELECT * FROM tracks;"), "args": args , "result": "OK"})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getartists(args):
|
|
||||||
return calls.jsonify({"artists": db.executequerystatic("SELECT artistName FROM tracks GROUP BY artistName;"), "args": args, "result" : "OK"})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getalbums(args):
|
|
||||||
return calls.jsonify({"albums": db.executequerystatic("SELECT albumName FROM tracks GROUP BY albumName;"), "args": args, "result":"OK"})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getgenres(args):
|
|
||||||
return calls.jsonify({"genres": db.executequerystatic("SELECT genre FROM tracks GROUP BY genre;"), "args": args, "result":"OK"})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getyears(args):
|
|
||||||
return calls.jsonify({"years": db.executequerystatic("SELECT year FROM tracks GROUP BY year;"), "args": args, "result":"OK"})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getalbumnames(args):
|
|
||||||
return calls.jsonify({"albumnames": db.executequerystatic("SELECT albumName FROM tracks GROUP BY albumName;"), "args": args})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def search(args):
|
|
||||||
data = args.split("&")
|
|
||||||
genquery="""
|
|
||||||
SELECT $ident FROM tracks WHERE LCASE(trackName) LIKE LCASE(\"%$trackname%\") $orgenre LCASE(genre) LIKE LCASE(\"%$genre%\") $oralbum LCASE(albumName) LIKE LCASE(\"%$album%\") $orartist LCASE(artistName) LIKE LCASE(\"%$artistname%\") $end;
|
|
||||||
"""
|
|
||||||
query="""
|
|
||||||
SELECT $ident FROM tracks WHERE ($or1 OR $or2 OR $or3 ) $and1 $and2 $and3 $end;
|
|
||||||
"""
|
|
||||||
test = string.Template(query)
|
|
||||||
genqueryres = ""
|
|
||||||
arguments = []
|
|
||||||
general = ""
|
|
||||||
for entry in data:
|
|
||||||
values = entry.split("=")
|
|
||||||
values[1] = values[1].replace("%20"," ")
|
|
||||||
if values[0] == "q":
|
|
||||||
general = values[1]
|
|
||||||
continue
|
|
||||||
if values[1]:
|
|
||||||
arguments.append(values)
|
|
||||||
print(arguments)
|
|
||||||
finalstring = "" + genquery
|
|
||||||
for arg in arguments:
|
|
||||||
if arg[0] == "artist":
|
|
||||||
finalstring = string.Template(finalstring).safe_substitute(artistname=arg[1], orartist="AND")
|
|
||||||
test = string.Template(test.safe_substitute(and1="AND LCASE(artistName) LIKE LCASE(\"%"+ arg[1] +"%\")"))
|
|
||||||
elif arg[0] == "genre":
|
|
||||||
finalstring = string.Template(finalstring).safe_substitute(genre=arg[1],orgenre="AND")
|
|
||||||
test = string.Template(test.safe_substitute(and2="AND LCASE(genre) LIKE LCASE(\"%"+ arg[1] +"%\")"))
|
|
||||||
elif arg[0] == "album":
|
|
||||||
finalstring = string.Template(finalstring).safe_substitute(album=arg[1],oralbum="AND")
|
|
||||||
test = string.Template(test.safe_substitute(and3="AND LCASE(albumName) LIKE LCASE(\"%"+ arg[1] +"%\")"))
|
|
||||||
print(finalstring)
|
|
||||||
finalstring = string.Template(finalstring).safe_substitute(genre=general,artistname=general,album=general,trackname=general)
|
|
||||||
print(finalstring)
|
|
||||||
test = test.safe_substitute( and1="", and2="",and3="",or1="LCASE(artistName) LIKE LCASE(\"%"+general+"%\")",or2="LCASE(genre) LIKE LCASE(\"%"+general+"%\")",or3="LCASE(albumName) LIKE LCASE(\"%"+general+"%\")")
|
|
||||||
print(test)
|
|
||||||
print(string.Template(test).safe_substitute(ident="*",end=""))
|
|
||||||
return calls.jsonify({"result":"OK", "genres": db.executequerystatic(string.Template(test).safe_substitute(ident="genre",end="GROUP BY genre")),"artists": db.executequerystatic(string.Template(test).safe_substitute(ident="artistName",end="GROUP BY artistName")), "albums": db.executequerystatic(string.Template(test).safe_substitute(ident="albumName",end="GROUP BY albumName")), "songs" : db.executequerystatic(string.Template(test).safe_substitute(ident="*",end=""))})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getsongs(args):
|
|
||||||
"""Get song by album, genre, year, artist"""
|
|
||||||
data = args.partition("?")
|
|
||||||
splitstring = data[0].partition("=")
|
|
||||||
name= splitstring[0]
|
|
||||||
value = splitstring[2].replace("%20"," ")
|
|
||||||
if name == "album":
|
|
||||||
songs = db.executequerystatic("SELECT * FROM tracks WHERE albumName = \"" + value + "\"")
|
|
||||||
elif name == "genre":
|
|
||||||
songs = db.executequerystatic("SELECT * FROM tracks WHERE genre = \"" + value + "\"")
|
|
||||||
elif name == "year":
|
|
||||||
songs = db.executequerystatic("SELECT * FROM tracks WHERE year = \"" + value + "\"")
|
|
||||||
elif name == "artist":
|
|
||||||
songs = db.executequerystatic("SELECT * FROM tracks WHERE artistName = \"" + value + "\"")
|
|
||||||
elif name == "search":
|
|
||||||
songs = db.executequerystatic("SELECT * FROM tracks WHERE LCASE(trackName) LIKE LCASE(\"%"+ value + "%\") GROUP BY trackName")
|
|
||||||
else:
|
|
||||||
return calls.jsonify({"result":"NOK", "errormsg": "Not a valid argument"})
|
|
||||||
return calls.jsonify({"result":"OK","songs":songs})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getsongbyid(args):
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
try:
|
|
||||||
config.read("config.cfg")
|
|
||||||
musicdir = config.get("Library","musicdir")
|
|
||||||
port = config.get("HTTP","port")
|
|
||||||
except:
|
|
||||||
return calls.jsonify({"result" : "NOK" , "errormsg" : "I/O error while reading config."})
|
|
||||||
data = args.split("&")
|
|
||||||
splitsting = data[0].split("=")
|
|
||||||
id = splitsting[1]
|
|
||||||
file = db.executequerystatic(
|
|
||||||
"SELECT SUBSTRING_INDEX(trackUrl,'" + musicdir + "',-1) as filedir FROM `tracks` WHERE id = " + id)
|
|
||||||
try:
|
|
||||||
url = str(file[0][0])
|
|
||||||
except:
|
|
||||||
return calls.jsonify({"result": "NOK", "errormsg" : "Song ID does not exist in database."})
|
|
||||||
return calls.jsonify({"result": "OK", "songurl": "http://imegumii.nl:"+ "/music/English"+ url})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def setsong(args, songname):
|
|
||||||
global song
|
|
||||||
song = songname
|
|
||||||
return calls.jsonify({"result": "OK", "args": args})
|
|
||||||
|
|
||||||
|
|
||||||
validAPIcalls = {"getallsongs": calls.getallsongs,
|
|
||||||
"setsong": calls.setsong,
|
|
||||||
"search": calls.search,
|
|
||||||
"getsongs": calls.getsongs,
|
|
||||||
"getsongbyid": calls.getsongbyid,
|
|
||||||
"getartists": calls.getartists,
|
|
||||||
"getalbums": calls.getalbums,
|
|
||||||
"getgenres": calls.getgenres,
|
|
||||||
"getyears": calls.getyears,
|
|
||||||
"getalbumnames": calls.getalbumnames
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
import pymysql
|
|
||||||
import configparser
|
|
||||||
from threading import RLock as Lock
|
|
||||||
from warnings import filterwarnings
|
|
||||||
|
|
||||||
filterwarnings('ignore', category = pymysql.Warning)
|
|
||||||
class Database:
|
|
||||||
|
|
||||||
buffer = []
|
|
||||||
cout = 0
|
|
||||||
lock = Lock()
|
|
||||||
def __init__(self, DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE):
|
|
||||||
"""Init class """
|
|
||||||
self.cnx = pymysql.connect(user=DB_USERNAME, password=DB_PASSWORD, host=DB_HOST, database=DB_DATABASE, port=DB_PORT, charset='utf8')
|
|
||||||
self.cursor = self.cnx.cursor()
|
|
||||||
|
|
||||||
def executeQuery(self, query):
|
|
||||||
try:
|
|
||||||
self.cursor.execute(query)
|
|
||||||
self.cnx.commit()
|
|
||||||
return self.cursor.fetchall()
|
|
||||||
except pymysql.ProgrammingError as e:
|
|
||||||
print(e)
|
|
||||||
print(query)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def executequerystatic(query):
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
try:
|
|
||||||
config.read("config.cfg")
|
|
||||||
DB_USERNAME = config.get("Database", "username")
|
|
||||||
DB_PASSWORD = config.get("Database", "password")
|
|
||||||
DB_HOST = config.get("Database", "host")
|
|
||||||
DB_DATABASE = config.get("Database", "database")
|
|
||||||
DB_PORT = config.getint("Database", "port")
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
|
|
||||||
cnx = pymysql.connect(user=DB_USERNAME, password=DB_PASSWORD, host=DB_HOST, database=DB_DATABASE, port=DB_PORT)
|
|
||||||
cursor = cnx.cursor()
|
|
||||||
if query != "":
|
|
||||||
cursor.execute(query)
|
|
||||||
cnx.commit()
|
|
||||||
return cursor.fetchall()
|
|
||||||
else:
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
def turnoffautocommit(self):
|
|
||||||
self.cursor.execute("SET autocommit=0;")
|
|
||||||
self.cnx.commit()
|
|
||||||
|
|
||||||
def removeSong(self, path):
|
|
||||||
self.db.executeQuery("DELETE FROM `tracks` WHERE trackUrl = " + path.replace("'", '\\\''))
|
|
||||||
|
|
||||||
def updateInsertSong(self, genre, trackname, artistname, albumname, albumartist, tracknumber, year, duration, path): #notworking
|
|
||||||
self.db.executeQuery("INSERT INTO `tracks` (`genre`, `trackUrl`, `trackName`, `artistName`, `albumName`, `albumArtist`, `trackNumber`, `year`, `duration`) VALUES ('" + genre + b"','" + path.replace("'", '\\\'') + "','" + trackname + "','" + artistname + "','" + albumname + "','" + albumartist + "','" + tracknumber + "','" + year + "','0') " +
|
|
||||||
b" ON DUPLICATE KEY UPDATE `genre`=VALUES(`genre`) , `trackName` = VALUES(`trackName`) , `artistName` = VALUES(`artistName`) ,`albumName` = VALUES(`albumName`) , `albumArtist` = VALUES(`albumArtist`) , `trackNumber` = VALUES(`trackNumber`) , `year` = VALUES(`year`) , `duration` = VALUES(`duration`)")
|
|
||||||
|
|
||||||
def insertMultipleSongs(self, genre, trackname, artistname, albumname, albumartist, tracknumber, year, duration, path):
|
|
||||||
self.buffer.append([genre, trackname, artistname, albumname, albumartist, tracknumber, year, duration, path])
|
|
||||||
# Database.lock.acquire()
|
|
||||||
if len(self.buffer) > 50:
|
|
||||||
self.pushbuffer()
|
|
||||||
# Database.lock.release()
|
|
||||||
|
|
||||||
def pushbuffer(self):
|
|
||||||
query = ('INSERT INTO `tracks` (`genre`, `trackUrl`, `trackName`, `artistName`, `albumName`, `albumArtist`, `trackNumber`, `year`, `duration`) VALUES ')
|
|
||||||
for song in self.buffer:
|
|
||||||
query += "("
|
|
||||||
for field in song:
|
|
||||||
query += "'" + field + "',"
|
|
||||||
query = query[:-1]
|
|
||||||
query += "),"
|
|
||||||
query = query[:-1]
|
|
||||||
query += " ON DUPLICATE KEY UPDATE `genre`=VALUES(`genre`) , `trackName` = VALUES(`trackName`) , `artistName` = VALUES(`artistName`) ,`albumName` = VALUES(`albumName`) , `albumArtist` = VALUES(`albumArtist`) , `trackNumber` = VALUES(`trackNumber`) , `year` = VALUES(`year`) , `duration` = VALUES(`duration`);"
|
|
||||||
self.executeQuery(query)
|
|
||||||
del self.buffer[:]
|
|
||||||
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
|
|
||||||
import http.server
|
|
||||||
import socketserver
|
|
||||||
import threading
|
|
||||||
import html
|
|
||||||
|
|
||||||
import yjdaemon.API as API
|
|
||||||
|
|
||||||
"""
|
|
||||||
HTTP request handler.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class HTTPServerThread(threading.Thread):
|
|
||||||
def __init__(self, PORT):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.PORT = PORT
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
Handler = HTTPHandler
|
|
||||||
socketserver.TCPServer.allow_reuse_address = True
|
|
||||||
httpd = socketserver.TCPServer(("", self.PORT), Handler)
|
|
||||||
httpd.serve_forever()
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
REST API
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class HTTPHandler(http.server.SimpleHTTPRequestHandler):
|
|
||||||
def send_message(self, status, content_type, data):
|
|
||||||
self.send_response(status)
|
|
||||||
self.send_header("Content-type:", content_type)
|
|
||||||
self.end_headers()
|
|
||||||
self.wfile.write(data)
|
|
||||||
self.wfile.write("\n".encode("utf-8"))
|
|
||||||
|
|
||||||
def do_GET(self):
|
|
||||||
""" Serve a GET request. """
|
|
||||||
path = html.unescape(self.path)
|
|
||||||
path = str(path).lstrip("/").split("?")[0]
|
|
||||||
retval = API.calls.APIcall(path)
|
|
||||||
if retval is not None: # if call is valid API function
|
|
||||||
try:
|
|
||||||
args = str(html.unescape(self.path)).lstrip("/").split("?")[1]
|
|
||||||
except IndexError as e:
|
|
||||||
print(e)
|
|
||||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
|
|
||||||
return
|
|
||||||
self.send_message(200, "application/json", retval(args))
|
|
||||||
else: # else parse as normal HTTP request
|
|
||||||
f = self.send_head()
|
|
||||||
if f:
|
|
||||||
try:
|
|
||||||
self.copyfile(f, self.wfile)
|
|
||||||
finally:
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
def do_POST(self):
|
|
||||||
""" Serve a POST request. """
|
|
||||||
path = html.unescape(self.path)
|
|
||||||
path = str(path).lstrip("/").split("?")[0]
|
|
||||||
retval = API.calls.APIcall(path)
|
|
||||||
if retval is not None: # if call is valid API function
|
|
||||||
try:
|
|
||||||
args = str(html.unescape(self.path)).lstrip("/").split("?")[1] #if no args
|
|
||||||
except IndexError as e:
|
|
||||||
print(e)
|
|
||||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
|
|
||||||
return
|
|
||||||
if self.headers["Content-Type"] == 'application/json': # if data is json data
|
|
||||||
length = int(self.headers["Content-Length"])
|
|
||||||
rawdata = self.rfile.read(length)
|
|
||||||
result = retval(args, API.calls.getfromrawjson(rawdata, "data"))
|
|
||||||
self.send_message(200, "application/json", result)
|
|
||||||
else: # if not json data
|
|
||||||
self.send_message(422, "application/json", API.calls.jsonify({"error": "Not JSON data."}))
|
|
||||||
else: # if not API function
|
|
||||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Not an API function"}))
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import socket
|
|
||||||
import threading
|
|
||||||
|
|
||||||
endline = "\r\n"
|
|
||||||
|
|
||||||
class ServiceSocket(threading.Thread):
|
|
||||||
def __init__(self, PORT):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.PORT = PORT
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
||||||
self.s.bind(("", self.PORT))
|
|
||||||
self.s.listen(1)
|
|
||||||
while 1:
|
|
||||||
conn, addr = self.s.accept()
|
|
||||||
ClientHandler(conn).start()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ClientHandler(threading.Thread):
|
|
||||||
def __init__(self,conn):
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.conn = conn
|
|
||||||
def run(self):
|
|
||||||
while 1:
|
|
||||||
data = self.conn.recv(1024)
|
|
||||||
if not data:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
datastring = data.decode('utf-8', "ignore").rstrip(endline).lower()
|
|
||||||
print(datastring)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,78 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from mutagen.easyid3 import EasyID3
|
|
||||||
from mutagen.mp3 import MP3
|
|
||||||
import mutagen._util
|
|
||||||
import os
|
|
||||||
from watchdog.observers import Observer
|
|
||||||
from watchdog.events import FileSystemEventHandler
|
|
||||||
|
|
||||||
class LibraryScanner:
|
|
||||||
|
|
||||||
def __init__(self, Database, librarypath):
|
|
||||||
"""Init class """
|
|
||||||
self.url = librarypath
|
|
||||||
self.db = Database
|
|
||||||
self.scanRecursif()
|
|
||||||
ob = Observer()
|
|
||||||
ob.schedule(Filehandler(self), self.url, recursive=True)
|
|
||||||
ob.start()
|
|
||||||
|
|
||||||
|
|
||||||
def scanRecursif(self):
|
|
||||||
print("Scanning library "+self.url+" recursively...")
|
|
||||||
# musicdirs = [os.path.join(self.url,o) for o in os.listdir(self.url) if os.path.isdir(os.path.join(self.url,o))]
|
|
||||||
self.db.turnoffautocommit()
|
|
||||||
for root, directories, filenames in os.walk(self.url):
|
|
||||||
self.scandir(filenames,root)
|
|
||||||
|
|
||||||
def scandir(self,filenames, root):
|
|
||||||
for filename in filenames:
|
|
||||||
if filename.lower().endswith(('.mp3')):
|
|
||||||
path = os.path.join(root,filename)
|
|
||||||
try:
|
|
||||||
print(path, end='\r')
|
|
||||||
id3 = EasyID3(path)
|
|
||||||
audio = MP3(path)
|
|
||||||
print(audio.info.length)
|
|
||||||
self.db.insertMultipleSongs(self.getValue(id3, "genre"),path.replace("'", '\\\''),self.getValue(id3, "title"),self.getValue(id3, "artist"),self.getValue(id3, "album"),self.getValue(id3, "performer"),self.getValue(id3, "tracknumber"),self.getValue(id3, "date"),str(audio.info.length))
|
|
||||||
except (mutagen.id3._util.ID3NoHeaderError):
|
|
||||||
print("Error reading ID3 tag", end='\r')
|
|
||||||
|
|
||||||
|
|
||||||
def insertSong(self, path):
|
|
||||||
try:
|
|
||||||
id3 = EasyID3(path)
|
|
||||||
self.db.executeQuery(b"INSERT INTO `tracks` (`genre`, `trackUrl`, `trackName`, `artistName`, `albumName`, `albumArtist`, `trackNumber`, `year`, `duration`) VALUES ('" + self.getValue(id3,"genre") + b"'," + b"'" + path.replace("'", '\\\'').encode('utf8') + b"'," + b"'" + self.getValue(id3, "title") + b"'," + b"'" + self.getValue(id3, "artist") + b"'," + b"'" + self.getValue(id3, "album") + b"'," + b"'" + self.getValue(id3, "performer") + b"'," + b"'" + self.getValue(id3, "tracknumber") + b"'," + b"'" + self.getValue(id3, "date") + b"'," + b"'0') " +
|
|
||||||
b" ON DUPLICATE KEY UPDATE `genre`=VALUES(`genre`) , `trackName` = VALUES(`trackName`) , `artistName` = VALUES(`artistName`) ,`albumName` = VALUES(`albumName`) , `albumArtist` = VALUES(`albumArtist`) , `trackNumber` = VALUES(`trackNumber`) , `year` = VALUES(`year`) , `duration` = VALUES(`duration`)")
|
|
||||||
|
|
||||||
except (mutagen.id3._util.ID3NoHeaderError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def removeSong(self,path):
|
|
||||||
self.db.removeSong(path)
|
|
||||||
|
|
||||||
def getValue(self, id3, value):
|
|
||||||
try:
|
|
||||||
return id3[value][0].replace("'", "\\'")
|
|
||||||
except (KeyError, IndexError, ValueError):
|
|
||||||
print("Error reading value of ID3 tag", end='\r')
|
|
||||||
return ""
|
|
||||||
|
|
||||||
|
|
||||||
class Filehandler(FileSystemEventHandler):
|
|
||||||
def __init__(self, LibraryScanner):
|
|
||||||
self.libscanner = LibraryScanner
|
|
||||||
|
|
||||||
def process(self, event):
|
|
||||||
if not(event.is_directory):
|
|
||||||
if os.path.isfile(event.src_path) and event.src_path.lower().endswith(('.mp3','.flac', 'm4a')):
|
|
||||||
self.libscanner.insertSong(event.src_path)
|
|
||||||
else:
|
|
||||||
self.libscanner.removeSong(event.src_path)
|
|
||||||
|
|
||||||
def on_modified(self, event):
|
|
||||||
self.process(event)
|
|
||||||
|
|
||||||
def on_created(self, event):
|
|
||||||
self.process(event)
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
import configparser
|
|
||||||
from yjdaemon.Database import Database
|
|
||||||
from yjdaemon.libraryscanner import LibraryScanner
|
|
||||||
from yjdaemon.yjmpd import YJMPD
|
|
||||||
from yjdaemon.HTTPServer import HTTPServerThread
|
|
||||||
|
|
||||||
debug = False
|
|
||||||
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
try:
|
|
||||||
config.read("../config.cfg")
|
|
||||||
HTTP_PORT = int(config.get("HTTP", "port"))
|
|
||||||
DAEMON_PORT = int(config.get("Daemon", "port"))
|
|
||||||
MUSIC_DIR = str(config.get("Library", "jancodir"))
|
|
||||||
|
|
||||||
DB_USERNAME = config.get("Database", "username")
|
|
||||||
DB_PASSWORD = config.get("Database", "password")
|
|
||||||
DB_HOST = config.get("Database", "host")
|
|
||||||
DB_DATABASE = config.get("Database", "database")
|
|
||||||
DB_PORT = config.getint("Database", "port")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(e.with_traceback())
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
class MainDaemon(YJMPD):
|
|
||||||
def run(self):
|
|
||||||
HTTP_thread = HTTPServerThread(HTTP_PORT)
|
|
||||||
HTTP_thread.start()
|
|
||||||
db = Database(DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE)
|
|
||||||
LibraryScanner(db, MUSIC_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
username = os.getenv('USER')
|
|
||||||
if None == username:
|
|
||||||
dir = "/tmp/.pydaemon.pid"
|
|
||||||
else:
|
|
||||||
dir = "/home/" + username + "/.pydaemon.pid"
|
|
||||||
daemon = MainDaemon(dir, MUSIC_DIR)
|
|
||||||
if len(sys.argv) == 2:
|
|
||||||
if 'start' == sys.argv[1]:
|
|
||||||
daemon.start()
|
|
||||||
elif 'stop' == sys.argv[1]:
|
|
||||||
daemon.stop()
|
|
||||||
elif 'restart' == sys.argv[1]:
|
|
||||||
daemon.restart()
|
|
||||||
elif 'status' == sys.argv[1]:
|
|
||||||
daemon.status()
|
|
||||||
else:
|
|
||||||
print("Unknown command")
|
|
||||||
sys.exit(2)
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
print("usage: %s start|stop|status|restart" % sys.argv[0])
|
|
||||||
sys.exit(2)
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
import atexit
|
|
||||||
import signal
|
|
||||||
|
|
||||||
|
|
||||||
class YJMPD:
|
|
||||||
"""A generic yjdaemon class.
|
|
||||||
|
|
||||||
Usage: subclass the yjdaemon class and override the run() method."""
|
|
||||||
|
|
||||||
def __init__(self, pidfile, root):
|
|
||||||
self.pidfile = pidfile
|
|
||||||
self.root = root
|
|
||||||
|
|
||||||
def daemonize(self):
|
|
||||||
"""Deamonize class. UNIX double fork mechanism."""
|
|
||||||
|
|
||||||
try:
|
|
||||||
pid = os.fork()
|
|
||||||
if pid > 0:
|
|
||||||
# exit first parent
|
|
||||||
sys.exit(0)
|
|
||||||
except OSError as err:
|
|
||||||
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# decouple from parent environment
|
|
||||||
os.chdir(self.root)
|
|
||||||
os.setsid()
|
|
||||||
os.umask(0)
|
|
||||||
|
|
||||||
# do second fork
|
|
||||||
try:
|
|
||||||
pid = os.fork()
|
|
||||||
if pid > 0:
|
|
||||||
# exit from second parent
|
|
||||||
sys.exit(0)
|
|
||||||
except OSError as err:
|
|
||||||
sys.stderr.write('fork #2 failed: {0}\n'.format(err))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# redirect standard file descriptors
|
|
||||||
sys.stdout.flush()
|
|
||||||
sys.stderr.flush()
|
|
||||||
si = open(os.devnull, 'r')
|
|
||||||
so = open(os.devnull, 'a+')
|
|
||||||
se = open(os.devnull, 'a+')
|
|
||||||
|
|
||||||
os.dup2(si.fileno(), sys.stdin.fileno())
|
|
||||||
os.dup2(so.fileno(), sys.stdout.fileno())
|
|
||||||
os.dup2(se.fileno(), sys.stderr.fileno())
|
|
||||||
|
|
||||||
# write pidfile
|
|
||||||
atexit.register(self.delpid)
|
|
||||||
|
|
||||||
pid = str(os.getpid())
|
|
||||||
with open(self.pidfile, 'w+') as f:
|
|
||||||
f.write(pid + '\n')
|
|
||||||
|
|
||||||
def delpid(self):
|
|
||||||
os.remove(self.pidfile)
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""Start the yjdaemon."""
|
|
||||||
|
|
||||||
# Check for a pidfile to see if the yjdaemon already runs
|
|
||||||
try:
|
|
||||||
with open(self.pidfile, 'r') as pf:
|
|
||||||
|
|
||||||
pid = int(pf.read().strip())
|
|
||||||
except IOError:
|
|
||||||
pid = None
|
|
||||||
|
|
||||||
if pid:
|
|
||||||
message = "pidfile {0} already exist. " + \
|
|
||||||
"Daemon already running?\n"
|
|
||||||
sys.stderr.write(message.format(self.pidfile))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Start the yjdaemon
|
|
||||||
self.daemonize()
|
|
||||||
self.run()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
"""Stop the yjdaemon."""
|
|
||||||
|
|
||||||
# Get the pid from the pidfile
|
|
||||||
try:
|
|
||||||
with open(self.pidfile, 'r') as pf:
|
|
||||||
pid = int(pf.read().strip())
|
|
||||||
except IOError:
|
|
||||||
pid = None
|
|
||||||
|
|
||||||
if not pid:
|
|
||||||
message = "pidfile {0} does not exist. " + \
|
|
||||||
"Daemon not running?\n"
|
|
||||||
sys.stderr.write(message.format(self.pidfile))
|
|
||||||
return # not an error in a restart
|
|
||||||
|
|
||||||
# Try killing the yjdaemon process
|
|
||||||
try:
|
|
||||||
while 1:
|
|
||||||
os.kill(pid, signal.SIGTERM)
|
|
||||||
time.sleep(0.1)
|
|
||||||
except OSError as err:
|
|
||||||
e = str(err.args)
|
|
||||||
if e.find("No such process") > 0:
|
|
||||||
if os.path.exists(self.pidfile):
|
|
||||||
os.remove(self.pidfile)
|
|
||||||
else:
|
|
||||||
print(str(err.args))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def restart(self):
|
|
||||||
"""Restart the yjdaemon."""
|
|
||||||
self.stop()
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def status(self):
|
|
||||||
"""Print out status."""
|
|
||||||
if os.path.exists(self.pidfile):
|
|
||||||
message = "Daemon running.\n"
|
|
||||||
else:
|
|
||||||
message = "Daemon not running.\n"
|
|
||||||
sys.stdout.write(message)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
"""You should override this method when you subclass Daemon.
|
|
||||||
|
|
||||||
It will be called after the process has been daemonized by
|
|
||||||
start() or restart()."""
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
-- phpMyAdmin SQL Dump
|
|
||||||
-- version 4.3.8deb0.1
|
|
||||||
-- http://www.phpmyadmin.net
|
|
||||||
--
|
|
||||||
-- Host: localhost
|
|
||||||
-- Gegenereerd op: 27 sep 2015 om 22:19
|
|
||||||
-- Serverversie: 5.6.19-0ubuntu0.14.04.1
|
|
||||||
-- PHP-versie: 5.5.9-1ubuntu4.11
|
|
||||||
|
|
||||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
|
||||||
SET time_zone = "+00:00";
|
|
||||||
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8 */;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Database: `yjmpd`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Tabelstructuur voor tabel `tracks`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `tracks` (
|
|
||||||
`id` int(11) NOT NULL,
|
|
||||||
`genre` varchar(100) DEFAULT NULL,
|
|
||||||
`trackUrl` varchar(200) NOT NULL,
|
|
||||||
`trackName` varchar(100) DEFAULT NULL,
|
|
||||||
`artistName` varchar(100) DEFAULT NULL,
|
|
||||||
`albumName` varchar(100) DEFAULT NULL,
|
|
||||||
`albumArtist` varchar(100) DEFAULT NULL,
|
|
||||||
`trackNumber` int(11) DEFAULT NULL,
|
|
||||||
`year` int(11) DEFAULT NULL,
|
|
||||||
`duration` time DEFAULT NULL,
|
|
||||||
`playCount` int(11) NOT NULL DEFAULT '0'
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=8135 DEFAULT CHARSET=latin1;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indexen voor geëxporteerde tabellen
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Indexen voor tabel `tracks`
|
|
||||||
--
|
|
||||||
ALTER TABLE `tracks`
|
|
||||||
ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `trackUrl` (`trackUrl`);
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT voor geëxporteerde tabellen
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- AUTO_INCREMENT voor een tabel `tracks`
|
|
||||||
--
|
|
||||||
ALTER TABLE `tracks`
|
|
||||||
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8135;
|
|
||||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
||||||
Reference in New Issue
Block a user