1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2024-06-22 21:23:19 +00:00

misc changes

* implement socket timeout error
* use 128k buffer size for copy
* use NewPipe HTTP user agent in the downloads
* automatically recover downloads with network errors that are queued
This commit is contained in:
kapodamy 2019-04-17 18:17:24 -03:00
parent 16d6bda85d
commit d1573a0a6e
16 changed files with 46 additions and 15 deletions

View File

@ -28,7 +28,7 @@ public class DownloadInitializer extends Thread {
@Override
public void run() {
if (mMission.current > 0) mMission.resetState(false,true, DownloadMission.ERROR_NOTHING);
if (mMission.current > 0) mMission.resetState(false, true, DownloadMission.ERROR_NOTHING);
int retryCount = 0;
while (true) {

View File

@ -4,11 +4,14 @@ import android.os.Handler;
import android.os.Message;
import android.util.Log;
import org.schabi.newpipe.Downloader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
@ -45,6 +48,7 @@ public class DownloadMission extends Mission {
public static final int ERROR_POSTPROCESSING_HOLD = 1009;
public static final int ERROR_INSUFFICIENT_STORAGE = 1010;
public static final int ERROR_PROGRESS_LOST = 1011;
public static final int ERROR_TIMEOUT = 1012;
public static final int ERROR_HTTP_NO_CONTENT = 204;
public static final int ERROR_HTTP_UNSUPPORTED_RANGE = 206;
@ -232,10 +236,9 @@ public class DownloadMission extends Mission {
URL url = new URL(urls[current]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("User-Agent", Downloader.USER_AGENT);
// BUG workaround: switching between networks can freeze the download forever
//conn.setRequestProperty("Connection", "close");
conn.setConnectTimeout(30000);
conn.setReadTimeout(10000);
@ -329,6 +332,8 @@ public class DownloadMission extends Mission {
notifyError(ERROR_CONNECT_HOST, null);
} else if (err instanceof UnknownHostException) {
notifyError(ERROR_UNKNOWN_HOST, null);
} else if (err instanceof SocketTimeoutException) {
notifyError(ERROR_TIMEOUT, null);
} else {
notifyError(ERROR_UNKNOWN_EXCEPTION, err);
}
@ -338,7 +343,7 @@ public class DownloadMission extends Mission {
Log.e(TAG, "notifyError() code = " + code, err);
if (err instanceof IOException) {
if (storage.canWrite() || err.getMessage().contains("Permission denied")) {
if (!storage.canWrite() || err.getMessage().contains("Permission denied")) {
code = ERROR_PERMISSION_DENIED;
err = null;
} else if (err.getMessage().contains("ENOSPC")) {
@ -349,7 +354,19 @@ public class DownloadMission extends Mission {
errCode = code;
errObject = err;
enqueued = false;
switch (code) {
case ERROR_SSL_EXCEPTION:
case ERROR_UNKNOWN_HOST:
case ERROR_CONNECT_HOST:
case ERROR_TIMEOUT:
// do not change the queue flag for network errors, can be
// recovered silently without the user interaction
break;
default:
// also checks for server errors
if (code < 500 || code > 599) enqueued = false;
}
pause();

View File

@ -27,7 +27,6 @@ public class DownloadRunnable extends Thread {
if (mission == null) throw new NullPointerException("mission is null");
mMission = mission;
mId = id;
mConn = null;
}
@Override

View File

@ -1,6 +1,5 @@
package us.shandian.giga.get;
import android.annotation.SuppressLint;
import android.support.annotation.NonNull;
import android.util.Log;
@ -19,7 +18,7 @@ import static org.schabi.newpipe.BuildConfig.DEBUG;
* Single-threaded fallback mode
*/
public class DownloadRunnableFallback extends Thread {
private static final String TAG = "DownloadRunnableFallback";
private static final String TAG = "DownloadRunnableFallbac";
private final DownloadMission mMission;
@ -30,9 +29,6 @@ public class DownloadRunnableFallback extends Thread {
DownloadRunnableFallback(@NonNull DownloadMission mission) {
mMission = mission;
mIs = null;
mF = null;
mConn = null;
}
private void dispose() {
@ -46,7 +42,6 @@ public class DownloadRunnableFallback extends Thread {
}
@Override
@SuppressLint("LongLogTag")
public void run() {
boolean done;
@ -106,6 +101,10 @@ public class DownloadRunnableFallback extends Thread {
return;
}
if (DEBUG) {
Log.e(TAG, "got exception, retrying...", e);
}
run();// try again
return;
}

View File

@ -11,6 +11,7 @@ import java.io.IOException;
public class CircularFileWriter extends SharpStream {
private final static int QUEUE_BUFFER_SIZE = 8 * 1024;// 8 KiB
private final static int COPY_BUFFER_SIZE = 128 * 1024; // 128 KiB
private final static int NOTIFY_BYTES_INTERVAL = 64 * 1024;// 64 KiB
private final static int THRESHOLD_AUX_LENGTH = 15 * 1024 * 1024;// 15 MiB
@ -53,6 +54,7 @@ public class CircularFileWriter extends SharpStream {
aux.flush();
boolean underflow = aux.offset < aux.length || out.offset < out.length;
byte[] buffer = new byte[COPY_BUFFER_SIZE];
aux.target.seek(0);
out.target.seek(out.length);
@ -60,14 +62,14 @@ public class CircularFileWriter extends SharpStream {
long length = amount;
while (length > 0) {
int read = (int) Math.min(length, Integer.MAX_VALUE);
read = aux.target.read(aux.queue, 0, Math.min(read, aux.queue.length));
read = aux.target.read(buffer, 0, Math.min(read, buffer.length));
if (read < 1) {
amount -= length;
break;
}
out.writeProof(aux.queue, read);
out.writeProof(buffer, read);
length -= read;
}
@ -100,7 +102,6 @@ public class CircularFileWriter extends SharpStream {
// move the excess data to the beginning of the file
long readOffset = amount;
long writeOffset = 0;
byte[] buffer = new byte[128 * 1024]; // 128 KiB
aux.length -= amount;
length = aux.length;

View File

@ -73,6 +73,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_HOLD;
import static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_STOPPED;
import static us.shandian.giga.get.DownloadMission.ERROR_PROGRESS_LOST;
import static us.shandian.giga.get.DownloadMission.ERROR_SSL_EXCEPTION;
import static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT;
import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION;
import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST;
@ -487,6 +488,9 @@ public class MissionAdapter extends Adapter<ViewHolder> {
case ERROR_PROGRESS_LOST:
msg = R.string.error_progress_lost;
break;
case ERROR_TIMEOUT:
msg = R.string.error_timeout;
break;
default:
if (mission.errCode >= 100 && mission.errCode < 600) {
msgEx = "HTTP " + mission.errCode;

View File

@ -472,4 +472,5 @@
<string name="pause_downloads_on_mobile_desc">Downloads, die nicht pausiert werden können, werden wiederholt</string>
<string name="conferences">Konferenzen</string>
<string name="events">Ereignisse</string>
<string name="error_timeout">Verbindungszeitüberschreitung</string>
</resources>

View File

@ -457,6 +457,7 @@ abrir en modo popup</string>
<string name="error_postprocessing_stopped">NewPipe se cerro mientras se trabajaba en el archivo</string>
<string name="error_insufficient_storage">No hay suficiente espacio disponible en el dispositivo</string>
<string name="error_progress_lost">Se perdió el progreso porque el archivo fue eliminado</string>
<string name="error_timeout">Tiempo de espera excedido</string>
<string name="downloads_storage">API de almacenamiento</string>
<string name="downloads_storage_desc">Seleccione que API utilizar para almacenar las descargas</string>

View File

@ -468,4 +468,5 @@
<string name="max_retry_desc">Deskarga ezeztatu aurretik saiatu beharreko aldi kopurua</string>
<string name="pause_downloads_on_mobile">Pausatu datu mugikorretara aldatzean</string>
<string name="pause_downloads_on_mobile_desc">Pausatu ezin daitezkeen deskargak berrekingo dira</string>
<string name="error_timeout">Konexioaren denbora muga</string>
</resources>

View File

@ -440,6 +440,7 @@
<string name="missions_header_pending">Dans la file d\'attente</string>
<string name="paused">En pause</string>
<string name="download_failed">Téléchargement échoué</string>
<string name="error_timeout">Délai de connection dépassé</string>
<string name="conferences">Conférences</string>
<string name="download_finished">Téléchargement terminé</string>
<string name="download_finished_more">%s téléchargements terminés</string>

View File

@ -473,4 +473,5 @@
<string name="pause_downloads_on_mobile_desc">I download che non possono essere messi in pausa verranno riavviati</string>
<string name="events">Eventi</string>
<string name="conferences">Conferenze</string>
<string name="error_timeout">Connesione finita</string>
</resources>

View File

@ -464,4 +464,6 @@
<string name="msg_pending_downloads">ダウンロードから %s の保留中の転送を続行します</string>
<string name="pause_downloads_on_mobile">モバイルデータ通信に切り替え時に休止</string>
<string name="pause_downloads_on_mobile_desc">休止できないダウンロードが再開されます</string>
<string name="missions_header_pending">保留中</string>
<string name="error_timeout">接続タイムアウト</string>
</resources>

View File

@ -473,4 +473,5 @@
<string name="pause_downloads_on_mobile_desc">Downloads die niet kunnen worden gepauzeerd zullen worden herstart</string>
<string name="events">Gebeurtenissen</string>
<string name="conferences">Conferenties</string>
<string name="error_timeout">Time-out van verbinding</string>
</resources>

View File

@ -473,4 +473,5 @@
<string name="pause_downloads_on_mobile">Останавливать скачивание при переходе на мобильную сеть</string>
<string name="close">Закрыть</string>
<string name="missions_header_pending">в ожидании</string>
<string name="error_timeout">Время соединения вышло</string>
</resources>

View File

@ -469,4 +469,5 @@
<string name="pause_downloads_on_mobile_desc">無法暫停的下載將會重新開始</string>
<string name="events">事件</string>
<string name="conferences">會議</string>
<string name="error_timeout">連接超時</string>
</resources>

View File

@ -534,6 +534,7 @@
<string name="error_postprocessing_stopped">NewPipe was closed while working on the file</string>
<string name="error_insufficient_storage">No space left on device</string>
<string name="error_progress_lost">Progress lost, because the file was deleted</string>
<string name="error_timeout">Connection timeout</string>
<string name="clear_finished_download">Clear finished downloads</string>
<string name="confirm_prompt">Are you sure?</string>