Skip to content

Commit 3faee1f

Browse files
committed
Implement new tag based search for the media search
1 parent 4941bf9 commit 3faee1f

3 files changed

Lines changed: 72 additions & 47 deletions

File tree

library/src/main/java/me/proxer/library/api/list/InternalApi.java

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,8 @@
11
package me.proxer.library.api.list;
22

33
import me.proxer.library.api.ProxerCall;
4-
import me.proxer.library.entity.list.IndustryCore;
5-
import me.proxer.library.entity.list.IndustryProject;
6-
import me.proxer.library.entity.list.MediaListEntry;
7-
import me.proxer.library.entity.list.Tag;
8-
import me.proxer.library.entity.list.TranslatorGroupCore;
9-
import me.proxer.library.entity.list.TranslatorGroupProject;
10-
import me.proxer.library.enums.Category;
11-
import me.proxer.library.enums.Country;
12-
import me.proxer.library.enums.IndustryType;
13-
import me.proxer.library.enums.Language;
14-
import me.proxer.library.enums.LengthBound;
15-
import me.proxer.library.enums.MediaListSortCriteria;
16-
import me.proxer.library.enums.MediaSearchSortCriteria;
17-
import me.proxer.library.enums.MediaType;
18-
import me.proxer.library.enums.Medium;
19-
import me.proxer.library.enums.ProjectState;
20-
import me.proxer.library.enums.SortType;
21-
import me.proxer.library.enums.TagRateFilter;
22-
import me.proxer.library.enums.TagSortCriteria;
23-
import me.proxer.library.enums.TagSpoilerFilter;
24-
import me.proxer.library.enums.TagSubType;
25-
import me.proxer.library.enums.TagType;
4+
import me.proxer.library.entity.list.*;
5+
import me.proxer.library.enums.*;
266
import retrofit2.http.GET;
277
import retrofit2.http.Query;
288

@@ -57,6 +37,8 @@ ProxerCall<List<MediaListEntry>> mediaSearch(@Query("name") String name,
5737
@Query("length-limit") LengthBound lengthLimit,
5838
@Query("tags") String tags,
5939
@Query("notags") String excludedTags,
40+
@Query("taggenre") String tagGenres,
41+
@Query("notaggenre") String excludedTagGenres,
6042
@Query("tagratefilter") TagRateFilter tagRateFilter,
6143
@Query("tagspoilerfilter") TagSpoilerFilter tagSpoilerFilter,
6244
@Query("p") Integer page,

library/src/main/java/me/proxer/library/api/list/MediaSearchEndpoint.java

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,7 @@
55
import me.proxer.library.api.PagingLimitEndpoint;
66
import me.proxer.library.api.ProxerCall;
77
import me.proxer.library.entity.list.MediaListEntry;
8-
import me.proxer.library.enums.FskConstraint;
9-
import me.proxer.library.enums.Genre;
10-
import me.proxer.library.enums.Language;
11-
import me.proxer.library.enums.LengthBound;
12-
import me.proxer.library.enums.MediaSearchSortCriteria;
13-
import me.proxer.library.enums.MediaType;
14-
import me.proxer.library.enums.TagRateFilter;
15-
import me.proxer.library.enums.TagSpoilerFilter;
8+
import me.proxer.library.enums.*;
169
import me.proxer.library.util.ProxerUtils;
1710

1811
import javax.annotation.Nullable;
@@ -94,13 +87,15 @@ public final class MediaSearchEndpoint implements PagingLimitEndpoint<List<Media
9487
/**
9588
* Sets the required genres.
9689
*/
90+
@Deprecated
9791
@Nullable
9892
@Setter
9993
private EnumSet<Genre> genres;
10094

10195
/**
10296
* Sets the excluded genres.
10397
*/
98+
@Deprecated
10499
@Nullable
105100
@Setter
106101
private EnumSet<Genre> excludedGenres;
@@ -132,6 +127,12 @@ public final class MediaSearchEndpoint implements PagingLimitEndpoint<List<Media
132127
@Nullable
133128
private String excludedTags;
134129

130+
@Nullable
131+
private String tagGenres;
132+
133+
@Nullable
134+
private String excludedTagGenres;
135+
135136
MediaSearchEndpoint(final InternalApi internalApi) {
136137
this.internalApi = internalApi;
137138
}
@@ -162,13 +163,40 @@ public MediaSearchEndpoint excludedTags(@Nullable final Set<String> excludedIds)
162163
return this;
163164
}
164165

