async void chimneyMpdServer_OnList(object sender, ResponseEventArgs e)
{
Dictionary<string, string> tags = new Dictionary<string, string>();
tags.Add("files", "Files");
tags.Add("album", "Album");
tags.Add("artist", "Artist");
tags.Add("albumartist", "AlbumArtist");
tags.Add("genre", "Genre");
tags.Add("title", "Title");
string listtype = "file";
string filtertype = string.Empty;
string filterwhat = string.Empty;
bool suc = true;
string groupby = string.Empty;
if (e.arguments.Count > 0)
{
listtype = e.arguments[0];
if(e.arguments.Count > 1)
{
filtertype = (!e.arguments[1].Equals("group") && tags.ContainsKey(e.arguments[1].ToLower()))
? tags[e.arguments[1].ToLower()]
: null;
int groupcounter = 2;
if (filtertype == null) groupcounter = 1;
else if (e.arguments.Count > 2)
{
filterwhat = e.arguments[2];
groupcounter++;
}
else filterwhat = null;
if (e.arguments.Count > groupcounter && e.arguments[groupcounter].Equals("group"))
{
for (int i = groupcounter; i < e.arguments.Count; i++ )
{
if(!e.arguments[i].Equals("group"))
{
if(tags.ContainsKey(e.arguments[i].ToLower())) groupby += " GROUP BY " + tags[e.arguments[i].ToLower()];
}
}
}
}
}
string filterwhattype = (!string.IsNullOrEmpty(filtertype) && !string.IsNullOrEmpty(filterwhat))
? " WHERE " + filtertype + " = \"" + filterwhat + "\""
: string.Empty;
List<File> queryResult = null;
switch (listtype)
{
case ("album"):
queryResult = await Dbconnection.QueryAsync<File>("SELECT DISTINCT Album FROM Files" + filterwhattype + groupby);
break;
case ("artist"):
queryResult = await Dbconnection.QueryAsync<File>("SELECT DISTINCT Artist FROM Files" + filterwhattype + groupby);
break;
case ("genre"):
queryResult = await Dbconnection.QueryAsync<File>("SELECT DISTINCT Genre FROM Files" + filterwhattype + groupby);
break;
case ("albumartist"):
queryResult = await Dbconnection.QueryAsync<File>("SELECT DISTINCT AlbumArtist FROM Files" + filterwhattype + groupby);
break;
case ("file"):
queryResult = await Dbconnection.QueryAsync<File>("SELECT DISTINCT RelativePath FROM Files" + filterwhattype + groupby);
break;
default:
break;
}
string response = string.Empty;
foreach (File file in queryResult)
{
switch (listtype)
{
case ("album"):
response += "Album: " + file.Album + "\n";
break;
case ("artist"):
response += "Artist: " + file.Artist + "\n";
break;
case ("genre"):
response += "Genre: " + file.Genre + "\n";
break;
case ("albumartist"):
response += "AlbumArtist: " + file.AlbumArtist + "\n";
break;
case ("file"):
response += "file: " + file.RelativePath + "\n";
break;
default:
break;
}
}
if (suc) chimneyMpdServer.AppendResponse(response, e.id, e.position);
else
{
string errorfile = string.Empty;
if (e.arguments.Count > 0) errorfile = e.arguments.First<string>();
chimneyMpdServer.ErrorResponse(MPDKeyWords.Response.ACK + " [50@0] {listall} could not find path:" + " \"" + errorfile + "\"", e.id, e.position);
}
}