From 58368d48b2dda9bdf9e534b49d165a0ac865ea5f Mon Sep 17 00:00:00 2001 From: 34j <55338215+34j@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:43:38 +0900 Subject: [PATCH 1/3] Add content filters. --- .../NiconicoSearchQueryHandlerFactory.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java index 2dd0d8687..1f2e22751 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java @@ -12,22 +12,42 @@ public class NiconicoSearchQueryHandlerFactory extends SearchQueryHandlerFactory { public static final int ITEMS_PER_PAGE = 10; - private static final String SEARCH_URL - = "https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search"; + public static final String ALL = "all"; + public static final String TAGS = "Tags"; + private static final String SEARCH_URL = "https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search"; + + // https://site.nicovideo.jp/search-api-docs/snapshot @Override public String getUrl(final String id, - final List contentFilter, - final String sortFilter) throws ParsingException { + final List contentFilters, + final String sortFilter) throws ParsingException { try { - return SEARCH_URL + "?q=" + URLEncoder.encode(id, UTF_8) - + "&targets=title,description,tags" - + "&fields=contentId,title,userId,channelId" + String url = SEARCH_URL + "?q=" + URLEncoder.encode(id, UTF_8); + + url += "&targets="; + if (contentFilters.isEmpty()) { + url += "title,description,tags"; + } else { + switch (contentFilters.get(0)) { + case TAGS: + url += "tagsExact"; + break; + case ALL: + default: + url += "title,description,tags"; + break; + } + } + + url += "&fields=contentId,title,userId,channelId" + ",viewCounter,lengthSeconds,thumbnailUrl,startTime" - + "&_sort=-viewCounter" + + "&_sort=" + "-viewCounter" + "&_offset=0" + "&_limit=" + ITEMS_PER_PAGE + "&_context=" + URLEncoder.encode(NiconicoService.APP_NAME, UTF_8); + + return url; } catch (final UnsupportedEncodingException e) { throw new ParsingException("could not encode query."); } @@ -36,7 +56,8 @@ public String getUrl(final String id, @Override public String[] getAvailableContentFilter() { return new String[] { - "all" + ALL, + TAGS }; } } \ No newline at end of file From 4b23e0cb3821762a50dd1348ef3ce43ce6b8bc8e Mon Sep 17 00:00:00 2001 From: 34j <55338215+34j@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:44:38 +0900 Subject: [PATCH 2/3] Add sorting filters --- .../NiconicoSearchQueryHandlerFactory.java | 74 ++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java index 1f2e22751..37c95eef6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java @@ -8,12 +8,24 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.HashMap; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class NiconicoSearchQueryHandlerFactory extends SearchQueryHandlerFactory { public static final int ITEMS_PER_PAGE = 10; public static final String ALL = "all"; public static final String TAGS = "Tags"; + public static final String VIEW_COUNTER = "view_count"; + public static final String MYLIST_COUNTER = "mylist_count"; + public static final String LIKE_COUNTER = "like_count"; + public static final String LENGTH_SECONDS = "length"; + public static final String START_TIME = "posting_time"; + public static final String COMMENT_COUNTER = "comment_count"; + public static final String LAST_COMMENT_TIME = "last_comment_time"; + public static final String ASCENDING = "ascending"; + public static final String DESCENDING = "descending"; private static final String SEARCH_URL = "https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search"; @@ -42,11 +54,11 @@ public String getUrl(final String id, url += "&fields=contentId,title,userId,channelId" + ",viewCounter,lengthSeconds,thumbnailUrl,startTime" - + "&_sort=" + "-viewCounter" + + "&_sort=" + getSortFilter(sortFilter) + "&_offset=0" + "&_limit=" + ITEMS_PER_PAGE + "&_context=" + URLEncoder.encode(NiconicoService.APP_NAME, UTF_8); - + return url; } catch (final UnsupportedEncodingException e) { throw new ParsingException("could not encode query."); @@ -60,4 +72,62 @@ public String[] getAvailableContentFilter() { TAGS }; } + + @Override + public String[] getAvailableSortFilter() { + final String[] fields = new String[] { + VIEW_COUNTER, + MYLIST_COUNTER, + LIKE_COUNTER, + LENGTH_SECONDS, + START_TIME, + COMMENT_COUNTER, + LAST_COMMENT_TIME + }; + final String[] orders = new String[] { ASCENDING, DESCENDING }; + final String[] sortFilters = new String[fields.length * orders.length]; + for (int i = 0; i < fields.length; i++) { + for (int j = 0; j < orders.length; j++) { + sortFilters[i * orders.length + j] = fields[i] + "_" + orders[j]; + } + } + ; + return sortFilters; + } + + private String getSortFilter(final String sortFilter) { + final HashMap SORT_FILTERS = new HashMap() { + { + put(VIEW_COUNTER, "viewCounter"); + put(MYLIST_COUNTER, "mylistCounter"); + put(LIKE_COUNTER, "likeCounter"); + put(LENGTH_SECONDS, "lengthSeconds"); + put(START_TIME, "startTime"); + put(COMMENT_COUNTER, "commentCounter"); + put(LAST_COMMENT_TIME, "lastCommentTime"); + } + }; + + final HashMap SORT_ORDERS = new HashMap() { + { + put(DESCENDING, "-"); + put(ASCENDING, "+"); + } + }; + + if (sortFilter.isEmpty()) { + return SORT_ORDERS.get(DESCENDING) + SORT_FILTERS.get(VIEW_COUNTER); + } + final Pattern pattern = Pattern.compile("^(.+)_(.+)$"); + final Matcher matcher = pattern.matcher(sortFilter); + if (!matcher.find()) { + throw new IllegalArgumentException("Invalid sort filter: " + sortFilter); + } + final String field = SORT_FILTERS.get(matcher.group(0)); + final String order = SORT_ORDERS.get(matcher.group(1)); + if (field == null || order == null) { + throw new IllegalArgumentException("Invalid sort filter: " + sortFilter); + } + return order + field; + } } \ No newline at end of file From 43ac5a41056657b8156f7ad5f8e9e892781c89c1 Mon Sep 17 00:00:00 2001 From: 34j <55338215+34j@users.noreply.github.com> Date: Tue, 13 Sep 2022 15:13:08 +0900 Subject: [PATCH 3/3] Change to lowercase --- .../niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java index 37c95eef6..22622b95d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java @@ -16,7 +16,7 @@ public class NiconicoSearchQueryHandlerFactory extends SearchQueryHandlerFactory { public static final int ITEMS_PER_PAGE = 10; public static final String ALL = "all"; - public static final String TAGS = "Tags"; + public static final String TAGS = "tags"; public static final String VIEW_COUNTER = "view_count"; public static final String MYLIST_COUNTER = "mylist_count"; public static final String LIKE_COUNTER = "like_count";