Merge pull request #183 from nikhilbadyal/uptodown-specific

 Ability to download the specific version from uptodown
This commit is contained in:
Nikhil Badyal
2023-07-01 16:04:46 +05:30
committed by GitHub
3 changed files with 41 additions and 11 deletions
+37 -4
View File
@@ -8,6 +8,7 @@ from time import perf_counter
from typing import Tuple from typing import Tuple
import requests import requests
from bs4 import BeautifulSoup
from loguru import logger from loguru import logger
from selectolax.lexbor import LexborHTMLParser from selectolax.lexbor import LexborHTMLParser
from tqdm import tqdm from tqdm import tqdm
@@ -107,8 +108,36 @@ class Downloader(object):
download_url = self.config.apk_mirror + sub_url download_url = self.config.apk_mirror + sub_url
return download_url return download_url
def __upto_down_downloader(self, app: str) -> str: def __upto_down_specific_version(self, app: str, version: str) -> str:
"""Function to download the specified version of app from apkmirror.
:param app: Name of the application
:param version: Version of the application to download
:return: Version of downloaded apk
"""
logger.debug("downloading specified version of app from uptodown.")
url = f"https://{app}.en.uptodown.com/android/versions"
html = self.config.session.get(url).text
soup = BeautifulSoup(html, "html.parser")
versions_list = soup.find("section", {"id": "versions"})
download_url = None
for version_item in versions_list.find_all("div", {"data-url": True}):
extracted_version = version_item.find("span", {"class": "version"}).text
if extracted_version == version:
download_url = version_item["data-url"]
print(f"data-url for version {version}: {download_url}")
break
if download_url is None:
raise AppNotFound(f"Unable to get download url for {app}")
self.__upto_down_downloader(download_url, app)
logger.debug(f"Downloaded {app} apk from upto_down_downloader in rt")
return version
def __upto_down_latest_downloader(self, app: str) -> str:
page = f"https://{app}.en.uptodown.com/android/download" page = f"https://{app}.en.uptodown.com/android/download"
return self.__upto_down_downloader(page, app)
def __upto_down_downloader(self, page: str, app: str) -> str:
parser = LexborHTMLParser(self.config.session.get(page).text) parser = LexborHTMLParser(self.config.session.get(page).text)
main_page = parser.css_first("#detail-download-button") main_page = parser.css_first("#detail-download-button")
download_url = main_page.attributes["data-url"] download_url = main_page.attributes["data-url"]
@@ -249,13 +278,17 @@ class Downloader(object):
executor.map(lambda repo: self.repository(*repo), assets) executor.map(lambda repo: self.repository(*repo), assets)
logger.info("Downloaded revanced microG ,cli, integrations and patches.") logger.info("Downloaded revanced microG ,cli, integrations and patches.")
def upto_down_downloader(self, app: str) -> str: def upto_down_downloader(self, version: str, app: str) -> str:
"""Function to download from UptoDown. """Function to download from UptoDown.
:param version: version to download
:param app: Name of the application :param app: Name of the application
:return: Version of downloaded APK :return: Version of downloaded APK
""" """
return self.__upto_down_downloader(app) if version and version != "latest":
return self.__upto_down_specific_version(app, version)
else:
return self.__upto_down_latest_downloader(app)
def apk_pure_downloader(self, app: str) -> str: def apk_pure_downloader(self, app: str) -> str:
"""Function to download from Apk Pure. """Function to download from Apk Pure.
@@ -297,7 +330,7 @@ class Downloader(object):
# Returning Latest as I don't know, which version user provided. # Returning Latest as I don't know, which version user provided.
return "latest" return "latest"
if app in self.config.upto_down: if app in self.config.upto_down:
return self.upto_down_downloader(app) return self.upto_down_downloader(version, app)
elif app in self.config.apk_pure: elif app in self.config.apk_pure:
return self.apk_pure_downloader(app) return self.apk_pure_downloader(app)
elif app in self.config.apk_sos: elif app in self.config.apk_sos:
+3 -7
View File
@@ -148,14 +148,10 @@ class Patches(object):
if not (app_name := app_names.get(app)): if not (app_name := app_names.get(app)):
raise AppNotFound(app) raise AppNotFound(app)
patches = getattr(self, app_name) patches = getattr(self, app_name)
version = "" version = "latest"
try: try:
if app in ("youtube", "youtube_music"): version = next(i["version"] for i in patches if i["version"] != "all")
version = next(i["version"] for i in patches if i["version"] != "all") logger.debug(f"Recommended Version for patching {app} is {version}")
logger.debug(f"Recommended Version for patching {app} is {version}")
else:
logger.debug("No recommended version.")
# No recommended version available
except StopIteration: except StopIteration:
pass pass
return patches, version return patches, version
+1
View File
@@ -6,6 +6,7 @@ from requests import Response
default_build = [ default_build = [
"youtube", "youtube",
"youtube_music",
] ]
all_builds = [ all_builds = [
"youtube", "youtube",