Skip to content

Commit a390a06

Browse files
committed
Use BetaHub as a fallback for obtaining firmwares
1 parent 9d431ce commit a390a06

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/main/java/airsquared/blobsaver/app/TSS.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,14 @@ private List<Utils.IOSVersion> getIOSVersions() throws TSSException {
287287
} else if (manualIpswURL != null) {
288288
return Collections.singletonList(new Utils.IOSVersion(null, null, manualIpswURL, null));
289289
} else if (includeBetas) {
290-
return Stream.concat(getSignedFirmwares(deviceIdentifier), getSignedBetas(deviceIdentifier)).toList();
290+
var signedFirmwares = getSignedFirmwares(deviceIdentifier);
291+
Stream<Utils.IOSVersion> signedBetas;
292+
try {
293+
signedBetas = getSignedBetas(deviceIdentifier);
294+
} catch (IOException e) {
295+
throw new TSSException("There was an error with the beta API; try without including beta versions.", false, e);
296+
}
297+
return Stream.concat(signedFirmwares, signedBetas).toList();
291298
} else { // all signed firmwares
292299
return getSignedFirmwares(deviceIdentifier).toList();
293300
}
@@ -299,9 +306,6 @@ private List<Utils.IOSVersion> getIOSVersions() throws TSSException {
299306
throw new TSSException(message, false, e);
300307
} catch (IOException e) {
301308
var message = "Saving blobs failed. Check your internet connection.";
302-
if (includeBetas) {
303-
message += " There may be an error with the beta API; try without including beta versions.";
304-
}
305309
throw new TSSException(message, false, e);
306310
}
307311
}

src/main/java/airsquared/blobsaver/app/Utils.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,38 @@ static void runSafe(Runnable runnable) {
353353

354354
static Stream<IOSVersion> getFirmwareList(String deviceIdentifier) throws IOException {
355355
String url = "https://api.ipsw.me/v4/device/" + deviceIdentifier;
356-
return createVersionStream(Network.makeRequest(url).getAsJsonObject().getAsJsonArray("firmwares"));
356+
try {
357+
return createVersionStream(Network.makeRequest(url).getAsJsonObject().getAsJsonArray("firmwares"));
358+
} catch (IOException e) {
359+
try {
360+
return getBetaHubList(deviceIdentifier, false);
361+
} catch (Exception ex) {
362+
e.addSuppressed(ex);
363+
throw e;
364+
}
365+
}
357366
}
358367

359368
static Stream<IOSVersion> getBetaList(String deviceIdentifier) throws IOException {
360-
String url = "https://api.m1sta.xyz/betas/" + deviceIdentifier;
361-
return createVersionStream(Network.makeRequest(url).getAsJsonArray());
369+
try {
370+
String url = "https://api.m1sta.xyz/betas/" + deviceIdentifier;
371+
return createVersionStream(Network.makeRequest(url).getAsJsonArray());
372+
} catch (Exception e) {
373+
try {
374+
return getBetaHubList(deviceIdentifier, true);
375+
} catch (Exception ex) {
376+
e.addSuppressed(ex);
377+
throw e;
378+
}
379+
}
380+
}
381+
382+
static Stream<IOSVersion> getBetaHubList(String deviceIdentifier, boolean betas) throws IOException {
383+
String url = "https://www.betahub.cn/api/apple/firmwares/" + deviceIdentifier + "?type=" + (betas ? 2 : 1);
384+
JsonArray firmwares = Network.makeRequest(url).getAsJsonObject().getAsJsonArray("firmwares");
385+
return StreamSupport.stream(firmwares.spliterator(), false)
386+
.map(JsonElement::getAsJsonObject)
387+
.map(o -> new IOSVersion(o.get("version").getAsString(), o.get("build_id").getAsString(), o.get("url").getAsString(), o.get("signing").getAsInt() == 1));
362388
}
363389

364390
private static Stream<IOSVersion> createVersionStream(JsonArray array) {
@@ -425,6 +451,7 @@ private static void extractManifestFromZip(String ipswUrl, Path extractTo) throw
425451
* <p>
426452
* Maybe replace with https://github.com/patrickfav/bytes-java ?
427453
*/
454+
@SuppressWarnings("JavadocLinkAsPlainText")
428455
public static String bytesToHex(byte[] byteArray, ByteOrder byteOrder) {
429456
final char[] lookup = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
430457

0 commit comments

Comments
 (0)