mirror of
https://github.com/k4yt3x/video2x.git
synced 2024-12-29 16:09:10 +00:00
a1e1d98929
sys.executable gets the python.exe used to run the script -r allows pip to use requirements.txt
232 lines
7.8 KiB
Python
232 lines
7.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Name: Video2X Setup Script
|
|
Author: K4YT3X
|
|
Author: BrianPetkovsek
|
|
Date Created: November 28, 2018
|
|
Last Modified: June 14, 2019
|
|
|
|
Licensed under the GNU General Public License Version 3 (GNU GPL v3),
|
|
available at: https://www.gnu.org/licenses/gpl-3.0.txt
|
|
|
|
(C) 2018-2019 K4YT3X
|
|
|
|
Description: This script helps installing all dependencies of video2x
|
|
and generates a configuration for it.
|
|
|
|
Installation Details:
|
|
- ffmpeg: %LOCALAPPDATA%\\video2x\\ffmpeg
|
|
- waifu2x-caffe: %LOCALAPPDATA%\\video2x\\waifu2x-caffe
|
|
|
|
"""
|
|
import argparse
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import traceback
|
|
import zipfile
|
|
|
|
# Requests doesn't come with windows, therefore
|
|
# it will be installed as a dependency and imported
|
|
# later in the script.
|
|
# import requests
|
|
|
|
VERSION = '1.2.1'
|
|
|
|
|
|
def process_arguments():
|
|
"""Processes CLI arguments
|
|
"""
|
|
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
|
|
# video options
|
|
general_options = parser.add_argument_group('General Options')
|
|
general_options.add_argument('-d', '--driver', help='driver to download and configure', action='store', choices=['all', 'waifu2x_caffe', 'waifu2x_converter'], default='all')
|
|
|
|
# parse arguments
|
|
return parser.parse_args()
|
|
|
|
|
|
class Video2xSetup:
|
|
""" 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.
|
|
"""
|
|
|
|
def __init__(self, driver, download_python_modules):
|
|
self.driver = driver
|
|
self.download_python_modules = download_python_modules
|
|
self.trash = []
|
|
|
|
def run(self):
|
|
if self.download_python_modules:
|
|
print('\nInstalling Python libraries')
|
|
self._install_python_requirements()
|
|
|
|
print('\nInstalling FFMPEG')
|
|
self._install_ffmpeg()
|
|
|
|
if self.driver == 'all':
|
|
self._install_waifu2x_caffe()
|
|
self._install_waifu2x_converter_cpp()
|
|
elif self.driver == 'waifu2x_caffe':
|
|
self._install_waifu2x_caffe()
|
|
elif self.driver == 'waifu2x_converter':
|
|
self._install_waifu2x_converter_cpp()
|
|
|
|
print('\nGenerating Video2X configuration file')
|
|
self._generate_config()
|
|
|
|
print('\nCleaning up temporary files')
|
|
self._cleanup()
|
|
|
|
def _install_python_requirements(self):
|
|
""" Read requirements.txt and return its content
|
|
"""
|
|
pip_install('requirements.txt')
|
|
|
|
def _cleanup(self):
|
|
""" Cleanup all the temp files downloaded
|
|
"""
|
|
for file in self.trash:
|
|
try:
|
|
print(f'Deleting: {file}')
|
|
os.remove(file)
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
def _install_ffmpeg(self):
|
|
""" Install FFMPEG
|
|
"""
|
|
latest_release = 'https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-latest-win64-static.zip'
|
|
|
|
ffmpeg_zip = download(latest_release, tempfile.gettempdir())
|
|
self.trash.append(ffmpeg_zip)
|
|
|
|
with zipfile.ZipFile(ffmpeg_zip) as zipf:
|
|
zipf.extractall(f'{os.getenv("localappdata")}\\video2x')
|
|
|
|
def _install_waifu2x_caffe(self):
|
|
""" Install waifu2x_caffe
|
|
"""
|
|
print('\nInstalling waifu2x-caffe')
|
|
import requests
|
|
|
|
# Get latest release of waifu2x-caffe via GitHub API
|
|
latest_release = json.loads(requests.get('https://api.github.com/repos/lltcggie/waifu2x-caffe/releases/latest').content)
|
|
|
|
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(f'{os.getenv("localappdata")}\\video2x')
|
|
|
|
def _install_waifu2x_converter_cpp(self):
|
|
""" Install waifu2x_caffe
|
|
"""
|
|
print('\nInstalling waifu2x-converter-cpp')
|
|
import re
|
|
import requests
|
|
|
|
# Get latest release of waifu2x-caffe via GitHub API
|
|
latest_release = json.loads(requests.get('https://api.github.com/repos/DeadSix27/waifu2x-converter-cpp/releases/latest').content)
|
|
|
|
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(f'{os.getenv("localappdata")}\\video2x\\waifu2x-converter-cpp')
|
|
|
|
def _generate_config(self):
|
|
""" Generate video2x config
|
|
"""
|
|
# Open current video2x.json file as template
|
|
with open('video2x.json', 'r') as template:
|
|
template_dict = json.load(template)
|
|
template.close()
|
|
|
|
local_app_data = os.getenv('localappdata')
|
|
|
|
# configure only the specified drivers
|
|
if self.driver == 'all':
|
|
template_dict['waifu2x_caffe']['waifu2x_caffe_path'] = f'{local_app_data}\\video2x\\waifu2x-caffe\\waifu2x-caffe-cui.exe'
|
|
template_dict['waifu2x_converter']['waifu2x_converter_path'] = f'{local_app_data}\\video2x\\waifu2x-converter-cpp'
|
|
elif self.driver == 'waifu2x_caffe':
|
|
template_dict['waifu2x_caffe']['waifu2x_caffe_path'] = f'{local_app_data}\\video2x\\waifu2x-caffe\\waifu2x-caffe-cui.exe'
|
|
elif self.driver == 'waifu2x_converter':
|
|
template_dict['waifu2x_converter']['waifu2x_converter_path'] = f'{local_app_data}\\video2x\\waifu2x-converter-cpp'
|
|
|
|
template_dict['ffmpeg']['ffmpeg_path'] = f'{local_app_data}\\video2x\\ffmpeg-latest-win64-static\\bin'
|
|
template_dict['video2x']['video2x_cache_directory'] = None
|
|
template_dict['video2x']['preserve_frames'] = False
|
|
|
|
# Write configuration into file
|
|
with open('video2x.json', 'w') as config:
|
|
json.dump(template_dict, config, indent=4)
|
|
config.close()
|
|
|
|
|
|
def download(url, save_path, chunk_size=4096):
|
|
""" Download file to local with requests library
|
|
"""
|
|
from tqdm import tqdm
|
|
import requests
|
|
|
|
output_file = f'{save_path}\\{url.split("/")[-1]}'
|
|
print(f'Downloading: {url}')
|
|
print(f'Chunk size: {chunk_size}')
|
|
print(f'Saving to: {output_file}')
|
|
|
|
stream = requests.get(url, stream=True)
|
|
total_size = int(stream.headers['content-length'])
|
|
|
|
# Write content into file
|
|
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:
|
|
output.write(chunk)
|
|
progress_bar.update(len(chunk))
|
|
|
|
return output_file
|
|
|
|
|
|
def pip_install(file):
|
|
""" 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
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
args = process_arguments()
|
|
print('Video2X Setup Script')
|
|
print(f'Version: {VERSION}')
|
|
|
|
# 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')
|
|
download_python_modules = False
|
|
|
|
setup = Video2xSetup(args.driver, download_python_modules)
|
|
setup.run()
|
|
print('\nScript finished successfully')
|
|
except Exception:
|
|
traceback.print_exc()
|
|
print('An error has occurred')
|
|
print('Video2X Automatic Setup has failed')
|
|
exit(1)
|