mirror of
https://github.com/hydralauncher/hydra.git
synced 2026-01-20 17:53:55 +00:00
feat: add support for VikingFile and display if link is available
This commit is contained in:
@@ -8,6 +8,7 @@ import {
|
||||
DatanodesApi,
|
||||
MediafireApi,
|
||||
PixelDrainApi,
|
||||
VikingFileApi,
|
||||
} from "../hosters";
|
||||
import { PythonRPC } from "../python-rpc";
|
||||
import {
|
||||
@@ -499,6 +500,29 @@ export class DownloadManager {
|
||||
allow_multiple_connections: true,
|
||||
};
|
||||
}
|
||||
case Downloader.VikingFile: {
|
||||
logger.log(
|
||||
`[DownloadManager] Processing VikingFile download for URI: ${download.uri}`
|
||||
);
|
||||
try {
|
||||
const downloadUrl = await VikingFileApi.getDownloadUrl(download.uri);
|
||||
logger.log(`[DownloadManager] VikingFile direct URL obtained`);
|
||||
return {
|
||||
action: "start",
|
||||
game_id: downloadId,
|
||||
url: downloadUrl,
|
||||
save_path: download.downloadPath,
|
||||
header:
|
||||
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
`[DownloadManager] Error processing VikingFile download:`,
|
||||
error
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,3 +5,4 @@ export * from "./mediafire";
|
||||
export * from "./pixeldrain";
|
||||
export * from "./buzzheavier";
|
||||
export * from "./fuckingfast";
|
||||
export * from "./vikingfile";
|
||||
|
||||
51
src/main/services/hosters/vikingfile.ts
Normal file
51
src/main/services/hosters/vikingfile.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import axios from "axios";
|
||||
|
||||
interface UnlockResponse {
|
||||
link: string;
|
||||
hoster: string;
|
||||
}
|
||||
|
||||
export class VikingFileApi {
|
||||
private static readonly browserHeaders = {
|
||||
"User-Agent":
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
|
||||
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
||||
Referer: "https://vikingfile.com/",
|
||||
};
|
||||
|
||||
public static async getDownloadUrl(uri: string): Promise<string> {
|
||||
const unlockResponse = await axios.post<UnlockResponse>(
|
||||
`${import.meta.env.MAIN_VITE_NIMBUS_API_URL}/hosters/unlock`,
|
||||
{ url: uri }
|
||||
);
|
||||
|
||||
if (!unlockResponse.data.link) {
|
||||
throw new Error("Failed to unlock VikingFile URL");
|
||||
}
|
||||
|
||||
const redirectUrl = unlockResponse.data.link;
|
||||
|
||||
// Follow the redirect to get the final Cloudflare storage URL
|
||||
try {
|
||||
const redirectResponse = await axios.head(redirectUrl, {
|
||||
headers: this.browserHeaders,
|
||||
maxRedirects: 0,
|
||||
validateStatus: (status) =>
|
||||
status === 301 || status === 302 || status === 200,
|
||||
});
|
||||
|
||||
if (
|
||||
redirectResponse.headers.location ||
|
||||
redirectResponse.status === 301 ||
|
||||
redirectResponse.status === 302
|
||||
) {
|
||||
return redirectResponse.headers.location || redirectUrl;
|
||||
}
|
||||
|
||||
return redirectUrl;
|
||||
} catch (error) {
|
||||
// Fallback to the redirect URL if following redirect fails
|
||||
return redirectUrl;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user