mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-30 23:03:00 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master'
This commit is contained in:
		| @@ -4,8 +4,7 @@ import android.test.AndroidTestCase; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.Downloader; | ||||||
| import org.schabi.newpipe.extractor.ChannelExtractor; | import org.schabi.newpipe.extractor.ChannelExtractor; | ||||||
| import org.schabi.newpipe.extractor.SearchEngine; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 12.09.16. |  * Created by Christian Schabesberger on 12.09.16. | ||||||
| @@ -33,7 +32,7 @@ public class YoutubeChannelExtractorTest extends AndroidTestCase  { | |||||||
|     @Override |     @Override | ||||||
|     public void setUp() throws Exception { |     public void setUp() throws Exception { | ||||||
|         super.setUp(); |         super.setUp(); | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 0, new Downloader()); |                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 0, new Downloader()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -67,13 +66,13 @@ public class YoutubeChannelExtractorTest extends AndroidTestCase  { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void testGetNextPage() throws Exception { |     public void testGetNextPage() throws Exception { | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 1, new Downloader()); |                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 1, new Downloader()); | ||||||
|         assertTrue("next page didn't have content", !extractor.getStreams().getItemList().isEmpty()); |         assertTrue("next page didn't have content", !extractor.getStreams().getItemList().isEmpty()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void testGetNextNextPageUrl() throws Exception { |     public void testGetNextNextPageUrl() throws Exception { | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 2, new Downloader()); |                 .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw", 2, new Downloader()); | ||||||
|         assertTrue("next page didn't have content", extractor.hasNextPage()); |         assertTrue("next page didn't have content", extractor.hasNextPage()); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -2,15 +2,11 @@ package org.schabi.newpipe.extractor.youtube; | |||||||
|  |  | ||||||
| import android.test.AndroidTestCase; | import android.test.AndroidTestCase; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; |  | ||||||
| import org.schabi.newpipe.extractor.SearchResult; | import org.schabi.newpipe.extractor.SearchResult; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfo; |  | ||||||
| import org.schabi.newpipe.extractor.SearchEngine; | import org.schabi.newpipe.extractor.SearchEngine; | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.Downloader; | ||||||
|  |  | ||||||
| import java.io.PrintWriter; |  | ||||||
| import java.io.StringWriter; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -40,7 +36,7 @@ public class YoutubeSearchEngineTest extends AndroidTestCase { | |||||||
|     @Override |     @Override | ||||||
|     public void setUp() throws Exception { |     public void setUp() throws Exception { | ||||||
|         super.setUp(); |         super.setUp(); | ||||||
|         SearchEngine engine = ServiceList.getService("Youtube") |         SearchEngine engine = NewPipe.getService("Youtube") | ||||||
|                 .getSearchEngineInstance(new Downloader()); |                 .getSearchEngineInstance(new Downloader()); | ||||||
|  |  | ||||||
|         result = engine.search("this is something boring", |         result = engine.search("this is something boring", | ||||||
|   | |||||||
| @@ -6,9 +6,9 @@ import org.schabi.newpipe.Downloader; | |||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.AbstractVideoInfo; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.ExtractionException; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; | import org.schabi.newpipe.extractor.ParsingException; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.StreamExtractor; | import org.schabi.newpipe.extractor.StreamExtractor; | ||||||
| import org.schabi.newpipe.extractor.VideoStream; | import org.schabi.newpipe.extractor.stream_info.VideoStream; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| @@ -37,7 +37,7 @@ public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase { | |||||||
|     private StreamExtractor extractor; |     private StreamExtractor extractor; | ||||||
|  |  | ||||||
|     public void setUp() throws IOException, ExtractionException { |     public void setUp() throws IOException, ExtractionException { | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getExtractorInstance("https://www.youtube.com/watch?v=YQHsXMglC9A", new Downloader()); |                 .getExtractorInstance("https://www.youtube.com/watch?v=YQHsXMglC9A", new Downloader()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -48,7 +48,7 @@ public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase { | |||||||
|  |  | ||||||
|     public void testGetValidTimeStamp() throws ExtractionException, IOException { |     public void testGetValidTimeStamp() throws ExtractionException, IOException { | ||||||
|         StreamExtractor extractor = |         StreamExtractor extractor = | ||||||
|                 ServiceList.getService("Youtube") |                 NewPipe.getService("Youtube") | ||||||
|                         .getExtractorInstance("https://youtu.be/FmG385_uUys?t=174", new Downloader()); |                         .getExtractorInstance("https://youtu.be/FmG385_uUys?t=174", new Downloader()); | ||||||
|         assertTrue(Integer.toString(extractor.getTimeStamp()), |         assertTrue(Integer.toString(extractor.getTimeStamp()), | ||||||
|                 extractor.getTimeStamp() == 174); |                 extractor.getTimeStamp() == 174); | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ import android.test.AndroidTestCase; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.Downloader; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.ExtractionException; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; | import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| @@ -39,7 +39,7 @@ public class YoutubeStreamExtractorGemaTest extends AndroidTestCase { | |||||||
|     public void testGemaError() throws IOException, ExtractionException { |     public void testGemaError() throws IOException, ExtractionException { | ||||||
|         if(testActive) { |         if(testActive) { | ||||||
|             try { |             try { | ||||||
|                 ServiceList.getService("Youtube") |                 NewPipe.getService("Youtube") | ||||||
|                         .getExtractorInstance("https://www.youtube.com/watch?v=3O1_3zBUKM8", |                         .getExtractorInstance("https://www.youtube.com/watch?v=3O1_3zBUKM8", | ||||||
|                         new Downloader()); |                         new Downloader()); | ||||||
|             } catch(YoutubeStreamExtractor.GemaException ge) { |             } catch(YoutubeStreamExtractor.GemaException ge) { | ||||||
|   | |||||||
| @@ -2,11 +2,8 @@ package org.schabi.newpipe.extractor.youtube; | |||||||
|  |  | ||||||
| import android.test.AndroidTestCase; | import android.test.AndroidTestCase; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; |  | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; |  | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.ExtractionException; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; | import org.schabi.newpipe.extractor.ParsingException; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
| import org.schabi.newpipe.extractor.StreamExtractor; | import org.schabi.newpipe.extractor.StreamExtractor; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| @@ -39,7 +36,7 @@ public class YoutubeStreamExtractorLiveStreamTest extends AndroidTestCase { | |||||||
|     public void setUp() throws IOException, ExtractionException { |     public void setUp() throws IOException, ExtractionException { | ||||||
|         //todo: make the extractor not throw over a livestream |         //todo: make the extractor not throw over a livestream | ||||||
|         /* |         /* | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getExtractorInstance("https://www.youtube.com/watch?v=J0s6NjqdjLE", new Downloader()); |                 .getExtractorInstance("https://www.youtube.com/watch?v=J0s6NjqdjLE", new Downloader()); | ||||||
|                 */ |                 */ | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ import android.test.AndroidTestCase; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.Downloader; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; | import org.schabi.newpipe.extractor.ParsingException; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
| import org.schabi.newpipe.extractor.StreamExtractor; | import org.schabi.newpipe.extractor.StreamExtractor; | ||||||
| import org.schabi.newpipe.extractor.VideoStream; | import org.schabi.newpipe.extractor.stream_info.VideoStream; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| @@ -16,7 +16,7 @@ public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase { | |||||||
|     private StreamExtractor extractor; |     private StreamExtractor extractor; | ||||||
|  |  | ||||||
|     public void setUp() throws IOException, ExtractionException { |     public void setUp() throws IOException, ExtractionException { | ||||||
|         extractor = ServiceList.getService("Youtube") |         extractor = NewPipe.getService("Youtube") | ||||||
|                 .getExtractorInstance("https://www.youtube.com/watch?v=i6JTvzrpBy0", |                 .getExtractorInstance("https://www.youtube.com/watch?v=i6JTvzrpBy0", | ||||||
|                         new Downloader()); |                         new Downloader()); | ||||||
|     } |     } | ||||||
| @@ -27,7 +27,7 @@ public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void testGetValidTimeStamp() throws ExtractionException, IOException { |     public void testGetValidTimeStamp() throws ExtractionException, IOException { | ||||||
|         StreamExtractor extractor=ServiceList.getService("Youtube") |         StreamExtractor extractor= NewPipe.getService("Youtube") | ||||||
|                 .getExtractorInstance("https://youtu.be/FmG385_uUys?t=174", |                 .getExtractorInstance("https://youtu.be/FmG385_uUys?t=174", | ||||||
|                         new Downloader()); |                         new Downloader()); | ||||||
|         assertTrue(Integer.toString(extractor.getTimeStamp()), |         assertTrue(Integer.toString(extractor.getTimeStamp()), | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ | |||||||
|         <activity |         <activity | ||||||
|             android:name=".detail.VideoItemDetailActivity" |             android:name=".detail.VideoItemDetailActivity" | ||||||
|             android:label="@string/title_videoitem_detail" |             android:label="@string/title_videoitem_detail" | ||||||
|  |             android:launchMode="singleTask" | ||||||
|             android:theme="@style/AppTheme"> |             android:theme="@style/AppTheme"> | ||||||
|             <meta-data |             <meta-data | ||||||
|                 android:name="android.support.PARENT_ACTIVITY" |                 android:name="android.support.PARENT_ACTIVITY" | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import org.acra.config.ACRAConfiguration; | |||||||
| import org.acra.config.ACRAConfigurationException; | import org.acra.config.ACRAConfigurationException; | ||||||
| import org.acra.config.ConfigurationBuilder; | import org.acra.config.ConfigurationBuilder; | ||||||
| import org.acra.sender.ReportSenderFactory; | import org.acra.sender.ReportSenderFactory; | ||||||
|  | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.report.AcraReportSenderFactory; | import org.schabi.newpipe.report.AcraReportSenderFactory; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.settings.SettingsActivity; | import org.schabi.newpipe.settings.SettingsActivity; | ||||||
| @@ -60,6 +61,9 @@ public class App extends Application { | |||||||
|                             "Could not initialize ACRA crash report", R.string.app_ui_crash)); |                             "Could not initialize ACRA crash report", R.string.app_ui_crash)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         //init NewPipe | ||||||
|  |         NewPipe.init(new Downloader()); | ||||||
|  |  | ||||||
|         // Initialize image loader |         // Initialize image loader | ||||||
|         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build(); |         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build(); | ||||||
|         ImageLoader.getInstance().init(config); |         ImageLoader.getInstance().init(config); | ||||||
|   | |||||||
| @@ -20,12 +20,12 @@ import com.nostra13.universalimageloader.core.ImageLoader; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.detail.VideoItemDetailActivity; | import org.schabi.newpipe.detail.VideoItemDetailActivity; | ||||||
| import org.schabi.newpipe.detail.VideoItemDetailFragment; | import org.schabi.newpipe.detail.VideoItemDetailFragment; | ||||||
| import org.schabi.newpipe.extractor.ChannelExtractor; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.ChannelInfo; |  | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; |  | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
| import org.schabi.newpipe.extractor.StreamingService; | import org.schabi.newpipe.extractor.StreamingService; | ||||||
|  | import org.schabi.newpipe.extractor.channel.ChannelExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.channel.ChannelInfo; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
| import org.schabi.newpipe.info_list.InfoItemBuilder; | import org.schabi.newpipe.info_list.InfoItemBuilder; | ||||||
| import org.schabi.newpipe.info_list.InfoListAdapter; | import org.schabi.newpipe.info_list.InfoListAdapter; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| @@ -188,11 +188,11 @@ public class ChannelActivity extends AppCompatActivity { | |||||||
|             public void run() { |             public void run() { | ||||||
|                 StreamingService service = null; |                 StreamingService service = null; | ||||||
|                 try { |                 try { | ||||||
|                     service = ServiceList.getService(serviceId); |                     service = NewPipe.getService(serviceId); | ||||||
|                     ChannelExtractor extractor = service.getChannelExtractorInstance( |                     ChannelExtractor extractor = service.getChannelExtractorInstance( | ||||||
|                             channelUrl, pageNumber, new Downloader()); |                             channelUrl, pageNumber); | ||||||
|  |  | ||||||
|                     final ChannelInfo info = ChannelInfo.getInfo(extractor, new Downloader()); |                     final ChannelInfo info = ChannelInfo.getInfo(extractor); | ||||||
|  |  | ||||||
|  |  | ||||||
|                     h.post(new Runnable() { |                     h.post(new Runnable() { | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ import com.nostra13.universalimageloader.core.assist.FailReason; | |||||||
| import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; | import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 01.08.16. |  * Created by Christian Schabesberger on 01.08.16. | ||||||
| @@ -50,7 +50,7 @@ public class ImageErrorLoadingListener implements ImageLoadingListener { | |||||||
|         ErrorActivity.reportError(activity, |         ErrorActivity.reportError(activity, | ||||||
|                 failReason.getCause(), null, rootView, |                 failReason.getCause(), null, rootView, | ||||||
|                 ErrorActivity.ErrorInfo.make(ErrorActivity.LOAD_IMAGE, |                 ErrorActivity.ErrorInfo.make(ErrorActivity.LOAD_IMAGE, | ||||||
|                         ServiceList.getNameOfService(serviceId), imageUri, |                         NewPipe.getNameOfService(serviceId), imageUri, | ||||||
|                         R.string.could_not_load_image)); |                         R.string.could_not_load_image)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ import android.widget.ArrayAdapter; | |||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.settings.SettingsActivity; | import org.schabi.newpipe.settings.SettingsActivity; | ||||||
| import org.schabi.newpipe.extractor.MediaFormat; | import org.schabi.newpipe.extractor.MediaFormat; | ||||||
| import org.schabi.newpipe.extractor.VideoStream; | import org.schabi.newpipe.extractor.stream_info.VideoStream; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| @@ -111,6 +111,9 @@ class ActionBarHandler { | |||||||
|  |  | ||||||
|  |  | ||||||
|     private int getDefaultResolution(final List<VideoStream> videoStreams) { |     private int getDefaultResolution(final List<VideoStream> videoStreams) { | ||||||
|  |         if (defaultPreferences == null) | ||||||
|  |             return 0; | ||||||
|  |  | ||||||
|         String defaultResolution = defaultPreferences |         String defaultResolution = defaultPreferences | ||||||
|                 .getString(activity.getString(R.string.default_resolution_key), |                 .getString(activity.getString(R.string.default_resolution_key), | ||||||
|                         activity.getString(R.string.default_resolution_value)); |                         activity.getString(R.string.default_resolution_value)); | ||||||
|   | |||||||
| @@ -6,19 +6,35 @@ import android.util.Log; | |||||||
| import android.view.View; | import android.view.View; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.Downloader; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamInfo; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
| import org.schabi.newpipe.extractor.StreamExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.StreamInfo; |  | ||||||
| import org.schabi.newpipe.extractor.StreamingService; | import org.schabi.newpipe.extractor.StreamingService; | ||||||
| import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; | import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by the-scrabi on 02.08.16. |  * Created by Christian Schabesberger on 02.08.16. | ||||||
|  |  * | ||||||
|  |  * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org> | ||||||
|  |  * StreamInfoWorker.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 StreamInfoWorker { | public class StreamInfoWorker { | ||||||
| @@ -51,7 +67,7 @@ public class StreamInfoWorker { | |||||||
|             StreamInfo streamInfo = null; |             StreamInfo streamInfo = null; | ||||||
|             StreamingService service = null; |             StreamingService service = null; | ||||||
|             try { |             try { | ||||||
|                 service = ServiceList.getService(serviceId); |                 service = NewPipe.getService(serviceId); | ||||||
|             } catch (Exception e) { |             } catch (Exception e) { | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|                 ErrorActivity.reportError(h, a, e, VideoItemDetailFragment.class, null, |                 ErrorActivity.reportError(h, a, e, VideoItemDetailFragment.class, null, | ||||||
| @@ -60,8 +76,8 @@ public class StreamInfoWorker { | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             try { |             try { | ||||||
|                 streamExtractor = service.getExtractorInstance(videoUrl, new Downloader()); |                 streamExtractor = service.getExtractorInstance(videoUrl); | ||||||
|                 streamInfo = StreamInfo.getVideoInfo(streamExtractor, new Downloader()); |                 streamInfo = StreamInfo.getVideoInfo(streamExtractor); | ||||||
|  |  | ||||||
|                 final StreamInfo info = streamInfo; |                 final StreamInfo info = streamInfo; | ||||||
|                 h.post(new Runnable() { |                 h.post(new Runnable() { | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ import android.widget.Toast; | |||||||
| import org.schabi.newpipe.App; | import org.schabi.newpipe.App; | ||||||
| import org.schabi.newpipe.MainActivity; | import org.schabi.newpipe.MainActivity; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.StreamingService; | import org.schabi.newpipe.extractor.StreamingService; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -68,52 +68,66 @@ public class VideoItemDetailActivity extends AppCompatActivity { | |||||||
|         // http://developer.android.com/guide/components/fragments.html |         // http://developer.android.com/guide/components/fragments.html | ||||||
|         // |         // | ||||||
|  |  | ||||||
|         Bundle arguments = new Bundle(); |  | ||||||
|         if (savedInstanceState == null) { |         if (savedInstanceState == null) { | ||||||
|             // this means the video was called though another app |             handleIntent(getIntent()); | ||||||
|             if (getIntent().getData() != null) { |  | ||||||
|                 videoUrl = getIntent().getData().toString(); |  | ||||||
|                 StreamingService[] serviceList = ServiceList.getServices(); |  | ||||||
|                 //StreamExtractor videoExtractor = null; |  | ||||||
|                 for (int i = 0; i < serviceList.length; i++) { |  | ||||||
|                     if (serviceList[i].getUrlIdHandlerInstance().acceptUrl(videoUrl)) { |  | ||||||
|                         arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, i); |  | ||||||
|                         currentStreamingService = i; |  | ||||||
|                         //videoExtractor = ServiceList.getService(i).getExtractorInstance(); |  | ||||||
|                         break; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 if(currentStreamingService == -1) { |  | ||||||
|                     Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) |  | ||||||
|                             .show(); |  | ||||||
|                 } |  | ||||||
|                 //arguments.putString(VideoItemDetailFragment.VIDEO_URL, |  | ||||||
|                 //        videoExtractor.getUrl(videoExtractor.getId(videoUrl)));//cleans URL |  | ||||||
|                 arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); |  | ||||||
|  |  | ||||||
|                 arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, |  | ||||||
|                         PreferenceManager.getDefaultSharedPreferences(this) |  | ||||||
|                                 .getBoolean(getString(R.string.autoplay_through_intent_key), false)); |  | ||||||
|             } else { |  | ||||||
|                 videoUrl = getIntent().getStringExtra(VideoItemDetailFragment.VIDEO_URL); |  | ||||||
|                 currentStreamingService = getIntent().getIntExtra(VideoItemDetailFragment.STREAMING_SERVICE, -1); |  | ||||||
|                 arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); |  | ||||||
|                 arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); |  | ||||||
|                 arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, false); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|         } else { |         } else { | ||||||
|             videoUrl = savedInstanceState.getString(VideoItemDetailFragment.VIDEO_URL); |             videoUrl = savedInstanceState.getString(VideoItemDetailFragment.VIDEO_URL); | ||||||
|             currentStreamingService = savedInstanceState.getInt(VideoItemDetailFragment.STREAMING_SERVICE); |             currentStreamingService = savedInstanceState.getInt(VideoItemDetailFragment.STREAMING_SERVICE); | ||||||
|             arguments = savedInstanceState; |             addFragment(savedInstanceState); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onNewIntent(Intent intent) { | ||||||
|  |         super.onNewIntent(intent); | ||||||
|  |         setIntent(intent); | ||||||
|  |         handleIntent(intent); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void handleIntent(Intent intent) { | ||||||
|  |         Bundle arguments = new Bundle(); | ||||||
|  |         // this means the video was called though another app | ||||||
|  |         if (intent.getData() != null) { | ||||||
|  |             videoUrl = intent.getData().toString(); | ||||||
|  |             StreamingService[] serviceList = NewPipe.getServices(); | ||||||
|  |             //StreamExtractor videoExtractor = null; | ||||||
|  |             for (int i = 0; i < serviceList.length; i++) { | ||||||
|  |                 if (serviceList[i].getUrlIdHandlerInstance().acceptUrl(videoUrl)) { | ||||||
|  |                     arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, i); | ||||||
|  |                     currentStreamingService = i; | ||||||
|  |                     //videoExtractor = ServiceList.getService(i).getExtractorInstance(); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if(currentStreamingService == -1) { | ||||||
|  |                 Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) | ||||||
|  |                         .show(); | ||||||
|  |             } | ||||||
|  |             //arguments.putString(VideoItemDetailFragment.VIDEO_URL, | ||||||
|  |             //        videoExtractor.getUrl(videoExtractor.getId(videoUrl)));//cleans URL | ||||||
|  |             arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); | ||||||
|  |  | ||||||
|  |             arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, | ||||||
|  |                     PreferenceManager.getDefaultSharedPreferences(this) | ||||||
|  |                             .getBoolean(getString(R.string.autoplay_through_intent_key), false)); | ||||||
|  |         } else { | ||||||
|  |             videoUrl = intent.getStringExtra(VideoItemDetailFragment.VIDEO_URL); | ||||||
|  |             currentStreamingService = intent.getIntExtra(VideoItemDetailFragment.STREAMING_SERVICE, -1); | ||||||
|  |             arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); | ||||||
|  |             arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); | ||||||
|  |             arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, false); | ||||||
|  |         } | ||||||
|  |         addFragment(arguments); | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void addFragment(final Bundle arguments) { | ||||||
|         // Create the detail fragment and add it to the activity |         // Create the detail fragment and add it to the activity | ||||||
|         // using a fragment transaction. |         // using a fragment transaction. | ||||||
|         fragment = new VideoItemDetailFragment(); |         fragment = new VideoItemDetailFragment(); | ||||||
|         fragment.setArguments(arguments); |         fragment.setArguments(arguments); | ||||||
|         getSupportFragmentManager().beginTransaction() |         getSupportFragmentManager().beginTransaction() | ||||||
|                 .add(R.id.videoitem_detail_container, fragment) |                 .replace(R.id.videoitem_detail_container, fragment) | ||||||
|                 .commit(); |                 .commit(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -43,18 +43,18 @@ import java.util.Vector; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.ActivityCommunicator; | import org.schabi.newpipe.ActivityCommunicator; | ||||||
| import org.schabi.newpipe.ChannelActivity; | import org.schabi.newpipe.ChannelActivity; | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfo; | import org.schabi.newpipe.extractor.stream_info.StreamInfo; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; | ||||||
| import org.schabi.newpipe.info_list.InfoItemBuilder; | import org.schabi.newpipe.info_list.InfoItemBuilder; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.ImageErrorLoadingListener; | import org.schabi.newpipe.ImageErrorLoadingListener; | ||||||
| import org.schabi.newpipe.Localization; | import org.schabi.newpipe.Localization; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.download.DownloadDialog; | import org.schabi.newpipe.download.DownloadDialog; | ||||||
| import org.schabi.newpipe.extractor.AudioStream; | import org.schabi.newpipe.extractor.stream_info.AudioStream; | ||||||
| import org.schabi.newpipe.extractor.MediaFormat; | import org.schabi.newpipe.extractor.MediaFormat; | ||||||
| import org.schabi.newpipe.extractor.ServiceList; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.StreamInfo; | import org.schabi.newpipe.extractor.stream_info.VideoStream; | ||||||
| import org.schabi.newpipe.extractor.VideoStream; |  | ||||||
| import org.schabi.newpipe.player.BackgroundPlayer; | import org.schabi.newpipe.player.BackgroundPlayer; | ||||||
| import org.schabi.newpipe.player.PlayVideoActivity; | import org.schabi.newpipe.player.PlayVideoActivity; | ||||||
| import org.schabi.newpipe.player.ExoPlayerActivity; | import org.schabi.newpipe.player.ExoPlayerActivity; | ||||||
| @@ -306,7 +306,7 @@ public class VideoItemDetailFragment extends Fragment { | |||||||
|                             ErrorActivity.reportError(getActivity(), |                             ErrorActivity.reportError(getActivity(), | ||||||
|                                     failReason.getCause(), null, rootView, |                                     failReason.getCause(), null, rootView, | ||||||
|                                     ErrorActivity.ErrorInfo.make(ErrorActivity.LOAD_IMAGE, |                                     ErrorActivity.ErrorInfo.make(ErrorActivity.LOAD_IMAGE, | ||||||
|                                             ServiceList.getNameOfService(info.service_id), imageUri, |                                             NewPipe.getNameOfService(info.service_id), imageUri, | ||||||
|                                             R.string.could_not_load_thumbnails)); |                                             R.string.could_not_load_thumbnails)); | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org> |  * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org> | ||||||
|  * AbstractVideoInfo.java is part of NewPipe. |  * AbstractStreamInfo.java is part of NewPipe. | ||||||
|  * |  * | ||||||
|  * NewPipe is free software: you can redistribute it and/or modify |  * NewPipe is free software: you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License as published by |  * it under the terms of the GNU General Public License as published by | ||||||
| @@ -19,7 +19,7 @@ package org.schabi.newpipe.extractor; | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /**Common properties between StreamInfo and StreamPreviewInfo.*/ | /**Common properties between StreamInfo and StreamPreviewInfo.*/ | ||||||
| public abstract class AbstractVideoInfo { | public abstract class AbstractStreamInfo { | ||||||
|     public static enum StreamType { |     public static enum StreamType { | ||||||
|         NONE,   // placeholder to check if stream type was checked or not |         NONE,   // placeholder to check if stream type was checked or not | ||||||
|         VIDEO_STREAM, |         VIDEO_STREAM, | ||||||
| @@ -2,6 +2,8 @@ package org.schabi.newpipe.extractor; | |||||||
|  |  | ||||||
| import android.util.Xml; | import android.util.Xml; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.AudioStream; | ||||||
| import org.xmlpull.v1.XmlPullParser; | import org.xmlpull.v1.XmlPullParser; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| @@ -40,10 +42,10 @@ public class DashMpdParser { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static List<AudioStream> getAudioStreams(String dashManifestUrl, |     public static List<AudioStream> getAudioStreams(String dashManifestUrl) | ||||||
|                                                              Downloader downloader) |  | ||||||
|             throws DashMpdParsingException { |             throws DashMpdParsingException { | ||||||
|         String dashDoc; |         String dashDoc; | ||||||
|  |         Downloader downloader = NewPipe.getDownloader(); | ||||||
|         try { |         try { | ||||||
|             dashDoc = downloader.download(dashManifestUrl); |             dashDoc = downloader.download(dashManifestUrl); | ||||||
|         } catch(IOException ioe) { |         } catch(IOException ioe) { | ||||||
|   | |||||||
| @@ -1,12 +1,13 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor; | ||||||
| 
 | 
 | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
| import org.schabi.newpipe.extractor.services.youtube.YoutubeService; | import org.schabi.newpipe.extractor.services.youtube.YoutubeService; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 23.08.15. |  * Created by Christian Schabesberger on 23.08.15. | ||||||
|  * |  * | ||||||
|  * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org> |  * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org> | ||||||
|  * ServiceList.java is part of NewPipe. |  * NewPipe.java is part of NewPipe. | ||||||
|  * |  * | ||||||
|  * NewPipe is free software: you can redistribute it and/or modify |  * NewPipe is free software: you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License as published by |  * it under the terms of the GNU General Public License as published by | ||||||
| @@ -26,20 +27,24 @@ import org.schabi.newpipe.extractor.services.youtube.YoutubeService; | |||||||
|  * Currently only Youtube until the API becomes more stable.*/ |  * Currently only Youtube until the API becomes more stable.*/ | ||||||
| 
 | 
 | ||||||
| @SuppressWarnings("ALL") | @SuppressWarnings("ALL") | ||||||
| public class ServiceList { | public class NewPipe { | ||||||
| 
 | 
 | ||||||
|     private ServiceList() { |     private NewPipe() { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static final String TAG = ServiceList.class.toString(); |     private static final String TAG = NewPipe.class.toString(); | ||||||
|     private static final StreamingService[] services = { | 
 | ||||||
|  |     private static final StreamingService[] serviceList = { | ||||||
|         new YoutubeService(0) |         new YoutubeService(0) | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|  |     private static Downloader downloader = null; | ||||||
|  | 
 | ||||||
|     public static StreamingService[] getServices() { |     public static StreamingService[] getServices() { | ||||||
|         return services; |         return serviceList; | ||||||
|     } |     } | ||||||
|     public static StreamingService getService(int serviceId)throws ExtractionException { |     public static StreamingService getService(int serviceId)throws ExtractionException { | ||||||
|         for(StreamingService s : services) { |         for(StreamingService s : serviceList) { | ||||||
|             if(s.getServiceId() == serviceId) { |             if(s.getServiceId() == serviceId) { | ||||||
|                 return s; |                 return s; | ||||||
|             } |             } | ||||||
| @@ -47,7 +52,7 @@ public class ServiceList { | |||||||
|         throw new ExtractionException("Service not known: " + Integer.toString(serviceId)); |         throw new ExtractionException("Service not known: " + Integer.toString(serviceId)); | ||||||
|     } |     } | ||||||
|     public static StreamingService getService(String serviceName) throws ExtractionException { |     public static StreamingService getService(String serviceName) throws ExtractionException { | ||||||
|         return services[getIdOfService(serviceName)]; |         return serviceList[getIdOfService(serviceName)]; | ||||||
|     } |     } | ||||||
|     public static String getNameOfService(int id) { |     public static String getNameOfService(int id) { | ||||||
|         try { |         try { | ||||||
| @@ -59,11 +64,19 @@ public class ServiceList { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     public static int getIdOfService(String serviceName) throws ExtractionException { |     public static int getIdOfService(String serviceName) throws ExtractionException { | ||||||
|         for(int i = 0; i < services.length; i++) { |         for(int i = 0; i < serviceList.length; i++) { | ||||||
|             if(services[i].getServiceInfo().name.equals(serviceName)) { |             if(serviceList[i].getServiceInfo().name.equals(serviceName)) { | ||||||
|                 return i; |                 return i; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         throw new ExtractionException("Error: Service " + serviceName + " not known."); |         throw new ExtractionException("Error: Service " + serviceName + " not known."); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     public static void init(Downloader d) { | ||||||
|  |         downloader = d; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static Downloader getDownloader() { | ||||||
|  |         return downloader; | ||||||
|  |     } | ||||||
| } | } | ||||||
| @@ -1,5 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  |  | ||||||
| import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||||
| import java.net.URLDecoder; | import java.net.URLDecoder; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|   | |||||||
| @@ -1,5 +1,11 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.channel.ChannelExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.search.SearchEngine; | ||||||
|  | import org.schabi.newpipe.extractor.search.SuggestionExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamExtractor; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -35,13 +41,14 @@ public abstract class StreamingService { | |||||||
|  |  | ||||||
|     public abstract ServiceInfo getServiceInfo(); |     public abstract ServiceInfo getServiceInfo(); | ||||||
|  |  | ||||||
|     public abstract StreamExtractor getExtractorInstance(String url, Downloader downloader) |     public abstract StreamExtractor getExtractorInstance(String url) | ||||||
|             throws IOException, ExtractionException; |             throws IOException, ExtractionException; | ||||||
|     public abstract SearchEngine getSearchEngineInstance(Downloader downloader); |     public abstract SearchEngine getSearchEngineInstance(); | ||||||
|     public abstract UrlIdHandler getUrlIdHandlerInstance(); |     public abstract UrlIdHandler getUrlIdHandlerInstance(); | ||||||
|     public abstract UrlIdHandler getChannelUrlIdHandlerInstance(); |     public abstract UrlIdHandler getChannelUrlIdHandlerInstance(); | ||||||
|     public abstract ChannelExtractor getChannelExtractorInstance(String url, int page, Downloader downloader) |     public abstract ChannelExtractor getChannelExtractorInstance(String url, int page) | ||||||
|             throws ExtractionException, IOException; |             throws ExtractionException, IOException; | ||||||
|  |     public abstract SuggestionExtractor getSuggestionExtractorInstance(); | ||||||
|  |  | ||||||
|     public final int getServiceId() { |     public final int getServiceId() { | ||||||
|         return serviceId; |         return serviceId; | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 26.07.16. |  * Created by Christian Schabesberger on 26.07.16. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -1,4 +1,9 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.channel; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| 
 | 
 | ||||||
| @@ -26,15 +31,13 @@ public abstract class ChannelExtractor { | |||||||
|     private int serviceId; |     private int serviceId; | ||||||
|     private String url; |     private String url; | ||||||
|     private UrlIdHandler urlIdHandler; |     private UrlIdHandler urlIdHandler; | ||||||
|     private Downloader downloader; |  | ||||||
|     private StreamPreviewInfoCollector previewInfoCollector; |     private StreamPreviewInfoCollector previewInfoCollector; | ||||||
|     private int page = -1; |     private int page = -1; | ||||||
| 
 | 
 | ||||||
|     public ChannelExtractor(UrlIdHandler urlIdHandler, String url, int page, Downloader dl, int serviceId) |     public ChannelExtractor(UrlIdHandler urlIdHandler, String url, int page, int serviceId) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         this.url = url; |         this.url = url; | ||||||
|         this.page = page; |         this.page = page; | ||||||
|         this.downloader = dl; |  | ||||||
|         this.serviceId = serviceId; |         this.serviceId = serviceId; | ||||||
|         this.urlIdHandler = urlIdHandler; |         this.urlIdHandler = urlIdHandler; | ||||||
|         previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); |         previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); | ||||||
| @@ -42,7 +45,6 @@ public abstract class ChannelExtractor { | |||||||
| 
 | 
 | ||||||
|     public String getUrl() { return url; } |     public String getUrl() { return url; } | ||||||
|     public UrlIdHandler getUrlIdHandler() { return urlIdHandler; } |     public UrlIdHandler getUrlIdHandler() { return urlIdHandler; } | ||||||
|     public Downloader getDownloader() { return downloader; } |  | ||||||
|     public StreamPreviewInfoCollector getStreamPreviewInfoCollector() { |     public StreamPreviewInfoCollector getStreamPreviewInfoCollector() { | ||||||
|         return previewInfoCollector; |         return previewInfoCollector; | ||||||
|     } |     } | ||||||
| @@ -1,4 +1,8 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.channel; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; | ||||||
| 
 | 
 | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Vector; | import java.util.Vector; | ||||||
| @@ -30,7 +34,7 @@ public class ChannelInfo { | |||||||
|         errors.add(e); |         errors.add(e); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static ChannelInfo getInfo(ChannelExtractor extractor, Downloader dl) |     public static ChannelInfo getInfo(ChannelExtractor extractor) | ||||||
|         throws ParsingException { |         throws ParsingException { | ||||||
|         ChannelInfo info = new ChannelInfo(); |         ChannelInfo info = new ChannelInfo(); | ||||||
| 
 | 
 | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.exceptions; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 30.01.16. |  * Created by Christian Schabesberger on 30.01.16. | ||||||
| @@ -24,11 +24,9 @@ public class ExtractionException extends Exception { | |||||||
|     public ExtractionException(String message) { |     public ExtractionException(String message) { | ||||||
|         super(message); |         super(message); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     public ExtractionException(Throwable cause) { |     public ExtractionException(Throwable cause) { | ||||||
|         super(cause); |         super(cause); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     public ExtractionException(String message, Throwable cause) { |     public ExtractionException(String message, Throwable cause) { | ||||||
|         super(message, cause); |         super(message, cause); | ||||||
|     } |     } | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.exceptions; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 12.09.16. |  * Created by Christian Schabesberger on 12.09.16. | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.exceptions; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 31.01.16. |  * Created by Christian Schabesberger on 31.01.16. | ||||||
| @@ -1,4 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.search; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -41,12 +44,8 @@ public abstract class SearchEngine { | |||||||
|         return collector; |         return collector; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public abstract List<String> suggestionList( |  | ||||||
|             String query,String contentCountry, Downloader dl) |  | ||||||
|             throws ExtractionException, IOException; |  | ||||||
| 
 |  | ||||||
|     //Result search(String query, int page); |     //Result search(String query, int page); | ||||||
|     public abstract StreamPreviewInfoSearchCollector search( |     public abstract StreamPreviewInfoSearchCollector search( | ||||||
|             String query, int page, String contentCountry, Downloader dl) |             String query, int page, String contentCountry) | ||||||
|             throws ExtractionException, IOException; |             throws ExtractionException, IOException; | ||||||
| } | } | ||||||
| @@ -1,4 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.search; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -26,10 +29,10 @@ import java.util.Vector; | |||||||
| 
 | 
 | ||||||
| public class SearchResult { | public class SearchResult { | ||||||
|     public static SearchResult getSearchResult(SearchEngine engine, String query, |     public static SearchResult getSearchResult(SearchEngine engine, String query, | ||||||
|                                                int page, String languageCode, Downloader dl) |                                                int page, String languageCode) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
| 
 | 
 | ||||||
|         SearchResult result = engine.search(query, page, languageCode, dl).getSearchResult(); |         SearchResult result = engine.search(query, page, languageCode).getSearchResult(); | ||||||
|         if(result.resultList.isEmpty()) { |         if(result.resultList.isEmpty()) { | ||||||
|             if(result.suggestion.isEmpty()) { |             if(result.suggestion.isEmpty()) { | ||||||
|                 throw new ExtractionException("Empty result despite no error"); |                 throw new ExtractionException("Empty result despite no error"); | ||||||
| @@ -1,4 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.search; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 11.05.16. |  * Created by Christian Schabesberger on 11.05.16. | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | package org.schabi.newpipe.extractor.search; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  |  | ||||||
|  | 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; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -7,15 +7,16 @@ import org.json.JSONObject; | |||||||
| import org.jsoup.Jsoup; | import org.jsoup.Jsoup; | ||||||
| import org.jsoup.nodes.Document; | import org.jsoup.nodes.Document; | ||||||
| import org.jsoup.nodes.Element; | import org.jsoup.nodes.Element; | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
| import org.schabi.newpipe.extractor.ChannelExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.Downloader; | import org.schabi.newpipe.extractor.Downloader; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.Parser; | import org.schabi.newpipe.extractor.Parser; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoCollector; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.channel.ChannelExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; | ||||||
|  |  | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| @@ -46,7 +47,6 @@ public class YoutubeChannelExtractor extends ChannelExtractor { | |||||||
|  |  | ||||||
|     // private CSSOMParser cssParser = new CSSOMParser(new SACParserCSS3()); |     // private CSSOMParser cssParser = new CSSOMParser(new SACParserCSS3()); | ||||||
|  |  | ||||||
|     private Downloader downloader; |  | ||||||
|     private Document doc = null; |     private Document doc = null; | ||||||
|  |  | ||||||
|     private boolean isAjaxPage = false; |     private boolean isAjaxPage = false; | ||||||
| @@ -59,12 +59,13 @@ public class YoutubeChannelExtractor extends ChannelExtractor { | |||||||
|     // this request url. |     // this request url. | ||||||
|     private static String nextPageUrl = ""; |     private static String nextPageUrl = ""; | ||||||
|  |  | ||||||
|     public YoutubeChannelExtractor(UrlIdHandler urlIdHandler, String url, int page, Downloader dl, int serviceId) |     public YoutubeChannelExtractor(UrlIdHandler urlIdHandler, String url, int page, int serviceId) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         super(urlIdHandler, url, page, dl, serviceId); |         super(urlIdHandler, url, page, serviceId); | ||||||
|  |  | ||||||
|  |         Downloader downloader = NewPipe.getDownloader(); | ||||||
|  |  | ||||||
|         url = urlIdHandler.cleanUrl(url) ; //+ "/video?veiw=0&flow=list&sort=dd"; |         url = urlIdHandler.cleanUrl(url) ; //+ "/video?veiw=0&flow=list&sort=dd"; | ||||||
|         downloader = dl; |  | ||||||
|  |  | ||||||
|         if(page == 0) { |         if(page == 0) { | ||||||
|             if (isUserUrl(url)) { |             if (isUserUrl(url)) { | ||||||
| @@ -162,8 +163,8 @@ public class YoutubeChannelExtractor extends ChannelExtractor { | |||||||
|             if (li.select("div[class=\"feed-item-dismissable\"]").first() != null) { |             if (li.select("div[class=\"feed-item-dismissable\"]").first() != null) { | ||||||
|                 collector.commit(new StreamPreviewInfoExtractor() { |                 collector.commit(new StreamPreviewInfoExtractor() { | ||||||
|                     @Override |                     @Override | ||||||
|                     public AbstractVideoInfo.StreamType getStreamType() throws ParsingException { |                     public AbstractStreamInfo.StreamType getStreamType() throws ParsingException { | ||||||
|                         return AbstractVideoInfo.StreamType.VIDEO_STREAM; |                         return AbstractStreamInfo.StreamType.VIDEO_STREAM; | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     @Override |                     @Override | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| package org.schabi.newpipe.extractor.services.youtube; | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.extractor.Parser; | import org.schabi.newpipe.extractor.Parser; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 25.07.16. |  * Created by Christian Schabesberger on 25.07.16. | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor.services.youtube; | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 02.03.16. |  * Created by Christian Schabesberger on 02.03.16. | ||||||
|   | |||||||
| @@ -4,26 +4,16 @@ import org.jsoup.Jsoup; | |||||||
| import org.jsoup.nodes.Document; | import org.jsoup.nodes.Document; | ||||||
| import org.jsoup.nodes.Element; | import org.jsoup.nodes.Element; | ||||||
| import org.schabi.newpipe.extractor.Downloader; | 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.SearchEngine; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoSearchCollector; |  | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
| import org.w3c.dom.Node; | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
| import org.w3c.dom.NodeList; | import org.schabi.newpipe.extractor.search.SearchEngine; | ||||||
| import org.xml.sax.InputSource; | import org.schabi.newpipe.extractor.search.StreamPreviewInfoSearchCollector; | ||||||
| import org.xml.sax.SAXException; | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; | ||||||
|  |  | ||||||
| import java.net.URLEncoder; | import java.net.URLEncoder; | ||||||
| import java.io.ByteArrayInputStream; |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| import javax.xml.parsers.DocumentBuilder; |  | ||||||
| import javax.xml.parsers.DocumentBuilderFactory; |  | ||||||
| import javax.xml.parsers.ParserConfigurationException; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 09.08.15. |  * Created by Christian Schabesberger on 09.08.15. | ||||||
| @@ -55,20 +45,11 @@ public class YoutubeSearchEngine extends SearchEngine { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public StreamPreviewInfoSearchCollector search(String query, int page, String languageCode, Downloader downloader) |     public StreamPreviewInfoSearchCollector search(String query, int page, String languageCode) | ||||||
|             throws IOException, ExtractionException { |             throws IOException, ExtractionException { | ||||||
|         StreamPreviewInfoSearchCollector collector = getStreamPreviewInfoSearchCollector(); |         StreamPreviewInfoSearchCollector collector = getStreamPreviewInfoSearchCollector(); | ||||||
|  |  | ||||||
|         /* Cant use Uri.Bilder since it's android code. |         Downloader downloader = NewPipe.getDownloader(); | ||||||
|         // Android code is baned from the extractor side. |  | ||||||
|         Uri.Builder builder = new Uri.Builder(); |  | ||||||
|         builder.scheme("https") |  | ||||||
|                 .authority("www.youtube.com") |  | ||||||
|                 .appendPath("results") |  | ||||||
|                 .appendQueryParameter("search_query", query) |  | ||||||
|                 .appendQueryParameter("page", Integer.toString(page)) |  | ||||||
|                 .appendQueryParameter("filters", "video"); |  | ||||||
|                 */ |  | ||||||
|  |  | ||||||
|         String url = "https://www.youtube.com/results" |         String url = "https://www.youtube.com/results" | ||||||
|                 + "?search_query=" + URLEncoder.encode(query, CHARSET_UTF_8) |                 + "?search_query=" + URLEncoder.encode(query, CHARSET_UTF_8) | ||||||
| @@ -126,66 +107,6 @@ public class YoutubeSearchEngine extends SearchEngine { | |||||||
|         return collector; |         return collector; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public List<String> suggestionList(String query, String contentCountry, Downloader dl) |  | ||||||
|             throws IOException, ParsingException { |  | ||||||
|  |  | ||||||
|         List<String> suggestions = new ArrayList<>(); |  | ||||||
|  |  | ||||||
|         /* Cant use Uri.Bilder since it's android code. |  | ||||||
|         // Android code is baned from the extractor side. |  | ||||||
|         Uri.Builder builder = new Uri.Builder(); |  | ||||||
|         builder.scheme("https") |  | ||||||
|                 .authority("suggestqueries.google.com") |  | ||||||
|                 .appendPath("complete") |  | ||||||
|                 .appendPath("search") |  | ||||||
|                 .appendQueryParameter("client", "") |  | ||||||
|                 .appendQueryParameter("output", "toolbar") |  | ||||||
|                 .appendQueryParameter("ds", "yt") |  | ||||||
|                 .appendQueryParameter("hl",contentCountry) |  | ||||||
|                 .appendQueryParameter("q", query); |  | ||||||
|                 */ |  | ||||||
|         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) { |     private StreamPreviewInfoExtractor extractPreviewInfo(final Element item) { | ||||||
|         return new YoutubeStreamPreviewInfoExtractor(item); |         return new YoutubeStreamPreviewInfoExtractor(item); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| package org.schabi.newpipe.extractor.services.youtube; | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.extractor.ChannelExtractor; |  | ||||||
| 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.StreamingService; | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
| import org.schabi.newpipe.extractor.SearchEngine; | import org.schabi.newpipe.extractor.channel.ChannelExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.search.SearchEngine; | ||||||
|  | import org.schabi.newpipe.extractor.search.SuggestionExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamExtractor; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| @@ -44,18 +44,18 @@ public class YoutubeService extends StreamingService { | |||||||
|         return serviceInfo; |         return serviceInfo; | ||||||
|     } |     } | ||||||
|     @Override |     @Override | ||||||
|     public StreamExtractor getExtractorInstance(String url, Downloader downloader) |     public StreamExtractor getExtractorInstance(String url) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         UrlIdHandler urlIdHandler = new YoutubeStreamUrlIdHandler(); |         UrlIdHandler urlIdHandler = new YoutubeStreamUrlIdHandler(); | ||||||
|         if(urlIdHandler.acceptUrl(url)) { |         if(urlIdHandler.acceptUrl(url)) { | ||||||
|             return new YoutubeStreamExtractor(urlIdHandler, url, downloader, getServiceId()); |             return new YoutubeStreamExtractor(urlIdHandler, url, getServiceId()); | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
|             throw new IllegalArgumentException("supplied String is not a valid Youtube URL"); |             throw new IllegalArgumentException("supplied String is not a valid Youtube URL"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     @Override |     @Override | ||||||
|     public SearchEngine getSearchEngineInstance(Downloader downloader) { |     public SearchEngine getSearchEngineInstance() { | ||||||
|         return new YoutubeSearchEngine(getUrlIdHandlerInstance(), getServiceId()); |         return new YoutubeSearchEngine(getUrlIdHandlerInstance(), getServiceId()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -70,8 +70,13 @@ public class YoutubeService extends StreamingService { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public ChannelExtractor getChannelExtractorInstance(String url, int page, Downloader downloader) |     public ChannelExtractor getChannelExtractorInstance(String url, int page) | ||||||
|         throws ExtractionException, IOException { |         throws ExtractionException, IOException { | ||||||
|         return new YoutubeChannelExtractor(getChannelUrlIdHandlerInstance(), url, page, downloader, getServiceId()); |         return new YoutubeChannelExtractor(getChannelUrlIdHandlerInstance(), url, page, getServiceId()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public SuggestionExtractor getSuggestionExtractorInstance() { | ||||||
|  |         return new YoutubeSuggestionExtractor(getServiceId()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,19 +8,20 @@ import org.jsoup.nodes.Element; | |||||||
| import org.mozilla.javascript.Context; | import org.mozilla.javascript.Context; | ||||||
| import org.mozilla.javascript.Function; | import org.mozilla.javascript.Function; | ||||||
| import org.mozilla.javascript.ScriptableObject; | import org.mozilla.javascript.ScriptableObject; | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
| import org.schabi.newpipe.extractor.AudioStream; | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.AudioStream; | ||||||
| import org.schabi.newpipe.extractor.Downloader; | import org.schabi.newpipe.extractor.Downloader; | ||||||
|  | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.Parser; | import org.schabi.newpipe.extractor.Parser; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
| import org.schabi.newpipe.extractor.StreamInfo; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoCollector; |  | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
| import org.schabi.newpipe.extractor.StreamExtractor; |  | ||||||
| import org.schabi.newpipe.extractor.MediaFormat; | import org.schabi.newpipe.extractor.MediaFormat; | ||||||
| import org.schabi.newpipe.extractor.VideoStream; | import org.schabi.newpipe.extractor.stream_info.StreamExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamInfo; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoCollector; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; | ||||||
|  | import org.schabi.newpipe.extractor.stream_info.VideoStream; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -185,15 +186,12 @@ public class YoutubeStreamExtractor extends StreamExtractor { | |||||||
|     UrlIdHandler urlidhandler = new YoutubeStreamUrlIdHandler(); |     UrlIdHandler urlidhandler = new YoutubeStreamUrlIdHandler(); | ||||||
|     String pageUrl = ""; |     String pageUrl = ""; | ||||||
|  |  | ||||||
|     private Downloader downloader; |     public YoutubeStreamExtractor(UrlIdHandler urlIdHandler, String pageUrl, int serviceId) | ||||||
|  |  | ||||||
|     public YoutubeStreamExtractor(UrlIdHandler urlIdHandler, String pageUrl, |  | ||||||
|                                   Downloader dl, int serviceId) |  | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         super(urlIdHandler ,pageUrl, dl, serviceId); |         super(urlIdHandler, pageUrl, serviceId); | ||||||
|         //most common videoInfo fields are now set in our superclass, for all services |         //most common videoInfo fields are now set in our superclass, for all services | ||||||
|         downloader = dl; |  | ||||||
|         this.pageUrl = pageUrl; |         this.pageUrl = pageUrl; | ||||||
|  |         Downloader downloader = NewPipe.getDownloader(); | ||||||
|         String pageContent = downloader.download(urlidhandler.cleanUrl(pageUrl)); |         String pageContent = downloader.download(urlidhandler.cleanUrl(pageUrl)); | ||||||
|         doc = Jsoup.parse(pageContent, pageUrl); |         doc = Jsoup.parse(pageContent, pageUrl); | ||||||
|         JSONObject ytPlayerConfig; |         JSONObject ytPlayerConfig; | ||||||
| @@ -284,6 +282,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { | |||||||
|  |  | ||||||
|     private String getPlayerUrlFromRestrictedVideo(String pageUrl) throws ParsingException { |     private String getPlayerUrlFromRestrictedVideo(String pageUrl) throws ParsingException { | ||||||
|         try { |         try { | ||||||
|  |             Downloader downloader = NewPipe.getDownloader(); | ||||||
|             String playerUrl = ""; |             String playerUrl = ""; | ||||||
|             String videoId = urlidhandler.getId(pageUrl); |             String videoId = urlidhandler.getId(pageUrl); | ||||||
|             String embedUrl = "https://www.youtube.com/embed/" + videoId; |             String embedUrl = "https://www.youtube.com/embed/" + videoId; | ||||||
| @@ -710,7 +709,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { | |||||||
|     private StreamPreviewInfoExtractor extractVideoPreviewInfo(final Element li) { |     private StreamPreviewInfoExtractor extractVideoPreviewInfo(final Element li) { | ||||||
|         return new StreamPreviewInfoExtractor() { |         return new StreamPreviewInfoExtractor() { | ||||||
|             @Override |             @Override | ||||||
|             public AbstractVideoInfo.StreamType getStreamType() throws ParsingException { |             public AbstractStreamInfo.StreamType getStreamType() throws ParsingException { | ||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -788,6 +787,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { | |||||||
|         String decryptionCode; |         String decryptionCode; | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|  |             Downloader downloader = NewPipe.getDownloader(); | ||||||
|             String playerCode = downloader.download(playerUrl); |             String playerCode = downloader.download(playerUrl); | ||||||
|  |  | ||||||
|             decryptionFuncName = |             decryptionFuncName = | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| package org.schabi.newpipe.extractor.services.youtube; | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
| import org.jsoup.nodes.Element; | import org.jsoup.nodes.Element; | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
| import org.schabi.newpipe.extractor.Parser; | import org.schabi.newpipe.extractor.Parser; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfoExtractor; | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfoExtractor; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org> |  * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org> | ||||||
| @@ -146,11 +146,11 @@ public class YoutubeStreamPreviewInfoExtractor implements StreamPreviewInfoExtra | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public AbstractVideoInfo.StreamType getStreamType() { |     public AbstractStreamInfo.StreamType getStreamType() { | ||||||
|         if(isLiveStream(item)) { |         if(isLiveStream(item)) { | ||||||
|             return AbstractVideoInfo.StreamType.LIVE_STREAM; |             return AbstractStreamInfo.StreamType.LIVE_STREAM; | ||||||
|         } else { |         } else { | ||||||
|             return AbstractVideoInfo.StreamType.VIDEO_STREAM; |             return AbstractStreamInfo.StreamType.VIDEO_STREAM; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| package org.schabi.newpipe.extractor.services.youtube; | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.extractor.FoundAdException; |  | ||||||
| import org.schabi.newpipe.extractor.Parser; | import org.schabi.newpipe.extractor.Parser; | ||||||
| import org.schabi.newpipe.extractor.ParsingException; |  | ||||||
| import org.schabi.newpipe.extractor.UrlIdHandler; | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.FoundAdException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  |  | ||||||
| import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||||
| import java.net.URLDecoder; | import java.net.URLDecoder; | ||||||
|   | |||||||
| @@ -0,0 +1,100 @@ | |||||||
|  | package org.schabi.newpipe.extractor.services.youtube; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.Downloader; | ||||||
|  | import org.schabi.newpipe.extractor.NewPipe; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | import org.schabi.newpipe.extractor.search.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); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 04.03.16. |  * Created by Christian Schabesberger on 04.03.16. | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 10.08.15. |  * Created by Christian Schabesberger on 10.08.15. | ||||||
| @@ -20,6 +20,10 @@ package org.schabi.newpipe.extractor; | |||||||
|  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. |  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
|  | 
 | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| /**Scrapes information from a video streaming service (eg, YouTube).*/ | /**Scrapes information from a video streaming service (eg, YouTube).*/ | ||||||
| @@ -31,7 +35,6 @@ public abstract class StreamExtractor { | |||||||
|     private int serviceId; |     private int serviceId; | ||||||
|     private String url; |     private String url; | ||||||
|     private UrlIdHandler urlIdHandler; |     private UrlIdHandler urlIdHandler; | ||||||
|     private Downloader downloader; |  | ||||||
|     private StreamPreviewInfoCollector previewInfoCollector; |     private StreamPreviewInfoCollector previewInfoCollector; | ||||||
| 
 | 
 | ||||||
|     public class ExctractorInitException extends ExtractionException { |     public class ExctractorInitException extends ExtractionException { | ||||||
| @@ -55,7 +58,7 @@ public abstract class StreamExtractor { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public StreamExtractor(UrlIdHandler urlIdHandler, String url, Downloader dl, int serviceId) { |     public StreamExtractor(UrlIdHandler urlIdHandler, String url, int serviceId) { | ||||||
|         this.serviceId = serviceId; |         this.serviceId = serviceId; | ||||||
|         this.urlIdHandler = urlIdHandler; |         this.urlIdHandler = urlIdHandler; | ||||||
|         previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); |         previewInfoCollector = new StreamPreviewInfoCollector(urlIdHandler, serviceId); | ||||||
| @@ -73,10 +76,6 @@ public abstract class StreamExtractor { | |||||||
|         return urlIdHandler; |         return urlIdHandler; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public Downloader getDownloader() { |  | ||||||
|         return downloader; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public abstract int getTimeStamp() throws ParsingException; |     public abstract int getTimeStamp() throws ParsingException; | ||||||
|     public abstract String getTitle() throws ParsingException; |     public abstract String getTitle() throws ParsingException; | ||||||
|     public abstract String getDescription() throws ParsingException; |     public abstract String getDescription() throws ParsingException; | ||||||
| @@ -1,4 +1,9 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
|  | import org.schabi.newpipe.extractor.DashMpdParser; | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -26,7 +31,7 @@ import java.util.Vector; | |||||||
| 
 | 
 | ||||||
| /**Info object for opened videos, ie the video ready to play.*/ | /**Info object for opened videos, ie the video ready to play.*/ | ||||||
| @SuppressWarnings("ALL") | @SuppressWarnings("ALL") | ||||||
| public class StreamInfo extends AbstractVideoInfo { | public class StreamInfo extends AbstractStreamInfo { | ||||||
| 
 | 
 | ||||||
|     public static class StreamExctractException extends ExtractionException { |     public static class StreamExctractException extends ExtractionException { | ||||||
|         StreamExctractException(String message) { |         StreamExctractException(String message) { | ||||||
| @@ -39,7 +44,7 @@ public class StreamInfo extends AbstractVideoInfo { | |||||||
|     /**Creates a new StreamInfo object from an existing AbstractVideoInfo. |     /**Creates a new StreamInfo object from an existing AbstractVideoInfo. | ||||||
|      * All the shared properties are copied to the new StreamInfo.*/ |      * All the shared properties are copied to the new StreamInfo.*/ | ||||||
|     @SuppressWarnings("WeakerAccess") |     @SuppressWarnings("WeakerAccess") | ||||||
|     public StreamInfo(AbstractVideoInfo avi) { |     public StreamInfo(AbstractStreamInfo avi) { | ||||||
|         this.id = avi.id; |         this.id = avi.id; | ||||||
|         this.title = avi.title; |         this.title = avi.title; | ||||||
|         this.uploader = avi.uploader; |         this.uploader = avi.uploader; | ||||||
| @@ -67,19 +72,19 @@ public class StreamInfo extends AbstractVideoInfo { | |||||||
| 
 | 
 | ||||||
|     /**Fills out the video info fields which are common to all services. |     /**Fills out the video info fields which are common to all services. | ||||||
|      * Probably needs to be overridden by subclasses*/ |      * Probably needs to be overridden by subclasses*/ | ||||||
|     public static StreamInfo getVideoInfo(StreamExtractor extractor, Downloader downloader) |     public static StreamInfo getVideoInfo(StreamExtractor extractor) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         StreamInfo streamInfo = new StreamInfo(); |         StreamInfo streamInfo = new StreamInfo(); | ||||||
| 
 | 
 | ||||||
|         streamInfo = extractImportantData(streamInfo, extractor, downloader); |         streamInfo = extractImportantData(streamInfo, extractor); | ||||||
|         streamInfo = extractStreams(streamInfo, extractor, downloader); |         streamInfo = extractStreams(streamInfo, extractor); | ||||||
|         streamInfo = extractOptionalData(streamInfo, extractor, downloader); |         streamInfo = extractOptionalData(streamInfo, extractor); | ||||||
| 
 | 
 | ||||||
|         return streamInfo; |         return streamInfo; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static StreamInfo extractImportantData( |     private static StreamInfo extractImportantData( | ||||||
|             StreamInfo streamInfo, StreamExtractor extractor, Downloader downloader) |             StreamInfo streamInfo, StreamExtractor extractor) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         /* ---- importand data, withoug the video can't be displayed goes here: ---- */ |         /* ---- importand data, withoug the video can't be displayed goes here: ---- */ | ||||||
|         // if one of these is not available an exception is ment to be thrown directly into the frontend. |         // if one of these is not available an exception is ment to be thrown directly into the frontend. | ||||||
| @@ -105,7 +110,7 @@ public class StreamInfo extends AbstractVideoInfo { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static StreamInfo extractStreams( |     private static StreamInfo extractStreams( | ||||||
|             StreamInfo streamInfo, StreamExtractor extractor, Downloader downloader) |             StreamInfo streamInfo, StreamExtractor extractor) | ||||||
|             throws ExtractionException, IOException { |             throws ExtractionException, IOException { | ||||||
|         /* ---- stream extraction goes here ---- */ |         /* ---- stream extraction goes here ---- */ | ||||||
|         // At least one type of stream has to be available, |         // At least one type of stream has to be available, | ||||||
| @@ -132,7 +137,7 @@ public class StreamInfo extends AbstractVideoInfo { | |||||||
|             // same as the quick and dirty aboth |             // same as the quick and dirty aboth | ||||||
|             try { |             try { | ||||||
|                 streamInfo.audio_streams.addAll( |                 streamInfo.audio_streams.addAll( | ||||||
|                         DashMpdParser.getAudioStreams(streamInfo.dashMpdUrl, downloader)); |                         DashMpdParser.getAudioStreams(streamInfo.dashMpdUrl)); | ||||||
|             } catch(Exception e) { |             } catch(Exception e) { | ||||||
|                 streamInfo.addException( |                 streamInfo.addException( | ||||||
|                         new ExtractionException("Couldn't get audio streams from dash mpd", e)); |                         new ExtractionException("Couldn't get audio streams from dash mpd", e)); | ||||||
| @@ -166,7 +171,7 @@ public class StreamInfo extends AbstractVideoInfo { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static StreamInfo extractOptionalData( |     private static StreamInfo extractOptionalData( | ||||||
|             StreamInfo streamInfo, StreamExtractor extractor, Downloader downloader) { |             StreamInfo streamInfo, StreamExtractor extractor) { | ||||||
|         /*  ---- optional data goes here: ---- */ |         /*  ---- optional data goes here: ---- */ | ||||||
|         // If one of these failes, the frontend neets to handle that they are not available. |         // If one of these failes, the frontend neets to handle that they are not available. | ||||||
|         // Exceptions are therfore not thrown into the frontend, but stored into the error List, |         // Exceptions are therfore not thrown into the frontend, but stored into the error List, | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 26.08.15. |  * Created by Christian Schabesberger on 26.08.15. | ||||||
| @@ -20,7 +20,9 @@ package org.schabi.newpipe.extractor; | |||||||
|  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. |  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
|  | 
 | ||||||
| /**Info object for previews of unopened videos, eg search results, related videos*/ | /**Info object for previews of unopened videos, eg search results, related videos*/ | ||||||
| public class StreamPreviewInfo extends AbstractVideoInfo { | public class StreamPreviewInfo extends AbstractStreamInfo { | ||||||
|     public int duration; |     public int duration; | ||||||
| } | } | ||||||
| @@ -1,5 +1,8 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
| 
 | 
 | ||||||
|  | import org.schabi.newpipe.extractor.UrlIdHandler; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.FoundAdException; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
| import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamUrlIdHandler; | import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamUrlIdHandler; | ||||||
| 
 | 
 | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -1,4 +1,7 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
|  | 
 | ||||||
|  | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 28.02.16. |  * Created by Christian Schabesberger on 28.02.16. | ||||||
| @@ -21,7 +24,7 @@ package org.schabi.newpipe.extractor; | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| public interface StreamPreviewInfoExtractor { | public interface StreamPreviewInfoExtractor { | ||||||
|     AbstractVideoInfo.StreamType getStreamType() throws ParsingException; |     AbstractStreamInfo.StreamType getStreamType() throws ParsingException; | ||||||
|     String getWebPageUrl() throws ParsingException; |     String getWebPageUrl() throws ParsingException; | ||||||
|     String getTitle() throws ParsingException; |     String getTitle() throws ParsingException; | ||||||
|     int getDuration() throws ParsingException; |     int getDuration() throws ParsingException; | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| package org.schabi.newpipe.extractor; | package org.schabi.newpipe.extractor.stream_info; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 04.03.16. |  * Created by Christian Schabesberger on 04.03.16. | ||||||
| @@ -10,8 +10,8 @@ import com.nostra13.universalimageloader.core.ImageLoader; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.ImageErrorLoadingListener; | import org.schabi.newpipe.ImageErrorLoadingListener; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.AbstractStreamInfo; | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfo; | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by Christian Schabesberger on 26.09.16. |  * Created by Christian Schabesberger on 26.09.16. | ||||||
| @@ -66,7 +66,7 @@ public class InfoItemBuilder { | |||||||
|         if(info.duration > 0) { |         if(info.duration > 0) { | ||||||
|             holder.itemDurationView.setText(getDurationString(info.duration)); |             holder.itemDurationView.setText(getDurationString(info.duration)); | ||||||
|         } else { |         } else { | ||||||
|             if(info.stream_type == AbstractVideoInfo.StreamType.LIVE_STREAM) { |             if(info.stream_type == AbstractStreamInfo.StreamType.LIVE_STREAM) { | ||||||
|                 holder.itemDurationView.setText(R.string.duration_live); |                 holder.itemDurationView.setText(R.string.duration_live); | ||||||
|             } else { |             } else { | ||||||
|                 holder.itemDurationView.setVisibility(View.GONE); |                 holder.itemDurationView.setVisibility(View.GONE); | ||||||
|   | |||||||
| @@ -6,13 +6,8 @@ import android.view.LayoutInflater; | |||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
|  |  | ||||||
| import com.nostra13.universalimageloader.core.DisplayImageOptions; |  | ||||||
| import com.nostra13.universalimageloader.core.ImageLoader; |  | ||||||
|  |  | ||||||
| import org.schabi.newpipe.ImageErrorLoadingListener; |  | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.AbstractVideoInfo; | import org.schabi.newpipe.extractor.stream_info.StreamPreviewInfo; | ||||||
| import org.schabi.newpipe.extractor.StreamPreviewInfo; |  | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Vector; | import java.util.Vector; | ||||||
|   | |||||||
| @@ -18,13 +18,13 @@ import android.view.inputmethod.InputMethodManager; | |||||||
| import android.widget.ProgressBar; | import android.widget.ProgressBar; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
|  |  | ||||||
|  | import org.schabi.newpipe.extractor.NewPipe; | ||||||
|  | import org.schabi.newpipe.extractor.search.SearchResult; | ||||||
| import org.schabi.newpipe.info_list.InfoItemBuilder; | import org.schabi.newpipe.info_list.InfoItemBuilder; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.detail.VideoItemDetailActivity; | import org.schabi.newpipe.detail.VideoItemDetailActivity; | ||||||
| import org.schabi.newpipe.detail.VideoItemDetailFragment; | import org.schabi.newpipe.detail.VideoItemDetailFragment; | ||||||
| import org.schabi.newpipe.extractor.SearchResult; |  | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
| import org.schabi.newpipe.info_list.InfoListAdapter; | import org.schabi.newpipe.info_list.InfoListAdapter; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -72,7 +72,7 @@ public class SearchInfoItemFragment extends Fragment { | |||||||
|                     ErrorActivity.reportError(a, e, null, |                     ErrorActivity.reportError(a, e, null, | ||||||
|                             a.findViewById(android.R.id.content), |                             a.findViewById(android.R.id.content), | ||||||
|                             ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, |                             ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, | ||||||
|                                     ServiceList.getNameOfService(streamingServiceId), |                                     NewPipe.getNameOfService(streamingServiceId), | ||||||
|                                     "Could not get widget with focus", R.string.general_error)); |                                     "Could not get widget with focus", R.string.general_error)); | ||||||
|                 } |                 } | ||||||
|                 // clear focus |                 // clear focus | ||||||
| @@ -137,13 +137,13 @@ public class SearchInfoItemFragment extends Fragment { | |||||||
|             streamingServiceId = savedInstanceState.getInt(STREAMING_SERVICE); |             streamingServiceId = savedInstanceState.getInt(STREAMING_SERVICE); | ||||||
|         } else { |         } else { | ||||||
|             try { |             try { | ||||||
|                 streamingServiceId = ServiceList.getIdOfService("Youtube"); |                 streamingServiceId = NewPipe.getIdOfService("Youtube"); | ||||||
|             } catch(Exception e) { |             } catch(Exception e) { | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|                 ErrorActivity.reportError(getActivity(), e, null, |                 ErrorActivity.reportError(getActivity(), e, null, | ||||||
|                         getActivity().findViewById(android.R.id.content), |                         getActivity().findViewById(android.R.id.content), | ||||||
|                         ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, |                         ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, | ||||||
|                                 ServiceList.getNameOfService(streamingServiceId), |                                 NewPipe.getNameOfService(streamingServiceId), | ||||||
|                                 "", R.string.general_error)); |                                 "", R.string.general_error)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -7,13 +7,12 @@ import android.preference.PreferenceManager; | |||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import android.view.View; | import android.view.View; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.search.SearchEngine; | ||||||
|  | import org.schabi.newpipe.extractor.search.SearchResult; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.SearchEngine; |  | ||||||
| import org.schabi.newpipe.extractor.SearchResult; |  | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  |  | ||||||
| @@ -85,8 +84,8 @@ public class SearchWorker { | |||||||
|             SearchEngine engine = null; |             SearchEngine engine = null; | ||||||
|  |  | ||||||
|             try { |             try { | ||||||
|                 engine = ServiceList.getService(serviceId) |                 engine = NewPipe.getService(serviceId) | ||||||
|                         .getSearchEngineInstance(new Downloader()); |                         .getSearchEngineInstance(); | ||||||
|             } catch(ExtractionException e) { |             } catch(ExtractionException e) { | ||||||
|                 ErrorActivity.reportError(h, a, e, null, null, |                 ErrorActivity.reportError(h, a, e, null, null, | ||||||
|                         ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, |                         ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, | ||||||
| @@ -100,8 +99,7 @@ public class SearchWorker { | |||||||
|                 String searchLanguage = sp.getString(searchLanguageKey, |                 String searchLanguage = sp.getString(searchLanguageKey, | ||||||
|                         a.getString(R.string.default_language_value)); |                         a.getString(R.string.default_language_value)); | ||||||
|                 result = SearchResult |                 result = SearchResult | ||||||
|                         .getSearchResult(engine, query, page, searchLanguage, new Downloader()); |                         .getSearchResult(engine, query, page, searchLanguage); | ||||||
|  |  | ||||||
|                 if(runs) { |                 if(runs) { | ||||||
|                     h.post(new ResultRunnable(result, requestId)); |                     h.post(new ResultRunnable(result, requestId)); | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -6,12 +6,11 @@ import android.os.Handler; | |||||||
| import android.preference.PreferenceManager; | import android.preference.PreferenceManager; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
|  |  | ||||||
| import org.schabi.newpipe.Downloader; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ExtractionException; | ||||||
|  | import org.schabi.newpipe.extractor.search.SuggestionExtractor; | ||||||
| import org.schabi.newpipe.report.ErrorActivity; | import org.schabi.newpipe.report.ErrorActivity; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
| import org.schabi.newpipe.extractor.ExtractionException; |  | ||||||
| import org.schabi.newpipe.extractor.SearchEngine; |  | ||||||
| import org.schabi.newpipe.extractor.ServiceList; |  | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -70,18 +69,18 @@ public class SuggestionSearchRunnable implements Runnable{ | |||||||
|     @Override |     @Override | ||||||
|     public void run() { |     public void run() { | ||||||
|         try { |         try { | ||||||
|             SearchEngine engine = |             SuggestionExtractor se = | ||||||
|                     ServiceList.getService(serviceId).getSearchEngineInstance(new Downloader()); |                     NewPipe.getService(serviceId).getSuggestionExtractorInstance(); | ||||||
|             SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(a); |             SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(a); | ||||||
|             String searchLanguageKey = a.getString(R.string.search_language_key); |             String searchLanguageKey = a.getString(R.string.search_language_key); | ||||||
|             String searchLanguage = sp.getString(searchLanguageKey, |             String searchLanguage = sp.getString(searchLanguageKey, | ||||||
|                     a.getString(R.string.default_language_value)); |                     a.getString(R.string.default_language_value)); | ||||||
|             List<String> suggestions = engine.suggestionList(query,searchLanguage,new Downloader()); |             List<String> suggestions = se.suggestionList(query, searchLanguage); | ||||||
|             h.post(new SuggestionResultRunnable(suggestions, adapter)); |             h.post(new SuggestionResultRunnable(suggestions, adapter)); | ||||||
|         } catch (ExtractionException e) { |         } catch (ExtractionException e) { | ||||||
|             ErrorActivity.reportError(h, a, e, null, a.findViewById(android.R.id.content), |             ErrorActivity.reportError(h, a, e, null, a.findViewById(android.R.id.content), | ||||||
|                     ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, |                     ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, | ||||||
|                             ServiceList.getNameOfService(serviceId), query, R.string.parsing_error)); |                             NewPipe.getNameOfService(serviceId), query, R.string.parsing_error)); | ||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } catch (IOException e) { |         } catch (IOException e) { | ||||||
|             postNewErrorToast(h, R.string.network_error); |             postNewErrorToast(h, R.string.network_error); | ||||||
| @@ -89,7 +88,7 @@ public class SuggestionSearchRunnable implements Runnable{ | |||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             ErrorActivity.reportError(h, a, e, null, a.findViewById(android.R.id.content), |             ErrorActivity.reportError(h, a, e, null, a.findViewById(android.R.id.content), | ||||||
|                     ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, |                     ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED, | ||||||
|                             ServiceList.getNameOfService(serviceId), query, R.string.general_error)); |                             NewPipe.getNameOfService(serviceId), query, R.string.general_error)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Weblate
					Weblate