diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/dashmanifestcreator/YoutubePostLiveStreamDvrDashManifestCreator.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/dashmanifestcreator/YoutubePostLiveStreamDvrDashManifestCreator.java index 3c6bd1da8..a58a5021a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/dashmanifestcreator/YoutubePostLiveStreamDvrDashManifestCreator.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/dashmanifestcreator/YoutubePostLiveStreamDvrDashManifestCreator.java @@ -17,8 +17,8 @@ import javax.annotation.Nonnull; public class YoutubePostLiveStreamDvrDashManifestCreator extends AbstractYoutubeDashManifestCreator { - protected YoutubePostLiveStreamDvrDashManifestCreator(@Nonnull final ItagInfo itagInfo, - final long durationSecondsFallback) { + public YoutubePostLiveStreamDvrDashManifestCreator(@Nonnull final ItagInfo itagInfo, + final long durationSecondsFallback) { super(itagInfo, durationSecondsFallback); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java index 75e603758..bae738397 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java @@ -66,6 +66,9 @@ import org.schabi.newpipe.extractor.localization.TimeAgoPatternsManager; import org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptExtractor; import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; import org.schabi.newpipe.extractor.services.youtube.YoutubeThrottlingDecrypter; +import org.schabi.newpipe.extractor.services.youtube.dashmanifestcreator.YoutubeOtfDashManifestCreator; +import org.schabi.newpipe.extractor.services.youtube.dashmanifestcreator.YoutubePostLiveStreamDvrDashManifestCreator; +import org.schabi.newpipe.extractor.services.youtube.dashmanifestcreator.YoutubeProgressiveDashManifestCreator; import org.schabi.newpipe.extractor.services.youtube.itag.delivery.HLSItagFormatDeliveryData; import org.schabi.newpipe.extractor.services.youtube.itag.delivery.ItagFormatDeliveryData; import org.schabi.newpipe.extractor.services.youtube.itag.delivery.ProgressiveHTTPItagFormatDeliveryData; @@ -82,6 +85,8 @@ import org.schabi.newpipe.extractor.stream.Privacy; import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.stream.StreamSegment; import org.schabi.newpipe.extractor.streamdata.delivery.DeliveryData; +import org.schabi.newpipe.extractor.streamdata.delivery.dashmanifestcreator.DashManifestCreator; +import org.schabi.newpipe.extractor.streamdata.delivery.simpleimpl.SimpleDASHManifestDeliveryDataImpl; import org.schabi.newpipe.extractor.streamdata.delivery.simpleimpl.SimpleHLSDeliveryDataImpl; import org.schabi.newpipe.extractor.streamdata.delivery.simpleimpl.SimpleProgressiveHTTPDeliveryDataImpl; import org.schabi.newpipe.extractor.streamdata.format.registry.SubtitleFormatRegistry; @@ -1254,16 +1259,27 @@ public class YoutubeStreamExtractor extends StreamExtractor { } // DASH - // TODO - if ("FORMAT_STREAM_TYPE_OTF".equalsIgnoreCase(itagInfo.getType())) { - // OTF DASH MANIFEST - } else if (isPostLive()) { - // YoutubePostLiveStreamDvrDashManifestCreator + // Duration in seconds used as fallback inside the dashManifestCreators + long durationInSec; + try { + durationInSec = getLength(); + } catch (final ParsingException e) { + durationInSec = -1; } - // YoutubeProgressiveDashManifestCreator + return new SimpleDASHManifestDeliveryDataImpl( + getDashManifestCreatorConstructor(itagInfo).apply(itagInfo, durationInSec)); + } - return null; + private BiFunction, Long, DashManifestCreator> getDashManifestCreatorConstructor( + final ItagInfo itagInfo + ) { + if ("FORMAT_STREAM_TYPE_OTF".equalsIgnoreCase(itagInfo.getType())) { + return YoutubeOtfDashManifestCreator::new; + } else if (isPostLive()) { + return YoutubePostLiveStreamDvrDashManifestCreator::new; + } + return YoutubeProgressiveDashManifestCreator::new; } @Nonnull diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/DASHManifestDeliveryData.java b/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/DASHManifestDeliveryData.java index ce2452a73..914c6c1d8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/DASHManifestDeliveryData.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/DASHManifestDeliveryData.java @@ -1,18 +1,12 @@ package org.schabi.newpipe.extractor.streamdata.delivery; +import org.schabi.newpipe.extractor.streamdata.delivery.dashmanifestcreator.DashManifestCreator; + import javax.annotation.Nonnull; public interface DASHManifestDeliveryData extends DASHDeliveryData { - /** - * Returns the base url for the DashManifest. - * - * @return - */ - // TODO: Check removal @Nonnull - default String getBaseUrl() { - return ""; - } + DashManifestCreator getDashManifestCreator(); - String getManifestAsString(); + String getCachedDashManifestAsString(); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/simpleimpl/SimpleDASHManifestDeliveryDataImpl.java b/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/simpleimpl/SimpleDASHManifestDeliveryDataImpl.java index 767ce3a04..0102e7d59 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/simpleimpl/SimpleDASHManifestDeliveryDataImpl.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/streamdata/delivery/simpleimpl/SimpleDASHManifestDeliveryDataImpl.java @@ -1,9 +1,9 @@ package org.schabi.newpipe.extractor.streamdata.delivery.simpleimpl; import org.schabi.newpipe.extractor.streamdata.delivery.DASHManifestDeliveryData; +import org.schabi.newpipe.extractor.streamdata.delivery.dashmanifestcreator.DashManifestCreator; import java.util.Objects; -import java.util.function.Supplier; import javax.annotation.Nonnull; @@ -21,14 +21,27 @@ import javax.annotation.Nonnull; public class SimpleDASHManifestDeliveryDataImpl extends AbstractDeliveryDataImpl implements DASHManifestDeliveryData { @Nonnull - private final Supplier dashManifestBuilder; + private final DashManifestCreator dashManifestCreator; - public SimpleDASHManifestDeliveryDataImpl(@Nonnull final Supplier dashManifestBuilder) { - this.dashManifestBuilder = Objects.requireNonNull(dashManifestBuilder); + private String cachedDashManifest; + + public SimpleDASHManifestDeliveryDataImpl( + @Nonnull final DashManifestCreator dashManifestCreator + ) { + this.dashManifestCreator = Objects.requireNonNull(dashManifestCreator); } @Override - public String getManifestAsString() { - return dashManifestBuilder.get(); + @Nonnull + public DashManifestCreator getDashManifestCreator() { + return dashManifestCreator; + } + + @Override + public String getCachedDashManifestAsString() { + if (cachedDashManifest != null) { + cachedDashManifest = getDashManifestCreator().generateManifest(); + } + return cachedDashManifest; } } \ No newline at end of file