Skip to content

Commit

Permalink
Support audio only background for services only supporting video str…
Browse files Browse the repository at this point in the history
…eams

Some services may only have video streams and no separate audio streams available.
This commit will add audio background playback support for those services.
It uses the video source as audio source for background playback.

Co-Authored-By: evermind-zz <55653+evermind-zz@users.noreply.github.com>
  • Loading branch information
ShareASmile and evermind-zz committed Jul 14, 2024
1 parent c15f8da commit a119f52
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
import com.google.android.exoplayer2.source.MediaSource;

import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.Stream;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.VideoStream;
import org.schabi.newpipelegacy.player.helper.PlayerDataSource;
import org.schabi.newpipelegacy.player.mediaitem.MediaItemTag;
import org.schabi.newpipelegacy.player.mediaitem.StreamInfoTag;
Expand Down Expand Up @@ -43,20 +45,50 @@ public MediaSource resolve(@NonNull final StreamInfo info) {

final List<AudioStream> audioStreams = getNonTorrentStreams(info.getAudioStreams());

final int index = ListHelper.getDefaultAudioFormat(context, audioStreams);
if (index < 0 || index >= info.getAudioStreams().size()) {
final Stream stream = getAudioSource(info);
if (stream == null) {
return null;
}

final AudioStream audio = info.getAudioStreams().get(index);
final MediaItemTag tag = StreamInfoTag.of(info);

try {
return PlaybackResolver.buildMediaSource(
dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag);
dataSource, stream, info, PlaybackResolver.cacheKeyOf(info, stream), tag);
} catch (final ResolverException e) {
Log.e(TAG, "Unable to create audio source", e);
return null;
}
}

/**
* Get a stream to be played as audio. If a service has no separate {@link AudioStream}s we
* use a video stream as audio source to support audio background playback.
*
* @param info of the stream
* @return the audio source to use or null if none could be found
*/
@Nullable
private Stream getAudioSource(@NonNull final StreamInfo info) {
final List<AudioStream> audioStreams = getNonTorrentStreams(info.getAudioStreams());
if (!audioStreams.isEmpty()) {
final int index = ListHelper.getDefaultAudioFormat(context, audioStreams);
return getStreamForIndex(index, audioStreams);
} else {
final List<VideoStream> videoStreams = getNonTorrentStreams(info.getVideoStreams());
if (!videoStreams.isEmpty()) {
final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams);
return getStreamForIndex(index, videoStreams);
}
}
return null;
}

@Nullable
Stream getStreamForIndex(final int index, @NonNull final List<? extends Stream> streams) {
if (index >= 0 && index < streams.size()) {
return streams.get(index);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,26 @@ static String cacheKeyOf(final StreamInfo info, final AudioStream audioStream) {

return cacheKey.toString();
}

/**
* Use common base type {@link Stream} to handle {@link AudioStream} or {@link VideoStream}
* transparently. For more info see {@link #cacheKeyOf(StreamInfo, AudioStream)} or
* {@link #cacheKeyOf(StreamInfo, VideoStream)}.
*
* @param info the {@link StreamInfo stream info}, to distinguish between streams with
* the same features but coming from different stream infos
* @param stream the {@link Stream} ({@link AudioStream} or {@link VideoStream})
* for which the cache key should be created
* @return a key to be used to store the cache of the provided {@link Stream}
*/
static String cacheKeyOf(final StreamInfo info, final Stream stream) {
if (stream instanceof AudioStream) {
return cacheKeyOf(info, (AudioStream) stream);
} else if (stream instanceof VideoStream) {
return cacheKeyOf(info, (VideoStream) stream);
}
throw new RuntimeException("no audio or video stream. That should never happen");
}
//endregion


Expand Down

0 comments on commit a119f52

Please sign in to comment.