From 10f5225f514a03b2532ec430b5caace6c6049b92 Mon Sep 17 00:00:00 2001 From: Alexandre Teles Date: Tue, 21 Nov 2023 00:10:22 -0300 Subject: [PATCH] feat: remove appinfo capabilities --- api/apkdl.py | 32 ---------------------- api/backends/apkdl.py | 64 ------------------------------------------- api/models/appinfo.py | 19 ------------- 3 files changed, 115 deletions(-) delete mode 100644 api/apkdl.py delete mode 100644 api/backends/apkdl.py delete mode 100644 api/models/appinfo.py diff --git a/api/apkdl.py b/api/apkdl.py deleted file mode 100644 index 54ab7a9..0000000 --- a/api/apkdl.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -This module provides a blueprint for the app endpoint. - -Routes: - - GET /app/info: Get app info. -""" - -from sanic import Blueprint, Request -from sanic.response import JSONResponse, json -from sanic_ext import openapi - -from api.backends.apkdl import ApkDl -from api.backends.entities import AppInfo -from api.models.appinfo import AppInfoModel - -from config import api_version - -apkdl: Blueprint = Blueprint("app", version=api_version) - -apkdl_backend: ApkDl = ApkDl() - - -@apkdl.get("/app/info/") -@openapi.definition( - summary="Get information about an app", - response=[AppInfoModel], -) -async def root(request: Request, app_id: str) -> JSONResponse: - data: dict[str, AppInfo] = { - "app_info": await apkdl_backend.get_app_info(package_name=app_id) - } - return json(data, status=200) diff --git a/api/backends/apkdl.py b/api/backends/apkdl.py deleted file mode 100644 index db19934..0000000 --- a/api/backends/apkdl.py +++ /dev/null @@ -1,64 +0,0 @@ -from base64 import b64encode - -from aiohttp import ClientResponse -from bs4 import BeautifulSoup -from sanic import SanicException -from toolz.functoolz import compose - -from api.backends.backend import AppInfoProvider -from api.backends.entities import AppInfo -from api.utils.http_utils import http_get - -name: str = "apkdl" -base_url: str = "https://apk-dl.com" - - -class ApkDl(AppInfoProvider): - def __init__(self): - super().__init__(name, base_url) - - async def get_app_info(self, package_name: str) -> AppInfo: - """Fetches information about an Android app from the ApkDl website. - - Args: - package_name (str): The package name of the app to fetch. - - Returns: - AppInfo: An AppInfo object containing the name, category, and logo of the app. - - Raises: - SanicException: If the HTTP request fails or the app data is incomplete or not found. - """ - app_url: str = f"{base_url}/{package_name}" - response: ClientResponse = await http_get(headers={}, url=app_url) - if response.status != 200: - raise SanicException( - f"ApkDl: {response.status}", status_code=response.status - ) - page = BeautifulSoup(await response.read(), "lxml") - find_div_text = compose( - lambda d: d.find_next_sibling("div"), - lambda d: page.find("div", text=d), - ) - fetch_logo_url = compose( - lambda div: div.img["src"], - lambda _: page.find("div", {"class": "logo"}), - ) - logo_response: ClientResponse = await http_get( - headers={}, url=fetch_logo_url(None) - ) - logo: str = ( - f"data:image/png;base64,{b64encode(await logo_response.content.read()).decode('utf-8')}" - if logo_response.status == 200 - else "" - ) - app_data = dict( - name=find_div_text("App Name").text, - category=find_div_text("Category").text, - logo=logo, - ) - if not all(app_data.values()): - raise SanicException( - "ApkDl: App data incomplete or not found", status_code=500 - ) - return AppInfo(**app_data) diff --git a/api/models/appinfo.py b/api/models/appinfo.py deleted file mode 100644 index 9c2cf1d..0000000 --- a/api/models/appinfo.py +++ /dev/null @@ -1,19 +0,0 @@ -from pydantic import BaseModel - - -class AppInfoFields(BaseModel): - """ - Fields for the AppInfo endpoint. - """ - - name: str - category: str - logo: str - - -class AppInfoModel(BaseModel): - """ - Response model app info. - """ - - app_info: AppInfoFields