From cc89b0aac5ff141de65e84a446fe7f39f566412f Mon Sep 17 00:00:00 2001 From: K4YT3X Date: Sun, 13 Dec 2020 16:39:49 -0500 Subject: [PATCH] formatted setup script with black --- src/video2x_setup.py | 333 +++++++++++++++++++++++++------------------ 1 file changed, 195 insertions(+), 138 deletions(-) diff --git a/src/video2x_setup.py b/src/video2x_setup.py index d7c7b85..713c5a9 100755 --- a/src/video2x_setup.py +++ b/src/video2x_setup.py @@ -45,33 +45,47 @@ import zipfile # Therefore, they will be installed during the Python dependency # installation step and imported later in the script. -SETUP_VERSION = '2.4.1' +SETUP_VERSION = "2.4.1" # global static variables -LOCALAPPDATA = pathlib.Path(os.getenv('localappdata')) -DRIVER_OPTIONS = ['all', - 'ffmpeg', - 'gifski', - 'waifu2x_caffe', - 'waifu2x_converter_cpp', - 'waifu2x_ncnn_vulkan', - 'srmd_ncnn_vulkan', - 'realsr_ncnn_vulkan', - 'anime4kcpp'] +LOCALAPPDATA = pathlib.Path(os.getenv("localappdata")) +DRIVER_OPTIONS = [ + "all", + "ffmpeg", + "gifski", + "waifu2x_caffe", + "waifu2x_converter_cpp", + "waifu2x_ncnn_vulkan", + "srmd_ncnn_vulkan", + "realsr_ncnn_vulkan", + "anime4kcpp", +] def parse_arguments(): - """ parse command line arguments - """ - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('-d', '--driver', help='driver to download and configure', choices=DRIVER_OPTIONS, default='all') - parser.add_argument('-u', '--uninstall', help='uninstall Video2X dependencies from default location', action='store_true') + """parse command line arguments""" + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + parser.add_argument( + "-d", + "--driver", + help="driver to download and configure", + choices=DRIVER_OPTIONS, + default="all", + ) + parser.add_argument( + "-u", + "--uninstall", + help="uninstall Video2X dependencies from default location", + action="store_true", + ) # parse arguments return parser.parse_args() class Video2xSetup: - """ install dependencies for video2x video enlarger + """install dependencies for video2x video enlarger This library is meant to be executed as a stand-alone script. All files will be installed under %LOCALAPPDATA%\\video2x. @@ -86,51 +100,48 @@ class Video2xSetup: # regardless of which driver to install # always ensure Python modules are installed and up-to-date if self.download_python_modules: - print('\nInstalling Python libraries') + print("\nInstalling Python libraries") self._install_python_requirements() # if all drivers are to be installed - if self.driver == 'all': - DRIVER_OPTIONS.remove('all') + if self.driver == "all": + DRIVER_OPTIONS.remove("all") for driver in DRIVER_OPTIONS: - getattr(self, f'_install_{driver}')() + getattr(self, f"_install_{driver}")() # install only the selected driver else: - getattr(self, f'_install_{self.driver}')() + getattr(self, f"_install_{self.driver}")() # self._cleanup() def _install_python_requirements(self): - """ Read requirements.txt and return its content - """ - pip_install('requirements.txt') + """Read requirements.txt and return its content""" + pip_install("requirements.txt") def _cleanup(self): - """ Cleanup all the temp files downloaded - """ - print('\nCleaning up temporary files') + """Cleanup all the temp files downloaded""" + print("\nCleaning up temporary files") for file in self.trash: try: if file.is_dir(): - print(f'Deleting directory: {file}') + print(f"Deleting directory: {file}") shutil.rmtree(file) else: - print(f'Deleting file: {file}') + print(f"Deleting file: {file}") file.unlink() except Exception: - print(f'Error deleting: {file}') + print(f"Error deleting: {file}") traceback.print_exc() def _install_ffmpeg(self): - """ Install FFMPEG - """ - print('\nInstalling FFmpeg') + """Install FFMPEG""" + print("\nInstalling FFmpeg") import patoolib - latest_release = 'https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z' + latest_release = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z" ffmpeg_7z = download(latest_release, tempfile.gettempdir()) self.trash.append(ffmpeg_7z) @@ -138,151 +149,183 @@ class Video2xSetup: # if running in PyInstaller, add sys._MEIPASS\7z to path # this directory contains 7za.exe and its DLL files with contextlib.suppress(AttributeError): - os.environ['PATH'] += f';{sys._MEIPASS}\\7z' + os.environ["PATH"] += f";{sys._MEIPASS}\\7z" - ffmpeg_directory = LOCALAPPDATA / 'video2x' / 'ffmpeg' + ffmpeg_directory = LOCALAPPDATA / "video2x" / "ffmpeg" # (ffmpeg_directory).mkdir(parents=True, exist_ok=True) # pyunpack.Archive(ffmpeg_7z).extractall(ffmpeg_directory) if (ffmpeg_directory).exists(): shutil.rmtree(ffmpeg_directory) - patoolib.extract_archive(str(ffmpeg_7z), outdir=str(LOCALAPPDATA / 'video2x')) - (LOCALAPPDATA / 'video2x' / ffmpeg_7z.stem).rename(ffmpeg_directory) + patoolib.extract_archive(str(ffmpeg_7z), outdir=str(LOCALAPPDATA / "video2x")) + (LOCALAPPDATA / "video2x" / ffmpeg_7z.stem).rename(ffmpeg_directory) def _install_gifski(self): - print('\nInstalling Gifski') + print("\nInstalling Gifski") import requests # Get latest release of Gifski via Github API - releases = requests.get('https://api.github.com/repos/ImageOptim/gifski/releases').json() + releases = requests.get( + "https://api.github.com/repos/ImageOptim/gifski/releases" + ).json() for release in releases: - for asset in release['assets']: - if re.search(r'gifski-.*\.tar\.xz', asset['browser_download_url']): - gifski_tar_xz = download(asset['browser_download_url'], tempfile.gettempdir()) + for asset in release["assets"]: + if re.search(r"gifski-.*\.tar\.xz", asset["browser_download_url"]): + gifski_tar_xz = download( + asset["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(gifski_tar_xz) # extract and rename with tarfile.open(gifski_tar_xz) as archive: - archive.extractall(LOCALAPPDATA / 'video2x' / 'gifski') + archive.extractall(LOCALAPPDATA / "video2x" / "gifski") return def _install_waifu2x_caffe(self): - """ Install waifu2x_caffe - """ - print('\nInstalling waifu2x-caffe') + """Install waifu2x_caffe""" + print("\nInstalling waifu2x-caffe") import requests # Get latest release of waifu2x-caffe via GitHub API - latest_release = requests.get('https://api.github.com/repos/lltcggie/waifu2x-caffe/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/lltcggie/waifu2x-caffe/releases/latest" + ).json() - for a in latest_release['assets']: - if 'waifu2x-caffe.zip' in a['browser_download_url']: - waifu2x_caffe_zip = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if "waifu2x-caffe.zip" in a["browser_download_url"]: + waifu2x_caffe_zip = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(waifu2x_caffe_zip) with zipfile.ZipFile(waifu2x_caffe_zip) as zipf: - zipf.extractall(LOCALAPPDATA / 'video2x') + zipf.extractall(LOCALAPPDATA / "video2x") def _install_waifu2x_converter_cpp(self): - """ Install waifu2x_caffe - """ - print('\nInstalling waifu2x-converter-cpp') + """Install waifu2x_caffe""" + print("\nInstalling waifu2x-converter-cpp") import requests # Get latest release of waifu2x-caffe via GitHub API - latest_release = requests.get('https://api.github.com/repos/DeadSix27/waifu2x-converter-cpp/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/DeadSix27/waifu2x-converter-cpp/releases/latest" + ).json() - for a in latest_release['assets']: - if re.search(r'waifu2x-DeadSix27-win64_v[0-9]*\.zip', a['browser_download_url']): - waifu2x_converter_cpp_zip = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if re.search( + r"waifu2x-DeadSix27-win64_v[0-9]*\.zip", a["browser_download_url"] + ): + waifu2x_converter_cpp_zip = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(waifu2x_converter_cpp_zip) with zipfile.ZipFile(waifu2x_converter_cpp_zip) as zipf: - zipf.extractall(LOCALAPPDATA / 'video2x' / 'waifu2x-converter-cpp') + zipf.extractall(LOCALAPPDATA / "video2x" / "waifu2x-converter-cpp") def _install_waifu2x_ncnn_vulkan(self): - """ Install waifu2x-ncnn-vulkan - """ - print('\nInstalling waifu2x-ncnn-vulkan') + """Install waifu2x-ncnn-vulkan""" + print("\nInstalling waifu2x-ncnn-vulkan") import requests # Get latest release of waifu2x-ncnn-vulkan via Github API - latest_release = requests.get('https://api.github.com/repos/nihui/waifu2x-ncnn-vulkan/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/nihui/waifu2x-ncnn-vulkan/releases/latest" + ).json() - for a in latest_release['assets']: - if re.search(r'waifu2x-ncnn-vulkan-\d*-windows\.zip', a['browser_download_url']): - waifu2x_ncnn_vulkan_zip = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if re.search( + r"waifu2x-ncnn-vulkan-\d*-windows\.zip", a["browser_download_url"] + ): + waifu2x_ncnn_vulkan_zip = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(waifu2x_ncnn_vulkan_zip) # extract and rename - waifu2x_ncnn_vulkan_directory = LOCALAPPDATA / 'video2x' / 'waifu2x-ncnn-vulkan' + waifu2x_ncnn_vulkan_directory = LOCALAPPDATA / "video2x" / "waifu2x-ncnn-vulkan" with zipfile.ZipFile(waifu2x_ncnn_vulkan_zip) as zipf: - zipf.extractall(LOCALAPPDATA / 'video2x') + zipf.extractall(LOCALAPPDATA / "video2x") # if directory already exists, remove it if waifu2x_ncnn_vulkan_directory.exists(): shutil.rmtree(waifu2x_ncnn_vulkan_directory) # rename the newly extracted directory - (LOCALAPPDATA / 'video2x' / zipf.namelist()[0]).rename(waifu2x_ncnn_vulkan_directory) + (LOCALAPPDATA / "video2x" / zipf.namelist()[0]).rename( + waifu2x_ncnn_vulkan_directory + ) def _install_srmd_ncnn_vulkan(self): - """ Install srmd-ncnn-vulkan - """ - print('\nInstalling srmd-ncnn-vulkan') + """Install srmd-ncnn-vulkan""" + print("\nInstalling srmd-ncnn-vulkan") import requests # Get latest release of srmd-ncnn-vulkan via Github API - latest_release = requests.get('https://api.github.com/repos/nihui/srmd-ncnn-vulkan/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/nihui/srmd-ncnn-vulkan/releases/latest" + ).json() - for a in latest_release['assets']: - if re.search(r'srmd-ncnn-vulkan-\d*-windows\.zip', a['browser_download_url']): - srmd_ncnn_vulkan_zip = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if re.search( + r"srmd-ncnn-vulkan-\d*-windows\.zip", a["browser_download_url"] + ): + srmd_ncnn_vulkan_zip = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(srmd_ncnn_vulkan_zip) # extract and rename - srmd_ncnn_vulkan_directory = LOCALAPPDATA / 'video2x' / 'srmd-ncnn-vulkan' + srmd_ncnn_vulkan_directory = LOCALAPPDATA / "video2x" / "srmd-ncnn-vulkan" with zipfile.ZipFile(srmd_ncnn_vulkan_zip) as zipf: - zipf.extractall(LOCALAPPDATA / 'video2x') + zipf.extractall(LOCALAPPDATA / "video2x") # if directory already exists, remove it if srmd_ncnn_vulkan_directory.exists(): shutil.rmtree(srmd_ncnn_vulkan_directory) # rename the newly extracted directory - (LOCALAPPDATA / 'video2x' / zipf.namelist()[0]).rename(srmd_ncnn_vulkan_directory) + (LOCALAPPDATA / "video2x" / zipf.namelist()[0]).rename( + srmd_ncnn_vulkan_directory + ) def _install_realsr_ncnn_vulkan(self): - """ Install realsr-ncnn-vulkan - """ - print('\nInstalling realsr-ncnn-vulkan') + """Install realsr-ncnn-vulkan""" + print("\nInstalling realsr-ncnn-vulkan") import requests # Get latest release of realsr-ncnn-vulkan via Github API - latest_release = requests.get('https://api.github.com/repos/nihui/realsr-ncnn-vulkan/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/nihui/realsr-ncnn-vulkan/releases/latest" + ).json() - for a in latest_release['assets']: - if re.search(r'realsr-ncnn-vulkan-\d*-windows\.zip', a['browser_download_url']): - realsr_ncnn_vulkan_zip = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if re.search( + r"realsr-ncnn-vulkan-\d*-windows\.zip", a["browser_download_url"] + ): + realsr_ncnn_vulkan_zip = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(realsr_ncnn_vulkan_zip) # extract and rename - realsr_ncnn_vulkan_directory = LOCALAPPDATA / 'video2x' / 'realsr-ncnn-vulkan' + realsr_ncnn_vulkan_directory = LOCALAPPDATA / "video2x" / "realsr-ncnn-vulkan" with zipfile.ZipFile(realsr_ncnn_vulkan_zip) as zipf: - zipf.extractall(LOCALAPPDATA / 'video2x') + zipf.extractall(LOCALAPPDATA / "video2x") # if directory already exists, remove it if realsr_ncnn_vulkan_directory.exists(): shutil.rmtree(realsr_ncnn_vulkan_directory) # rename the newly extracted directory - (LOCALAPPDATA / 'video2x' / zipf.namelist()[0]).rename(realsr_ncnn_vulkan_directory) + (LOCALAPPDATA / "video2x" / zipf.namelist()[0]).rename( + realsr_ncnn_vulkan_directory + ) def _install_anime4kcpp(self): - """ Install Anime4KCPP - """ - print('\nInstalling Anime4KCPP') + """Install Anime4KCPP""" + print("\nInstalling Anime4KCPP") import patoolib import requests @@ -290,28 +333,35 @@ class Video2xSetup: # get latest release of Anime4KCPP via Github API # at the time of writing this portion, Anime4KCPP doesn't yet have a stable release # therefore releases/latest won't work - latest_release = requests.get('https://api.github.com/repos/TianZerL/Anime4KCPP/releases/latest').json() + latest_release = requests.get( + "https://api.github.com/repos/TianZerL/Anime4KCPP/releases/latest" + ).json() - for a in latest_release['assets']: - if re.search(r'Anime4KCPP_CLI-.*-Win64-msvc\.7z', a['browser_download_url']): - anime4kcpp_7z = download(a['browser_download_url'], tempfile.gettempdir()) + for a in latest_release["assets"]: + if re.search( + r"Anime4KCPP_CLI-.*-Win64-msvc\.7z", a["browser_download_url"] + ): + anime4kcpp_7z = download( + a["browser_download_url"], tempfile.gettempdir() + ) self.trash.append(anime4kcpp_7z) # if running in PyInstaller, add sys._MEIPASS\7z to path # this directory contains 7za.exe and its DLL files with contextlib.suppress(AttributeError): - os.environ['PATH'] += f';{sys._MEIPASS}\\7z' + os.environ["PATH"] += f";{sys._MEIPASS}\\7z" # (LOCALAPPDATA / 'video2x' / 'anime4kcpp').mkdir(parents=True, exist_ok=True) # pyunpack.Archive(anime4kcpp_7z).extractall(LOCALAPPDATA / 'video2x' / 'anime4kcpp') - if (LOCALAPPDATA / 'video2x' / 'anime4kcpp').exists(): - shutil.rmtree(LOCALAPPDATA / 'video2x' / 'anime4kcpp') - patoolib.extract_archive(str(anime4kcpp_7z), outdir=str(LOCALAPPDATA / 'video2x' / 'anime4kcpp')) + if (LOCALAPPDATA / "video2x" / "anime4kcpp").exists(): + shutil.rmtree(LOCALAPPDATA / "video2x" / "anime4kcpp") + patoolib.extract_archive( + str(anime4kcpp_7z), outdir=str(LOCALAPPDATA / "video2x" / "anime4kcpp") + ) def download(url, save_path, chunk_size=4096): - """ Download file to local with requests library - """ + """Download file to local with requests library""" from tqdm import tqdm import requests @@ -325,14 +375,14 @@ def download(url, save_path, chunk_size=4096): # get file name file_name = None - if 'content-disposition' in stream.headers: - disposition = stream.headers['content-disposition'] + if "content-disposition" in stream.headers: + disposition = stream.headers["content-disposition"] with contextlib.suppress(IndexError): file_name = re.findall("filename=(.+)", disposition)[0].strip('"') if file_name is None: # output_file = f'{save_path}\\{stream.url.split("/")[-1]}' - output_file = save_path / stream.url.split('/')[-1] + output_file = save_path / stream.url.split("/")[-1] else: output_file = save_path / file_name @@ -341,17 +391,17 @@ def download(url, save_path, chunk_size=4096): # get total size for progress bar if provided in headers total_size = 0 - if 'content-length' in stream.headers: - total_size = int(stream.headers['content-length']) + if "content-length" in stream.headers: + total_size = int(stream.headers["content-length"]) # print download information summary - print(f'Downloading: {url}') - print(f'Total size: {total_size}') - print(f'Chunk size: {chunk_size}') - print(f'Saving to: {output_file}') + print(f"Downloading: {url}") + print(f"Total size: {total_size}") + print(f"Chunk size: {chunk_size}") + print(f"Saving to: {output_file}") # Write content into file - with open(output_file, 'wb') as output: + with open(output_file, "wb") as output: with tqdm(total=total_size, ascii=True) as progress_bar: for chunk in stream.iter_content(chunk_size=chunk_size): if chunk: @@ -363,16 +413,18 @@ def download(url, save_path, chunk_size=4096): def pip_install(file): - """ Install python package via python pip module + """Install python package via python pip module pip.main() is not available after pip 9.0.1, thus pip module is not used in this case. """ - return subprocess.run([sys.executable, '-m', 'pip', 'install', '-U', '-r', file]).returncode + return subprocess.run( + [sys.executable, "-m", "pip", "install", "-U", "-r", file] + ).returncode -if __name__ != '__main__': - raise ImportError('video2x_setup cannot be imported') +if __name__ != "__main__": + raise ImportError("video2x_setup cannot be imported") try: # set default exit code @@ -382,42 +434,47 @@ try: start_time = time.time() # check platform - if platform.system() != 'Windows': - print('This script is currently only compatible with Windows') + if platform.system() != "Windows": + print("This script is currently only compatible with Windows") EXIT_CODE = 1 sys.exit(1) # parse command line arguments args = parse_arguments() - print('Video2X Setup Script') - print(f'Version: {SETUP_VERSION}') + print("Video2X Setup Script") + print(f"Version: {SETUP_VERSION}") # uninstall video2x dependencies if args.uninstall: - if input('Are you sure you want to uninstall all Video2X dependencies? [y/N]: ').lower() == 'y': + if ( + input( + "Are you sure you want to uninstall all Video2X dependencies? [y/N]: " + ).lower() + == "y" + ): try: print(f'Removing: {LOCALAPPDATA / "video2x"}') - shutil.rmtree(LOCALAPPDATA / 'video2x') - print('Successfully uninstalled all dependencies') + shutil.rmtree(LOCALAPPDATA / "video2x") + print("Successfully uninstalled all dependencies") except FileNotFoundError: print(f'Dependency folder does not exist: {LOCALAPPDATA / "video2x"}') else: - print('Uninstallation aborted') + print("Uninstallation aborted") # run installation else: # do not install pip modules if script # is packaged in exe format download_python_modules = True - if sys.argv[0].endswith('.exe'): - print('\nScript is packaged as exe, skipping pip module download') + if sys.argv[0].endswith(".exe"): + print("\nScript is packaged as exe, skipping pip module download") download_python_modules = False # create setup install instance and run installer setup = Video2xSetup(args.driver, download_python_modules) setup.run() - print('\nScript finished successfully') + print("\nScript finished successfully") # let SystemExit signals pass through except SystemExit as e: @@ -427,15 +484,15 @@ except SystemExit as e: # user needs to run this with higher privilege except PermissionError: traceback.print_exc() - print('You might have insufficient privilege for this script to run') - print('Try running this script with Administrator privileges') + print("You might have insufficient privilege for this script to run") + print("Try running this script with Administrator privileges") EXIT_CODE = 1 # for any exception in the script except Exception: traceback.print_exc() - print('An error has occurred') - print('Video2X Automatic Setup has failed') + print("An error has occurred") + print("Video2X Automatic Setup has failed") EXIT_CODE = 1 @@ -447,15 +504,15 @@ finally: setup._cleanup() except Exception: traceback.print_exc() - print('An error occurred while trying to cleanup files') + print("An error occurred while trying to cleanup files") - print('Script finished') - print(f'Time taken: {timedelta(seconds=round(time.time() - start_time))}') + print("Script finished") + print(f"Time taken: {timedelta(seconds=round(time.time() - start_time))}") # if the program is launched as an Windows PE file # it might be launched from double clicking # pause the window before it closes automatically - if sys.argv[0].endswith('.exe'): - input('Press [ENTER] to exit script') + if sys.argv[0].endswith(".exe"): + input("Press [ENTER] to exit script") sys.exit(EXIT_CODE)