166+
/**
167+
* Sets the genre tag ids a entry must have to be included in the result.
168+
*/
169+
public MediaSearchEndpoint genreTags(@Nullable final Set<String> ids) {
170+
if (ids != null) {
171+
this.tagGenres = ProxerUtils.join(DELIMITER, ids);
172+
} else {
173+
this.tagGenres = null;
174+
}
175+
176+
return this;
177+
}
178+
179+
/**
180+
* Sets the genre tag ids a entry must not have to be included in the result.
181+
*/
182+
public MediaSearchEndpoint excludedGenreTags(@Nullable final Set<String> excludedIds) {
183+
if (excludedIds != null) {
184+
this.excludedTagGenres = ProxerUtils.join(DELIMITER, excludedIds);
185+
} else {
186+
this.excludedTagGenres = null;
187+
}
188+
189+
return this;
190+
}
191+
165192
@Override
166193
public ProxerCall<List<MediaListEntry>> build() {
167194
String joinedGenres = genres == null ? null : ProxerUtils.joinEnums(DELIMITER, genres);
168195
String joinedExcludedGenres = excludedGenres == null ? null : ProxerUtils.joinEnums(DELIMITER, excludedGenres);
169196
String joinedFskConstraints = fskConstraints == null ? null : ProxerUtils.joinEnums(DELIMITER, fskConstraints);
170197

171198
return internalApi.mediaSearch(name, language, type, joinedGenres, joinedExcludedGenres, joinedFskConstraints,
172-
sort, length, lengthBound, tags, excludedTags, tagRateFilter, tagSpoilerFilter, page, limit);
199+
sort, length, lengthBound, tags, excludedTags, tagGenres, excludedTagGenres,
200+
tagRateFilter, tagSpoilerFilter, page, limit);
173201
}
174202
}

library/src/test/java/me/proxer/library/api/list/MediaSearchEndpointTest.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,7 @@
33
import me.proxer.library.ProxerTest;
44
import me.proxer.library.api.ProxerException;
55
import me.proxer.library.entity.list.MediaListEntry;
6-
import me.proxer.library.enums.FskConstraint;
7-
import me.proxer.library.enums.Genre;
8-
import me.proxer.library.enums.Language;
9-
import me.proxer.library.enums.LengthBound;
10-
import me.proxer.library.enums.MediaLanguage;
11-
import me.proxer.library.enums.MediaSearchSortCriteria;
12-
import me.proxer.library.enums.MediaState;
13-
import me.proxer.library.enums.MediaType;
14-
import me.proxer.library.enums.Medium;
15-
import me.proxer.library.enums.TagRateFilter;
16-
import me.proxer.library.enums.TagSpoilerFilter;
6+
import me.proxer.library.enums.*;
177
import okhttp3.mockwebserver.MockResponse;
188
import org.junit.Test;
199

@@ -50,10 +40,10 @@ public void testPath() throws ProxerException, IOException, InterruptedException
5040
.name("test")
5141
.limit(10)
5242
.page(3)
53-
.genres(EnumSet.of(Genre.ADULT, Genre.ACTION))
54-
.excludedGenres(EnumSet.of(Genre.DRAMA, Genre.FANTASY))
5543
.tags(new HashSet<>(Arrays.asList("3", "7")))
5644
.excludedTags(new HashSet<>(Arrays.asList("5", "20")))
45+
.genreTags(new HashSet<>(Arrays.asList("22", "33")))
46+
.excludedGenreTags(new HashSet<>(Arrays.asList("13", "17")))
5747
.fskConstraints(EnumSet.of(FskConstraint.FEAR))
5848
.language(Language.ENGLISH)
5949
.length(300)
@@ -66,9 +56,8 @@ public void testPath() throws ProxerException, IOException, InterruptedException
6656
.execute();
6757

6858
assertThat(server.takeRequest().getPath()).isEqualTo("/api/v1/list/entrysearch?name=test&language=en&"
69-
+ "type=all-manga&genre=Action%2BAdult&nogenre=Drama%2BFantasy&fsk=fear&sort=clicks&length=300&"
70-
+ "length-limit=down&tags=3%2B7&notags=5%2B20&tagratefilter=rate_1&"
71-
+ "tagspoilerfilter=spoiler_1&p=3&limit=10");
59+
+ "type=all-manga&fsk=fear&sort=clicks&length=300&length-limit=down&tags=3%2B7&notags=5%2B20&"
60+
+ "taggenre=22%2B33&notaggenre=13%2B17&tagratefilter=rate_1&tagspoilerfilter=spoiler_1&p=3&limit=10");
7261
}
7362

7463
@Test
@@ -97,6 +86,32 @@ public void testExcludedTagsNull() throws Exception {
9786
assertThat(server.takeRequest().getPath()).isEqualTo("/api/v1/list/entrysearch");
9887
}
9988

89+
@Test
90+
public void testGenreTagsNull() throws Exception {
91+
server.enqueue(new MockResponse().setBody(fromResource("media_list_entry.json")));
92+
93+
api.list().mediaSearch()
94+
.genreTags(new HashSet<>(Arrays.asList("3", "7")))
95+
.genreTags(null)
96+
.build()
97+
.execute();
98+
99+
assertThat(server.takeRequest().getPath()).isEqualTo("/api/v1/list/entrysearch");
100+
}
101+
102+
@Test
103+
public void testExcludedGenreTagsNull() throws Exception {
104+
server.enqueue(new MockResponse().setBody(fromResource("media_list_entry.json")));
105+
106+
api.list().mediaSearch()
107+
.excludedGenreTags(new HashSet<>(Arrays.asList("5", "20")))
108+
.excludedGenreTags(null)
109+
.build()
110+
.execute();
111+
112+
assertThat(server.takeRequest().getPath()).isEqualTo("/api/v1/list/entrysearch");
113+
}
114+
100115
private MediaListEntry buildTestEntry() {
101116
return new MediaListEntry("3637", "+ A Channel", EnumSet.of(Genre.COMEDY, Genre.SCHOOL),
102117
Medium.OVA, 11, MediaState.FINISHED, 774, 115,

0 commit comments

Comments
 (0)