mirror of
https://github.com/revanced/revanced-releases-api.git
synced 2025-05-04 16:04:24 +02:00
fully implements redis cache functionality
This commit is contained in:
parent
ae423dc2fa
commit
231ce565d9
@ -1,16 +1,16 @@
|
|||||||
|
# ReVanced Releases API
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
# ReVanced Releases API
|
|
||||||
|
|
||||||
This is a simple API that returns the latest ReVanced releases.
|
This is a simple API that returns the latest ReVanced releases.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
The API is available at [https://revanced-releases-api.afterst0rm.xyz/](https://revanced-releases-api.afterst0rm.xyz/).
|
The API is available at [https://revanced-releases-api.afterst0rm.xyz/](https://revanced-releases-api.afterst0rm.xyz/).
|
||||||
|
|
||||||
For development purposes, you can run the API locally by cloning this repository and running `docker-compose up` or `docker-compose up --build` if you want to rebuild the image. Optionally you can run the application without Docker by running `pip -U install -r ./requirements.txt` and `python ./main.py`. Remember to set the environment variable `GITHUB_TOKEN` to a valid token if you want to run the API locally.
|
For development purposes, you can run the API locally by cloning this repository and running `docker-compose up` or `docker-compose up --build` if you want to rebuild the image. Optionally you can run the application without Docker by running `pip -U install -r ./requirements.txt` and `python ./main.py`. Remember to set the environment variable `GITHUB_TOKEN` to a valid token if you want to run the API locally and make sure to have a `redis` instance running.
|
||||||
|
|
||||||
### API Endpoints
|
### API Endpoints
|
||||||
|
|
||||||
|
16
config.toml
16
config.toml
@ -8,15 +8,22 @@ Changelogs are not included but can be found on the [ReVanced Repositories](http
|
|||||||
|
|
||||||
The team also have a [Discord Server](https://revanced.app/discord) if you need help.
|
The team also have a [Discord Server](https://revanced.app/discord) if you need help.
|
||||||
|
|
||||||
### API Endpoints
|
## API Endpoints
|
||||||
|
|
||||||
* [apps](/apps) - Returns all currently patchable apps
|
* [apps](/apps) - Returns all currently patchable apps
|
||||||
* [tools](/tools) - Returns the latest version of all ReVanced tools and Vanced MicroG
|
* [tools](/tools) - Returns the latest version of all ReVanced tools and Vanced MicroG
|
||||||
* [patches](/patches) - Returns the latest version of all ReVanced patches
|
* [patches](/patches) - Returns the latest version of all ReVanced patches
|
||||||
|
|
||||||
There is no cache on this API because we trust our fellow developers to implement a cache on their end.
|
## Additional Information
|
||||||
|
|
||||||
So please be kind and don't blow up the API with requests or we will have to block your IP address.
|
* Rate Limiting - 15 requests per minute
|
||||||
|
* Cache - 1 minute
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
1. Although we will try to avoid breaking changes, we can't guarantee that it won't happen.
|
||||||
|
2. Okay, the api is now cached and rate limited (per endpoint). But please don't abuse it, we don't want to have to block you.
|
||||||
|
3. Make sure to implement a cache system on your end to avoid unnecessary requests.
|
||||||
|
|
||||||
Godspeed 💀
|
Godspeed 💀
|
||||||
|
|
||||||
@ -37,6 +44,9 @@ port = 8000
|
|||||||
|
|
||||||
limit = "15/minute"
|
limit = "15/minute"
|
||||||
|
|
||||||
|
[cache]
|
||||||
|
expire = 60
|
||||||
|
|
||||||
[app]
|
[app]
|
||||||
|
|
||||||
repositories = ["TeamVanced/VancedMicroG", "revanced/revanced-cli", "revanced/revanced-patches", "revanced/revanced-integrations"]
|
repositories = ["TeamVanced/VancedMicroG", "revanced/revanced-cli", "revanced/revanced-patches", "revanced/revanced-integrations"]
|
@ -1,7 +1,27 @@
|
|||||||
version: "3.8"
|
version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
redis:
|
||||||
|
container_name: revanced-releases-api-redis
|
||||||
|
image: redis:latest
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
restart: always
|
||||||
revanced-releases-api:
|
revanced-releases-api:
|
||||||
container_name: revanced-releases-api
|
container_name: revanced-releases-api
|
||||||
image: alexandreteles/revanced-releases-api:latest
|
image: alexandreteles/revanced-releases-api:latest
|
||||||
restart: always
|
environment:
|
||||||
|
- REDIS_HOST=revanced-releases-api-redis
|
||||||
|
- REDIS_PORT=6379
|
||||||
|
- GITHUB_TOKEN=YOUR_GITHUB_TOKEN
|
||||||
|
ports:
|
||||||
|
- 127.0.0.1:7934:8000
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
infra:
|
||||||
|
external: true
|
28
main.py
28
main.py
@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
import toml
|
import toml
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
import aioredis
|
||||||
from fastapi import FastAPI, Request, Response
|
from fastapi import FastAPI, Request, Response
|
||||||
from modules.Releases import Releases
|
from modules.Releases import Releases
|
||||||
from fastapi.responses import RedirectResponse
|
from fastapi.responses import RedirectResponse
|
||||||
@ -12,13 +14,20 @@ from slowapi.errors import RateLimitExceeded
|
|||||||
from fastapi_cache import FastAPICache
|
from fastapi_cache import FastAPICache
|
||||||
from fastapi_cache.backends.redis import RedisBackend
|
from fastapi_cache.backends.redis import RedisBackend
|
||||||
from fastapi_cache.decorator import cache
|
from fastapi_cache.decorator import cache
|
||||||
import aioredis
|
|
||||||
|
|
||||||
"""Get latest ReVanced releases from GitHub API."""
|
"""Get latest ReVanced releases from GitHub API."""
|
||||||
|
|
||||||
# Load config
|
# Load config
|
||||||
|
|
||||||
config = toml.load("config.toml")
|
config: dict = toml.load("config.toml")
|
||||||
|
|
||||||
|
# Redis connection parameters
|
||||||
|
|
||||||
|
redis_config: dict[ str, str | int ] = {
|
||||||
|
"url": f"redis://{os.environ['REDIS_URL']}",
|
||||||
|
"port": os.environ['REDIS_PORT'],
|
||||||
|
"collection": 0
|
||||||
|
}
|
||||||
|
|
||||||
# Create releases instance
|
# Create releases instance
|
||||||
|
|
||||||
@ -42,7 +51,7 @@ app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
|
|||||||
# Setup cache
|
# Setup cache
|
||||||
|
|
||||||
@cache()
|
@cache()
|
||||||
async def get_cache():
|
async def get_cache() -> int:
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
# Routes
|
# Routes
|
||||||
@ -59,7 +68,7 @@ async def root(request: Request, response: Response) -> RedirectResponse:
|
|||||||
|
|
||||||
@app.get('/tools', response_model=ResponseModels.ToolsResponseModel)
|
@app.get('/tools', response_model=ResponseModels.ToolsResponseModel)
|
||||||
@limiter.limit(config['slowapi']['limit'])
|
@limiter.limit(config['slowapi']['limit'])
|
||||||
@cache(expire=60)
|
@cache(config['cache']['expire'])
|
||||||
async def tools(request: Request, response: Response) -> dict:
|
async def tools(request: Request, response: Response) -> dict:
|
||||||
"""Get patching tools' latest version.
|
"""Get patching tools' latest version.
|
||||||
|
|
||||||
@ -70,7 +79,7 @@ async def tools(request: Request, response: Response) -> dict:
|
|||||||
|
|
||||||
@app.get('/apps', response_model=ResponseModels.AppsResponseModel)
|
@app.get('/apps', response_model=ResponseModels.AppsResponseModel)
|
||||||
@limiter.limit(config['slowapi']['limit'])
|
@limiter.limit(config['slowapi']['limit'])
|
||||||
@cache(expire=60)
|
@cache(config['cache']['expire'])
|
||||||
async def apps(request: Request, response: Response) -> dict:
|
async def apps(request: Request, response: Response) -> dict:
|
||||||
"""Get patchable apps.
|
"""Get patchable apps.
|
||||||
|
|
||||||
@ -81,7 +90,7 @@ async def apps(request: Request, response: Response) -> dict:
|
|||||||
|
|
||||||
@app.get('/patches', response_model=ResponseModels.PatchesResponseModel)
|
@app.get('/patches', response_model=ResponseModels.PatchesResponseModel)
|
||||||
@limiter.limit(config['slowapi']['limit'])
|
@limiter.limit(config['slowapi']['limit'])
|
||||||
@cache(expire=60)
|
@cache(config['cache']['expire'])
|
||||||
async def patches(request: Request, response: Response) -> dict:
|
async def patches(request: Request, response: Response) -> dict:
|
||||||
"""Get latest patches.
|
"""Get latest patches.
|
||||||
|
|
||||||
@ -92,10 +101,13 @@ async def patches(request: Request, response: Response) -> dict:
|
|||||||
return await releases.get_patches_json()
|
return await releases.get_patches_json()
|
||||||
|
|
||||||
@app.on_event("startup")
|
@app.on_event("startup")
|
||||||
async def startup():
|
async def startup() -> None:
|
||||||
redis = aioredis.from_url("redis://localhost", encoding="utf8", decode_responses=True)
|
redis_url = f"{redis_config['url']}:{redis_config['port']}/{redis_config['collection']}"
|
||||||
|
redis = aioredis.from_url(redis_url, encoding="utf8", decode_responses=True)
|
||||||
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
|
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
# Run app
|
# Run app
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
uvicorn.run(app, host=config['uvicorn']['host'], port=config['uvicorn']['port'])
|
uvicorn.run(app, host=config['uvicorn']['host'], port=config['uvicorn']['port'])
|
@ -18,7 +18,7 @@ class CompatiblePackagesResponseFields(BaseModel):
|
|||||||
BaseModel (pydantic.BaseModel): BaseModel from pydantic
|
BaseModel (pydantic.BaseModel): BaseModel from pydantic
|
||||||
"""
|
"""
|
||||||
name: str
|
name: str
|
||||||
verstions: list[ str ] | None
|
versions: list[ str ] | None
|
||||||
class PatchesResponseFields(BaseModel):
|
class PatchesResponseFields(BaseModel):
|
||||||
"""Implements the fields for the /patches endpoint.
|
"""Implements the fields for the /patches endpoint.
|
||||||
|
|
||||||
|
@ -1,13 +1,24 @@
|
|||||||
---
|
---
|
||||||
version: "3.8"
|
version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
redis:
|
||||||
|
container_name: revanced-releases-api-redis
|
||||||
|
image: redis:latest
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
networks:
|
||||||
|
- infra
|
||||||
|
restart: always
|
||||||
revanced-releases-api:
|
revanced-releases-api:
|
||||||
image: alexandreteles/revanced-releases-api:latest
|
|
||||||
container_name: revanced-releases-api
|
container_name: revanced-releases-api
|
||||||
|
image: alexandreteles/revanced-releases-api:latest
|
||||||
environment:
|
environment:
|
||||||
- GITHUB_TOKEN=
|
- REDIS_HOST=revanced-releases-api-redis
|
||||||
|
- REDIS_PORT=6379
|
||||||
|
- GITHUB_TOKEN=YOUR_GITHUB_TOKEN
|
||||||
ports:
|
ports:
|
||||||
- 127.0.0.1:8000:8000
|
- 127.0.0.1:7934:8000
|
||||||
networks:
|
networks:
|
||||||
- infra
|
- infra
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
Loading…
x
Reference in New Issue
Block a user