diff --git a/lib/src/reverse_engineering/clients/embedded_player_client.dart b/lib/src/reverse_engineering/clients/embedded_player_client.dart index 8c9055c..1c13d24 100644 --- a/lib/src/reverse_engineering/clients/embedded_player_client.dart +++ b/lib/src/reverse_engineering/clients/embedded_player_client.dart @@ -26,14 +26,14 @@ class EmbeddedPlayerClient { late final Iterable<_StreamInfo> muxedStreams = root .get('streamingData') ?.getList('formats') - ?.map((e) => _StreamInfo(e)) ?? + ?.map((e) => _StreamInfo(e, StreamSource.muxed)) ?? const []; /// late final Iterable<_StreamInfo> adaptiveStreams = root .get('streamingData') ?.getList('adaptiveFormats') - ?.map((e) => _StreamInfo(e)) ?? + ?.map((e) => _StreamInfo(e, StreamSource.adaptive)) ?? const []; /// @@ -131,5 +131,9 @@ class _StreamInfo extends StreamInfoProvider { @override late final int? framerate = root['fps'] ?? 0; - _StreamInfo(this.root); + + @override + final StreamSource source; + + _StreamInfo(this.root, this.source); } diff --git a/lib/src/reverse_engineering/dash_manifest.dart b/lib/src/reverse_engineering/dash_manifest.dart index ce0c68b..8ab517c 100644 --- a/lib/src/reverse_engineering/dash_manifest.dart +++ b/lib/src/reverse_engineering/dash_manifest.dart @@ -47,6 +47,9 @@ class _StreamInfo extends StreamInfoProvider { _StreamInfo(this.root); + @override + StreamSource get source => StreamSource.dash; + @override late final int tag = int.parse(root.getAttribute('id')!); diff --git a/lib/src/reverse_engineering/models/stream_info_provider.dart b/lib/src/reverse_engineering/models/stream_info_provider.dart index 9ccb840..ff6b914 100644 --- a/lib/src/reverse_engineering/models/stream_info_provider.dart +++ b/lib/src/reverse_engineering/models/stream_info_provider.dart @@ -1,8 +1,13 @@ +enum StreamSource { muxed, adaptive, dash } + /// abstract class StreamInfoProvider { /// static final RegExp contentLenExp = RegExp(r'clen=(\d+)'); + /// + StreamSource get source; + /// int get tag; diff --git a/lib/src/reverse_engineering/player/player_response.dart b/lib/src/reverse_engineering/player/player_response.dart index c135dee..3e2f4f7 100644 --- a/lib/src/reverse_engineering/player/player_response.dart +++ b/lib/src/reverse_engineering/player/player_response.dart @@ -96,7 +96,7 @@ class PlayerResponse { late final List muxedStreams = root .get('streamingData') ?.getList('formats') - ?.map((e) => _StreamInfo(e)) + ?.map((e) => _StreamInfo(e, StreamSource.muxed)) .cast() .toList() ?? const []; @@ -105,7 +105,7 @@ class PlayerResponse { late final List adaptiveStreams = root .get('streamingData') ?.getList('adaptiveFormats') - ?.map((e) => _StreamInfo(e)) + ?.map((e) => _StreamInfo(e, StreamSource.adaptive)) .cast() .toList() ?? const []; @@ -238,5 +238,8 @@ class _StreamInfo extends StreamInfoProvider { return codecs.last; } - _StreamInfo(this.root); + @override + final StreamSource source; + + _StreamInfo(this.root, this.source); } diff --git a/lib/src/videos/streams/streams_client.dart b/lib/src/videos/streams/streams_client.dart index eb17f23..a21a1b5 100644 --- a/lib/src/videos/streams/streams_client.dart +++ b/lib/src/videos/streams/streams_client.dart @@ -156,9 +156,9 @@ class StreamsClient { await _httpClient.getContentLength(url, validate: false) ?? 0; - if (contentLength <= 0) { - continue; - } + // if (contentLength <= 0) { + // continue; + // } // Common var container = StreamContainer.parse(streamInfo.container!); @@ -184,7 +184,8 @@ class StreamsClient { : videoQuality.toVideoResolution(); // Muxed - if (!audioCodec.isNullOrWhiteSpace) { + if (!audioCodec.isNullOrWhiteSpace && + streamInfo.source != StreamSource.adaptive) { streams[tag] = MuxedStreamInfo( tag, url, diff --git a/pubspec.yaml b/pubspec.yaml index 1253845..674b578 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: youtube_explode_dart description: A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key. -version: 1.10.6 +version: 1.10.7-dev.1 homepage: https://github.com/Hexer10/youtube_explode_dart