2018-11-29 20:08:15 +00:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Name : Video2X Setup Script
Author : K4YT3X
Date Created : November 28 , 2018
2019-04-22 05:26:36 +00:00
Last Modified : April 21 , 2019
2018-11-29 20:08:15 +00:00
Licensed under the GNU General Public License Version 3 ( GNU GPL v3 ) ,
available at : https : / / www . gnu . org / licenses / gpl - 3.0 . txt
2019-02-08 19:03:46 +00:00
( C ) 2018 - 2019 K4YT3X
2018-11-29 20:08:15 +00:00
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
"""
2019-03-26 20:18:37 +00:00
import argparse
2018-11-29 20:08:15 +00:00
import json
import os
import subprocess
2019-03-31 07:46:15 +00:00
import sys
2018-11-29 20:08:15 +00:00
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
2019-03-31 07:46:15 +00:00
VERSION = ' 1.2.1 '
2019-03-26 20:18:37 +00:00
def process_arguments ( ) :
""" Processes CLI arguments
"""
parser = argparse . ArgumentParser ( formatter_class = argparse . ArgumentDefaultsHelpFormatter )
# video options
general_options = parser . add_argument_group ( ' General Options ' )
2019-03-26 22:04:47 +00:00
general_options . add_argument ( ' -d ' , ' --driver ' , help = ' driver to download and configure ' , action = ' store ' , choices = [ ' all ' , ' waifu2x_caffe ' , ' waifu2x_converter ' ] , default = ' all ' )
2019-03-26 20:18:37 +00:00
# parse arguments
return parser . parse_args ( )
2018-11-29 20:08:15 +00:00
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 .
"""
2019-03-31 07:46:15 +00:00
def __init__ ( self , driver , download_python_modules ) :
2019-03-26 20:18:37 +00:00
self . driver = driver
2019-03-31 07:46:15 +00:00
self . download_python_modules = download_python_modules
2018-11-29 20:08:15 +00:00
self . trash = [ ]
def run ( self ) :
2019-03-31 07:46:15 +00:00
if self . download_python_modules :
print ( ' \n Installing Python libraries ' )
self . _install_python_requirements ( )
2018-11-29 20:08:15 +00:00
print ( ' \n Installing FFMPEG ' )
self . _install_ffmpeg ( )
2019-03-26 20:18:37 +00:00
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 ( )
2018-11-29 20:08:15 +00:00
print ( ' \n Generating Video2X configuration file ' )
self . _generate_config ( )
print ( ' \n Cleaning 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 :
2019-03-26 20:18:37 +00:00
package = line . split ( ' == ' ) [ 0 ]
2018-11-29 20:08:15 +00:00
pip_install ( package )
def _cleanup ( self ) :
""" Cleanup all the temp files downloaded
"""
for file in self . trash :
try :
2019-04-22 05:26:36 +00:00
print ( f ' Deleting: { file } ' )
2018-11-29 20:08:15 +00:00
os . remove ( file )
except FileNotFoundError :
pass
def _install_ffmpeg ( self ) :
""" Install FFMPEG
"""
2019-03-26 20:18:37 +00:00
latest_release = ' https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-latest-win64-static.zip '
2018-11-29 20:08:15 +00:00
ffmpeg_zip = download ( latest_release , tempfile . gettempdir ( ) )
self . trash . append ( ffmpeg_zip )
with zipfile . ZipFile ( ffmpeg_zip ) as zipf :
2019-04-22 05:26:36 +00:00
zipf . extractall ( f ' { os . getenv ( " localappdata " ) } \\ video2x ' )
2018-11-29 20:08:15 +00:00
def _install_waifu2x_caffe ( self ) :
""" Install waifu2x_caffe
"""
2019-03-26 20:18:37 +00:00
print ( ' \n Installing waifu2x-caffe ' )
2018-11-29 20:08:15 +00:00
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 :
2019-04-22 05:26:36 +00:00
zipf . extractall ( f ' { os . getenv ( " localappdata " ) } \\ video2x ' )
2018-11-29 20:08:15 +00:00
2019-03-26 20:18:37 +00:00
def _install_waifu2x_converter_cpp ( self ) :
""" Install waifu2x_caffe
"""
print ( ' \n Installing 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 :
2019-04-22 05:26:36 +00:00
zipf . extractall ( f ' { os . getenv ( " localappdata " ) } \\ video2x \\ waifu2x-converter-cpp ' )
2019-03-26 20:18:37 +00:00
2018-11-29 20:08:15 +00:00
def _generate_config ( self ) :
""" Generate video2x config
"""
2019-03-09 17:51:06 +00:00
# Open current video2x.json file as template
with open ( ' video2x.json ' , ' r ' ) as template :
template_dict = json . load ( template )
template . close ( )
2019-03-26 20:18:37 +00:00
2019-04-22 05:26:36 +00:00
local_app_data = os . getenv ( ' localappdata ' )
2019-03-26 20:18:37 +00:00
# configure only the specified drivers
if self . driver == ' all ' :
2019-04-22 05:26:36 +00:00
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 '
2019-03-26 20:18:37 +00:00
elif self . driver == ' waifu2x_caffe ' :
2019-04-22 05:26:36 +00:00
template_dict [ ' waifu2x_caffe ' ] [ ' waifu2x_caffe_path ' ] = f ' { local_app_data } \\ video2x \\ waifu2x-caffe \\ waifu2x-caffe-cui.exe '
2019-03-26 20:18:37 +00:00
elif self . driver == ' waifu2x_converter ' :
2019-04-22 05:26:36 +00:00
template_dict [ ' waifu2x_converter ' ] [ ' waifu2x_converter_path ' ] = f ' { local_app_data } \\ video2x \\ waifu2x-converter-cpp '
2019-03-26 20:18:37 +00:00
2019-04-22 05:26:36 +00:00
template_dict [ ' ffmpeg ' ] [ ' ffmpeg_path ' ] = f ' { local_app_data } \\ video2x \\ ffmpeg-latest-win64-static \\ bin '
2019-03-09 17:51:06 +00:00
template_dict [ ' ffmpeg ' ] [ ' ffmpeg_hwaccel ' ] = ' auto '
template_dict [ ' ffmpeg ' ] [ ' extra_arguments ' ] = [ ]
2019-03-31 07:46:15 +00:00
template_dict [ ' video2x ' ] [ ' video2x_cache_folder ' ] = None
2019-03-09 17:51:06 +00:00
template_dict [ ' video2x ' ] [ ' preserve_frames ' ] = False
# Write configuration into file
2018-11-29 20:08:15 +00:00
with open ( ' video2x.json ' , ' w ' ) as config :
2019-03-31 07:46:15 +00:00
json . dump ( template_dict , config , indent = 4 )
2018-11-29 20:08:15 +00:00
config . close ( )
def download ( url , save_path , chunk_size = 4096 ) :
""" Download file to local with requests library
"""
2019-03-26 20:18:37 +00:00
from tqdm import tqdm
2018-11-29 20:08:15 +00:00
import requests
2019-04-22 05:26:36 +00:00
output_file = f ' { save_path } \\ { url . split ( " / " ) [ - 1 ] } '
print ( f ' Downloading: { url } ' )
print ( f ' Chunk size: { chunk_size } ' )
print ( f ' Saving to: { output_file } ' )
2018-11-29 20:08:15 +00:00
stream = requests . get ( url , stream = True )
2019-03-26 20:18:37 +00:00
total_size = int ( stream . headers [ ' content-length ' ] )
2018-11-29 20:08:15 +00:00
# Write content into file
with open ( output_file , ' wb ' ) as output :
2019-03-26 20:18:37 +00:00
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 ) )
2018-11-29 20:08:15 +00:00
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 :
2019-03-26 20:18:37 +00:00
args = process_arguments ( )
2019-03-31 07:46:15 +00:00
print ( ' Video2X Setup Script ' )
2019-04-22 05:26:36 +00:00
print ( f ' Version: { VERSION } ' )
2019-03-31 07:46:15 +00:00
# do not install pip modules if script
# is packaged in exe format
download_python_modules = True
if sys . argv [ 0 ] . endswith ( ' .exe ' ) :
print ( ' \n Script is packaged as exe, skipping pip module download ' )
download_python_modules = False
setup = Video2xSetup ( args . driver , download_python_modules )
2018-11-29 20:08:15 +00:00
setup . run ( )
2019-03-31 07:46:15 +00:00
print ( ' \n Script finished successfully ' )
2018-11-29 20:08:15 +00:00
except Exception :
traceback . print_exc ( )
print ( ' An error has occurred ' )
print ( ' Video2X Automatic Setup has failed ' )
exit ( 1 )