1
0
mirror of https://github.com/ZetaKebab/MpcNET.git synced 2024-09-16 05:30:09 +00:00
MpcNET/LibMpc/MpdFile.cs

542 lines
20 KiB
C#
Raw Normal View History

using System;
2016-10-30 22:54:45 +00:00
using System.Collections.Generic;
using System.Text;
2016-11-30 13:42:28 +00:00
namespace LibMpc
2016-10-30 22:54:45 +00:00
{
/// <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;
}
}
}