import os import platform import shutil import subprocess import sys import zipfile import requests def clean_files(): try: shutil.rmtree(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'build')) except Exception: pass try: shutil.rmtree(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist')) except Exception: pass try: shutil.rmtree(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist_chrome')) except Exception: pass def download_chromium(): # https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/ revision = "1260008" if os.name == 'nt' else '1260015' arch = 'Win_x64' if os.name == 'nt' else 'Linux_x64' dl_file = 'chrome-win' if os.name == 'nt' else 'chrome-linux' dl_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist_chrome') dl_path_folder = os.path.join(dl_path, dl_file) dl_path_zip = dl_path_folder + '.zip' # response = requests.get( # f'https://commondatastorage.googleapis.com/chromium-browser-snapshots/{arch}/LAST_CHANGE', # timeout=30) # revision = response.text.strip() print("Downloading revision: " + revision) os.mkdir(dl_path) with requests.get( f'https://commondatastorage.googleapis.com/chromium-browser-snapshots/{arch}/{revision}/{dl_file}.zip', stream=True) as r: r.raise_for_status() with open(dl_path_zip, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print("File downloaded: " + dl_path_zip) with zipfile.ZipFile(dl_path_zip, 'r') as zip_ref: zip_ref.extractall(dl_path) os.remove(dl_path_zip) chrome_path = os.path.join(dl_path, "chrome") shutil.move(dl_path_folder, chrome_path) print("Extracted in: " + chrome_path) if os.name != 'nt': # Give executable permissions for *nix # file * | grep executable | cut -d: -f1 print("Giving executable permissions...") execs = ['chrome', 'chrome_crashpad_handler', 'chrome_sandbox', 'chrome-wrapper', 'xdg-mime', 'xdg-settings'] for exec_file in execs: exec_path = os.path.join(chrome_path, exec_file) os.chmod(exec_path, 0o755) def run_pyinstaller(): sep = ';' if os.name == 'nt' else ':' result = subprocess.run([sys.executable, "-m", "PyInstaller", "--icon", "resources/flaresolverr_logo.ico", "--add-data", f"package.json{sep}.", "--add-data", f"{os.path.join('dist_chrome', 'chrome')}{sep}chrome", os.path.join("src", "flaresolverr.py")], cwd=os.pardir, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: print(result.stderr.decode('utf-8')) raise Exception("Error running pyInstaller") def compress_package(): dist_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, 'dist') package_folder = os.path.join(dist_folder, 'package') shutil.move(os.path.join(dist_folder, 'flaresolverr'), os.path.join(package_folder, 'flaresolverr')) print("Package folder: " + package_folder) compr_format = 'zip' if os.name == 'nt' else 'gztar' compr_file_name = 'flaresolverr_windows_x64' if os.name == 'nt' else 'flaresolverr_linux_x64' compr_file_path = os.path.join(dist_folder, compr_file_name) shutil.make_archive(compr_file_path, compr_format, package_folder) print("Compressed file path: " + compr_file_path) if __name__ == "__main__": print("Building package...") print("Platform: " + platform.platform()) print("Cleaning previous build...") clean_files() print("Downloading Chromium...") download_chromium() print("Building pyinstaller executable... ") run_pyinstaller() print("Compressing package... ") compress_package() # NOTE: python -m pip install pyinstaller