exception is passed to onFailure

This commit is contained in:
sunmisc
2024-02-15 18:49:14 +03:00
parent 287af14589
commit bbc4aa98f7
8 changed files with 76 additions and 44 deletions
@@ -1,9 +1,12 @@
package ru.vtosters.lite.music.callback;
import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.vtosters.lite.R;
import ru.vtosters.lite.downloaders.notifications.NotificationChannels;
import ru.vtosters.lite.music.interfaces.Callback;
import ru.vtosters.lite.utils.AndroidUtils;
@@ -40,12 +43,12 @@ public class MusicCallbackBuilder {
} catch (UnsatisfiedLinkError e) {
Log.e("AudioDownloader", "native libs");
Log.e("AudioDownloader", e.getMessage());
onFailure();
onFailure(e);
}
}
@Override
public void onFailure() {
public void onFailure(Throwable e) {
notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build());
}
@@ -77,7 +80,7 @@ public class MusicCallbackBuilder {
}
@Override
public void onFailure() {
public void onFailure(Throwable e) {
notification.setContentText(AndroidUtils.getString(R.string.load_audio_error)).setProgress(0, 0, false);
notificationManager.notify(notificationId, notification.build());
}
@@ -2,8 +2,6 @@ package ru.vtosters.lite.music.downloader;
import com.vk.dto.music.MusicTrack;
import java.io.IOException;
import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.music.interfaces.Callback;
import ru.vtosters.lite.music.interfaces.ITrackDownloader;
@@ -18,16 +16,36 @@ public final class CachedDownloader implements ITrackDownloader {
@Override
public void downloadTrack(MusicTrack track, Callback callback) {
var d = new Callback.CompletableFutureCallback(callback);
origin.downloadTrack(track, d);
d.thenAccept(result -> {
try {
ThumbnailDownloader.downloadThumbnails(track);
public void download(MusicTrack track, Callback callback) {
origin.download(track, new Callback() {
@Override
public void onProgress(int progress) { }
@Override
public void onSuccess() {
new ThumbnailDownloader().download(track, new Callback() {
@Override public void onProgress(int progress) {}
@Override public void onSuccess() {}
@Override
public void onFailure(Throwable e) {
callback.onFailure(e);
}
@Override public void onSizeReceived(long size, long header) {}
});
MusicCacheImpl.addTrack(track);
} catch (IOException e) {
callback.onFailure();
throw new RuntimeException(e);
}
@Override
public void onFailure(Throwable e) {
callback.onFailure(e);
}
@Override
public void onSizeReceived(long size, long header) {
callback.onSizeReceived(size, header);
}
});
}
@@ -24,7 +24,7 @@ public final class Mp3Downloader implements ITrackDownloader {
}
@Override
public void downloadTrack(MusicTrack track, Callback callback) {
public void download(MusicTrack track, Callback callback) {
String uri = track.D;
if (Objects.requireNonNull(uri).isEmpty()) {
String msg = "link error: " +
@@ -48,7 +48,7 @@ public final class Mp3Downloader implements ITrackDownloader {
callback.onProgress(100);
callback.onSuccess();
} else
callback.onFailure();
callback.onFailure(new RuntimeException(session.getLogsAsString()));
}, log -> callback.onProgress(Math.min(100, progress.incrementAndGet())),
statistics -> {}
);
@@ -59,8 +59,8 @@ public class PlaylistDownloader {
}
@Override
public void onFailure() {
origin.onFailure();
public void onFailure(Throwable e) {
origin.onFailure(e);
}
@Override public void onSizeReceived(long size, long header) {}
@@ -1,18 +1,23 @@
package ru.vtosters.lite.music.downloader;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import com.vk.dto.music.MusicTrack;
import org.json.JSONArray;
import org.json.JSONObject;
import ru.vtosters.lite.utils.IOUtils;
import ru.vtosters.lite.utils.music.MusicCacheStorageUtils;
import java.io.IOException;
import java.net.URL;
public class ThumbnailDownloader {
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import ru.vtosters.lite.music.interfaces.Callback;
import ru.vtosters.lite.music.interfaces.ITrackDownloader;
import ru.vtosters.lite.utils.IOUtils;
import ru.vtosters.lite.utils.music.MusicCacheStorageUtils;
public static void downloadThumbnails(MusicTrack track) throws IOException {
public final class ThumbnailDownloader implements ITrackDownloader {
@Override
public void download(MusicTrack track, Callback callback) {
JSONObject json = track.J();
JSONObject album = json.optJSONObject("album");
if (album == null) return;
@@ -20,24 +25,30 @@ public class ThumbnailDownloader {
if (thumb == null) return;
JSONArray sizes = thumb.optJSONArray("sizes");
String trackId = LibVKXClient.asId(track);
if (sizes == null) {
JSONArray names = thumb.names();
if (names == null) return;
for (int i = 0; i < names.length(); ++i) {
String name = names.optString(i);
downloadThumbnail(thumb.optString(name), Integer.parseInt(name.substring(6)), trackId);
}
} else {
for (int i = 0; i < sizes.length(); ++i) {
JSONObject size = sizes.optJSONObject(i);
int width = size.optInt("width");
String src = size.optString("src");
downloadThumbnail(src, width, trackId);
try {
if (sizes == null) {
JSONArray names = thumb.names();
if (names == null) return;
for (int i = 0; i < names.length(); ++i) {
String name = names.optString(i);
downloadThumbnail(thumb.optString(name), Integer.parseInt(name.substring(6)), trackId);
}
} else {
for (int i = 0; i < sizes.length(); ++i) {
JSONObject size = sizes.optJSONObject(i);
int width = size.optInt("width");
String src = size.optString("src");
downloadThumbnail(src, width, trackId);
}
}
callback.onSuccess();
} catch (IOException e) {
callback.onFailure(e);
throw new RuntimeException(e);
}
}
private static void downloadThumbnail(String url, int res, String trackId) throws IOException {
IOUtils.writeToFile(MusicCacheStorageUtils.getTrackThumb(trackId, res), IOUtils.readFully(new URL(url).openStream()));
}
}
@@ -24,7 +24,7 @@ public final class TrackDownloader {
else
Log.e("TrackDownloader", "Directory creation failed");
}
new Mp3Downloader(outDir).downloadTrack(track, callback);
new Mp3Downloader(outDir).download(track, callback);
}
public static void
@@ -36,6 +36,6 @@ public final class TrackDownloader {
new CachedDownloader(
new Mp3Downloader(path)
).downloadTrack(track, callback);
).download(track, callback);
}
}
@@ -7,7 +7,7 @@ public interface Callback {
void onSuccess();
void onFailure();
void onFailure(Throwable e);
void onSizeReceived(long size, long header);
@@ -33,9 +33,9 @@ public interface Callback {
}
@Override
public void onFailure() {
completeExceptionally(new RuntimeException("callback failed"));
origin.onFailure();
public void onFailure(Throwable e) {
completeExceptionally(e);
origin.onFailure(e);
}
@Override
@@ -12,5 +12,5 @@ public interface ITrackDownloader {
* @param track Music track
* @param callback Callback to call when download status changes
*/
void downloadTrack(MusicTrack track, Callback callback);
void download(MusicTrack track, Callback callback);
}