Skip to content

Commit

Permalink
Rewrite the SearchMulti function using Json trickery
Browse files Browse the repository at this point in the history
  • Loading branch information
LordMike committed Aug 1, 2016
1 parent ffa2e2b commit f38fb1b
Show file tree
Hide file tree
Showing 12 changed files with 129 additions and 101 deletions.
6 changes: 3 additions & 3 deletions TMDbLib/Client/TMDbClientSearch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,14 @@ public async Task<SearchContainer<SearchMovie>> SearchMovieAsync(string query, s
return await SearchMethod<SearchContainer<SearchMovie>>("movie", query, page, language, includeAdult, year, "yyyy-MM-dd").ConfigureAwait(false);
}

public async Task<SearchContainer<SearchMulti>> SearchMultiAsync(string query, int page = 0, bool includeAdult = false, int year = 0)
public async Task<SearchContainer<SearchBase>> SearchMultiAsync(string query, int page = 0, bool includeAdult = false, int year = 0)
{
return await SearchMultiAsync(query, DefaultLanguage, page, includeAdult, year).ConfigureAwait(false);
}

public async Task<SearchContainer<SearchMulti>> SearchMultiAsync(string query, string language, int page = 0, bool includeAdult = false, int year = 0)
public async Task<SearchContainer<SearchBase>> SearchMultiAsync(string query, string language, int page = 0, bool includeAdult = false, int year = 0)
{
return await SearchMethod<SearchContainer<SearchMulti>>("multi", query, page, language, includeAdult, year, "yyyy-MM-dd").ConfigureAwait(false);
return await SearchMethod<SearchContainer<SearchBase>>("multi", query, page, language, includeAdult, year, "yyyy-MM-dd").ConfigureAwait(false);
}

public async Task<SearchContainer<SearchPerson>> SearchPersonAsync(string query, int page = 0, bool includeAdult = false)
Expand Down
5 changes: 4 additions & 1 deletion TMDbLib/Objects/General/MediaType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ public enum MediaType
Movie = 1,

[EnumValue("tv")]
Tv = 2
Tv = 2,

[EnumValue("person")]
Person = 3
}
}
2 changes: 1 addition & 1 deletion TMDbLib/Objects/People/TaggedImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class TaggedImage

[JsonIgnore]
[JsonProperty("media")]
public MediaBase Media { get; set; }
public SearchBase Media { get; set; }

[JsonProperty("media_type")]
public MediaType MediaType { get; set; }
Expand Down
19 changes: 19 additions & 0 deletions TMDbLib/Objects/Search/SearchBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Newtonsoft.Json;
using TMDbLib.Objects.General;
using TMDbLib.Utilities;

namespace TMDbLib.Objects.Search
{
[JsonConverter(typeof(SearchBaseConverter))]
public class SearchBase
{
[JsonProperty("id")]
public int Id { get; set; }

[JsonProperty("popularity")]
public double Popularity { get; set; }

[JsonIgnore]
public MediaType MediaType { get; set; }
}
}
8 changes: 7 additions & 1 deletion TMDbLib/Objects/Search/SearchMovie.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
using System;
using Newtonsoft.Json;
using TMDbLib.Objects.General;

