Skip to content

Commit 02c8e9b

Browse files
committed
Refactored SearchMulti object (Issue #145)
1 parent 4ea3333 commit 02c8e9b

File tree

6 files changed

+110
-41
lines changed

6 files changed

+110
-41
lines changed

TMDbLib/Client/TMDbClientSearch.cs

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Threading.Tasks;
22
using System;
33
using RestSharp;
4+
using RestSharp.Deserializers;
45
using TMDbLib.Objects.General;
56
using TMDbLib.Objects.Search;
67
using TMDbLib.Utilities;
@@ -26,7 +27,7 @@ private RestRequest SearchBuildRequest(string method, string query, int page)
2627
public async Task<SearchContainer<SearchCompany>> SearchCompany(string query, int page = 0)
2728
{
2829
RestRequest req = SearchBuildRequest("company", query, page);
29-
30+
3031
IRestResponse<SearchContainer<SearchCompany>> resp = await _client.ExecuteGetTaskAsync<SearchContainer<SearchCompany>>(req).ConfigureAwait(false);
3132
return resp.Data;
3233
}
@@ -108,17 +109,21 @@ public async Task<SearchContainer<SearchMulti>> SearchMulti(string query, string
108109
req.AddParameter("language", language);
109110

110111
req.AddParameter("include_adult", includeAdult ? "true" : "false");
111-
112+
112113
IRestResponse<SearchContainer<SearchMulti>> resp = await _client.ExecuteGetTaskAsync<SearchContainer<SearchMulti>>(req).ConfigureAwait(false);
114+
115+
// Do custom parsing
116+
CustomDeserialization.DeserializeMultiSearchContent(resp.Data, resp.Content);
117+
113118
return resp.Data;
114119
}
115120

116121
public async Task<SearchContainer<SearchPerson>> SearchPerson(string query, int page = 0, bool includeAdult = false, SearchQueryType searchType = SearchQueryType.Undefined)
117122
{
118123
RestRequest req = SearchBuildRequest("person", query, page);
119-
124+
120125
req.AddParameter("include_adult", includeAdult ? "true" : "false");
121-
126+
122127
if (searchType != SearchQueryType.Undefined)
123128
req.AddParameter("search_type", searchType.GetDescription());
124129

@@ -138,7 +143,7 @@ public async Task<SearchContainer<SearchTv>> SearchTvShow(string query, string l
138143
language = language ?? DefaultLanguage;
139144
if (!String.IsNullOrWhiteSpace(language))
140145
req.AddParameter("language", language);
141-
146+
142147
if (firstAirDateYear > 0)
143148
req.AddParameter("first_air_date_year", firstAirDateYear);
144149

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.ComponentModel;
2+
3+
namespace TMDbLib.Objects.Search
4+
{
5+
public enum SearchMediaType
6+
{
7+
Unknown,
8+
9+
[Description("movie")]
10+
Movie,
11+
12+
[Description("tv")]
13+
TVShow,
14+
15+
[Description("person")]
16+
Person
17+
}
18+
}

TMDbLib/Objects/Search/SearchMulti.cs

+29-25
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,47 @@
11
using System;
2-
using System.Collections.Generic;
3-
using TMDbLib.Objects.General;
2+
using TMDbLib.Utilities;
43

54
namespace TMDbLib.Objects.Search
65
{
76
public class SearchMulti
87
{
98
public int Id { get; set; }
10-
public string Title { set { Name = value; } }
9+
10+
public string Title { set { Name = value; } get { return Name; } }
1111
public string Name { get; set; }
12-
public string OriginalName { get; set; }
13-
public string OriginalTitle { set { OriginalName = value; } }
14-
public DateTime? FirstAirDate { get; set; }
15-
public string BackdropPath { get; set; }
12+
13+
public string BackdropPath { set { PosterPath = value; } get { return PosterPath; } }
1614
public string PosterPath { get; set; }
15+
16+
public SearchMediaType Type { get; set; }
1717
public double Popularity { get; set; }
18-
public double VoteAverage { get; set; }
19-
public int VoteCount { get; set; }
20-
public bool Adult { get; set; }
21-
public DateTime? ReleaseDate { get; set; }
22-
public MediaType Type { get; set; }
23-
public List<string> OriginCountry { get; set; }
18+
19+
public SearchTv AsTvShow { get; set; }
20+
public SearchMovie AsMovie { get; set; }
21+
public SearchPerson AsPerson { get; set; }
22+
23+
// Individual fields not found in all three Media Types
24+
//public string OriginalName { get; set; }
25+
//public string OriginalTitle { set { OriginalName = value; } }
26+
//public DateTime? FirstAirDate { get; set; }
27+
//public double VoteAverage { get; set; }
28+
//public int VoteCount { get; set; }
29+
//public bool Adult { get; set; }
30+
//public DateTime? ReleaseDate { get; set; }
31+
//public List<string> OriginCountry { get; set; }
2432

2533
public string MediaType
2634
{
2735
set
2836
{
29-
switch (value)
30-
{
31-
case "tv":
32-
Type = General.MediaType.TVShow;
33-
break;
34-
case "movie":
35-
Type = General.MediaType.Movie;
36-
break;
37-
default:
38-
Type = General.MediaType.Unknown;
39-
break;
40-
}
37+
if (SearchMediaType.Movie.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase))
38+
Type = SearchMediaType.Movie;
39+
else if (SearchMediaType.TVShow.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase))
40+
Type = SearchMediaType.TVShow;
41+
else if (SearchMediaType.Person.GetDescription().Equals(value, StringComparison.InvariantCultureIgnoreCase))
42+
Type = SearchMediaType.Person;
43+
else
44+
Type = SearchMediaType.Unknown;
4145
}
4246
}
4347
}

TMDbLib/TMDbLib.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<Reference Include="System.Runtime.Serialization" />
4646
</ItemGroup>
4747
<ItemGroup>
48+
<Compile Include="Objects\Search\SearchMediaType.cs" />
4849
<Compile Include="Objects\Search\SearchQueryType.cs" />
4950
<Compile Include="Objects\Discover\DiscoverBase.cs" />
5051
<Compile Include="Objects\Discover\DiscoverMovie.cs" />

TMDbLib/Utilities/CustomDeserialization.cs

+36
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using System;
22
using System.Globalization;
33
using System.Text.RegularExpressions;
4+
using RestSharp;
5+
using RestSharp.Deserializers;
46
using TMDbLib.Objects.General;
57
using TMDbLib.Objects.Movies;
8+
using TMDbLib.Objects.Search;
69

710
namespace TMDbLib.Utilities
811
{
@@ -54,5 +57,38 @@ internal static void DeserializeAccountStatesRating(TvEpisodeAccountState accoun
5457
CultureInfo.InvariantCulture.NumberFormat);
5558
}
5659
}
60+
61+
public static void DeserializeMultiSearchContent(SearchContainer<SearchMulti> data, string content)
62+
{
63+
JsonDeserializer deserializer = new JsonDeserializer();
64+
65+
JsonObject objContainer = SimpleJson.DeserializeObject(content) as JsonObject;
66+
JsonArray resultsList = objContainer["results"] as JsonArray;
67+
68+
for (int i = 0; i < data.Results.Count; i++)
69+
{
70+
string jsonItem = resultsList[i].ToString();
71+
SearchMulti multiItem = data.Results[i];
72+
73+
if (multiItem.Type == SearchMediaType.TVShow)
74+
{
75+
SearchTv asTv = deserializer.Deserialize<SearchTv>(new RestResponse { Content = jsonItem });
76+
77+
multiItem.AsTvShow = asTv;
78+
}
79+
else if (multiItem.Type == SearchMediaType.Movie)
80+
{
81+
SearchMovie asMovie = deserializer.Deserialize<SearchMovie>(new RestResponse { Content = jsonItem });
82+
83+
multiItem.AsMovie = asMovie;
84+
}
85+
else if (multiItem.Type == SearchMediaType.Person)
86+
{
87+
SearchPerson asPerson = deserializer.Deserialize<SearchPerson>(new RestResponse { Content = jsonItem });
88+
89+
multiItem.AsPerson = asPerson;
90+
}
91+
}
92+
}
5793
}
5894
}

TMDbLibTests/ClientSearchTests.cs

+16-11
Original file line numberDiff line numberDiff line change
@@ -189,20 +189,25 @@ public void TestSearchMulti()
189189

190190
Assert.IsNotNull(item);
191191
Assert.AreEqual(1412, item.Id);
192-
Assert.AreEqual("/dXTyVDTIgeByvUOUEiHjbi8xX9A.jpg", item.BackdropPath);
193-
Assert.AreEqual(new DateTime(2012, 10, 10), item.FirstAirDate);
194-
Assert.AreEqual(MediaType.TVShow, item.Type);
192+
Assert.AreEqual(SearchMediaType.TVShow, item.Type);
195193
Assert.AreEqual("Arrow", item.Name);
196-
Assert.AreEqual("Arrow", item.OriginalName);
197-
Assert.AreEqual("/mo0FP1GxOFZT4UDde7RFDz5APXF.jpg", item.PosterPath);
194+
Assert.AreEqual("Arrow", item.Title);
198195
Assert.IsTrue(item.Popularity > 0);
199-
Assert.IsTrue(item.VoteAverage > 0);
200-
Assert.IsTrue(item.VoteCount > 0);
201196

202-
Assert.IsNotNull(item.OriginCountry);
203-
Assert.AreEqual(2, item.OriginCountry.Count);
204-
Assert.IsTrue(item.OriginCountry.Contains("US"));
205-
Assert.IsTrue(item.OriginCountry.Contains("CA"));
197+
Assert.IsNotNull(item.PosterPath);
198+
Assert.IsNotNull(item.BackdropPath);
199+
200+
foreach (SearchMulti multi in result.Results)
201+
{
202+
if (multi.Type == SearchMediaType.Movie)
203+
Assert.IsNotNull(multi.AsMovie);
204+
205+
if (multi.Type == SearchMediaType.TVShow)
206+
Assert.IsNotNull(multi.AsTvShow);
207+
208+
if (multi.Type == SearchMediaType.Person)
209+
Assert.IsNotNull(multi.AsPerson);
210+
}
206211
}
207212

208213
/// <summary>

0 commit comments

Comments
 (0)