From 369b6904b25e9c9df8d5faa331679297f7536fd6 Mon Sep 17 00:00:00 2001 From: K4YT3X Date: Thu, 29 Nov 2018 15:08:15 -0500 Subject: [PATCH] 1.0.0 added automatic setup script --- video2x_setup.py | 167 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 video2x_setup.py diff --git a/video2x_setup.py b/video2x_setup.py new file mode 100644 index 0000000..fcd745f --- /dev/null +++ b/video2x_setup.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Name: Video2X Setup Script +Author: K4YT3X +Date Created: November 28, 2018 +Last Modified: November 29, 2018 + +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 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 json +import os +import subprocess +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.0.0' + + +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): + self.trash = [] + + def run(self): + + print('\nInstalling Python libraries') + self._install_python_requirements() + + print('\nInstalling FFMPEG') + self._install_ffmpeg() + + print('\nInstalling waifu2x-caffe') + self._install_waifu2x_caffe() + + 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 + """ + with open('requirements.txt', 'r') as req: + for line in req: + package = line.split(' ')[0] + pip_install(package) + + def _cleanup(self): + """ Cleanup all the temp files downloaded + """ + for file in self.trash: + try: + print('Deleting: {}'.format(file)) + os.remove(file) + except FileNotFoundError: + pass + + def _install_ffmpeg(self): + """ Install FFMPEG + """ + latest_release = 'https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-4.1-win64-static.zip' + + ffmpeg_zip = download(latest_release, tempfile.gettempdir()) + self.trash.append(ffmpeg_zip) + + with zipfile.ZipFile(ffmpeg_zip) as zipf: + zipf.extractall('{}\\video2x'.format(os.getenv('localappdata'))) + + def _install_waifu2x_caffe(self): + """ Install 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('{}\\video2x'.format(os.getenv('localappdata'))) + + def _generate_config(self): + """ Generate video2x config + """ + settings = {} + + settings['waifu2x_path'] = '{}\\video2x\\waifu2x-caffe\\waifu2x-caffe-cui.exe'.format(os.getenv('localappdata')) + settings['ffmpeg_path'] = '{}\\video2x\\ffmpeg-4.1-win64-static\\bin'.format(os.getenv('localappdata')) + settings['ffmpeg_arguments'] = '' + settings['ffmpeg_hwaccel'] = 'cuda' + + with open('video2x.json', 'w') as config: + json.dump(settings, config, indent=2) + config.close() + + +def download(url, save_path, chunk_size=4096): + """ Download file to local with requests library + """ + import requests + + output_file = '{}\\{}'.format(save_path, url.split('/')[-1]) + print('Downloading: {}'.format(url)) + print('Chunk size: {}'.format(chunk_size)) + print('Saving to: {}'.format(output_file)) + + stream = requests.get(url, stream=True) + + # Write content into file + with open(output_file, 'wb') as output: + for chunk in stream.iter_content(chunk_size=chunk_size): + if chunk: + print('!', end='') + output.write(chunk) + print() + + return output_file + + +def pip_install(package): + """ 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(['python', '-m', 'pip', 'install', '-U', package]).returncode + + +if __name__ == "__main__": + try: + print('Video2x Setup Script') + print('Version: {}'.format(VERSION)) + setup = Video2xSetup() + setup.run() + print('\n Script finished successfully') + except Exception: + traceback.print_exc() + print('An error has occurred') + print('Video2X Automatic Setup has failed') + exit(1)