feat: migrate to new revanced api (#153)

* feat: migrate to new revanced api

* feat(download): migrate to /releases endpoint
This commit is contained in:
Ushie 2023-08-01 01:16:29 +03:00 committed by GitHub
parent a7c4b8f2e0
commit b9e50cf8d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 76 deletions

2
.env
View File

@ -1 +1 @@
RV_API_URL="https://releases.revanced.app" RV_API_URL="https://api.revanced.app"

View File

@ -1,11 +1,11 @@
import * as settings from './settings'; import * as settings from './settings';
// API Endpoints // API Endpoints
import type { Patch, Repository, Tool } from '$lib/types'; import type { Patch, Repository, Metadata, Asset } from '$lib/types';
export type ReposData = Repository[]; export type ReposData = Repository[];
export type PatchesData = { patches: Patch[]; packages: string[] }; export type PatchesData = { patches: Patch[]; packages: string[] };
export type ToolsData = { [repo: string]: Tool }; export type ReleaseData = { metadata: Metadata; assets: Asset[] };
async function get_json(endpoint: string) { async function get_json(endpoint: string) {
const url = `${settings.api_base_url()}/${endpoint}`; const url = `${settings.api_base_url()}/${endpoint}`;
@ -16,48 +16,20 @@ async function repositories(): Promise<ReposData> {
return await get_json('contributors').then((json) => json.repositories); return await get_json('contributors').then((json) => json.repositories);
} }
async function tools(): Promise<ToolsData> { async function manager(): Promise<ReleaseData> {
const json = await get_json('tools'); const json = await get_json('v2/revanced-manager/releases/latest');
// Make the data easier to work with. // console.log(json.release.metadata.tag_name);
let map: Map<string, Tool> = new Map(); console.log(json.release.assets[0].browser_download_url);
for (const tool of json['tools']) { return { metadata: json.release.metadata, assets: json.release.assets };
const repo: string = tool.repository;
if (!map.has(repo)) {
map.set(repo, {
version: tool.version,
repository: repo,
// Just use the timestamp of the first one we find.
timestamp: tool.timestamp,
assets: []
});
}
let value = map.get(repo)!!;
value.assets.push({
name: tool.name,
size: tool.size,
url: tool.browser_download_url,
content_type: tool.content_type
});
map.set(repo, value);
}
return Object.fromEntries(map);
}
async function manager(): Promise<Tool> {
return await tools().then((data) => data['revanced/revanced-manager']);
} }
async function patches(): Promise<PatchesData> { async function patches(): Promise<PatchesData> {
const json = await get_json('patches'); const json = await get_json('v2/patches/latest');
const packagesWithCount: { [key: string]: number } = {}; const packagesWithCount: { [key: string]: number } = {};
// gets packages and patch count // gets packages and patch count
for (let i = 0; i < json.length; i++) { for (let i = 0; i < json.patches.length; i++) {
json[i].compatiblePackages.forEach((pkg: Patch) => { json.patches[i].compatiblePackages.forEach((pkg: Patch) => {
packagesWithCount[pkg.name] = (packagesWithCount[pkg.name] || 0) + 1; packagesWithCount[pkg.name] = (packagesWithCount[pkg.name] || 0) + 1;
}); });
} }
@ -67,7 +39,7 @@ async function patches(): Promise<PatchesData> {
.sort((a, b) => b[1] - a[1]) .sort((a, b) => b[1] - a[1])
.map((pkg) => pkg[0]); .map((pkg) => pkg[0]);
return { patches: json, packages }; return { patches: json.patches, packages };
} }
export const staleTime = 5 * 60 * 1000; export const staleTime = 5 * 60 * 1000;

View File

@ -1,49 +1,49 @@
export interface Contributor { export interface Contributor {
login: string; login: string;
avatar_url: string; avatar_url: string;
html_url: string; html_url: string;
} }
export interface Repository { export interface Repository {
name: string; name: string;
contributors: Contributor[]; contributors: Contributor[];
} }
export interface Patch { export interface Patch {
name: string; name: string;
description: string; description: string;
version: string; version: string;
excluded: boolean; excluded: boolean;
deprecated: boolean; dependencies: string[];
dependencies: string[]; options: PatchOption[];
options: PatchOption[]; compatiblePackages: CompatiblePackage[];
compatiblePackages: CompatiblePackage[];
} }
export interface CompatiblePackage { export interface CompatiblePackage {
name: string; name: string;
versions: string[]; versions: string[];
} }
export interface PatchOption { export interface PatchOption {
key: string; key: string;
title: string; title: string;
description: string; description: string;
required: boolean; required: boolean;
choices: string[]; choices: string[];
} }
export interface Asset { export interface Asset {
name: string; name: string;
size: string|null; content_type: string;
url: string; browser_download_url: string;
content_type: string; }
};
export interface Tool {
repository: string;
version: string;
timestamp: string;
assets: Asset[];
};
export interface Metadata {
tag_name: string;
name: string;
draft: boolean;
prerelease: boolean;
created_at: string;
published_at: string;
body: string;
}

View File

@ -52,7 +52,7 @@
<Query {query} let:data> <Query {query} let:data>
<Button <Button
type="text" type="text"
href={data.assets[0].url} href={data.assets[0].browser_download_url}
download download
on:click={() => (warningDialogue = false)}>Okay</Button on:click={() => (warningDialogue = false)}>Okay</Button
> >
@ -68,17 +68,17 @@
<Query {query} let:data> <Query {query} let:data>
{#if !isAndroid || androidVersion < 8} {#if !isAndroid || androidVersion < 8}
<Button on:click={handleClick} type="filled" icon="download"> <Button on:click={handleClick} type="filled" icon="download">
{data.version} {data.metadata.tag_name}
</Button> </Button>
{:else} {:else}
<Button <Button
on:click={handleClick} on:click={handleClick}
type="filled" type="filled"
icon="download" icon="download"
href={data.assets[0].url} href={data.assets[0].browser_download_url}
download download
> >
{data.version} {data.metadata.tag_name}
</Button> </Button>
{/if} {/if}
</Query> </Query>