namespace TMDbLib.Objects.Search
{
public class SearchMovie : MediaBase
public class SearchMovie : SearchMovieTvBase
{
public SearchMovie()
{
MediaType = MediaType.Movie;
}

[JsonProperty("adult")]
public bool Adult { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@

namespace TMDbLib.Objects.Search
{
public class MediaBase
public class SearchMovieTvBase : SearchBase
{
[JsonProperty("id")]
public int Id { get; set; }

[JsonProperty("backdrop_path")]
public string BackdropPath { get; set; }

Expand All @@ -23,9 +20,6 @@ public class MediaBase
[JsonProperty("genre_ids")]
public List<int> GenreIds { get; set; }

[JsonProperty("popularity")]
public double Popularity { get; set; }

[JsonProperty("vote_average")]
public double VoteAverage { get; set; }

Expand Down
75 changes: 0 additions & 75 deletions TMDbLib/Objects/Search/SearchMulti.cs

This file was deleted.

14 changes: 7 additions & 7 deletions TMDbLib/Objects/Search/SearchPerson.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
using System.Collections.Generic;
using Newtonsoft.Json;
using TMDbLib.Objects.General;

namespace TMDbLib.Objects.Search
{
public class SearchPerson
public class SearchPerson : SearchBase
{
public SearchPerson()
{
MediaType = MediaType.Person;
}

[JsonProperty("adult")]
public bool Adult { get; set; }

[JsonProperty("id")]
public int Id { get; set; }

[JsonProperty("known_for")]
public List<KnownForBase> KnownFor { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("popularity")]
public double Popularity { get; set; }

[JsonProperty("profile_path")]
public string ProfilePath { get; set; }
}
Expand Down
12 changes: 9 additions & 3 deletions TMDbLib/Objects/Search/SearchTv.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using TMDbLib.Objects.General;

namespace TMDbLib.Objects.Search
{
public class SearchTv : MediaBase
public class SearchTv : SearchMovieTvBase
{
public SearchTv()
{
MediaType = MediaType.Tv;
}

[JsonProperty("first_air_date")]
public DateTime? FirstAirDate { get; set; }

[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("original_name")]
public string OriginalName { get; set; }

Expand Down
58 changes: 58 additions & 0 deletions TMDbLib/Utilities/SearchBaseConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using TMDbLib.Objects.General;
using TMDbLib.Objects.Search;

namespace TMDbLib.Utilities
{
internal class SearchBaseConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(SearchBase);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);

SearchBase result;
if (jObject["media_type"] == null)
{
// We cannot determine the correct type, let's hope we were provided one
result = (SearchBase)Activator.CreateInstance(objectType);
}
else
{
// Determine the type based on the media_type
MediaType mediaType = jObject["media_type"].ToObject<MediaType>();

switch (mediaType)
{
case MediaType.Movie:
result = new SearchMovie();
break;
case MediaType.Tv:
result = new SearchTv();
break;
case MediaType.Person:
result = new SearchPerson();
break;
default:
throw new ArgumentOutOfRangeException();
}
}

// Populate the result
serializer.Populate(jObject.CreateReader(), result);

return result;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}
6 changes: 3 additions & 3 deletions TMDbLibTests/ClientSearchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,16 +170,16 @@ public void TestSearchMulti()
{
TestHelpers.SearchPages(i => Config.Client.SearchMultiAsync("Arrow", i).Result);

SearchContainer<SearchMulti> result = Config.Client.SearchMultiAsync("Arrow").Result;
SearchContainer<SearchBase> result = Config.Client.SearchMultiAsync("Arrow").Result;

Assert.True(result.Results.Any());
SearchMulti item = result.Results.SingleOrDefault(s => s.Id == 1412);
SearchTv item = result.Results.OfType<SearchTv>().SingleOrDefault(s => s.Id == 1412);

Assert.NotNull(item);
Assert.Equal(1412, item.Id);
Assert.True(TestImagesHelpers.TestImagePath(item.BackdropPath), "item.BackdropPath was not a valid image path, was: " + item.BackdropPath);
Assert.Equal(new DateTime(2012, 10, 10), item.FirstAirDate);
Assert.Equal(MediaType.Tv, item.Type);
Assert.Equal(MediaType.Tv, item.MediaType);
Assert.Equal("Arrow", item.Name);
Assert.Equal("Arrow", item.OriginalName);
Assert.True(TestImagesHelpers.TestImagePath(item.PosterPath), "item.PosterPath was not a valid image path, was: " + item.PosterPath);
Expand Down
17 changes: 17 additions & 0 deletions TMDbLibTests/JsonMagicTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,22 @@ public void TestJsonTaggedImageConverter()
Assert.Contains(result.Results, item => item.MediaType == MediaType.Tv && item.Media is SearchTv);
Assert.Contains(result.Results, item => item.MediaType == MediaType.Movie && item.Media is SearchMovie);
}

/// <summary>
/// Tests the SearchBaseConverter
/// </summary>
[Fact]
public void TestSearchBaseConverter()
{
TestHelpers.SearchPages(i => Config.Client.SearchMultiAsync("Rock", i).Result);
SearchContainer<SearchBase> result = Config.Client.SearchMultiAsync("Rock").Result;

Assert.NotNull(result);
Assert.NotNull(result.Results);

Assert.Contains(result.Results, item => item.MediaType == MediaType.Tv && item is SearchTv);
Assert.Contains(result.Results, item => item.MediaType == MediaType.Movie && item is SearchMovie);
Assert.Contains(result.Results, item => item.MediaType == MediaType.Person && item is SearchPerson);
}
}
}

0 comments on commit f38fb1b

Please sign in to comment.