From 68a0eefa20712c29fe65407610b3f1c92a72ac3b Mon Sep 17 00:00:00 2001 From: chandrashekhar Date: Tue, 3 Nov 2015 13:32:05 +0530 Subject: [PATCH 1/3] + Added interface method in SearchEngine class for fetch search suggestion list. + Implemented SearchEngine Interface method in YoutubeSearchEngine class. --- .../java/org/schabi/newpipe/SearchEngine.java | 2 ++ .../newpipe/youtube/YoutubeSearchEngine.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/SearchEngine.java index 5d986f2a4..561988b42 100644 --- a/app/src/main/java/org/schabi/newpipe/SearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/SearchEngine.java @@ -32,4 +32,6 @@ public interface SearchEngine { } Result search(String query, int page); + + Result suggestionList(String query); } diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java index a59c67295..76f263703 100644 --- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java @@ -115,4 +115,23 @@ public class YoutubeSearchEngine implements SearchEngine { } return result; } + + @Override + public Result suggestionList(String query) { + +// http://suggestqueries.google.com/complete/search?client=youtube&ds=yt&q=andro + + Uri.Builder builder = new Uri.Builder(); + builder.scheme("https") + .authority("suggestqueries.google.com") + .appendPath("complete") + .appendPath("search") + .appendQueryParameter("client", "youtube") + .appendQueryParameter("ds", "yt") + .appendQueryParameter("q", query); + String url = builder.build().toString(); + + return null; + } + } From 85ac000479e591e0f13dccf599e923ce5b1ca7b4 Mon Sep 17 00:00:00 2001 From: chandrashekhar Date: Wed, 4 Nov 2015 11:41:17 +0530 Subject: [PATCH 2/3] + Change return type of interface method suggestionList, So that it will return arraylist of string type data(suggestion). --- .../java/org/schabi/newpipe/SearchEngine.java | 3 +- .../newpipe/youtube/YoutubeSearchEngine.java | 61 +++++++++++++++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/SearchEngine.java index 561988b42..68945661f 100644 --- a/app/src/main/java/org/schabi/newpipe/SearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/SearchEngine.java @@ -1,5 +1,6 @@ package org.schabi.newpipe; +import java.util.ArrayList; import java.util.Vector; /** @@ -33,5 +34,5 @@ public interface SearchEngine { Result search(String query, int page); - Result suggestionList(String query); + ArrayList suggestionList(String query); } diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java index 76f263703..2cbe5bb33 100644 --- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java @@ -9,10 +9,21 @@ import org.jsoup.nodes.Element; import org.schabi.newpipe.Downloader; import org.schabi.newpipe.SearchEngine; import org.schabi.newpipe.VideoInfoItem; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + /** * Created by Christian Schabesberger on 09.08.15. * @@ -117,21 +128,63 @@ public class YoutubeSearchEngine implements SearchEngine { } @Override - public Result suggestionList(String query) { + public ArrayList suggestionList(String query) { -// http://suggestqueries.google.com/complete/search?client=youtube&ds=yt&q=andro + ArrayList suggestions = new ArrayList<>(); Uri.Builder builder = new Uri.Builder(); builder.scheme("https") .authority("suggestqueries.google.com") .appendPath("complete") .appendPath("search") - .appendQueryParameter("client", "youtube") + .appendQueryParameter("client", "") + .appendQueryParameter("output", "toolbar") .appendQueryParameter("ds", "yt") .appendQueryParameter("q", query); String url = builder.build().toString(); - return null; + String response = Downloader.download(url); + DocumentBuilderFactory dbFactory + = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = null; + try { + dBuilder = dbFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + org.w3c.dom.Document doc = null; + try { + doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(response.getBytes("utf-8")))); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + doc.getDocumentElement().normalize(); + +// System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); + + NodeList nList = doc.getElementsByTagName("CompleteSuggestion"); + + for (int temp = 0; temp < nList.getLength(); temp++) { + + Node nNode = nList.item(temp); +// System.out.println("\nCurrent Element :" + nNode.getNodeName()); + + NodeList nList1 = doc.getElementsByTagName("suggestion"); + + Node nNode1 = nList1.item(temp); +// System.out.println("\nInside Item :" + nNode1.getNodeName()); + + if (nNode1.getNodeType() == Node.ELEMENT_NODE) { + org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode1; + + System.out.println("final data : " + eElement.getAttribute("data")); + + suggestions.add(eElement.getAttribute("data")); + } + } + return suggestions; } } From 4def715b253a95a156aa33728303437816ac1ec9 Mon Sep 17 00:00:00 2001 From: chandrashekhar Date: Thu, 5 Nov 2015 13:19:28 +0530 Subject: [PATCH 3/3] + Added TODO & remove unused lines. --- .../newpipe/youtube/YoutubeSearchEngine.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java index 0c13b66ea..b2b1beeac 100644 --- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java @@ -157,34 +157,33 @@ public class YoutubeSearchEngine implements SearchEngine { String url = builder.build().toString(); String response = Downloader.download(url); - DocumentBuilderFactory dbFactory - = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = null; + + //TODO: Parse xml data using Jsoup not done + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder; + org.w3c.dom.Document doc = null; + try { dBuilder = dbFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } - org.w3c.dom.Document doc = null; - try { doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(response.getBytes("utf-8")))); - } catch (SAXException e) { - e.printStackTrace(); - } catch (IOException e) { + doc.getDocumentElement().normalize(); + }catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } - doc.getDocumentElement().normalize(); - NodeList nList = doc.getElementsByTagName("CompleteSuggestion"); - for (int temp = 0; temp < nList.getLength(); temp++) { + if(doc!=null){ + NodeList nList = doc.getElementsByTagName("CompleteSuggestion"); + for (int temp = 0; temp < nList.getLength(); temp++) { - NodeList nList1 = doc.getElementsByTagName("suggestion"); - Node nNode1 = nList1.item(temp) - ; - if (nNode1.getNodeType() == Node.ELEMENT_NODE) { - org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode1; - suggestions.add(eElement.getAttribute("data")); + NodeList nList1 = doc.getElementsByTagName("suggestion"); + Node nNode1 = nList1.item(temp); + if (nNode1.getNodeType() == Node.ELEMENT_NODE) { + org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode1; + suggestions.add(eElement.getAttribute("data")); + } } + }else { + Log.e(TAG, "GREAT FUCKING ERROR"); } return suggestions; }