Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2016-10-04 15:45:09 +02:00
commit afb62f729f
50 changed files with 457 additions and 317 deletions

View File

@ -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());
} }

View File

@ -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",

View File

@ -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);

View File

@ -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) {

View File

@ -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());
*/ */
} }

View File

@ -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()),

View File

@ -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"

View File

@ -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);

View File

@ -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() {

View File

@ -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));
} }

View File

@ -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));

View File

@ -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() {

View File

@ -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();
} }

View File

@ -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));
} }

View File

@ -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,

View File

@ -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) {

View File

@ -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;
}
} }

View File

@ -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;

View File

@ -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;

View File

@ -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.
* *

View File

@ -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;
} }

View File

@ -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();

View File

@ -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);
} }

View File

@ -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.

View File

@ -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.

View File

@ -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;
} }

View File

@ -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");

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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);
} }

View File

@ -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());
} }
} }

View File

@ -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 =

View File

@ -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;
} }
} }

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -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.

View File

@ -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;

View File

@ -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,

View File

@ -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;
} }

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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);

View File

@ -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;

View File

@ -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));
} }
} }

View File

@ -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));
} }

View File

@ -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));
} }
} }