Added VideoQualityData

This commit is contained in:
litetex 2022-06-05 17:00:22 +02:00
parent 73bd33d889
commit d0bae9e2a1
7 changed files with 88 additions and 37 deletions

View File

@ -22,6 +22,7 @@ import org.schabi.newpipe.extractor.streamdata.format.registry.AudioFormatRegist
import org.schabi.newpipe.extractor.streamdata.format.registry.VideoAudioFormatRegistry;
import org.schabi.newpipe.extractor.streamdata.stream.AudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.VideoAudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleAudioStreamImpl;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleVideoAudioStreamImpl;
@ -201,7 +202,10 @@ public class MediaCCCLiveStreamExtractor extends StreamExtractor {
deliveryData,
// TODO: This looks wrong
new VideoAudioFormatRegistry().getFromSuffix(dto.getUrlKey()),
videoSize.getInt(0) + "x" + videoSize.getInt(1)
new VideoQualityData(
/*height=*/videoSize.getInt(1, VideoQualityData.UNKNOWN),
/*width=*/videoSize.getInt(0, VideoQualityData.UNKNOWN),
VideoQualityData.UNKNOWN)
);
})
.collect(Collectors.toList());

View File

@ -21,6 +21,7 @@ import org.schabi.newpipe.extractor.streamdata.format.registry.AudioFormatRegist
import org.schabi.newpipe.extractor.streamdata.format.registry.VideoAudioFormatRegistry;
import org.schabi.newpipe.extractor.streamdata.stream.AudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.VideoAudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleAudioStreamImpl;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleVideoAudioStreamImpl;
import org.schabi.newpipe.extractor.utils.JsonUtils;
@ -112,7 +113,11 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
null,
AudioStream.UNKNOWN_BITRATE,
new VideoAudioFormatRegistry().getFromMimeType(o.getString("mime_type")),
o.getInt("height") + "p"
new VideoQualityData(
o.getInt("height", VideoQualityData.UNKNOWN),
o.getInt("width", VideoQualityData.UNKNOWN),
VideoQualityData.UNKNOWN
)
))
.collect(Collectors.toList());
}
@ -139,8 +144,7 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
conferenceData = JsonParser.object()
.from(downloader.get(data.getString("conference_url")).responseBody());
} catch (final JsonParserException jpe) {
throw new ExtractionException("Could not parse json returned by URL: " + videoUrl,
jpe);
throw new ExtractionException("Could not parse json returned by URL: " + videoUrl, jpe);
}
}

View File

