Reordered code inside StreamInfo + Added dashMpdUrl and hlsMasterPlaylistUrl
This commit is contained in:
parent
d0bae9e2a1
commit
9055f55270
|
@ -42,11 +42,11 @@ public abstract class Info implements Serializable {
|
||||||
this.errors.addAll(throwables);
|
this.errors.addAll(throwables);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Info(final int serviceId,
|
protected Info(final int serviceId,
|
||||||
final String id,
|
final String id,
|
||||||
final String url,
|
final String url,
|
||||||
final String originalUrl,
|
final String originalUrl,
|
||||||
final String name) {
|
final String name) {
|
||||||
this.serviceId = serviceId;
|
this.serviceId = serviceId;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
@ -54,7 +54,7 @@ public abstract class Info implements Serializable {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Info(final int serviceId, final LinkHandler linkHandler, final String name) {
|
protected Info(final int serviceId, final LinkHandler linkHandler, final String name) {
|
||||||
this(serviceId,
|
this(serviceId,
|
||||||
linkHandler.getId(),
|
linkHandler.getId(),
|
||||||
linkHandler.getUrl(),
|
linkHandler.getUrl(),
|
||||||
|
|
|
@ -51,295 +51,6 @@ import javax.annotation.Nonnull;
|
||||||
*/
|
*/
|
||||||
public class StreamInfo extends Info {
|
public class StreamInfo extends Info {
|
||||||
|
|
||||||
public static class StreamExtractException extends ExtractionException {
|
|
||||||
StreamExtractException(final String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public StreamInfo(final int serviceId,
|
|
||||||
final String url,
|
|
||||||
final String originalUrl,
|
|
||||||
final StreamType streamType,
|
|
||||||
final String id,
|
|
||||||
final String name,
|
|
||||||
final int ageLimit) {
|
|
||||||
super(serviceId, id, url, originalUrl, name);
|
|
||||||
this.streamType = streamType;
|
|
||||||
this.ageLimit = ageLimit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static StreamInfo getInfo(final String url) throws IOException, ExtractionException {
|
|
||||||
return getInfo(NewPipe.getServiceByUrl(url), url);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static StreamInfo getInfo(@Nonnull final StreamingService service,
|
|
||||||
final String url) throws IOException, ExtractionException {
|
|
||||||
return getInfo(service.getStreamExtractor(url));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static StreamInfo getInfo(@Nonnull final StreamExtractor extractor)
|
|
||||||
throws ExtractionException, IOException {
|
|
||||||
extractor.fetchPage();
|
|
||||||
final StreamInfo streamInfo;
|
|
||||||
try {
|
|
||||||
streamInfo = extractImportantData(extractor);
|
|
||||||
extractStreams(streamInfo, extractor);
|
|
||||||
extractOptionalData(streamInfo, extractor);
|
|
||||||
return streamInfo;
|
|
||||||
|
|
||||||
} catch (final ExtractionException e) {
|
|
||||||
// Currently, YouTube does not distinguish between age restricted videos and videos
|
|
||||||
// blocked by country. This means that during the initialisation of the extractor, the
|
|
||||||
// extractor will assume that a video is age restricted while in reality it is blocked
|
|
||||||
// by country.
|
|
||||||
//
|
|
||||||
// We will now detect whether the video is blocked by country or not.
|
|
||||||
|
|
||||||
final String errorMessage = extractor.getErrorMessage();
|
|
||||||
if (isNullOrEmpty(errorMessage)) {
|
|
||||||
throw e;
|
|
||||||
} else {
|
|
||||||
throw new ContentNotAvailableException(errorMessage, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
private static StreamInfo extractImportantData(@Nonnull final StreamExtractor extractor)
|
|
||||||
throws ExtractionException {
|
|
||||||
// Important data, without it the content can't be displayed.
|
|
||||||
// If one of these is not available, the frontend will receive an exception directly.
|
|
||||||
|
|
||||||
final int serviceId = extractor.getServiceId();
|
|
||||||
final String url = extractor.getUrl();
|
|
||||||
final String originalUrl = extractor.getOriginalUrl();
|
|
||||||
final StreamType streamType = extractor.getStreamType();
|
|
||||||
final String id = extractor.getId();
|
|
||||||
final String name = extractor.getName();
|
|
||||||
final int ageLimit = extractor.getAgeLimit();
|
|
||||||
|
|
||||||
// Suppress always-non-null warning as here we double-check it really is not null
|
|
||||||
//noinspection ConstantConditions
|
|
||||||
if (streamType == StreamType.NONE
|
|
||||||
|| isNullOrEmpty(url)
|
|
||||||
|| isNullOrEmpty(id)
|
|
||||||
|| name == null /* but it can be empty of course */
|
|
||||||
|| ageLimit == -1) {
|
|
||||||
throw new ExtractionException("Some important stream information was not given.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new StreamInfo(extractor.getServiceId(), url, extractor.getOriginalUrl(),
|
|
||||||
streamType, id, name, ageLimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static void extractStreams(final StreamInfo streamInfo,
|
|
||||||
final StreamExtractor extractor)
|
|
||||||
throws ExtractionException {
|
|
||||||
/* ---- Stream extraction goes here ---- */
|
|
||||||
// At least one type of stream has to be available, otherwise an exception will be thrown
|
|
||||||
// directly into the frontend.
|
|
||||||
|
|
||||||
/* Load and extract audio */
|
|
||||||
try {
|
|
||||||
streamInfo.setAudioStreams(extractor.getAudioStreams());
|
|
||||||
} catch (final ContentNotSupportedException e) {
|
|
||||||
throw e;
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(new ExtractionException("Couldn't get audio streams", e));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extract video stream url */
|
|
||||||
try {
|
|
||||||
streamInfo.setVideoStreams(extractor.getVideoStreams());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(new ExtractionException("Couldn't get video streams", e));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Extract video only stream url */
|
|
||||||
try {
|
|
||||||
streamInfo.setVideoOnlyStreams(extractor.getVideoOnlyStreams());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(new ExtractionException("Couldn't get video only streams", e));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lists can be null if an exception was thrown during extraction
|
|
||||||
if (streamInfo.getVideoStreams() == null) {
|
|
||||||
streamInfo.setVideoStreams(Collections.emptyList());
|
|
||||||
}
|
|
||||||
if (streamInfo.getVideoOnlyStreams() == null) {
|
|
||||||
streamInfo.setVideoOnlyStreams(Collections.emptyList());
|
|
||||||
}
|
|
||||||
if (streamInfo.getAudioStreams() == null) {
|
|
||||||
streamInfo.setAudioStreams(Collections.emptyList());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Either audio or video has to be available, otherwise we didn't get a stream (since
|
|
||||||
// videoOnly are optional, they don't count).
|
|
||||||
if ((streamInfo.videoStreams.isEmpty()) && (streamInfo.audioStreams.isEmpty())) {
|
|
||||||
throw new StreamExtractException(
|
|
||||||
"Could not get any stream. See error variable to get further details.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("MethodLength")
|
|
||||||
private static void extractOptionalData(final StreamInfo streamInfo,
|
|
||||||
final StreamExtractor extractor) {
|
|
||||||
/* ---- Optional data goes here: ---- */
|
|
||||||
// If one of these fails, the frontend needs to handle that they are not available.
|
|
||||||
// Exceptions are therefore not thrown into the frontend, but stored into the error list,
|
|
||||||
// so the frontend can afterwards check where errors happened.
|
|
||||||
|
|
||||||
try {
|
|
||||||
streamInfo.setThumbnailUrl(extractor.getThumbnailUrl());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setDuration(extractor.getLength());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploaderName(extractor.getUploaderName());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploaderUrl(extractor.getUploaderUrl());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploaderAvatarUrl(extractor.getUploaderAvatarUrl());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploaderVerified(extractor.isUploaderVerified());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploaderSubscriberCount(extractor.getUploaderSubscriberCount());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
streamInfo.setSubChannelName(extractor.getSubChannelName());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setSubChannelUrl(extractor.getSubChannelUrl());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setSubChannelAvatarUrl(extractor.getSubChannelAvatarUrl());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
streamInfo.setDescription(extractor.getDescription());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setViewCount(extractor.getViewCount());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setTextualUploadDate(extractor.getTextualUploadDate());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setUploadDate(extractor.getUploadDate());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setStartPosition(extractor.getTimeStamp());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setLikeCount(extractor.getLikeCount());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setDislikeCount(extractor.getDislikeCount());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setSubtitles(extractor.getSubtitles());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Additional info
|
|
||||||
try {
|
|
||||||
streamInfo.setHost(extractor.getHost());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setPrivacy(extractor.getPrivacy());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setCategory(extractor.getCategory());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setLicence(extractor.getLicence());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setLanguageInfo(extractor.getLanguageInfo());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setTags(extractor.getTags());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setSupportInfo(extractor.getSupportInfo());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setStreamSegments(extractor.getStreamSegments());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setMetaInfo(extractor.getMetaInfo());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
streamInfo.setPreviewFrames(extractor.getFrames());
|
|
||||||
} catch (final Exception e) {
|
|
||||||
streamInfo.addError(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
streamInfo.setRelatedItems(ExtractorHelper.getRelatedItemsOrLogError(streamInfo,
|
|
||||||
extractor));
|
|
||||||
}
|
|
||||||
|
|
||||||
private StreamType streamType;
|
private StreamType streamType;
|
||||||
private String thumbnailUrl = "";
|
private String thumbnailUrl = "";
|
||||||
private String textualUploadDate;
|
private String textualUploadDate;
|
||||||
|
@ -362,6 +73,11 @@ public class StreamInfo extends Info {
|
||||||
private String subChannelUrl = "";
|
private String subChannelUrl = "";
|
||||||
private String subChannelAvatarUrl = "";
|
private String subChannelAvatarUrl = "";
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private String dashMpdUrl = "";
|
||||||
|
@Nonnull
|
||||||
|
private String hlsMasterPlaylistUrl = "";
|
||||||
|
|
||||||
private List<VideoAudioStream> videoStreams = new ArrayList<>();
|
private List<VideoAudioStream> videoStreams = new ArrayList<>();
|
||||||
private List<AudioStream> audioStreams = new ArrayList<>();
|
private List<AudioStream> audioStreams = new ArrayList<>();
|
||||||
private List<VideoStream> videoOnlyStreams = new ArrayList<>();
|
private List<VideoStream> videoOnlyStreams = new ArrayList<>();
|
||||||
|
@ -381,6 +97,18 @@ public class StreamInfo extends Info {
|
||||||
private List<StreamSegment> streamSegments = new ArrayList<>();
|
private List<StreamSegment> streamSegments = new ArrayList<>();
|
||||||
private List<MetaInfo> metaInfo = new ArrayList<>();
|
private List<MetaInfo> metaInfo = new ArrayList<>();
|
||||||
|
|
||||||
|
public StreamInfo(final int serviceId,
|
||||||
|
final String url,
|
||||||
|
final String originalUrl,
|
||||||
|
final StreamType streamType,
|
||||||
|
final String id,
|
||||||
|
final String name,
|
||||||
|
final int ageLimit) {
|
||||||
|
super(serviceId, id, url, originalUrl, name);
|
||||||
|
this.streamType = streamType;
|
||||||
|
this.ageLimit = ageLimit;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preview frames, e.g. for the storyboard / seekbar thumbnail preview
|
* Preview frames, e.g. for the storyboard / seekbar thumbnail preview
|
||||||
*/
|
*/
|
||||||
|
@ -582,6 +310,24 @@ public class StreamInfo extends Info {
|
||||||
this.videoOnlyStreams = Objects.requireNonNull(videoOnlyStreams);
|
this.videoOnlyStreams = Objects.requireNonNull(videoOnlyStreams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public String getDashMpdUrl() {
|
||||||
|
return dashMpdUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDashMpdUrl(@Nonnull final String dashMpdUrl) {
|
||||||
|
this.dashMpdUrl = Objects.requireNonNull(dashMpdUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public String getHlsMasterPlaylistUrl() {
|
||||||
|
return hlsMasterPlaylistUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHlsMasterPlaylistUrl(@Nonnull final String hlsMasterPlaylistUrl) {
|
||||||
|
this.hlsMasterPlaylistUrl = Objects.requireNonNull(hlsMasterPlaylistUrl);
|
||||||
|
}
|
||||||
|
|
||||||
public List<InfoItem> getRelatedItems() {
|
public List<InfoItem> getRelatedItems() {
|
||||||
return relatedItems;
|
return relatedItems;
|
||||||
}
|
}
|
||||||
|
@ -687,4 +433,288 @@ public class StreamInfo extends Info {
|
||||||
public List<MetaInfo> getMetaInfo() {
|
public List<MetaInfo> getMetaInfo() {
|
||||||
return this.metaInfo;
|
return this.metaInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static StreamInfo getInfo(final String url) throws IOException, ExtractionException {
|
||||||
|
return getInfo(NewPipe.getServiceByUrl(url), url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StreamInfo getInfo(@Nonnull final StreamingService service,
|
||||||
|
final String url) throws IOException, ExtractionException {
|
||||||
|
return getInfo(service.getStreamExtractor(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StreamInfo getInfo(@Nonnull final StreamExtractor extractor)
|
||||||
|
throws ExtractionException, IOException {
|
||||||
|
extractor.fetchPage();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final StreamInfo streamInfo = extractImportantData(extractor);
|
||||||
|
extractStreams(streamInfo, extractor);
|
||||||
|
extractOptionalData(streamInfo, extractor);
|
||||||
|
return streamInfo;
|
||||||
|
|
||||||
|
} catch (final ExtractionException e) {
|
||||||
|
// Currently, YouTube does not distinguish between age restricted videos and videos
|
||||||
|
// blocked by country. This means that during the initialisation of the extractor, the
|
||||||
|
// extractor will assume that a video is age restricted while in reality it is blocked
|
||||||
|
// by country.
|
||||||
|
//
|
||||||
|
// We will now detect whether the video is blocked by country or not.
|
||||||
|
// TODO: An error message is not a valid indicator if the video a blocked in a country
|
||||||
|
final String errorMessage = extractor.getErrorMessage();
|
||||||
|
if (isNullOrEmpty(errorMessage)) {
|
||||||
|
throw e;
|
||||||
|
} else {
|
||||||
|
throw new ContentNotAvailableException(errorMessage, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
private static StreamInfo extractImportantData(@Nonnull final StreamExtractor extractor)
|
||||||
|
throws ExtractionException {
|
||||||
|
// Important data, without it the content can't be displayed.
|
||||||
|
// If one of these is not available, the frontend will receive an exception directly.
|
||||||
|
|
||||||
|
extractor.getServiceId(); // Check if a exception is thrown
|
||||||
|
final String url = extractor.getUrl();
|
||||||
|
extractor.getOriginalUrl(); // Check if a exception is thrown
|
||||||
|
final StreamType streamType = extractor.getStreamType();
|
||||||
|
final String id = extractor.getId();
|
||||||
|
final String name = extractor.getName();
|
||||||
|
final int ageLimit = extractor.getAgeLimit();
|
||||||
|
|
||||||
|
// Suppress always-non-null warning as here we double-check it really is not null
|
||||||
|
//noinspection ConstantConditions
|
||||||
|
if (streamType == StreamType.NONE
|
||||||
|
|| isNullOrEmpty(url)
|
||||||
|
|| isNullOrEmpty(id)
|
||||||
|
|| name == null /* but it can be empty of course */
|
||||||
|
|| ageLimit == -1) {
|
||||||
|
throw new ExtractionException("Some important stream information was not given.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StreamInfo(extractor.getServiceId(), url, extractor.getOriginalUrl(),
|
||||||
|
streamType, id, name, ageLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void extractStreams(final StreamInfo streamInfo,
|
||||||
|
final StreamExtractor extractor)
|
||||||
|
throws ExtractionException {
|
||||||
|
/* ---- Stream extraction goes here ---- */
|
||||||
|
// At least one type of stream has to be available, otherwise an exception will be thrown
|
||||||
|
// directly into the frontend.
|
||||||
|
|
||||||
|
/* Load and extract audio */
|
||||||
|
try {
|
||||||
|
streamInfo.setAudioStreams(extractor.getAudioStreams());
|
||||||
|
} catch (final ContentNotSupportedException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(new ExtractionException("Couldn't get audio streams", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extract video stream url */
|
||||||
|
try {
|
||||||
|
streamInfo.setVideoStreams(extractor.getVideoStreams());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(new ExtractionException("Couldn't get video streams", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extract video only stream url */
|
||||||
|
try {
|
||||||
|
streamInfo.setVideoOnlyStreams(extractor.getVideoOnlyStreams());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(new ExtractionException("Couldn't get video only streams", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extract DASH-MPD url */
|
||||||
|
try {
|
||||||
|
streamInfo.setDashMpdUrl(extractor.getDashMpdUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(new ExtractionException("Couldn't get DASH-MPD url", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extract hls master playlist url */
|
||||||
|
try {
|
||||||
|
streamInfo.setHlsMasterPlaylistUrl(extractor.getHlsMasterPlaylistUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(new ExtractionException("Couldn't get HLS master playlist", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if any data for streaming is available
|
||||||
|
if (streamInfo.getVideoStreams().isEmpty()
|
||||||
|
&& streamInfo.getVideoOnlyStreams().isEmpty()
|
||||||
|
&& streamInfo.getAudioStreams().isEmpty()
|
||||||
|
&& streamInfo.getDashMpdUrl().trim().isEmpty()
|
||||||
|
&& streamInfo.getHlsMasterPlaylistUrl().trim().isEmpty()
|
||||||
|
) {
|
||||||
|
throw new StreamExtractException("Could not get any required streaming-data. " +
|
||||||
|
"See error variable to get further details.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("MethodLength")
|
||||||
|
private static void extractOptionalData(final StreamInfo streamInfo,
|
||||||
|
final StreamExtractor extractor) {
|
||||||
|
/* ---- Optional data goes here: ---- */
|
||||||
|
// If one of these fails, the frontend needs to handle that they are not available.
|
||||||
|
// Exceptions are therefore not thrown into the frontend, but stored into the error list,
|
||||||
|
// so the frontend can afterwards check where errors happened.
|
||||||
|
|
||||||
|
try {
|
||||||
|
streamInfo.setThumbnailUrl(extractor.getThumbnailUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setDuration(extractor.getLength());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploaderName(extractor.getUploaderName());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploaderUrl(extractor.getUploaderUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploaderAvatarUrl(extractor.getUploaderAvatarUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploaderVerified(extractor.isUploaderVerified());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploaderSubscriberCount(extractor.getUploaderSubscriberCount());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
streamInfo.setSubChannelName(extractor.getSubChannelName());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setSubChannelUrl(extractor.getSubChannelUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setSubChannelAvatarUrl(extractor.getSubChannelAvatarUrl());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
streamInfo.setDescription(extractor.getDescription());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setViewCount(extractor.getViewCount());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setTextualUploadDate(extractor.getTextualUploadDate());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setUploadDate(extractor.getUploadDate());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setStartPosition(extractor.getTimeStamp());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setLikeCount(extractor.getLikeCount());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setDislikeCount(extractor.getDislikeCount());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setSubtitles(extractor.getSubtitles());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Additional info
|
||||||
|
try {
|
||||||
|
streamInfo.setHost(extractor.getHost());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setPrivacy(extractor.getPrivacy());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setCategory(extractor.getCategory());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setLicence(extractor.getLicence());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setLanguageInfo(extractor.getLanguageInfo());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setTags(extractor.getTags());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setSupportInfo(extractor.getSupportInfo());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setStreamSegments(extractor.getStreamSegments());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setMetaInfo(extractor.getMetaInfo());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
streamInfo.setPreviewFrames(extractor.getFrames());
|
||||||
|
} catch (final Exception e) {
|
||||||
|
streamInfo.addError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
streamInfo.setRelatedItems(
|
||||||
|
ExtractorHelper.getRelatedItemsOrLogError(streamInfo, extractor));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class StreamExtractException extends ExtractionException {
|
||||||
|
StreamExtractException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue