Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
afb62f729f
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue