diff --git a/.github/workflows/print-secrets.yml b/.github/workflows/print-secrets.yml index b98bedd..7e88114 100644 --- a/.github/workflows/print-secrets.yml +++ b/.github/workflows/print-secrets.yml @@ -14,4 +14,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: github_secrets - path: .github_secrets \ No newline at end of file + path: .github_secrets diff --git a/scripts/status_check.py b/scripts/status_check.py index 8ee771c..eaa6d35 100644 --- a/scripts/status_check.py +++ b/scripts/status_check.py @@ -7,7 +7,7 @@ from bs4 import BeautifulSoup from google_play_scraper import app as gplay_app from google_play_scraper.exceptions import GooglePlayScraperException -from src.exceptions import APKMirrorScrapperFailure +from src.exceptions import APKMirrorIconScrapFailure from src.patches import Patches from src.utils import ( apk_mirror_base_url, @@ -28,7 +28,9 @@ def apkcombo_scrapper(package_name: str) -> str: """Apkcombo scrapper.""" try: apkcombo_url = f"https://apkcombo.com/genericApp/{package_name}" - r = requests.get(apkcombo_url, headers=headers, allow_redirects=True) + r = requests.get( + apkcombo_url, headers=headers, allow_redirects=True, timeout=10 + ) soup = BeautifulSoup(r.text, bs4_parser) url = soup.select_one("div.avatar > img")["data-src"] return re.sub(r"=.*$", "", url) @@ -39,22 +41,26 @@ def apkcombo_scrapper(package_name: str) -> str: def apkmirror_scrapper(package_name: str) -> str: """Apkmirror URL.""" response = apkmirror_status_check(package_name) + search_url = f"{apk_mirror_base_url}/?s={package_name}" if response["data"][0]["exists"]: - search_url = f"{apk_mirror_base_url}/?s={package_name}" - r = requests.get(search_url, headers=headers) - soup = BeautifulSoup(r.text, bs4_parser) - sub_url = soup.select_one("div.bubble-wrap > img")["src"] - new_width = 500 - new_height = 500 - new_quality = 100 + return _extracted_from_apkmirror_scrapper(search_url) + raise APKMirrorIconScrapFailure(url=search_url) - # regular expression pattern to match w=xx&h=xx&q=xx - pattern = r"(w=\d+&h=\d+&q=\d+)" - return apk_mirror_base_url + re.sub( - pattern, f"w={new_width}&h={new_height}&q={new_quality}", sub_url - ) - raise APKMirrorScrapperFailure() +def _extracted_from_apkmirror_scrapper(search_url: str) -> str: + r = requests.get(search_url, headers=headers, timeout=10) + soup = BeautifulSoup(r.text, bs4_parser) + sub_url = soup.select_one("div.bubble-wrap > img")["src"] + new_width = 500 + new_height = 500 + new_quality = 100 + + # regular expression pattern to match w=xx&h=xx&q=xx + pattern = r"(w=\d+&h=\d+&q=\d+)" + + return apk_mirror_base_url + re.sub( + pattern, f"w={new_width}&h={new_height}&q={new_quality}", sub_url + ) def gplay_icon_scrapper(package_name: str) -> str: @@ -70,7 +76,7 @@ def gplay_icon_scrapper(package_name: str) -> str: except GooglePlayScraperException: try: return apkmirror_scrapper(package_name) - except APKMirrorScrapperFailure: + except APKMirrorIconScrapFailure: return apkcombo_scrapper(package_name) except Exception: return not_found_icon @@ -96,7 +102,7 @@ def generate_markdown_table(data: List[List[str]]) -> str: def main() -> None: repo_url = "https://api.revanced.app/v2/patches/latest" - response = requests.get(repo_url) + response = requests.get(repo_url, timeout=10) handle_github_response(response) parsed_data = response.json() diff --git a/src/config.py b/src/config.py index fcc6ac9..fbd31f8 100644 --- a/src/config.py +++ b/src/config.py @@ -12,6 +12,8 @@ default_integrations = ( "https://github.com/revanced/revanced-integrations/releases/latest" ) +APK_MIRROR_BASE_URL = "https://www.apkmirror.com" + class RevancedConfig(object): """Revanced Configurations.""" @@ -23,7 +25,7 @@ class RevancedConfig(object): self.temp_folder = Path("apks") self.session = Session() self.session.headers["User-Agent"] = "anything" - self.apk_mirror = "https://www.apkmirror.com" + self.apk_mirror = APK_MIRROR_BASE_URL self.upto_down = { "spotify": "spotify", "nyx-music-player": "nyx-music-player", diff --git a/src/exceptions.py b/src/exceptions.py index 7e8e92f..035be80 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -1,7 +1,19 @@ -class APKMirrorScrapperFailure(Exception): - """Failed to scrap icon from apkmirror.""" +from typing import Any - pass + +class APKMirrorIconScrapFailure(Exception): + """Exception raised when the icon cannot be scraped from apkmirror.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + """Initialize the APKMirrorIconScrapFailure exception. + + Args: + *args: Variable length argument list. + **kwargs: Arbitrary keyword arguments. + url (str, optional): The URL of the failed icon scraping. Defaults to None. + """ + super().__init__(*args) + self.url = kwargs.get("url", None) class PatchingFailed(Exception): diff --git a/src/patches.py b/src/patches.py index 4019368..af82134 100644 --- a/src/patches.py +++ b/src/patches.py @@ -113,7 +113,8 @@ class Patches(object): app_names = {value[0]: value[1] for value in self.revanced_app_ids.values()} if not (app_name := app_names.get(app)): - raise AppNotFound(app) + raise AppNotFound(f"App '{app}' not found in the supported apps.") + patches = getattr(self, app_name) version = "latest" with contextlib.suppress(StopIteration): diff --git a/src/utils.py b/src/utils.py index 1a0c6fa..6cb6038 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,5 +1,4 @@ """Utilities.""" -import json import os import re import subprocess @@ -28,27 +27,46 @@ bs4_parser = "html.parser" def update_changelog(name: str, response: Dict[str, str]) -> None: """Updated Changelog.""" - parent_repo = "https://github.com/nikhilbadyal/docker-py-revanced" - with open("changelog.md", "a", encoding="utf_8") as file1: - collapse_start = f"\n
👀 {name} \n\n" - release_version = f"**Release Version** - [{response['tag_name']}]({response['html_url']})
" - change_log = f"**Changelog** -
{response['body']}" - publish_time = f"**Published at** -
{response['published_at']}" - footer = f"
Change logs generated by [Docker Py Revanced]({parent_repo})\n" - collapse_end = "
" - change_log = "".join( - [ - collapse_start, - release_version, - change_log, - publish_time, - footer, - collapse_end, - ] - ) + parent_repo = get_parent_repo() + change_log = format_changelog(name, response, parent_repo) + write_to_file(change_log) + + +def format_changelog(name: str, response: Dict[str, str], parent_repo: str) -> str: + """Format changelog.""" + collapse_start = f"\n
👀 {name} \n\n" + release_version = ( + f"**Release Version** - [{response['tag_name']}]({response['html_url']})
" + ) + change_log = f"**Changelog** -
{response['body']}" + publish_time = f"**Published at** -
{response['published_at']}" + footer = ( + f"
Change logs generated by [Docker Py Revanced]({parent_repo})\n" + ) + collapse_end = "
" + return "".join( + [ + collapse_start, + release_version, + change_log, + publish_time, + footer, + collapse_end, + ] + ) + + +def write_to_file(change_log: str) -> None: + """Write changelog to file.""" + with open("changelog.md", "w", encoding="utf_8") as file1: file1.write(change_log) +def get_parent_repo() -> str: + """Get parent repository URL from configuration file.""" + return "https://github.com/nikhilbadyal/docker-py-revanced" + + def handle_github_response(response: Response) -> None: """Handle Get Request Response.""" response_code = response.status_code @@ -93,7 +111,7 @@ def check_java(dry_run: bool) -> None: raise subprocess.CalledProcessError(-1, "java -version") logger.debug("Cool!! Java is available") except subprocess.CalledProcessError: - logger.error("Java>= 17 Must be installed") + logger.error("Java>= 17 must be installed") exit(-1) @@ -119,11 +137,15 @@ def extra_downloads(config: RevancedConfig) -> None: def apkmirror_status_check(package_name: str) -> Any: - """Check if app exists on APKMirror.""" - check_if_exist = f"{apk_mirror_base_url}/wp-json/apkm/v1/app_exists/" + """Check if app exists on APKMirror. + + Args: + package_name (str): The name of the package to check. + + Returns: + dict: The response from APKMirror API as a JSON object. + """ + api_url = f"{apk_mirror_base_url}/wp-json/apkm/v1/app_exists/" body = {"pnames": [package_name]} - return json.loads( - requests.post( - check_if_exist, data=json.dumps(body), headers=apk_mirror_header - ).content - ) + response = requests.post(api_url, json=body, headers=apk_mirror_header) + return response.json()