2018-11-20 22:10:50 +00:00
|
|
|
package org.schabi.newpipe.util;
|
|
|
|
|
2019-10-04 12:59:08 +00:00
|
|
|
import androidx.annotation.NonNull;
|
2018-11-20 22:10:50 +00:00
|
|
|
|
|
|
|
import org.schabi.newpipe.extractor.MediaFormat;
|
|
|
|
import org.schabi.newpipe.extractor.stream.AudioStream;
|
|
|
|
import org.schabi.newpipe.extractor.stream.Stream;
|
|
|
|
import org.schabi.newpipe.extractor.stream.VideoStream;
|
|
|
|
import org.schabi.newpipe.util.StreamItemAdapter.StreamSizeWrapper;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
public class SecondaryStreamHelper<T extends Stream> {
|
|
|
|
private final int position;
|
|
|
|
private final StreamSizeWrapper<T> streams;
|
|
|
|
|
|
|
|
public SecondaryStreamHelper(StreamSizeWrapper<T> streams, T selectedStream) {
|
|
|
|
this.streams = streams;
|
|
|
|
this.position = streams.getStreamsList().indexOf(selectedStream);
|
|
|
|
if (this.position < 0) throw new RuntimeException("selected stream not found");
|
|
|
|
}
|
|
|
|
|
|
|
|
public T getStream() {
|
|
|
|
return streams.getStreamsList().get(position);
|
|
|
|
}
|
|
|
|
|
|
|
|
public long getSizeInBytes() {
|
|
|
|
return streams.getSizeInBytes(position);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* find the correct audio stream for the desired video stream
|
|
|
|
*
|
|
|
|
* @param audioStreams list of audio streams
|
|
|
|
* @param videoStream desired video ONLY stream
|
|
|
|
* @return selected audio stream or null if a candidate was not found
|
|
|
|
*/
|
|
|
|
public static AudioStream getAudioStreamFor(@NonNull List<AudioStream> audioStreams, @NonNull VideoStream videoStream) {
|
|
|
|
switch (videoStream.getFormat()) {
|
|
|
|
case WEBM:
|
New MP4 muxer + Queue changes + Storage fixes
Main changes:
* correctly check the available space (CircularFile.java)
* misc cleanup (CircularFile.java)
* use the "Error Reporter" for non-http errors
* rewrite network state checking and add better support for API 21 (Lollipop) or higher
* implement "metered networks"
* add buttons in "Downloads" activity to start/pause all pending downloads, ignoring the queue flag or if the network is "metered"
* add workaround for VPN connections and/or network switching. Example: switching WiFi to 3G
* rewrite DataReader ¡Webm muxer is now 57% more faster!
* rewrite CircularFile, use file buffers instead of memory buffers. Less troubles in low-end devices
* fix missing offset for KaxCluster (WebMWriter.java), manifested as no thumbnails on file explorers
Download queue:
* remember queue status, unless the user pause the download (un-queue)
* semi-automatic downloads, between networks. Effective if the user create a new download or the downloads activity is starts
* allow enqueue failed downloads
* new option, queue limit, enabled by default. Used to allow one or multiple downloads at same time
Miscellaneous:
* fix crash while selecting details/error menu (mistake on MissionFragment.java)
* misc serialize changes (DownloadMission.java)
* minor UI tweaks
* allow overwrite paused downloads
* fix wrong icons for grid/list button in downloads
* add share option
* implement #2006
* correct misspelled word in strings.xml (es) (cmn)
* fix MissionAdapter crash during device shutdown
New Mp4Muxer + required changes:
* new mp4 muxer (from dash only) with this, muxing on Android 7 is possible now!!!
* re-work in SharpStream
* drop mp4 dash muxer
* misc changes: add warning in SecondaryStreamHelper.java,
* strip m4a DASH files to normal m4a format (youtube only)
Fix storage issues:
* warn to the user if is choosing a "read only" download directory (for external SD Cards), useless is rooted :)
* "write proof" allow post-processing resuming only if the device ran out of space
* implement "insufficient storage" error for downloads
2019-03-23 01:54:07 +00:00
|
|
|
case MPEG_4:// ¿is mpeg-4 DASH?
|
2018-11-20 22:10:50 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean m4v = videoStream.getFormat() == MediaFormat.MPEG_4;
|
|
|
|
|
|
|
|
for (AudioStream audio : audioStreams) {
|
|
|
|
if (audio.getFormat() == (m4v ? MediaFormat.M4A : MediaFormat.WEBMA)) {
|
|
|
|
return audio;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// retry, but this time in reverse order
|
|
|
|
for (int i = audioStreams.size() - 1; i >= 0; i--) {
|
|
|
|
AudioStream audio = audioStreams.get(i);
|
|
|
|
if (audio.getFormat() == (m4v ? MediaFormat.MP3 : MediaFormat.OPUS)) {
|
|
|
|
return audio;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|