fix arm64 get m3u8
This commit is contained in:
parent
af4fba9a9c
commit
f7701e2cf4
158
agent-arm64.js
158
agent-arm64.js
@ -131,52 +131,6 @@ function getKdContext(adamId, uri) {
|
|||||||
return kdContext;
|
return kdContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getM3U8Url(adamId) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
Java.perform(() => {
|
|
||||||
try {
|
|
||||||
const SVPlaybackLeaseManagerProxy = Java.use("com.apple.android.music.playback.SVPlaybackLeaseManagerProxy");
|
|
||||||
const MediaAssetInfo = SVPlaybackLeaseManagerProxy.requestAsset(parseInt(adamId), "", ["HLS"], false);
|
|
||||||
resolve(MediaAssetInfo ? MediaAssetInfo.getDownloadUrl() : null);
|
|
||||||
} catch (e) {
|
|
||||||
console.error("Error calling requestAsset:", e);
|
|
||||||
resolve(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getM3U8UrlFromDownload(adamId) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
Java.perform(() => {
|
|
||||||
const N = Java.use("com.apple.android.storeservices.v2.N");
|
|
||||||
const data = N.a().j();
|
|
||||||
const PurchaseRequestPtr = Java.use("com.apple.android.storeservices.javanative.account.PurchaseRequest$PurchaseRequestPtr");
|
|
||||||
|
|
||||||
const request = Java.cast(data, Java.use("com.apple.android.storeservices.storeclient.g"));
|
|
||||||
const create = PurchaseRequestPtr.create(request.n.value);
|
|
||||||
create.get().setProcessDialogActions(true);
|
|
||||||
create.get().setURLBagKey("subDownload");
|
|
||||||
create.get().setBuyParameters(`salableAdamId=${adamId}&price=0&pricingParameters=SUBS&productType=S`);
|
|
||||||
try {
|
|
||||||
create.get().run();
|
|
||||||
const response = create.get().getResponse();
|
|
||||||
if (response.get().getError().get() == null) {
|
|
||||||
const item = response.get().getItems().get(0);
|
|
||||||
const assets = item.get().getAssets();
|
|
||||||
resolve(assets.get(assets.size() - 1).get().getURL());
|
|
||||||
} else {
|
|
||||||
console.error("Download failed", response.get().getError().get().errorCode());
|
|
||||||
resolve(null);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error during download", error);
|
|
||||||
resolve(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleDecryptionConnection(socket) {
|
async function handleDecryptionConnection(socket) {
|
||||||
try {
|
try {
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -214,38 +168,94 @@ async function handleDecryptionConnection(socket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global.getM3U8fromDownload = function(adamID) {
|
||||||
async function handleM3U8Connection(socket) {
|
var C8717f
|
||||||
try {
|
Java.choose("of.f", {
|
||||||
const adamIdSizeBuffer = await socket.input.readAll(1);
|
onMatch: function (x) {
|
||||||
if (adamIdSizeBuffer.byteLength === 0) {
|
C8717f = x
|
||||||
console.warn("Empty adamId size received");
|
},
|
||||||
return;
|
onComplete: function (x) {}
|
||||||
}
|
});
|
||||||
|
var response = C8717f.q(0, "", adamID, false)
|
||||||
const adamIdSize = adamIdSizeBuffer.unwrap().readU8();
|
if (response.get().getError().get() == null){
|
||||||
if (adamIdSize > 0) {
|
var item = response.get().getItems().get(0)
|
||||||
const adamIdBuffer = await socket.input.readAll(adamIdSize);
|
var assets = item.get().getAssets()
|
||||||
const adamId = String.fromCharCode(...new Uint8Array(adamIdBuffer));
|
var size = assets.size()
|
||||||
|
return assets.get(size - 1).get().getURL()
|
||||||
let m3u8Url = await getM3U8Url(adamId);
|
|
||||||
if (!m3u8Url) {
|
|
||||||
m3u8Url = await getM3U8UrlFromDownload(adamId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m3u8Url) {
|
|
||||||
const m3u8Array = new TextEncoder().encode(m3u8Url + "\n");
|
|
||||||
await socket.output.writeAll(m3u8Array);
|
|
||||||
} else {
|
} else {
|
||||||
console.error("Failed to retrieve M3U8 URL");
|
return response.get().getError().get().errorCode()
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const stringToByteArray = str => {
|
||||||
|
const byteArray = [];
|
||||||
|
for (let i = 0; i < str.length; ++i) {
|
||||||
|
byteArray.push(str.charCodeAt(i));
|
||||||
}
|
}
|
||||||
} catch (e) {
|
return byteArray;
|
||||||
console.error("M3U8 connection error:", e);
|
};
|
||||||
console.error(e.stack);
|
|
||||||
} finally {
|
global.getM3U8 = function(adamID) {
|
||||||
await socket.close();
|
Java.use("com.apple.android.music.common.MainContentActivity");
|
||||||
|
var SVPlaybackLeaseManagerProxy;
|
||||||
|
Java.choose("com.apple.android.music.playback.SVPlaybackLeaseManagerProxy", {
|
||||||
|
onMatch: function (x) {
|
||||||
|
SVPlaybackLeaseManagerProxy = x
|
||||||
|
},
|
||||||
|
onComplete: function (x) {}
|
||||||
|
});
|
||||||
|
var HLSParam = Java.array('java.lang.String', ["HLS"])
|
||||||
|
var MediaAssetInfo = SVPlaybackLeaseManagerProxy.requestAsset(parseInt(adamID), null, HLSParam, false)
|
||||||
|
if (MediaAssetInfo === null) {
|
||||||
|
return -1
|
||||||
}
|
}
|
||||||
|
return MediaAssetInfo.getDownloadUrl()
|
||||||
|
};
|
||||||
|
|
||||||
|
function performJavaOperations(adamID) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
Java.performNow(function () {
|
||||||
|
const url = getM3U8(adamID);
|
||||||
|
if (url === -1) {
|
||||||
|
const url = getM3U8fromDownload(adamID);
|
||||||
|
resolve(url);
|
||||||
|
} else {
|
||||||
|
resolve(url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function handleM3U8Connection(s) {
|
||||||
|
console.log("New M3U8 connection!");
|
||||||
|
try {
|
||||||
|
const adamSize = (await s.input.readAll(1)).unwrap().readU8();
|
||||||
|
if (adamSize !== 0) {
|
||||||
|
const adam = await s.input.readAll(adamSize);
|
||||||
|
const byteArray = new Uint8Array(adam);
|
||||||
|
let adamID = "";
|
||||||
|
for (let i = 0; i < byteArray.length; i++) {
|
||||||
|
adamID += String.fromCharCode(byteArray[i]);
|
||||||
|
}
|
||||||
|
console.log("adamID:", adamID);
|
||||||
|
let m3u8Url;
|
||||||
|
performJavaOperations(adamID)
|
||||||
|
.then(async (url) => {
|
||||||
|
m3u8Url = url;
|
||||||
|
console.log("M3U8 URL: ", m3u8Url);
|
||||||
|
const m3u8Array = stringToByteArray(m3u8Url + "\n");
|
||||||
|
// console.log("M3U8 ARRAY:", m3u8Array);
|
||||||
|
await s.output.writeAll(m3u8Array);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Error performing Java operations:", error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error handling M3U8 connection:", err);
|
||||||
|
}
|
||||||
|
await s.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
function initializeFridaFunctions(androidappmusic) {
|
function initializeFridaFunctions(androidappmusic) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user