Added method to download subtitles as VTT
This commit is contained in:
parent
6031695343
commit
6e3651fdf5
|
@ -10,6 +10,7 @@ import org.schabi.newpipe.extractor.StreamingService;
|
|||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
||||
import org.schabi.newpipe.extractor.stream.*;
|
||||
import org.schabi.newpipe.extractor.utils.Parser;
|
||||
|
||||
|
@ -194,10 +195,15 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HashMap<String, String[]> getSubtitles() throws IOException, ExtractionException, JsonParserException {
|
||||
public HashMap<String, String[]> getSubtitlesList() throws IOException, ExtractionException, JsonParserException {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String downloadSubtitles(String URL) throws IOException, ReCaptchaException {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public StreamType getStreamType() {
|
||||
return StreamType.AUDIO_STREAM;
|
||||
|
|
|
@ -420,34 +420,8 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||
return videoOnlyStreams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Example output:
|
||||
* {
|
||||
* #language code#: [
|
||||
* [0]"captions URL",
|
||||
* [1]"language Name"
|
||||
* ],
|
||||
* "a.en": { // a.#language code# == auto generated
|
||||
* [0]"https://youtube.com/api/timedtext..."
|
||||
* [1]"English (Auto-generated)"
|
||||
* },
|
||||
* ".en": { // .#language code# == normal (not auto generated)
|
||||
* [0]"https://youtube.com/api/timedtext..."
|
||||
* [1]"English"
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* Example usage:
|
||||
* 1) Get list of keys in the Map if there are any
|
||||
* 2) Get
|
||||
*
|
||||
* @return Map(String, StringArray[2])
|
||||
* @throws IOException - Thrown when parsing HTML page
|
||||
* @throws ExtractionException - Thrown when parsing HTML
|
||||
* @throws JsonParserException - Thrown when parsing JSON from the web page
|
||||
*/
|
||||
@Override
|
||||
public HashMap<String, String[]> getSubtitles() throws IOException, ExtractionException, JsonParserException {
|
||||
public HashMap<String, String[]> getSubtitlesList() throws IOException, ExtractionException, JsonParserException {
|
||||
HashMap<String, String[]> result = new HashMap<>();
|
||||
|
||||
JsonObject playerConfig = getPlayerConfig(getPageHtml());
|
||||
|
@ -473,6 +447,14 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String downloadSubtitles(String URL) throws IOException, ReCaptchaException {
|
||||
Downloader dl = NewPipe.getDownloader();
|
||||
// Instead of the WebVTT 'vtt' we can use also Timed Text Markup Language 'ttml'
|
||||
String URLasVTT = URL.replaceAll("&fmt=[^&]*", "&fmt=vtt");
|
||||
return dl.download(URLasVTT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StreamType getStreamType() throws ParsingException {
|
||||
//todo: if implementing livestream support this value should be generated dynamically
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.schabi.newpipe.extractor.StreamingService;
|
|||
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.exceptions.ReCaptchaException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
|
@ -66,7 +67,8 @@ public abstract class StreamExtractor extends Extractor {
|
|||
public abstract List<AudioStream> getAudioStreams() throws IOException, ExtractionException;
|
||||
public abstract List<VideoStream> getVideoStreams() throws IOException, ExtractionException;
|
||||
public abstract List<VideoStream> getVideoOnlyStreams() throws IOException, ExtractionException;
|
||||
public abstract HashMap<String, String[]> getSubtitles() throws IOException, ExtractionException, JsonParserException;
|
||||
public abstract HashMap<String, String[]> getSubtitlesList() throws IOException, ExtractionException, JsonParserException;
|
||||
public abstract String downloadSubtitles(String URL) throws IOException, ReCaptchaException;
|
||||
|
||||
public abstract StreamType getStreamType() throws ParsingException;
|
||||
public abstract StreamInfoItem getNextVideo() throws IOException, ExtractionException;
|
||||
|
|
|
@ -54,7 +54,6 @@ public class Parser {
|
|||
if (foundMatch) {
|
||||
return mat.group(group);
|
||||
} else {
|
||||
//Log.e(TAG, "failed to find pattern \""+pattern+"\" inside of \""+input+"\"");
|
||||
if (input.length() > 1024) {
|
||||
throw new RegexException("failed to find pattern \"" + pattern);
|
||||
} else {
|
||||
|
@ -64,12 +63,9 @@ public class Parser {
|
|||
}
|
||||
|
||||
public static boolean isMatch(String pattern, String input) {
|
||||
try {
|
||||
matchGroup1(pattern, input);
|
||||
return true;
|
||||
} catch (RegexException e) {
|
||||
return false;
|
||||
}
|
||||
Pattern pat = Pattern.compile(pattern);
|
||||
Matcher mat = pat.matcher(input);
|
||||
return mat.find();
|
||||
}
|
||||
|
||||
public static Map<String, String> compatParseMap(final String input) throws UnsupportedEncodingException {
|
||||
|
|
|
@ -105,6 +105,6 @@ public class SoundcloudStreamExtractorDefaultTest {
|
|||
|
||||
@Test
|
||||
public void testGetSubtitles() throws IOException, ExtractionException, JsonParserException {
|
||||
assertTrue(extractor.getSubtitles() != null);
|
||||
assertTrue(extractor.getSubtitlesList() != null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -152,7 +152,18 @@ public class YoutubeStreamExtractorDefaultTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testGetSubtitles() throws IOException, ExtractionException, JsonParserException {
|
||||
assertTrue(extractor.getSubtitles() != null);
|
||||
public void testGetSubtitlesList() throws IOException, ExtractionException, JsonParserException {
|
||||
assertTrue(extractor.getSubtitlesList() != null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDownloadSubtitles() throws Exception {
|
||||
try {
|
||||
extractor.downloadSubtitles(extractor.getSubtitlesList().get("en")[0]);
|
||||
// Video has no subtitles!
|
||||
assert false;
|
||||
} catch (Exception e) {
|
||||
assert true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,7 +106,12 @@ public class YoutubeStreamExtractorRestrictedTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testGetSubtitles() throws IOException, ExtractionException, JsonParserException {
|
||||
assertTrue(extractor.getSubtitles() != null);
|
||||
public void testGetSubtitlesList() throws IOException, ExtractionException, JsonParserException {
|
||||
assertTrue(extractor.getSubtitlesList() != null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDownloadSubtitles() throws Exception {
|
||||
assertTrue(extractor.downloadSubtitles("https://youtu.be/FmG385_uUys?t=174") != null);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue