mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	put Suggestion extraction into its own class
This commit is contained in:
		| @@ -41,10 +41,6 @@ public abstract class SearchEngine { | ||||
|         return collector; | ||||
|     } | ||||
|  | ||||
|     public abstract List<String> suggestionList( | ||||
|             String query,String contentCountry) | ||||
|             throws ExtractionException, IOException; | ||||
|  | ||||
|     //Result search(String query, int page); | ||||
|     public abstract StreamPreviewInfoSearchCollector search( | ||||
|             String query, int page, String contentCountry) | ||||
|   | ||||
| @@ -42,6 +42,7 @@ public abstract class StreamingService { | ||||
|     public abstract UrlIdHandler getChannelUrlIdHandlerInstance(); | ||||
|     public abstract ChannelExtractor getChannelExtractorInstance(String url, int page) | ||||
|             throws ExtractionException, IOException; | ||||
|     public abstract SuggestionExtractor getSuggestionExtractorInstance(); | ||||
|  | ||||
|     public final int getServiceId() { | ||||
|         return serviceId; | ||||
|   | ||||
| @@ -0,0 +1,41 @@ | ||||
| package org.schabi.newpipe.extractor; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Created by Christian Schabesberger on 28.09.16. | ||||
|  * | ||||
|  * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org> | ||||
|  * SuggestionExtractor.java is part of NewPipe. | ||||
|  * | ||||
|  * NewPipe is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * NewPipe is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| public abstract class SuggestionExtractor { | ||||
|  | ||||
|     private int serviceId; | ||||
|  | ||||
|     public SuggestionExtractor(int serviceId) { | ||||
|         this.serviceId = serviceId; | ||||
|     } | ||||
|  | ||||
|     public abstract List<String> suggestionList( | ||||
|             String query,String contentCountry) | ||||
|             throws ExtractionException, IOException; | ||||
|  | ||||
|     public int getServiceId() { | ||||
|         return serviceId; | ||||
|     } | ||||
| } | ||||
| @@ -118,55 +118,6 @@ public class YoutubeSearchEngine extends SearchEngine { | ||||
|         return collector; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<String> suggestionList(String query, String contentCountry) | ||||
|             throws IOException, ParsingException { | ||||
|  | ||||
|         List<String> suggestions = new ArrayList<>(); | ||||
|  | ||||
|         Downloader dl = NewPipe.getDownloader(); | ||||
|  | ||||
|         String url = "https://suggestqueries.google.com/complete/search" | ||||
|                 + "?client=" + "" | ||||
|                 + "&output=" + "toolbar" | ||||
|                 + "&ds=" + "yt" | ||||
|                 + "&hl=" + URLEncoder.encode(contentCountry, CHARSET_UTF_8) | ||||
|                 + "&q=" + URLEncoder.encode(query, CHARSET_UTF_8); | ||||
|  | ||||
|  | ||||
|         String response = dl.download(url); | ||||
|  | ||||
|         //TODO: Parse xml data using Jsoup not done | ||||
|         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); | ||||
|         DocumentBuilder dBuilder; | ||||
|         org.w3c.dom.Document doc = null; | ||||
|  | ||||
|         try { | ||||
|             dBuilder = dbFactory.newDocumentBuilder(); | ||||
|             doc = dBuilder.parse(new InputSource( | ||||
|                     new ByteArrayInputStream(response.getBytes(CHARSET_UTF_8)))); | ||||
|             doc.getDocumentElement().normalize(); | ||||
|         } catch (ParserConfigurationException | SAXException | IOException e) { | ||||
|             throw new ParsingException("Could not parse document."); | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             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")); | ||||
|                 } | ||||
|             } | ||||
|             return suggestions; | ||||
|         } catch(Exception e) { | ||||
|             throw new ParsingException("Could not get suggestions form document.", e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private StreamPreviewInfoExtractor extractPreviewInfo(final Element item) { | ||||
|         return new YoutubeStreamPreviewInfoExtractor(item); | ||||
|     } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import org.schabi.newpipe.extractor.ExtractionException; | ||||
| import org.schabi.newpipe.extractor.Downloader; | ||||
| import org.schabi.newpipe.extractor.StreamExtractor; | ||||
| import org.schabi.newpipe.extractor.StreamingService; | ||||
| import org.schabi.newpipe.extractor.SuggestionExtractor; | ||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | ||||
| import org.schabi.newpipe.extractor.SearchEngine; | ||||
|  | ||||
| @@ -74,4 +75,9 @@ public class YoutubeService extends StreamingService { | ||||
|         throws ExtractionException, IOException { | ||||
|         return new YoutubeChannelExtractor(getChannelUrlIdHandlerInstance(), url, page, getServiceId()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public SuggestionExtractor getSuggestionExtractorInstance() { | ||||
|         return new YoutubeSuggestionExtractor(getServiceId()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,100 @@ | ||||
| package org.schabi.newpipe.extractor.services.youtube; | ||||
|  | ||||
| import org.schabi.newpipe.extractor.Downloader; | ||||
| import org.schabi.newpipe.extractor.ExtractionException; | ||||
| import org.schabi.newpipe.extractor.NewPipe; | ||||
| import org.schabi.newpipe.extractor.ParsingException; | ||||
| import org.schabi.newpipe.extractor.SuggestionExtractor; | ||||
| 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.net.URLEncoder; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Vector; | ||||
|  | ||||
| import javax.xml.parsers.DocumentBuilder; | ||||
| import javax.xml.parsers.DocumentBuilderFactory; | ||||
| import javax.xml.parsers.ParserConfigurationException; | ||||
|  | ||||
| /** | ||||
|  * Created by Christian Schabesberger on 28.09.16. | ||||
|  * | ||||
|  * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org> | ||||
|  * YoutubeSuggestionExtractor.java is part of NewPipe. | ||||
|  * | ||||
|  * NewPipe is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * NewPipe is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| public class YoutubeSuggestionExtractor extends SuggestionExtractor { | ||||
|  | ||||
|     public static final String CHARSET_UTF_8 = "UTF-8"; | ||||
|  | ||||
|     public YoutubeSuggestionExtractor(int serviceId) { | ||||
|         super(serviceId); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<String> suggestionList( | ||||
|             String query, String contentCountry) | ||||
|             throws ExtractionException, IOException { | ||||
|         List<String> suggestions = new ArrayList<>(); | ||||
|  | ||||
|         Downloader dl = NewPipe.getDownloader(); | ||||
|  | ||||
|         String url = "https://suggestqueries.google.com/complete/search" | ||||
|                 + "?client=" + "" | ||||
|                 + "&output=" + "toolbar" | ||||
|                 + "&ds=" + "yt" | ||||
|                 + "&hl=" + URLEncoder.encode(contentCountry, CHARSET_UTF_8) | ||||
|                 + "&q=" + URLEncoder.encode(query, CHARSET_UTF_8); | ||||
|  | ||||
|  | ||||
|         String response = dl.download(url); | ||||
|  | ||||
|         //TODO: Parse xml data using Jsoup not done | ||||
|         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); | ||||
|         DocumentBuilder dBuilder; | ||||
|         org.w3c.dom.Document doc = null; | ||||
|  | ||||
|         try { | ||||
|             dBuilder = dbFactory.newDocumentBuilder(); | ||||
|             doc = dBuilder.parse(new InputSource( | ||||
|                     new ByteArrayInputStream(response.getBytes(CHARSET_UTF_8)))); | ||||
|             doc.getDocumentElement().normalize(); | ||||
|         } catch (ParserConfigurationException | SAXException | IOException e) { | ||||
|             throw new ParsingException("Could not parse document."); | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             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")); | ||||
|                 } | ||||
|             } | ||||
|             return suggestions; | ||||
|         } catch(Exception e) { | ||||
|             throw new ParsingException("Could not get suggestions form document.", e); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -8,6 +8,7 @@ import android.widget.Toast; | ||||
|  | ||||
| import org.schabi.newpipe.Downloader; | ||||
| import org.schabi.newpipe.extractor.NewPipe; | ||||
| import org.schabi.newpipe.extractor.SuggestionExtractor; | ||||
| import org.schabi.newpipe.report.ErrorActivity; | ||||
| import org.schabi.newpipe.R; | ||||
| import org.schabi.newpipe.extractor.ExtractionException; | ||||
| @@ -70,13 +71,13 @@ public class SuggestionSearchRunnable implements Runnable{ | ||||
|     @Override | ||||
|     public void run() { | ||||
|         try { | ||||
|             SearchEngine engine = | ||||
|                     NewPipe.getService(serviceId).getSearchEngineInstance(); | ||||
|             SuggestionExtractor se = | ||||
|                     NewPipe.getService(serviceId).getSuggestionExtractorInstance(); | ||||
|             SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(a); | ||||
|             String searchLanguageKey = a.getString(R.string.search_language_key); | ||||
|             String searchLanguage = sp.getString(searchLanguageKey, | ||||
|                     a.getString(R.string.default_language_value)); | ||||
|             List<String> suggestions = engine.suggestionList(query, searchLanguage); | ||||
|             List<String> suggestions = se.suggestionList(query, searchLanguage); | ||||
|             h.post(new SuggestionResultRunnable(suggestions, adapter)); | ||||
|         } catch (ExtractionException e) { | ||||
|             ErrorActivity.reportError(h, a, e, null, a.findViewById(android.R.id.content), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Christian Schabesberger
					Christian Schabesberger