@ -35,6 +35,7 @@ import org.schabi.newpipe.extractor.streamdata.stream.AudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.Stream;
import org.schabi.newpipe.extractor.streamdata.stream.SubtitleStream;
import org.schabi.newpipe.extractor.streamdata.stream.VideoAudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleAudioStreamImpl;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleSubtitleStreamImpl;
import org.schabi.newpipe.extractor.streamdata.stream.simpleimpl.SimpleVideoAudioStreamImpl;
@ -465,6 +466,7 @@ public class PeertubeStreamExtractor extends StreamExtractor {
.stream()
.filter(JsonObject.class::isInstance)
.map(JsonObject.class::cast)
// TODO Check! This is the master playlist!
.map(stream -> new SimpleVideoAudioStreamImpl(
new SimpleHLSDeliveryDataImpl(stream.getString(PLAYLIST_URL, "")),
VideoAudioFormatRegistry.MPEG_4)
@ -489,9 +491,10 @@ public class PeertubeStreamExtractor extends StreamExtractor {
.map(JsonObject.class::cast)
.filter(stream -> !isNullOrEmpty(getUrlFromStream(stream)))
.forEach(stream -> {
final String resolution = getResolutionFromStream(stream);
if (resolution.toLowerCase().contains("audio")) {
final JsonObject resJson = stream.getObject("resolution");
if (resJson.getString("label", "")
.toLowerCase()
.contains("audio")) {
// An audio stream
addNewStreams(
this.audioStreams,
@ -514,17 +517,15 @@ public class PeertubeStreamExtractor extends StreamExtractor {
dd,
new VideoAudioFormatRegistry()
.getFromSuffix(getExtensionFromStream(s)),
resolution
new VideoQualityData(
resJson.getInt("id", VideoQualityData.UNKNOWN),
stream.getInt("fps", VideoQualityData.UNKNOWN))
)
);
}
});
}
private static String getResolutionFromStream(@Nonnull final JsonObject stream) {
return stream.getObject("resolution")
.getString("label");
}
private static String getStreamUrlKeyFromStream(@Nonnull final JsonObject stream) {
return stream.has(FILE_URL) ? FILE_URL : FILE_DOWNLOAD_URL;

View File

@ -1,29 +1,23 @@
package org.schabi.newpipe.extractor.streamdata.stream;
import org.schabi.newpipe.extractor.streamdata.format.VideoAudioMediaFormat;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Represents a video (only) stream.
*/
public interface VideoStream extends Stream {
String UNKNOWN_RESOLUTION = "";
// TODO: Check if this can be non-null
@Nullable
default VideoAudioMediaFormat videoMediaFormat() {
return null;
}
// TODO: This should be a separate entity (containing e.g. height x width + fps)
@Nonnull
default String resolution() {
return UNKNOWN_RESOLUTION;
}
VideoQualityData videoQualityData();
@Override
default boolean equalsStream(@Nullable final Stream other) {
@ -33,6 +27,6 @@ public interface VideoStream extends Stream {
final VideoStream otherVideoStream = (VideoStream) other;
return Objects.equals(videoMediaFormat(), otherVideoStream.videoMediaFormat())
&& Objects.equals(resolution(), otherVideoStream.resolution());
&& videoQualityData().equalsVideoQualityData(otherVideoStream.videoQualityData());
}
}

View File

@ -0,0 +1,46 @@
package org.schabi.newpipe.extractor.streamdata.stream.quality;
public class VideoQualityData {
public static int UNKNOWN = -1;
private final int height;
private final int width;
private final int fps;
public VideoQualityData(final int height, final int width, final int fps) {
this.height = height;
this.width = width;
this.fps = fps;
}
public VideoQualityData(final int height, final int fps) {
this(height, UNKNOWN, fps);
}
public VideoQualityData(final int height) {
this(height, UNKNOWN);
}
public VideoQualityData() {
this(UNKNOWN);
}
public int height() {
return height;
}
public int width() {
return width;
}
public int fps() {
return fps;
}
public boolean equalsVideoQualityData(final VideoQualityData other) {
return height() == other.height()
&& width() == other.width()
&& fps() == other.fps();
}
}

View File

@ -4,6 +4,7 @@ import org.schabi.newpipe.extractor.streamdata.delivery.DeliveryData;
import org.schabi.newpipe.extractor.streamdata.format.AudioMediaFormat;
import org.schabi.newpipe.extractor.streamdata.format.VideoAudioMediaFormat;
import org.schabi.newpipe.extractor.streamdata.stream.VideoAudioStream;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import java.util.Objects;
@ -18,35 +19,35 @@ public class SimpleVideoAudioStreamImpl extends AbstractStreamImpl implements Vi
@Nullable
private final VideoAudioMediaFormat videoAudioMediaFormat;
@Nonnull
private final String resolution;
private final VideoQualityData videoQualityData;
public SimpleVideoAudioStreamImpl(
@Nonnull final DeliveryData deliveryData,
@Nullable final AudioMediaFormat audioMediaFormat,
final int averageBitrate,
@Nullable final VideoAudioMediaFormat videoAudioMediaFormat,
@Nonnull final String resolution
@Nonnull final VideoQualityData videoQualityData
) {
super(deliveryData);
this.audioMediaFormat = audioMediaFormat;
this.averageBitrate = averageBitrate;
this.videoAudioMediaFormat = videoAudioMediaFormat;
this.resolution = Objects.requireNonNull(resolution);
this.videoQualityData = Objects.requireNonNull(videoQualityData);
}
public SimpleVideoAudioStreamImpl(
@Nonnull final DeliveryData deliveryData,
@Nullable final VideoAudioMediaFormat videoAudioMediaFormat,
@Nonnull final String resolution
@Nonnull final VideoQualityData videoQualityData
) {
this(deliveryData, null, UNKNOWN_BITRATE, videoAudioMediaFormat, resolution);
this(deliveryData, null, UNKNOWN_BITRATE, videoAudioMediaFormat, videoQualityData);
}
public SimpleVideoAudioStreamImpl(
@Nonnull final DeliveryData deliveryData,
@Nullable final VideoAudioMediaFormat videoAudioMediaFormat
) {
this(deliveryData, videoAudioMediaFormat, UNKNOWN_RESOLUTION);
this(deliveryData, videoAudioMediaFormat, new VideoQualityData());
}
@Nullable
@ -68,7 +69,7 @@ public class SimpleVideoAudioStreamImpl extends AbstractStreamImpl implements Vi
@Nonnull
@Override
public String resolution() {
return resolution;
public VideoQualityData videoQualityData() {
return videoQualityData;
}
}

View File

@ -3,6 +3,7 @@ package org.schabi.newpipe.extractor.streamdata.stream.simpleimpl;
import org.schabi.newpipe.extractor.streamdata.delivery.DeliveryData;
import org.schabi.newpipe.extractor.streamdata.format.VideoAudioMediaFormat;
import org.schabi.newpipe.extractor.streamdata.stream.VideoStream;
import org.schabi.newpipe.extractor.streamdata.stream.quality.VideoQualityData;
import java.util.Objects;
@ -13,27 +14,27 @@ public class SimpleVideoStreamImpl extends AbstractStreamImpl implements VideoSt
@Nullable
private final VideoAudioMediaFormat videoAudioMediaFormat;
@Nonnull
private final String resolution;
private final VideoQualityData videoQualityData;
public SimpleVideoStreamImpl(
@Nonnull final DeliveryData deliveryData,
@Nullable final VideoAudioMediaFormat videoAudioMediaFormat,
@Nonnull final String resolution
@Nonnull final VideoQualityData videoQualityData
) {
super(deliveryData);
this.videoAudioMediaFormat = videoAudioMediaFormat;
this.resolution = Objects.requireNonNull(resolution);
this.videoQualityData = Objects.requireNonNull(videoQualityData);
}
public SimpleVideoStreamImpl(
@Nonnull final DeliveryData deliveryData,
@Nonnull final String resolution
@Nonnull final VideoQualityData videoQualityData
) {
this(deliveryData, null, resolution);
this(deliveryData, null, videoQualityData);
}
public SimpleVideoStreamImpl(@Nonnull final DeliveryData deliveryData) {
this(deliveryData, null, UNKNOWN_RESOLUTION);
this(deliveryData, new VideoQualityData());
}
@Nullable
@ -44,7 +45,7 @@ public class SimpleVideoStreamImpl extends AbstractStreamImpl implements VideoSt
@Nonnull
@Override
public String resolution() {
return resolution;
public VideoQualityData videoQualityData() {
return videoQualityData;
}
}