diff --git a/LibMpc/Commands/Commands.Database.cs b/LibMpc/Commands/Commands.Database.cs index 9f9844e..1db9e4d 100644 --- a/LibMpc/Commands/Commands.Database.cs +++ b/LibMpc/Commands/Commands.Database.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using System.Linq; +using LibMpc.Types; namespace LibMpc { @@ -12,7 +12,7 @@ namespace LibMpc { // TODO: count - public class Find : IMpcCommand>> + public class Find : IMpcCommand> { private readonly ITag _tag; private readonly string _searchText; @@ -25,22 +25,25 @@ namespace LibMpc public string Value => string.Join(" ", "find", _tag.Value, _searchText); - public IDictionary>> FormatResponse(IList> response) + public IEnumerable FormatResponse(IList> response) { - var results = new Dictionary>> - { - { "files", new List>() } - }; + var results = new List(); + var fileBuilder = new MpdFileBuidler(); foreach (var line in response) { if (line.Key.Equals("file")) { - results["files"].Add(new Dictionary { { "file", line.Value } }); + if (fileBuilder.IsInitialized) + { + results.Add(fileBuilder.Build()); + } + + fileBuilder.Init(line.Value); } else { - results["files"].Last().Add(line.Key, line.Value); + fileBuilder.WithProperty(line.Key, line.Value); } } @@ -59,50 +62,38 @@ namespace LibMpc public string Value => string.Join(" ", "list", _tag); - public IDictionary FormatResponse(IList> response) + public string FormatResponse(IList> response) { - return response.ToDefaultDictionary(); + // TODO: + return response.ToString(); } } // TODO: findadd - public class ListAll : IMpcCommand>>> + public class ListAll : IMpcCommand { public string Value => "listall"; - public IDictionary>>> FormatResponse(IList> response) + public MpdDirectory FormatResponse(IList> response) { - var results = new Dictionary>>> - { - { "directories", new List>>() } - }; - // Add by default the root directory - results["directories"].Add(new Dictionary> - { - { "path", new List() }, - { "files", new List() } - }); + var rootDirectory = new MpdDirectory("/"); foreach (var line in response) { if (line.Key.Equals("file")) { - results["directories"].Last()["files"].Add(line.Value); + rootDirectory.AddFile(line.Value); } if (line.Key.Equals("directory")) { - results["directories"].Add(new Dictionary> - { - { "path", new []{ line.Value } }, - { "files", new List() } - }); + rootDirectory.AddDirectory(line.Value); } } - return results; + return rootDirectory; } } @@ -119,9 +110,10 @@ namespace LibMpc // TODO: Extend command: < update [URI] > public string Value => "update"; - public IDictionary FormatResponse(IList> response) + public string FormatResponse(IList> response) { - return response.ToDefaultDictionary(); + // TODO: + return response.ToString(); } } diff --git a/LibMpc/Commands/Commands.Output.cs b/LibMpc/Commands/Commands.Output.cs index 490428b..3c76ea1 100644 --- a/LibMpc/Commands/Commands.Output.cs +++ b/LibMpc/Commands/Commands.Output.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using LibMpc.Types; namespace LibMpc { @@ -23,9 +24,10 @@ namespace LibMpc public string Value => string.Join(" ", "disableoutput", _outputId); - public IDictionary FormatResponse(IList> response) + public string FormatResponse(IList> response) { - return response.ToDefaultDictionary(); + // TODO: + return response.ToString(); } } @@ -43,9 +45,10 @@ namespace LibMpc public string Value => string.Join(" ", "enableoutput", _outputId); - public IDictionary FormatResponse(IList> response) + public string FormatResponse(IList> response) { - return response.ToDefaultDictionary(); + // TODO: + return response.ToString(); } } @@ -54,29 +57,21 @@ namespace LibMpc /// /// Shows information about all outputs. /// - public class Outputs : IMpcCommand>> + public class Outputs : IMpcCommand> { public string Value => "outputs"; - public IDictionary>> FormatResponse(IList> response) + public IEnumerable FormatResponse(IList> response) { - var result = new Dictionary>> - { - { "outputs", new List>() } - }; + var result = new List(); for (var i = 0; i < response.Count; i += 3) { - var outputId = response[i].Value; + var outputId = int.Parse(response[i].Value); var outputName = response[i + 1].Value; - var outputEnabled = response[i + 2].Value; + var outputEnabled = bool.Parse(response[i + 2].Value); - result["outputs"].Add(new Dictionary - { - {"id", outputId}, - {"name", outputName}, - {"enabled", outputEnabled} - }); + result.Add(new MpdOutput(outputId, outputName, outputEnabled)); } return result; diff --git a/LibMpc/Commands/Commands.Reflection.cs b/LibMpc/Commands/Commands.Reflection.cs index 68ed3c5..9d4506e 100644 --- a/LibMpc/Commands/Commands.Reflection.cs +++ b/LibMpc/Commands/Commands.Reflection.cs @@ -14,16 +14,13 @@ namespace LibMpc // TODO: commands // TODO: notcommands - public class TagTypes : IMpcCommand> + public class TagTypes : IMpcCommand> { public string Value => "tagtypes"; - IDictionary> IMpcCommand>.FormatResponse(IList> response) + public IEnumerable FormatResponse(IList> response) { - var result = new Dictionary> - { - { "tagtypes", response.Where(item => item.Key.Equals("tagtype")).Select(item => item.Value).ToList() } - }; + var result = response.Where(item => item.Key.Equals("tagtype")).Select(item => item.Value); return result; } diff --git a/LibMpc/Commands/IMpcCommand.cs b/LibMpc/Commands/IMpcCommand.cs index 008b1f2..71ae392 100644 --- a/LibMpc/Commands/IMpcCommand.cs +++ b/LibMpc/Commands/IMpcCommand.cs @@ -3,18 +3,10 @@ using System.Linq; namespace LibMpc { - public interface IMpcCommand + public interface IMpcCommand { string Value { get; } - IDictionary FormatResponse(IList> response); - } - - internal static class MpdCommandExtensions - { - public static IDictionary ToDefaultDictionary(this IList> items) - { - return items.ToDictionary(item => item.Key, item => item.Value); - } + T FormatResponse(IList> response); } } \ No newline at end of file diff --git a/LibMpc/Message/MpdResponse.cs b/LibMpc/Message/MpdResponse.cs index 0ad720d..dbe24ad 100644 --- a/LibMpc/Message/MpdResponse.cs +++ b/LibMpc/Message/MpdResponse.cs @@ -6,19 +6,19 @@ namespace LibMpc public interface IMpdResponse { IMpdResponseState State { get; } - IDictionary Body { get; } + T Body { get; } } public class MpdResponse : IMpdResponse { - public MpdResponse(string endLine, IDictionary body, bool connected) + public MpdResponse(string endLine, T body, bool connected) { State = new MpdResponseState(endLine, connected); Body = body; } public IMpdResponseState State { get; } - public IDictionary Body { get; } + public T Body { get; } } public static class CheckNotNullExtension diff --git a/LibMpc/MpdFile.cs b/LibMpc/MpdFile.cs deleted file mode 100644 index 7809ad5..0000000 --- a/LibMpc/MpdFile.cs +++ /dev/null @@ -1,544 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace LibMpc -{ - /// - /// The MpdFile class contains all meta data for a file of the MPD. - /// - 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; - /// - /// The name and path of the file. - /// - public string File { get { return this.file; } } - /// - /// The length of the file in seconds. - /// - public int Time { get { return this.time; } } - /// - /// The album of the file. - /// - public string Album { get { return this.album; } } - /// - /// The artist of the file. - /// - public string Artist { get { return this.artist; } } - /// - /// The title of the file. - /// - public string Title { get { return this.title; } } - /// - /// The value of the track property of the file. - /// - public string Track { get { return this.track; } } - /// - /// The name of the song. - /// - public string Name { get { return this.name; } } - /// - /// The genre of the song. - /// - public string Genre { get { return this.genre; } } - /// - /// The date the song was released. - /// - public string Date { get { return this.date; } } - /// - /// The composer of the song. - /// - public string Composer { get { return this.composer; } } - /// - /// The performer of the song. - /// - public string Performer { get { return this.performer; } } - /// - /// A comment to the file. - /// - public string Comment { get { return this.comment; } } - /// - /// The number of the disc on a multidisc album. - /// - public int Disc { get { return this.disc; } } - /// - /// The index of the file in a playlist. - /// - public int Pos { get { return this.pos; } } - /// - /// The id of the file in a playlist. - /// - public int Id { get { return this.id; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasTime { get { return this.time != NO_TIME; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasAlbum { get { return this.album != NO_ALBUM; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasArtist { get { return this.artist != NO_ARTIST; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasTitle { get { return this.title != NO_TITLE; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasTrack { get { return this.track != NO_TRACK; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasName { get { return this.name != NO_NAME; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasGenre { get { return this.genre != NO_GENRE; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasDate { get { return this.date != NO_DATE; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasComposer { get { return this.composer != NO_COMPOSER; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasPerformer { get { return this.performer != NO_PERFORMER; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasComment { get { return this.comment != NO_COMMENT; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasDisc { get { return this.disc != NO_DISC; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasPos { get { return this.pos != NO_POS; } } - /// - /// If the MpdFile has the property set. - /// - public bool HasId { get { return this.id != NO_ID; } } - /// - /// Creates a new MpdFile. - /// - /// The name and path of the file. - /// The length of the file in seconds. - /// The album of the file. - /// The artist of the file. - /// The title of the file. - /// The value of the track property of the file. - /// The name of the song. - /// The genre of the song. - /// The date the song was released. - /// The composer of the song. - /// The performer of the song. - /// A comment to the file. - /// The number of the disc on a multidisc album. - /// The index of the file in a playlist. - /// The id of the file in a playlist. - 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; - } - /// - /// A string containing all the properties of the file. - /// - /// - 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(); - } - /* - /// - /// Returns a MpdFile object from a MpdResponse object. - /// - /// The response of the MPD server. - /// A new MpdFile object build from the MpdResponse object. - 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 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); - } - /// - /// Builds a list of MpdFile objects from a MpdResponse object. - /// - /// The MpdResponse object to build the list of MpdFiles from. - /// A list ob MpdFiles built from the MpdResponse object. - public static List buildList(MpdResponse response) - { - if (response == null) - throw new ArgumentNullException("response"); - - List ret = new List(); - - 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 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; - - // TODO: - 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; - } - */ - } -} diff --git a/LibMpc/MpdOutput.cs b/LibMpc/MpdOutput.cs deleted file mode 100644 index 5420451..0000000 --- a/LibMpc/MpdOutput.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; - -namespace LibMpc -{ - /// - /// The MpdOutput class contains all attributes of an output device of the MPD. - /// - public class MpdOutput - { - private readonly int id; - private readonly string name; - private readonly bool enabled; - /// - /// The id of the output. - /// - public int Id { get { return this.id; } } - /// - /// The name of the output. - /// - public string Name { get { return this.name; } } - /// - /// If the output is enabled. - /// - public bool IsEnabled { get { return this.enabled; } } - /// - /// Creates a new MpdOutput object. - /// - /// The id of the output. - /// The name of the output. - /// If the output is enabled. - public MpdOutput(int id, string name, bool enabled) - { - if (name == null) - throw new ArgumentNullException("name"); - - this.id = id; - this.name = name; - this.enabled = enabled; - } - /// - /// Returns a string representation of the object mainly for debuging purpose. - /// - /// A string representation of the object. - public override string ToString() - { - return this.id + "::" + this.name + "::" + this.enabled; - } - } -} diff --git a/LibMpc/Types/MpdDirectory.cs b/LibMpc/Types/MpdDirectory.cs new file mode 100644 index 0000000..f71e2a9 --- /dev/null +++ b/LibMpc/Types/MpdDirectory.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using System.Linq; + +namespace LibMpc.Types +{ + public class MpdDirectory + { + private readonly IList _files = new List(); + private readonly IList _subDirectories = new List(); + + public MpdDirectory(string path) + { + path.CheckNotNull(); + + Path = path; + + var name = path.Split('/').Last(); + Name = string.IsNullOrEmpty(name) ? "root" : name; + } + + public string Path { get; } + public string Name { get; } + public IEnumerable Files => _files; + public IEnumerable SubDirectories => _subDirectories; + + internal void AddFile(string file) + { + var filePath = file.Split('/'); + var name = filePath[filePath.Length - 1]; + + if (filePath.Length == 1) + { + _files.Add(new MpdFile(name)); + } + else + { + var filePathWithoutCurrentDirectory = string.Join("/", filePath.Skip(1)); + foreach (var subDirectory in _subDirectories) + { + if (subDirectory.Path.Equals(filePath[0])) + { + subDirectory.AddFile(filePathWithoutCurrentDirectory); + } + } + } + } + + internal void AddDirectory(string directory) + { + var directoryPath = directory.Split('/'); + var name = directoryPath[directoryPath.Length - 1]; + + if (directoryPath.Length == 1) + { + _subDirectories.Add(new MpdDirectory(name)); + } + else + { + var directoryPathWithoutCurrentDirectory = string.Join("/", directoryPath.Skip(1)); + foreach (var subDirectory in _subDirectories) + { + if (subDirectory.Path.Equals(directoryPath[0])) + { + subDirectory.AddDirectory(directoryPathWithoutCurrentDirectory); + } + } + } + } + } +} \ No newline at end of file diff --git a/LibMpc/Types/MpdFile.cs b/LibMpc/Types/MpdFile.cs new file mode 100644 index 0000000..204b828 --- /dev/null +++ b/LibMpc/Types/MpdFile.cs @@ -0,0 +1,73 @@ +namespace LibMpc.Types +{ + public class MpdFileBuidler + { + private const string TagFile = "file"; + private const string TagTime = "Time"; + private const string TagArtist = "Artist"; + private const string TagAlbum = "Album"; + private const string TagTitle = "Title"; + private const string TagTrack = "Track"; + private const string TagName = "Name"; + private const string TagGenre = "Genre"; + private const string TagDate = "Date"; + private const string TagComposer = "Composer"; + private const string TagPerformer = "Performer"; + private const string TagComment = "Comment"; + private const string TagDisc = "Disc"; + private const string TagPos = "Pos"; + private const string TagId = "Id"; + + private MpdFile _mpdFile; + + public bool IsInitialized => _mpdFile != null; + + public MpdFileBuidler Init(string file) + { + _mpdFile = new MpdFile(file); + return this; + } + + public MpdFileBuidler WithProperty(string tag, string value) + { + _mpdFile.CheckNotNull(); + + // TODO: Parse tag + + return this; + } + + public MpdFile Build() + { + return _mpdFile; + } + } + + + /// + /// The MpdFile class contains all meta data for a file of the MPD. + /// + public class MpdFile + { + public MpdFile(string file) + { + File = file; + } + + public string File { get; } + public int Time { get; internal set; } = -1; + public string Album { get; internal set; } = string.Empty; + public string Artist { get; internal set; } = string.Empty; + public string Title { get; internal set; } = string.Empty; + public string Track { get; internal set; } = string.Empty; + public string Name { get; internal set; } = string.Empty; + public string Genre { get; internal set; } = string.Empty; + public string Date { get; internal set; } = string.Empty; + public string Composer { get; internal set; } = string.Empty; + public string Performer { get; internal set; } = string.Empty; + public string Comment { get; internal set; } = string.Empty; + public int Disc { get; internal set; } = -1; + public int Pos { get; internal set; } = -1; + public int Id { get; internal set; } = -1; + } +} diff --git a/LibMpc/Types/MpdOutput.cs b/LibMpc/Types/MpdOutput.cs new file mode 100644 index 0000000..5eaeba1 --- /dev/null +++ b/LibMpc/Types/MpdOutput.cs @@ -0,0 +1,21 @@ +namespace LibMpc.Types +{ + /// + /// The MpdOutput class contains all attributes of an output device of the MPD. + /// + public class MpdOutput + { + public MpdOutput(int id, string name, bool enabled) + { + name.CheckNotNull(); + + Id = id; + Name = name; + IsEnabled = enabled; + } + + public int Id { get; } + public string Name { get; } + public bool IsEnabled { get; } + } +} \ No newline at end of file diff --git a/LibMpcTest/LibMpcTest.cs b/LibMpcTest/LibMpcTest.cs index ace1279..ee4408e 100644 --- a/LibMpcTest/LibMpcTest.cs +++ b/LibMpcTest/LibMpcTest.cs @@ -1,5 +1,6 @@ using LibMpc; using System; +using System.Diagnostics; using System.Linq; using System.Net; using System.Threading.Tasks; @@ -25,11 +26,11 @@ namespace LibMpcTest var connected = Task.Run(async () => await _mpc.ConnectAsync()).Result; if (connected) { - Console.Out.WriteLine("Connected to MPD."); + WriteLine("Connected to MPD."); } else { - Console.Out.WriteLine("Could not connect to MPD."); + WriteLine("Could not connect to MPD."); } } @@ -38,11 +39,10 @@ namespace LibMpcTest { var response = await _mpc.SendAsync(new Commands.Reflection.TagTypes()); - Console.Out.WriteLine("TagTypesTest Result:"); - Console.Out.WriteLine(JsonConvert.SerializeObject(response, Formatting.Indented)); + WriteLine("TagTypesTest Result:"); + WriteLine(JsonConvert.SerializeObject(response, Formatting.Indented)); - Assert.True(response.Response.Body.Keys.Contains("tagtypes")); - Assert.True(response.Response.Body.Values.Any()); + Assert.True(response.Response.Body.Count().Equals(17)); } [Fact] @@ -50,16 +50,25 @@ namespace LibMpcTest { var response = await _mpc.SendAsync(new Commands.Database.ListAll()); - Console.Out.WriteLine("ListAllTest Result:"); - Console.Out.WriteLine(JsonConvert.SerializeObject(response, Formatting.Indented)); + WriteLine("ListAllTest Result:"); + WriteLine(JsonConvert.SerializeObject(response, Formatting.Indented)); - Assert.True(response.Response.Body.Keys.Contains("directories")); - Assert.True(response.Response.Body["directories"].Count.Equals(5)); + Assert.True(response.Response.Body.SubDirectories.Count().Equals(4)); + Assert.True(response.Response.Body.Files.Count().Equals(3)); } public void Dispose() { _mpc?.DisconnectAsync().GetAwaiter().GetResult(); } + + private void WriteLine(string value) + { +#if DEBUG + Debug.WriteLine(value); +#else + Console.Out.WriteLine(value); +#endif + } } } diff --git a/LibMpcTest/Server/Music/A long name directory with some spaces/short-trouser-pants-zip-closing.mp3 b/LibMpcTest/Server/Music/A long name directory with some spaces/Sub Directory Two/short-trouser-pants-zip-closing.mp3 similarity index 100% rename from LibMpcTest/Server/Music/A long name directory with some spaces/short-trouser-pants-zip-closing.mp3 rename to LibMpcTest/Server/Music/A long name directory with some spaces/Sub Directory Two/short-trouser-pants-zip-closing.mp3 diff --git a/LibMpcTest/Server/Music/A long name directory with some spaces/starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 b/LibMpcTest/Server/Music/A long name directory with some spaces/Sub Directory Two/starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 similarity index 100% rename from LibMpcTest/Server/Music/A long name directory with some spaces/starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 rename to LibMpcTest/Server/Music/A long name directory with some spaces/Sub Directory Two/starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 diff --git a/LibMpcTest/Server/Music/Directory With Spaces/central-locking-Ford-Mondeo-Mk-3.mp3 b/LibMpcTest/Server/Music/Directory With Spaces/SubDirectory One/central-locking-Ford-Mondeo-Mk-3.mp3 similarity index 100% rename from LibMpcTest/Server/Music/Directory With Spaces/central-locking-Ford-Mondeo-Mk-3.mp3 rename to LibMpcTest/Server/Music/Directory With Spaces/SubDirectory One/central-locking-Ford-Mondeo-Mk-3.mp3 diff --git a/LibMpcTest/Server/mpd.db b/LibMpcTest/Server/mpd.db index c1f0c92..021cf41 100644 --- a/LibMpcTest/Server/mpd.db +++ b/LibMpcTest/Server/mpd.db @@ -21,23 +21,36 @@ tag: MUSICBRAINZ_ALBUMARTISTID tag: MUSICBRAINZ_TRACKID info_end directory: A long name directory with some spaces -mtime: 1481622608 +mtime: 1482142041 begin: A long name directory with some spaces -song_begin: pouring-water-into-mug-of-coffee.mp3 -Time: 4 -Artist: Geek & Dummy -Title: Sound effect: pouring water into mug of coffee -Date: 2013 -Date: 2013 -mtime: 1481622059 -song_end +directory: Sub Directory Two +mtime: 1482142041 +begin: A long name directory with some spaces/Sub Directory Two song_begin: short-trouser-pants-zip-closing.mp3 Time: 1 Artist: Geek & Dummy Title: Sound effect: short trouser pants zip closing Date: 2013 Date: 2013 -mtime: 1481622066 +mtime: 1481623577 +song_end +song_begin: starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 +Time: 6 +Artist: Geek & Dummy +Title: Sound effect: starting engine - Ford Mondeo Mk 3 diesel +Album: Geek & Dummy Sound Library +Date: 2014 +Genre: soundfx +mtime: 1481623577 +song_end +end: A long name directory with some spaces/Sub Directory Two +song_begin: pouring-water-into-mug-of-coffee.mp3 +Time: 4 +Artist: Geek & Dummy +Title: Sound effect: pouring water into mug of coffee +Date: 2013 +Date: 2013 +mtime: 1481623577 song_end song_begin: Ghost-Sounds.mp3 Time: 95 @@ -47,20 +60,11 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622054 -song_end -song_begin: starting-engine-Ford-Mondeo-Mk-3-diesel.mp3 -Time: 6 -Artist: Geek & Dummy -Title: Sound effect: starting engine - Ford Mondeo Mk 3 diesel -Album: Geek & Dummy Sound Library -Date: 2014 -Genre: soundfx -mtime: 1481622063 +mtime: 1481623577 song_end end: A long name directory with some spaces directory: Directory -mtime: 1481622608 +mtime: 1482142041 begin: Directory song_begin: 2-Kids-Laughing.mp3 Time: 30 @@ -70,7 +74,7 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622083 +mtime: 1481623577 song_end song_begin: ambient-noise-server-room.mp3 Time: 71 @@ -80,20 +84,15 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622020 +mtime: 1481623577 song_end end: Directory directory: Directory With Spaces -mtime: 1481622608 +mtime: 1482142041 begin: Directory With Spaces -song_begin: coin-spin-light.mp3 -Time: 5 -Artist: Geek & Dummy -Title: Sound effect: coin spin (light coin) -Date: 2013 -Date: 2013 -mtime: 1481622036 -song_end +directory: SubDirectory One +mtime: 1482142041 +begin: Directory With Spaces/SubDirectory One song_begin: central-locking-Ford-Mondeo-Mk-3.mp3 Time: 5 Artist: Geek & Dummy @@ -102,7 +101,16 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622024 +mtime: 1481623577 +song_end +end: Directory With Spaces/SubDirectory One +song_begin: coin-spin-light.mp3 +Time: 5 +Artist: Geek & Dummy +Title: Sound effect: coin spin (light coin) +Date: 2013 +Date: 2013 +mtime: 1481623577 song_end song_begin: finger-snap-click.mp3 Time: 0 @@ -112,11 +120,11 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622047 +mtime: 1481623577 song_end end: Directory With Spaces directory: _My Directory -mtime: 1481622608 +mtime: 1482142041 begin: _My Directory song_begin: gas-fire-lighting.mp3 Time: 58 @@ -126,7 +134,7 @@ Album: Geek & Dummy Sound Library Date: 2014 Date: 2014 Genre: soundfx -mtime: 1481622051 +mtime: 1481623577 song_end end: _My Directory song_begin: teaspoon-stirring-mug-of-coffee.mp3 @@ -135,7 +143,7 @@ Artist: Geek & Dummy Title: Sound effect: teaspoon stirring mug of coffee Date: 2013 Date: 2013 -mtime: 1481622029 +mtime: 1481623577 song_end song_begin: whistle-kettle-boiling.mp3 Time: 36 @@ -143,7 +151,7 @@ Artist: Geek & Dummy Title: Sound effect: whistle kettle boiling Date: 2013 Date: 2013 -mtime: 1481622087 +mtime: 1481623577 song_end song_begin: wine-glass-double-chink-clink-cheers.mp3 Time: 1 @@ -151,5 +159,5 @@ Artist: Geek & Dummy Title: Sound effect: wine glass double chink/clink/cheers Date: 2013 Date: 2013 -mtime: 1481622090 +mtime: 1481623577 song_end