mirror of
https://github.com/ZetaKebab/MpcNET.git
synced 2025-01-14 22:18:43 +00:00
542 lines
20 KiB
C#
542 lines
20 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace LibMpc
|
|
{
|
|
/// <summary>
|
|
/// The MpdFile class contains all meta data for a file of the MPD.
|
|
/// </summary>
|
|
public class MpdFile
|
|
{
|
|
private const string TAG_FILE = "file";
|
|
private const string TAG_TIME = "Time";
|
|
private const string TAG_ARTIST = "Artist";
|
|
private const string TAG_ALBUM = "Album";
|
|
private const string TAG_TITLE = "Title";
|
|
private const string TAG_TRACK = "Track";
|
|
private const string TAG_NAME = "Name";
|
|
private const string TAG_GENRE = "Genre";
|
|
private const string TAG_DATE = "Date";
|
|
private const string TAG_COMPOSER = "Composer";
|
|
private const string TAG_PERFORMER = "Performer";
|
|
private const string TAG_COMMENT = "Comment";
|
|
private const string TAG_DISC = "Disc";
|
|
private const string TAG_POS = "Pos";
|
|
private const string TAG_ID = "Id";
|
|
|
|
private const int NO_TIME = -1;
|
|
private const string NO_ALBUM = null;
|
|
private const string NO_ARTIST = null;
|
|
private const string NO_TITLE = null;
|
|
private const string NO_TRACK = null;
|
|
private const string NO_NAME = null;
|
|
private const string NO_GENRE = null;
|
|
private const string NO_DATE = null;
|
|
private const string NO_COMPOSER = null;
|
|
private const string NO_PERFORMER = null;
|
|
private const string NO_COMMENT = null;
|
|
private const int NO_DISC = -1;
|
|
private const int NO_POS = -1;
|
|
private const int NO_ID = -1;
|
|
|
|
private readonly string file;
|
|
private readonly int time;
|
|
private readonly string album;
|
|
private readonly string artist;
|
|
private readonly string title;
|
|
private readonly string track;
|
|
private readonly string name;
|
|
private readonly string genre;
|
|
private readonly string date;
|
|
private readonly string composer;
|
|
private readonly string performer;
|
|
private readonly string comment;
|
|
private readonly int disc;
|
|
private readonly int pos;
|
|
private readonly int id;
|
|
/// <summary>
|
|
/// The name and path of the file.
|
|
/// </summary>
|
|
public string File { get { return this.file; } }
|
|
/// <summary>
|
|
/// The length of the file in seconds.
|
|
/// </summary>
|
|
public int Time { get { return this.time; } }
|
|
/// <summary>
|
|
/// The album of the file.
|
|
/// </summary>
|
|
public string Album { get { return this.album; } }
|
|
/// <summary>
|
|
/// The artist of the file.
|
|
/// </summary>
|
|
public string Artist { get { return this.artist; } }
|
|
/// <summary>
|
|
/// The title of the file.
|
|
/// </summary>
|
|
public string Title { get { return this.title; } }
|
|
/// <summary>
|
|
/// The value of the track property of the file.
|
|
/// </summary>
|
|
public string Track { get { return this.track; } }
|
|
/// <summary>
|
|
/// The name of the song.
|
|
/// </summary>
|
|
public string Name { get { return this.name; } }
|
|
/// <summary>
|
|
/// The genre of the song.
|
|
/// </summary>
|
|
public string Genre { get { return this.genre; } }
|
|
/// <summary>
|
|
/// The date the song was released.
|
|
/// </summary>
|
|
public string Date { get { return this.date; } }
|
|
/// <summary>
|
|
/// The composer of the song.
|
|
/// </summary>
|
|
public string Composer { get { return this.composer; } }
|
|
/// <summary>
|
|
/// The performer of the song.
|
|
/// </summary>
|
|
public string Performer { get { return this.performer; } }
|
|
/// <summary>
|
|
/// A comment to the file.
|
|
/// </summary>
|
|
public string Comment { get { return this.comment; } }
|
|
/// <summary>
|
|
/// The number of the disc on a multidisc album.
|
|
/// </summary>
|
|
public int Disc { get { return this.disc; } }
|
|
/// <summary>
|
|
/// The index of the file in a playlist.
|
|
/// </summary>
|
|
public int Pos { get { return this.pos; } }
|
|
/// <summary>
|
|
/// The id of the file in a playlist.
|
|
/// </summary>
|
|
public int Id { get { return this.id; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Time"/> property set.
|
|
/// </summary>
|
|
public bool HasTime { get { return this.time != NO_TIME; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Album"/> property set.
|
|
/// </summary>
|
|
public bool HasAlbum { get { return this.album != NO_ALBUM; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Artist"/> property set.
|
|
/// </summary>
|
|
public bool HasArtist { get { return this.artist != NO_ARTIST; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Title"/> property set.
|
|
/// </summary>
|
|
public bool HasTitle { get { return this.title != NO_TITLE; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Track"/> property set.
|
|
/// </summary>
|
|
public bool HasTrack { get { return this.track != NO_TRACK; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Name"/> property set.
|
|
/// </summary>
|
|
public bool HasName { get { return this.name != NO_NAME; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Genre"/> property set.
|
|
/// </summary>
|
|
public bool HasGenre { get { return this.genre != NO_GENRE; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Date"/> property set.
|
|
/// </summary>
|
|
public bool HasDate { get { return this.date != NO_DATE; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Composer"/> property set.
|
|
/// </summary>
|
|
public bool HasComposer { get { return this.composer != NO_COMPOSER; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Performer"/> property set.
|
|
/// </summary>
|
|
public bool HasPerformer { get { return this.performer != NO_PERFORMER; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Comment"/> property set.
|
|
/// </summary>
|
|
public bool HasComment { get { return this.comment != NO_COMMENT; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Disc"/> property set.
|
|
/// </summary>
|
|
public bool HasDisc { get { return this.disc != NO_DISC; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Pos"/> property set.
|
|
/// </summary>
|
|
public bool HasPos { get { return this.pos != NO_POS; } }
|
|
/// <summary>
|
|
/// If the MpdFile has the <see cref="Id"/> property set.
|
|
/// </summary>
|
|
public bool HasId { get { return this.id != NO_ID; } }
|
|
/// <summary>
|
|
/// Creates a new MpdFile.
|
|
/// </summary>
|
|
/// <param name="file">The name and path of the file.</param>
|
|
/// <param name="time">The length of the file in seconds.</param>
|
|
/// <param name="album">The album of the file.</param>
|
|
/// <param name="artist">The artist of the file.</param>
|
|
/// <param name="title">The title of the file.</param>
|
|
/// <param name="track">The value of the track property of the file.</param>
|
|
/// <param name="name">The name of the song.</param>
|
|
/// <param name="genre">The genre of the song.</param>
|
|
/// <param name="date">The date the song was released.</param>
|
|
/// <param name="composer">The composer of the song.</param>
|
|
/// <param name="performer">The performer of the song.</param>
|
|
/// <param name="comment">A comment to the file.</param>
|
|
/// <param name="disc">The number of the disc on a multidisc album.</param>
|
|
/// <param name="pos">The index of the file in a playlist.</param>
|
|
/// <param name="id">The id of the file in a playlist.</param>
|
|
public MpdFile(string file,
|
|
int time,
|
|
string album,
|
|
string artist,
|
|
string title,
|
|
string track,
|
|
string name,
|
|
string genre,
|
|
string date,
|
|
string composer,
|
|
string performer,
|
|
string comment,
|
|
int disc,
|
|
int pos,
|
|
int id)
|
|
{
|
|
if (file == null)
|
|
throw new ArgumentNullException("file");
|
|
|
|
this.file = file;
|
|
this.time = time;
|
|
this.album = album;
|
|
this.artist = artist;
|
|
this.title = title;
|
|
this.track = track;
|
|
this.name = name;
|
|
this.genre = genre;
|
|
this.date = date;
|
|
this.composer = composer;
|
|
this.performer = performer;
|
|
this.comment = comment;
|
|
this.disc = disc;
|
|
this.pos = pos;
|
|
this.id = id;
|
|
}
|
|
/// <summary>
|
|
/// A string containing all the properties of the file.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public override string ToString()
|
|
{
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
appendString(builder, TAG_FILE, this.file);
|
|
if (this.HasTime)
|
|
appendInt(builder, TAG_TIME, this.time);
|
|
if (this.HasAlbum)
|
|
appendString(builder, TAG_ALBUM, this.album);
|
|
if (this.HasArtist)
|
|
appendString(builder, TAG_ARTIST, this.artist);
|
|
if (this.HasTitle)
|
|
appendString(builder, TAG_TITLE, this.title);
|
|
if (this.HasTrack)
|
|
appendString(builder, TAG_TRACK, this.track);
|
|
if (this.HasName)
|
|
appendString(builder, TAG_NAME, this.name);
|
|
if (this.HasGenre)
|
|
appendString(builder, TAG_GENRE, this.genre);
|
|
if (this.HasDate)
|
|
appendString(builder, TAG_DATE, this.date);
|
|
if (this.HasComposer)
|
|
appendString(builder, TAG_COMPOSER, this.composer);
|
|
if (this.HasPerformer)
|
|
appendString(builder, TAG_PERFORMER, this.performer);
|
|
if (this.HasComment)
|
|
appendString(builder, TAG_COMMENT, this.comment);
|
|
if (this.HasDisc)
|
|
appendInt(builder, TAG_DISC, this.disc);
|
|
if (this.HasPos)
|
|
appendInt(builder, TAG_POS, this.pos);
|
|
if (this.HasId)
|
|
appendInt(builder, TAG_ID, this.id);
|
|
|
|
return builder.ToString();
|
|
}
|
|
|
|
private static void appendString(StringBuilder builder, string name, string value)
|
|
{
|
|
builder.Append(name);
|
|
builder.Append(": ");
|
|
builder.Append(value);
|
|
builder.AppendLine();
|
|
}
|
|
|
|
private static void appendInt(StringBuilder builder, string name, int value)
|
|
{
|
|
builder.Append(name);
|
|
builder.Append(": ");
|
|
builder.Append(value);
|
|
builder.AppendLine();
|
|
}
|
|
/// <summary>
|
|
/// Returns a MpdFile object from a MpdResponse object.
|
|
/// </summary>
|
|
/// <param name="response">The response of the MPD server.</param>
|
|
/// <returns>A new MpdFile object build from the MpdResponse object.</returns>
|
|
public static MpdFile build(MpdResponse response)
|
|
{
|
|
if (response == null)
|
|
throw new ArgumentNullException("response");
|
|
|
|
string file = null;
|
|
int time = NO_TIME;
|
|
string album = NO_ALBUM;
|
|
string artist = NO_ARTIST;
|
|
string title = NO_TITLE;
|
|
string track = NO_TRACK;
|
|
string name = NO_NAME;
|
|
string genre = NO_GENRE;
|
|
string date = NO_DATE;
|
|
string composer = NO_COMPOSER;
|
|
string performer = NO_PERFORMER;
|
|
string comment = NO_COMMENT;
|
|
int disc = NO_DISC;
|
|
int pos = NO_POS;
|
|
int id = NO_ID;
|
|
|
|
|
|
foreach (KeyValuePair<string, string> line in response)
|
|
{
|
|
if( line.Key != null )
|
|
switch (line.Key)
|
|
{
|
|
case TAG_FILE:
|
|
file = line.Value;
|
|
break;
|
|
case TAG_TIME:
|
|
int tryTime;
|
|
if( int.TryParse( line.Value, out tryTime ) )
|
|
time = tryTime;
|
|
break;
|
|
case TAG_ALBUM:
|
|
album = line.Value;
|
|
break;
|
|
case TAG_ARTIST:
|
|
artist = line.Value;
|
|
break;
|
|
case TAG_TITLE:
|
|
title = line.Value;
|
|
break;
|
|
case TAG_TRACK:
|
|
track = line.Value;
|
|
break;
|
|
case TAG_NAME:
|
|
name = line.Value;
|
|
break;
|
|
case TAG_GENRE:
|
|
genre = line.Value;
|
|
break;
|
|
case TAG_DATE:
|
|
date = line.Value;
|
|
break;
|
|
case TAG_COMPOSER:
|
|
composer = line.Value;
|
|
break;
|
|
case TAG_PERFORMER:
|
|
performer = line.Value;
|
|
break;
|
|
case TAG_COMMENT:
|
|
comment = line.Value;
|
|
break;
|
|
case TAG_DISC:
|
|
int tryDisc;
|
|
if (int.TryParse(line.Value, out tryDisc))
|
|
disc = tryDisc;
|
|
break;
|
|
case TAG_POS:
|
|
int tryPos;
|
|
if (int.TryParse(line.Value, out tryPos))
|
|
pos = tryPos;
|
|
break;
|
|
case TAG_ID:
|
|
int tryId;
|
|
if (int.TryParse(line.Value, out tryId))
|
|
id = tryId;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (file == null)
|
|
return null;
|
|
else
|
|
return new MpdFile(
|
|
file,
|
|
time,
|
|
album,
|
|
artist,
|
|
title,
|
|
track,
|
|
name,
|
|
genre,
|
|
date,
|
|
composer,
|
|
performer,
|
|
comment,
|
|
disc,
|
|
pos,
|
|
id);
|
|
}
|
|
/// <summary>
|
|
/// Builds a list of MpdFile objects from a MpdResponse object.
|
|
/// </summary>
|
|
/// <param name="response">The MpdResponse object to build the list of MpdFiles from.</param>
|
|
/// <returns>A list ob MpdFiles built from the MpdResponse object.</returns>
|
|
public static List<MpdFile> buildList(MpdResponse response)
|
|
{
|
|
if (response == null)
|
|
throw new ArgumentNullException("response");
|
|
|
|
List<MpdFile> ret = new List<MpdFile>();
|
|
|
|
string file = null;
|
|
int time = NO_TIME;
|
|
string album = NO_ALBUM;
|
|
string artist = NO_ARTIST;
|
|
string title = NO_TITLE;
|
|
string track = NO_TRACK;
|
|
string name = NO_NAME;
|
|
string genre = NO_GENRE;
|
|
string date = NO_DATE;
|
|
string composer = NO_COMPOSER;
|
|
string performer = NO_PERFORMER;
|
|
string comment = NO_COMMENT;
|
|
int disc = NO_DISC;
|
|
int pos = NO_POS;
|
|
int id = NO_ID;
|
|
|
|
|
|
foreach (KeyValuePair<string, string> line in response)
|
|
{
|
|
if( line.Key != null )
|
|
switch (line.Key)
|
|
{
|
|
case TAG_FILE:
|
|
if( file != null )
|
|
ret.Add( new MpdFile(
|
|
file,
|
|
time,
|
|
album,
|
|
artist,
|
|
title,
|
|
track,
|
|
name,
|
|
genre,
|
|
date,
|
|
composer,
|
|
performer,
|
|
comment,
|
|
disc,
|
|
pos,
|
|
id ) );
|
|
|
|
file = line.Value;
|
|
|
|
time = NO_TIME;
|
|
album = NO_ALBUM;
|
|
artist = NO_ARTIST;
|
|
title = NO_TITLE;
|
|
track = NO_TRACK;
|
|
name = NO_NAME;
|
|
genre = NO_GENRE;
|
|
date = NO_DATE;
|
|
composer = NO_COMPOSER;
|
|
performer = NO_PERFORMER;
|
|
comment = NO_COMMENT;
|
|
disc = NO_DISC;
|
|
pos = NO_POS;
|
|
id = NO_ID;
|
|
|
|
break;
|
|
case TAG_TIME:
|
|
int tryTime;
|
|
if( int.TryParse( line.Value, out tryTime ) )
|
|
time = tryTime;
|
|
break;
|
|
case TAG_ALBUM:
|
|
album = line.Value;
|
|
break;
|
|
case TAG_ARTIST:
|
|
artist = line.Value;
|
|
break;
|
|
case TAG_TITLE:
|
|
title = line.Value;
|
|
break;
|
|
case TAG_TRACK:
|
|
track = line.Value;
|
|
/*
|
|
int tryTrack;
|
|
if (int.TryParse(line.Value, out tryTrack))
|
|
track = tryTrack;
|
|
*/
|
|
break;
|
|
case TAG_NAME:
|
|
name = line.Value;
|
|
break;
|
|
case TAG_GENRE:
|
|
genre = line.Value;
|
|
break;
|
|
case TAG_DATE:
|
|
date = line.Value;
|
|
break;
|
|
case TAG_COMPOSER:
|
|
composer = line.Value;
|
|
break;
|
|
case TAG_PERFORMER:
|
|
performer = line.Value;
|
|
break;
|
|
case TAG_COMMENT:
|
|
comment = line.Value;
|
|
break;
|
|
case TAG_DISC:
|
|
int tryDisc;
|
|
if (int.TryParse(line.Value, out tryDisc))
|
|
disc = tryDisc;
|
|
break;
|
|
case TAG_POS:
|
|
int tryPos;
|
|
if (int.TryParse(line.Value, out tryPos))
|
|
pos = tryPos;
|
|
break;
|
|
case TAG_ID:
|
|
int tryId;
|
|
if (int.TryParse(line.Value, out tryId))
|
|
id = tryId;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (file != null)
|
|
ret.Add(new MpdFile(
|
|
file,
|
|
time,
|
|
album,
|
|
artist,
|
|
title,
|
|
track,
|
|
name,
|
|
genre,
|
|
date,
|
|
composer,
|
|
performer,
|
|
comment,
|
|
disc,
|
|
pos,
|
|
id ));
|
|
|
|
return ret;
|
|
}
|
|
}
|
|
}
|