🎨 Handle request status (#351)

This commit is contained in:
Nikhil Badyal
2023-08-28 22:08:27 +05:30
committed by GitHub
parent bc5635530b
commit 30e92acaee
8 changed files with 40 additions and 52 deletions
+11 -7
View File
@@ -27,7 +27,7 @@ from src.exceptions import (
BuilderError, BuilderError,
) )
from src.patches import Patches from src.patches import Patches
from src.utils import apkmirror_status_check, bs4_parser, handle_request_response, request_header from src.utils import apkmirror_status_check, bs4_parser, handle_request_response, request_header, request_timeout
no_of_col = 8 no_of_col = 8
combo_headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0"} combo_headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0"}
@@ -37,7 +37,8 @@ def apkcombo_scrapper(package_name: str) -> str:
"""Apkcombo scrapper.""" """Apkcombo scrapper."""
apkcombo_url = APK_COMBO_GENERIC_URL.format(package_name) apkcombo_url = APK_COMBO_GENERIC_URL.format(package_name)
try: try:
r = requests.get(apkcombo_url, headers=combo_headers, allow_redirects=True, timeout=60) r = requests.get(apkcombo_url, headers=combo_headers, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, apkcombo_url)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
avatar = soup.find(class_="avatar") avatar = soup.find(class_="avatar")
if not isinstance(avatar, Tag): if not isinstance(avatar, Tag):
@@ -74,7 +75,8 @@ def apkmonk_scrapper(package_name: str) -> str:
"""APKMonk scrapper.""" """APKMonk scrapper."""
apkmonk_url = APK_MONK_APK_URL.format(package_name) apkmonk_url = APK_MONK_APK_URL.format(package_name)
icon_logo = APK_MONK_ICON_URL.format(package_name) icon_logo = APK_MONK_ICON_URL.format(package_name)
r = requests.get(apkmonk_url, headers=combo_headers, allow_redirects=True, timeout=60) r = requests.get(apkmonk_url, headers=combo_headers, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, apkmonk_url)
if head := BeautifulSoup(r.text, bs4_parser).head: if head := BeautifulSoup(r.text, bs4_parser).head:
parsed_head = BeautifulSoup(str(head), bs4_parser) parsed_head = BeautifulSoup(str(head), bs4_parser)
href_elements = parsed_head.find_all(href=True) href_elements = parsed_head.find_all(href=True)
@@ -98,7 +100,8 @@ def apkmirror_scrapper(package_name: str) -> str:
def _extracted_from_apkmirror_scrapper(search_url: str) -> str: def _extracted_from_apkmirror_scrapper(search_url: str) -> str:
r = requests.get(search_url, headers=request_header, timeout=60) r = requests.get(search_url, headers=request_header, timeout=request_timeout)
handle_request_response(r, search_url)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
icon_element = soup.select_one("div.bubble-wrap > img") icon_element = soup.select_one("div.bubble-wrap > img")
if not icon_element: if not icon_element:
@@ -131,7 +134,8 @@ def apkpure_scrapper(package_name: str) -> str:
"""Scrap Icon from apkpure.""" """Scrap Icon from apkpure."""
apkpure_url = APK_PURE_ICON_URL.format(package_name) apkpure_url = APK_PURE_ICON_URL.format(package_name)
try: try:
r = requests.get(apkpure_url, headers=combo_headers, allow_redirects=True, timeout=60) r = requests.get(apkpure_url, headers=combo_headers, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, apkpure_url)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
search_result = soup.find_all(class_="brand-info-top") search_result = soup.find_all(class_="brand-info-top")
for brand_info in search_result: for brand_info in search_result:
@@ -182,8 +186,8 @@ def generate_markdown_table(data: List[List[str]]) -> str:
def main() -> None: def main() -> None:
"""Entrypoint.""" """Entrypoint."""
response = requests.get(revanced_api, timeout=10) response = requests.get(revanced_api, timeout=request_timeout)
handle_request_response(response) handle_request_response(response, revanced_api)
patches = response.json() patches = response.json()
+3 -9
View File
@@ -8,9 +8,8 @@ from loguru import logger
from src.app import APP from src.app import APP
from src.downloader.download import Downloader from src.downloader.download import Downloader
from src.downloader.sources import APK_MIRROR_BASE_URL from src.downloader.sources import APK_MIRROR_BASE_URL
from src.downloader.utils import status_code_200
from src.exceptions import APKMirrorAPKDownloadError from src.exceptions import APKMirrorAPKDownloadError
from src.utils import bs4_parser, contains_any_word, request_header from src.utils import bs4_parser, contains_any_word, handle_request_response, request_header, request_timeout
class ApkMirror(Downloader): class ApkMirror(Downloader):
@@ -77,13 +76,8 @@ class ApkMirror(Downloader):
@staticmethod @staticmethod
def _extracted_search_div(url: str, search_class: str) -> Tag: def _extracted_search_div(url: str, search_class: str) -> Tag:
"""Extract search div.""" """Extract search div."""
r = requests.get(url, headers=request_header, timeout=60) r = requests.get(url, headers=request_header, timeout=request_timeout)
if r.status_code != status_code_200: handle_request_response(r, url)
msg = f"Unable to connect with {url}. Are you blocked by APKMirror or abused apkmirror ?.Reason - {r.text}"
raise APKMirrorAPKDownloadError(
msg,
url=url,
)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
return soup.find(class_=search_class) # type: ignore[return-value] return soup.find(class_=search_class) # type: ignore[return-value]
+9 -24
View File
@@ -9,9 +9,8 @@ from scripts.status_check import combo_headers
from src.app import APP from src.app import APP
from src.downloader.download import Downloader from src.downloader.download import Downloader
from src.downloader.sources import APK_MONK_BASE_URL from src.downloader.sources import APK_MONK_BASE_URL
from src.downloader.utils import status_code_200
from src.exceptions import APKMonkAPKDownloadError from src.exceptions import APKMonkAPKDownloadError
from src.utils import bs4_parser, request_header from src.utils import bs4_parser, handle_request_response, request_header, request_timeout
class ApkMonk(Downloader): class ApkMonk(Downloader):
@@ -24,13 +23,8 @@ class ApkMonk(Downloader):
:param app: Name of the app :param app: Name of the app
""" """
file_name = f"{app}.apk" file_name = f"{app}.apk"
r = requests.get(page, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(page, headers=request_header, allow_redirects=True, timeout=request_timeout)
if r.status_code != status_code_200: handle_request_response(r, page)
msg = f"Unable to connect with {page}.Reason - {r.text}"
raise APKMonkAPKDownloadError(
msg,
url=page,
)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
download_scripts = soup.find_all("script", type="text/javascript") download_scripts = soup.find_all("script", type="text/javascript")
key_value_pattern = r'\{"pkg":"([^"]+)","key":"([^"]+)"\}' key_value_pattern = r'\{"pkg":"([^"]+)","key":"([^"]+)"\}'
@@ -48,13 +42,8 @@ class ApkMonk(Downloader):
url=page, url=page,
) )
request_header["User-Agent"] = combo_headers["User-Agent"] request_header["User-Agent"] = combo_headers["User-Agent"]
r = requests.get(url, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(url, headers=request_header, allow_redirects=True, timeout=request_timeout)
if r.status_code != status_code_200: handle_request_response(r, url)
msg = f"Unable to connect with {page}.Reason - {r.text}"
raise APKMonkAPKDownloadError(
msg,
url=page,
)
final_download_url = r.json()["url"] final_download_url = r.json()["url"]
self._download(final_download_url, file_name) self._download(final_download_url, file_name)
return file_name, final_download_url return file_name, final_download_url
@@ -67,13 +56,8 @@ class ApkMonk(Downloader):
:param main_page: Version of the application to download :param main_page: Version of the application to download
:return: Version of downloaded apk :return: Version of downloaded apk
""" """
r = requests.get(app.download_source, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(app.download_source, headers=request_header, allow_redirects=True, timeout=request_timeout)
if r.status_code != status_code_200: handle_request_response(r, app.download_source)
msg = f"Unable to connect with {app.download_source}.Reason - {r.text}"
raise APKMonkAPKDownloadError(
msg,
url=app.download_source,
)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
version_table = soup.find_all(class_="striped") version_table = soup.find_all(class_="striped")
for version_row in version_table: for version_row in version_table:
@@ -95,7 +79,8 @@ class ApkMonk(Downloader):
:param app: Name of the application :param app: Name of the application
:return: Version of downloaded apk :return: Version of downloaded apk
""" """
r = requests.get(app.download_source, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(app.download_source, headers=request_header, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, app.download_source)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
latest_download_url = soup.find(id="download_button")["href"] # type: ignore[index] latest_download_url = soup.find(id="download_button")["href"] # type: ignore[index]
return self.extract_download_link(latest_download_url, app.app_name) # type: ignore[arg-type] return self.extract_download_link(latest_download_url, app.app_name) # type: ignore[arg-type]
+3 -2
View File
@@ -7,7 +7,7 @@ from bs4 import BeautifulSoup
from src.app import APP from src.app import APP
from src.downloader.download import Downloader from src.downloader.download import Downloader
from src.exceptions import APKSosAPKDownloadError from src.exceptions import APKSosAPKDownloadError
from src.utils import bs4_parser, request_header from src.utils import bs4_parser, handle_request_response, request_header, request_timeout
class ApkSos(Downloader): class ApkSos(Downloader):
@@ -19,7 +19,8 @@ class ApkSos(Downloader):
:param page: Url of the page :param page: Url of the page
:param app: Name of the app :param app: Name of the app
""" """
r = requests.get(page, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(page, headers=request_header, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, page)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
download_button = soup.find(class_="col-sm-12 col-md-8 text-center") download_button = soup.find(class_="col-sm-12 col-md-8 text-center")
possible_links = download_button.find_all("a") # type: ignore[union-attr] possible_links = download_button.find_all("a") # type: ignore[union-attr]
+1 -1
View File
@@ -44,7 +44,7 @@ class Downloader(object):
stream=True, stream=True,
headers=headers, headers=headers,
) )
handle_request_response(response) handle_request_response(response, url)
total = int(response.headers.get("content-length", 0)) total = int(response.headers.get("content-length", 0))
bar = tqdm( bar = tqdm(
desc=file_name, desc=file_name,
+5 -5
View File
@@ -10,7 +10,7 @@ from src.app import APP
from src.config import RevancedConfig from src.config import RevancedConfig
from src.downloader.download import Downloader from src.downloader.download import Downloader
from src.exceptions import DownloadError from src.exceptions import DownloadError
from src.utils import handle_request_response, update_changelog from src.utils import handle_request_response, request_timeout, update_changelog
class Github(Downloader): class Github(Downloader):
@@ -34,8 +34,8 @@ class Github(Downloader):
if self.config.personal_access_token: if self.config.personal_access_token:
logger.debug("Using personal access token") logger.debug("Using personal access token")
headers["Authorization"] = f"token {self.config.personal_access_token}" headers["Authorization"] = f"token {self.config.personal_access_token}"
response = requests.get(repo_url, headers=headers, timeout=60) response = requests.get(repo_url, headers=headers, timeout=request_timeout)
handle_request_response(response) handle_request_response(response, repo_url)
if repo_name == "revanced-patches": if repo_name == "revanced-patches":
download_url = response.json()["assets"][1]["browser_download_url"] download_url = response.json()["assets"][1]["browser_download_url"]
else: else:
@@ -74,8 +74,8 @@ class Github(Downloader):
} }
if config.personal_access_token: if config.personal_access_token:
headers["Authorization"] = f"token {config.personal_access_token}" headers["Authorization"] = f"token {config.personal_access_token}"
response = requests.get(api_url, headers=headers, timeout=60) response = requests.get(api_url, headers=headers, timeout=request_timeout)
handle_request_response(response) handle_request_response(response, api_url)
update_changelog(f"{github_repo_owner}/{github_repo_name}", response.json()) update_changelog(f"{github_repo_owner}/{github_repo_name}", response.json())
assets = response.json()["assets"] assets = response.json()["assets"]
try: try:
+3 -2
View File
@@ -8,7 +8,7 @@ from loguru import logger
from src.app import APP from src.app import APP
from src.downloader.download import Downloader from src.downloader.download import Downloader
from src.exceptions import UptoDownAPKDownloadError from src.exceptions import UptoDownAPKDownloadError
from src.utils import bs4_parser, request_header from src.utils import bs4_parser, handle_request_response, request_header, request_timeout
class UptoDown(Downloader): class UptoDown(Downloader):
@@ -16,7 +16,8 @@ class UptoDown(Downloader):
def extract_download_link(self: Self, page: str, app: str) -> Tuple[str, str]: def extract_download_link(self: Self, page: str, app: str) -> Tuple[str, str]:
"""Extract download link from uptodown url.""" """Extract download link from uptodown url."""
r = requests.get(page, headers=request_header, allow_redirects=True, timeout=60) r = requests.get(page, headers=request_header, allow_redirects=True, timeout=request_timeout)
handle_request_response(r, page)
soup = BeautifulSoup(r.text, bs4_parser) soup = BeautifulSoup(r.text, bs4_parser)
download_button = soup.find(id="detail-download-button") download_button = soup.find(id="detail-download-button")
if not download_button: if not download_button:
+5 -2
View File
@@ -29,6 +29,7 @@ request_header = {
} }
bs4_parser = "html.parser" bs4_parser = "html.parser"
changelog_file = "changelog.md" changelog_file = "changelog.md"
request_timeout = 60
def update_changelog(name: str, response: Dict[str, str]) -> None: def update_changelog(name: str, response: Dict[str, str]) -> None:
@@ -99,7 +100,7 @@ def get_parent_repo() -> str:
return "https://github.com/nikhilbadyal/docker-py-revanced" return "https://github.com/nikhilbadyal/docker-py-revanced"
def handle_request_response(response: Response) -> None: def handle_request_response(response: Response, url: str) -> None:
"""The function handles the response of a GET request and raises an exception if the response code is not 200. """The function handles the response of a GET request and raises an exception if the response code is not 200.
Parameters Parameters
@@ -108,11 +109,13 @@ def handle_request_response(response: Response) -> None:
The parameter `response` is of type `Response`, which is likely referring to a response object from The parameter `response` is of type `Response`, which is likely referring to a response object from
an HTTP request. This object typically contains information about the response received from the an HTTP request. This object typically contains information about the response received from the
server, such as the status code, headers, and response body. server, such as the status code, headers, and response body.
url: str
The url on which request was made
""" """
response_code = response.status_code response_code = response.status_code
if response_code != status_code_200: if response_code != status_code_200:
msg = f"Unable to downloaded assets. Reason - {response.text}" msg = f"Unable to downloaded assets. Reason - {response.text}"
raise DownloadError(msg) raise DownloadError(msg, url=url)
def slugify(string: str) -> str: def slugify(string: str) -> str: