From 02c8e9baf9b2633dca5c3daaeb8318ab6c08f5bb Mon Sep 17 00:00:00 2001 From: Michael Bisbjerg Date: Sun, 16 Aug 2015 20:18:20 +0200 Subject: [PATCH] Refactored SearchMulti object (Issue #145) --- TMDbLib/Client/TMDbClientSearch.cs | 15 ++++-- TMDbLib/Objects/Search/SearchMediaType.cs | 18 ++++++++ TMDbLib/Objects/Search/SearchMulti.cs | 54 ++++++++++++---------- TMDbLib/TMDbLib.csproj | 1 + TMDbLib/Utilities/CustomDeserialization.cs | 36 +++++++++++++++ TMDbLibTests/ClientSearchTests.cs | 27 ++++++----- 6 files changed, 110 insertions(+), 41 deletions(-) create mode 100644 TMDbLib/Objects/Search/SearchMediaType.cs diff --git a/TMDbLib/Client/TMDbClientSearch.cs b/TMDbLib/Client/TMDbClientSearch.cs index 952db4b9..213d0efc 100644 --- a/TMDbLib/Client/TMDbClientSearch.cs +++ b/TMDbLib/Client/TMDbClientSearch.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using System; using RestSharp; +using RestSharp.Deserializers; using TMDbLib.Objects.General; using TMDbLib.Objects.Search; using TMDbLib.Utilities; @@ -26,7 +27,7 @@ private RestRequest SearchBuildRequest(string method, string query, int page) public async Task> SearchCompany(string query, int page = 0) { RestRequest req = SearchBuildRequest("company", query, page); - + IRestResponse> resp = await _client.ExecuteGetTaskAsync>(req).ConfigureAwait(false); return resp.Data; } @@ -108,17 +109,21 @@ public async Task> SearchMulti(string query, string req.AddParameter("language", language); req.AddParameter("include_adult", includeAdult ? "true" : "false"); - + IRestResponse> resp = await _client.ExecuteGetTaskAsync>(req).ConfigureAwait(false); + + // Do custom parsing + CustomDeserialization.DeserializeMultiSearchContent(resp.Data, resp.Content); + return resp.Data; } public async Task> SearchPerson(string query, int page = 0, bool includeAdult = false, SearchQueryType searchType = SearchQueryType.Undefined) { RestRequest req = SearchBuildRequest("person", query, page); - + req.AddParameter("include_adult", includeAdult ? "true" : "false"); - + if (searchType != SearchQueryType.Undefined) req.AddParameter("search_type", searchType.GetDescription()); @@ -138,7 +143,7 @@ public async Task> SearchTvShow(string query, string l language = language ?? DefaultLanguage; if (!String.IsNullOrWhiteSpace(language)) req.AddParameter("language", language); - + if (firstAirDateYear > 0) req.AddParameter("first_air_date_year", firstAirDateYear); diff --git a/TMDbLib/Objects/Search/SearchMediaType.cs b/TMDbLib/Objects/Search/SearchMediaType.cs new file mode 100644 index 00000000..ce8e9c19 --- /dev/null +++ b/TMDbLib/Objects/Search/SearchMediaType.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; + +namespace TMDbLib.Objects.Search +{ + public enum SearchMediaType + { + Unknown, + + [Description("movie")] + Movie, + + [Description("tv")] + TVShow, + + [Description("person")] + Person + } +} \ No newline at end of file diff --git a/TMDbLib/Objects/Search/SearchMulti.cs b/TMDbLib/Objects/Search/SearchMulti.cs index fdebea94..17794ae4 100644 --- a/TMDbLib/Objects/Search/SearchMulti.cs +++ b/TMDbLib/Objects/Search/SearchMulti.cs @@ -1,43 +1,47 @@ using System; -using System.Collections.Generic; -using TMDbLib.Objects.General; +using TMDbLib.Utilities; namespace TMDbLib.Objects.Search { public class SearchMulti { public int Id { get; set; } - public string Title { set { Name = value; } } + + public string Title { set { Name = value; } get { return Name; } } public string Name { get; set; } - public string OriginalName { get; set; } - public string OriginalTitle { set { OriginalName = value; } } - public DateTime? FirstAirDate { get; set; } - public string BackdropPath { get; set; } + + public string BackdropPath { set { PosterPath = value; } get { return PosterPath; } } public string PosterPath { get; set; } + + public SearchMediaType Type { get; set; } public double Popularity { get; set; } - public double VoteAverage { get; set; } - public int VoteCount { get; set; } - public bool Adult { get; set; } - public DateTime? ReleaseDate { get; set; } - public MediaType Type { get; set; } - public List OriginCountry { get; set; } + + public SearchTv AsTvShow { get; set; } + public SearchMovie AsMovie { get; set; } + public SearchPerson AsPerson { get; set; } + + // Individual fields not found in all three Media Types + //public string OriginalName { get; set; } + //public string OriginalTitle { set { OriginalName = value; } } + //public DateTime? FirstAirDate { get; set; } + //public double VoteAverage { get; set; } + //public int VoteCount { get; set; } + //public bool Adult { get; set; } + //public DateTime? ReleaseDate { get; set; } + //public List OriginCountry { get; set; } public string MediaType { set { - switch (value) - { - case "tv": - Type = General.MediaType.TVShow; - break; - case "movie": - Type = General.MediaType.Movie; - break; - default: - Type = General.MediaType.Unknown; - break; - } + if (SearchMediaType.Movie.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase)) + Type = SearchMediaType.Movie; + else if (SearchMediaType.TVShow.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase)) + Type = SearchMediaType.TVShow; + else if (SearchMediaType.Person.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase)) + Type = SearchMediaType.Person; + else + Type = SearchMediaType.Unknown; } } } diff --git a/TMDbLib/TMDbLib.csproj b/TMDbLib/TMDbLib.csproj index 0b7dbc51..3bb278ce 100644 --- a/TMDbLib/TMDbLib.csproj +++ b/TMDbLib/TMDbLib.csproj @@ -45,6 +45,7 @@ + diff --git a/TMDbLib/Utilities/CustomDeserialization.cs b/TMDbLib/Utilities/CustomDeserialization.cs index 2693e9c1..c0f33159 100644 --- a/TMDbLib/Utilities/CustomDeserialization.cs +++ b/TMDbLib/Utilities/CustomDeserialization.cs @@ -1,8 +1,11 @@ using System; using System.Globalization; using System.Text.RegularExpressions; +using RestSharp; +using RestSharp.Deserializers; using TMDbLib.Objects.General; using TMDbLib.Objects.Movies; +using TMDbLib.Objects.Search; namespace TMDbLib.Utilities { @@ -54,5 +57,38 @@ internal static void DeserializeAccountStatesRating(TvEpisodeAccountState accoun CultureInfo.InvariantCulture.NumberFormat); } } + + public static void DeserializeMultiSearchContent(SearchContainer data, string content) + { + JsonDeserializer deserializer = new JsonDeserializer(); + + JsonObject objContainer = SimpleJson.DeserializeObject(content) as JsonObject; + JsonArray resultsList = objContainer["results"] as JsonArray; + + for (int i = 0; i < data.Results.Count; i++) + { + string jsonItem = resultsList[i].ToString(); + SearchMulti multiItem = data.Results[i]; + + if (multiItem.Type == SearchMediaType.TVShow) + { + SearchTv asTv = deserializer.Deserialize(new RestResponse { Content = jsonItem }); + + multiItem.AsTvShow = asTv; + } + else if (multiItem.Type == SearchMediaType.Movie) + { + SearchMovie asMovie = deserializer.Deserialize(new RestResponse { Content = jsonItem }); + + multiItem.AsMovie = asMovie; + } + else if (multiItem.Type == SearchMediaType.Person) + { + SearchPerson asPerson = deserializer.Deserialize(new RestResponse { Content = jsonItem }); + + multiItem.AsPerson = asPerson; + } + } + } } } diff --git a/TMDbLibTests/ClientSearchTests.cs b/TMDbLibTests/ClientSearchTests.cs index 65d61db3..922a7560 100644 --- a/TMDbLibTests/ClientSearchTests.cs +++ b/TMDbLibTests/ClientSearchTests.cs @@ -189,20 +189,25 @@ public void TestSearchMulti() Assert.IsNotNull(item); Assert.AreEqual(1412, item.Id); - Assert.AreEqual("/dXTyVDTIgeByvUOUEiHjbi8xX9A.jpg", item.BackdropPath); - Assert.AreEqual(new DateTime(2012, 10, 10), item.FirstAirDate); - Assert.AreEqual(MediaType.TVShow, item.Type); + Assert.AreEqual(SearchMediaType.TVShow, item.Type); Assert.AreEqual("Arrow", item.Name); - Assert.AreEqual("Arrow", item.OriginalName); - Assert.AreEqual("/mo0FP1GxOFZT4UDde7RFDz5APXF.jpg", item.PosterPath); + Assert.AreEqual("Arrow", item.Title); Assert.IsTrue(item.Popularity > 0); - Assert.IsTrue(item.VoteAverage > 0); - Assert.IsTrue(item.VoteCount > 0); - Assert.IsNotNull(item.OriginCountry); - Assert.AreEqual(2, item.OriginCountry.Count); - Assert.IsTrue(item.OriginCountry.Contains("US")); - Assert.IsTrue(item.OriginCountry.Contains("CA")); + Assert.IsNotNull(item.PosterPath); + Assert.IsNotNull(item.BackdropPath); + + foreach (SearchMulti multi in result.Results) + { + if (multi.Type == SearchMediaType.Movie) + Assert.IsNotNull(multi.AsMovie); + + if (multi.Type == SearchMediaType.TVShow) + Assert.IsNotNull(multi.AsTvShow); + + if (multi.Type == SearchMediaType.Person) + Assert.IsNotNull(multi.AsPerson); + } } ///