mirror of
https://github.com/k4yt3x/video2x.git
synced 2026-02-14 00:54:47 +08:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f2ad35d41 | ||
|
|
d688ca490e | ||
|
|
708c983c1e | ||
|
|
9b91016d98 | ||
|
|
b024581906 | ||
|
|
8fd3292cd6 | ||
|
|
e646825c57 | ||
|
|
fdf326108f | ||
|
|
e26561c56a | ||
|
|
9d7c3963c3 | ||
|
|
ce5d4051e5 | ||
|
|
9f6f1eee5b | ||
|
|
6ae7491652 | ||
|
|
d35472fbfb | ||
|
|
7166afdc0e |
2
.github/workflows/nightly.yml
vendored
2
.github/workflows/nightly.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
python -m pip install -U pip
|
python -m pip install -U pip
|
||||||
pip install -U pyinstaller pywin32
|
pip install -U pyinstaller pywin32
|
||||||
pip install -U -r requirements-windows.txt
|
pip install -U -r requirements.txt
|
||||||
- name: Build Video2X CLI
|
- name: Build Video2X CLI
|
||||||
run: |
|
run: |
|
||||||
pyinstaller --noconfirm --log-level=WARN `
|
pyinstaller --noconfirm --log-level=WARN `
|
||||||
|
|||||||
57
Dockerfile
57
Dockerfile
@@ -1,8 +1,20 @@
|
|||||||
|
# Name: Video2X Dockerfile
|
||||||
|
# Creator: Danielle Douglas
|
||||||
|
# Date Created: Unknown
|
||||||
|
# Last Modified: January 14, 2020
|
||||||
|
|
||||||
|
# Editor: Lhanjian
|
||||||
|
# Last Modified: May 24, 2020
|
||||||
|
|
||||||
|
# Editor: K4YT3X
|
||||||
|
# Last Modified: May 30, 2020
|
||||||
|
|
||||||
FROM ubuntu:19.10
|
FROM ubuntu:19.10
|
||||||
#FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
|
#FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
|
||||||
MAINTAINER Danielle Douglas <ddouglas87@gmail.com>
|
|
||||||
MAINTAINER Lhanjian <lhjay1@foxmail.com>
|
LABEL maintainer="Danielle Douglas <ddouglas87@gmail.com>"
|
||||||
MAINTAINER K4YT3X <k4yt3x@k4yt3x.com>
|
LABEL maintainer="Lhanjian <lhjay1@foxmail.com>"
|
||||||
|
LABEL maintainer="K4YT3X <k4yt3x@k4yt3x.com>"
|
||||||
|
|
||||||
# Don't ask questions during image setup.
|
# Don't ask questions during image setup.
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
@@ -18,22 +30,10 @@ RUN apt-get update && apt-get install -y apt-utils &&\
|
|||||||
add-apt-repository -y ppa:graphics-drivers/ppa &&\
|
add-apt-repository -y ppa:graphics-drivers/ppa &&\
|
||||||
apt-get install -y --no-install-recommends apt-fast && apt-fast update
|
apt-get install -y --no-install-recommends apt-fast && apt-fast update
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-fast install -y --no-install-recommends autoconf ca-certificates curl ffmpeg frei0r-plugins-dev g++ gcc git-core gnupg2 gnutls-dev ladspa-sdk libass-dev libass-dev libbluray-dev libc6-dev libcaca-dev libcdio-paranoia-dev libchromaprint-dev libcodec2-dev libfdk-aac-dev libfdk-aac-dev libfontconfig1-dev libfreetype6-dev libfreetype6-dev libfreetype6-dev libfribidi-dev libgme-dev libgnutls28-dev libgsm1-dev libjack-dev libjack-dev liblilv-dev libmagic-dev libmagic1 libmodplug-dev libmp3lame-dev libmp3lame-dev libmysofa-dev libnuma-dev libopenal-dev libopencore-amrnb-dev libopencore-amrwb-dev libopenjp2-7-dev libopenmpt-dev libopus-dev libopus-dev libpulse-dev librsvg2-dev librtmp-dev librubberband-dev libsdl2-dev libsdl2-dev libshine-dev libsmbclient-dev libsnappy-dev libsoxr-dev libspeex-dev libssh-dev libtesseract-dev libtheora-dev libtool libtwolame-dev libv4l-dev libva-dev libva-dev libvdpau-dev libvdpau-dev libvo-amrwbenc-dev libvorbis-dev libvorbis-dev libvorbis-dev libvpx-dev libvpx-dev libwavpack-dev libwebp-dev libx264-dev libx264-dev libx265-dev libx265-dev libxcb-shm0-dev libxcb-shm0-dev libxcb-xfixes0-dev libxcb-xfixes0-dev libxcb1-dev libxcb1-dev libxml2-dev libxvidcore-dev libzmq3-dev libzvbi-dev nvidia-cuda-toolkit nvidia-driver-440 opencl-dev p11-kit pkg-config pkg-config python3-dev python3-pip python3-setuptools python3-wheel python3.8 texinfo texinfo wget wget yasm zlib1g-dev zlib1g-dev
|
||||||
|
|
||||||
## Install Video2X ##
|
# Install NASM
|
||||||
|
|
||||||
# Dependencies
|
|
||||||
RUN apt-fast install -y --no-install-recommends git-core python3-pip python3-setuptools python3-wheel python3-psutil ffmpeg gcc g++ \
|
|
||||||
libc6-dev python3-dev libmagic-dev libmagic1 python3.8 nvidia-driver-440 nvidia-cuda-toolkit gnupg2 curl ca-certificates pkg-config \
|
|
||||||
autoconf libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libass-dev libfreetype6-dev libgnutls28-dev \
|
|
||||||
libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev texinfo wget yasm zlib1g-dev \
|
|
||||||
libass-dev libfreetype6-dev libsdl2-dev p11-kit libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \
|
|
||||||
pkg-config texinfo wget zlib1g-dev libchromaprint-dev frei0r-plugins-dev gnutls-dev ladspa-sdk libcaca-dev libcdio-paranoia-dev libcodec2-dev \
|
|
||||||
libfontconfig1-dev libfreetype6-dev libfribidi-dev libgme-dev libgsm1-dev libjack-dev libmodplug-dev libmp3lame-dev libopencore-amrnb-dev \
|
|
||||||
libopencore-amrwb-dev libopenjp2-7-dev libopenmpt-dev libopus-dev libpulse-dev librsvg2-dev librubberband-dev librtmp-dev libshine-dev \
|
|
||||||
libsmbclient-dev libsnappy-dev libsoxr-dev libspeex-dev libssh-dev libtesseract-dev libtheora-dev libtwolame-dev libv4l-dev libvo-amrwbenc-dev \
|
|
||||||
libvorbis-dev libvpx-dev libwavpack-dev libwebp-dev libx264-dev libx265-dev libxvidcore-dev libxml2-dev libzmq3-dev libzvbi-dev liblilv-dev \
|
|
||||||
libopenal-dev opencl-dev libjack-dev libbluray-dev libfdk-aac-dev libmysofa-dev
|
|
||||||
|
|
||||||
RUN curl -vfsSLO https://www.nasm.us/pub/nasm/releasebuilds/$NASM_VERSION/nasm-$NASM_VERSION.tar.bz2 \
|
RUN curl -vfsSLO https://www.nasm.us/pub/nasm/releasebuilds/$NASM_VERSION/nasm-$NASM_VERSION.tar.bz2 \
|
||||||
&& tar -xjf nasm-$NASM_VERSION.tar.bz2 \
|
&& tar -xjf nasm-$NASM_VERSION.tar.bz2 \
|
||||||
&& cd nasm-$NASM_VERSION \
|
&& cd nasm-$NASM_VERSION \
|
||||||
@@ -42,6 +42,8 @@ RUN curl -vfsSLO https://www.nasm.us/pub/nasm/releasebuilds/$NASM_VERSION/nasm-$
|
|||||||
&& make -j$(nproc) \
|
&& make -j$(nproc) \
|
||||||
&& make install
|
&& make install
|
||||||
|
|
||||||
|
# Compile FFmpeg with CUDA support
|
||||||
|
|
||||||
RUN git clone --recurse-submodules -b n$NVCODEC_VERSION --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers \
|
RUN git clone --recurse-submodules -b n$NVCODEC_VERSION --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers \
|
||||||
&& cd nv-codec-headers \
|
&& cd nv-codec-headers \
|
||||||
&& make install
|
&& make install
|
||||||
@@ -72,19 +74,19 @@ RUN curl -vfsSLO https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2 \
|
|||||||
&& make -j$(nproc) \
|
&& make -j$(nproc) \
|
||||||
&& make install
|
&& make install
|
||||||
|
|
||||||
# Install Nvidia Driver
|
# Add Nvidia's machine-learning repository for libcudnn7 and libcudnn7-dev
|
||||||
|
RUN curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add - &&\
|
||||||
RUN curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add -
|
echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list
|
||||||
|
|
||||||
RUN echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list
|
|
||||||
|
|
||||||
# Install Video2X
|
# Install Video2X
|
||||||
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
|
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
|
||||||
RUN cd / && python3.8 -m pip install --upgrade pip &&\
|
RUN cd / && python3.8 -m pip install --upgrade pip &&\
|
||||||
git clone --recurse-submodules --progress https://github.com/k4yt3x/video2x.git --depth=1 &&\
|
git clone --recurse-submodules --progress https://github.com/k4yt3x/video2x.git --depth=1 &&\
|
||||||
python3.8 -m pip install avalon_framework colorama python-magic patool psutil pyqt5 pyunpack pyyaml requests tqdm
|
python3.8 -m pip install -U -r video2x/src/requirements.txt
|
||||||
|
|
||||||
# eg: docker build -t video2x . --build-arg driver=waifu2x_ncnn_vulkan
|
# Compile drivers
|
||||||
|
|
||||||
|
# example: docker build -t video2x . --build-arg driver=waifu2x_ncnn_vulkan
|
||||||
ARG driver=all
|
ARG driver=all
|
||||||
|
|
||||||
# Check if driver exists.
|
# Check if driver exists.
|
||||||
@@ -178,9 +180,8 @@ RUN if [ "$driver" = "all" ] || [ "$driver" = "waifu2x_converter" ] ;\
|
|||||||
#ENTRYPOINT ["/entrypoint.sh"]
|
#ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
||||||
WORKDIR /host
|
WORKDIR /host
|
||||||
ENTRYPOINT ["/bin/bash"]
|
ENTRYPOINT ["python3", "/video2x/src/video2x.py"]
|
||||||
|
|
||||||
ENV NVIDIA_DRIVER_CAPABILITIES all
|
ENV NVIDIA_DRIVER_CAPABILITIES all
|
||||||
# Docker image can ask questions now, if needed.
|
# Docker image can ask questions now, if needed.
|
||||||
ENV DEBIAN_FRONTEND teletype
|
ENV DEBIAN_FRONTEND teletype
|
||||||
|
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -33,7 +33,7 @@ To download the latest nightly build, go to the [GitHub Actions](https://github.
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
Video2X is a video/GIF/image upscaling software based on Waifu2X, Anime4K and SRMD written in Python 3. It upscales videos, GIFs and images, restoring details from low-resolution inputs. Video2X also accepts GIF input to video output and video input to GIF output.
|
Video2X is a video/GIF/image upscaling software based on Waifu2X, Anime4K, SRMD and RealSR written in Python 3. It upscales videos, GIFs and images, restoring details from low-resolution inputs. Video2X also accepts GIF input to video output and video input to GIF output.
|
||||||
|
|
||||||
Currently, Video2X supports the following drivers (implementations of algorithms).
|
Currently, Video2X supports the following drivers (implementations of algorithms).
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@ Currently, Video2X supports the following drivers (implementations of algorithms
|
|||||||
- **Waifu2X Converter CPP**: CPP implementation of waifu2x based on OpenCL and OpenCV
|
- **Waifu2X Converter CPP**: CPP implementation of waifu2x based on OpenCL and OpenCV
|
||||||
- **Waifu2X NCNN Vulkan**: NCNN implementation of waifu2x based on Vulkan API
|
- **Waifu2X NCNN Vulkan**: NCNN implementation of waifu2x based on Vulkan API
|
||||||
- **SRMD NCNN Vulkan**: NCNN implementation of SRMD based on Vulkan API
|
- **SRMD NCNN Vulkan**: NCNN implementation of SRMD based on Vulkan API
|
||||||
|
- **RealSR NCNN Vulkan**: NCNN implementation of RealSR based on Vulkan API
|
||||||
- **Anime4KCPP**: CPP implementation of Anime4K
|
- **Anime4KCPP**: CPP implementation of Anime4K
|
||||||
|
|
||||||
### Video Upscaling
|
### Video Upscaling
|
||||||
@@ -233,6 +234,12 @@ Are you interested in how the idea of Video2X was born? Do you want to know the
|
|||||||
### -c CONFIG, --config CONFIG
|
### -c CONFIG, --config CONFIG
|
||||||
video2x config file path
|
video2x config file path
|
||||||
|
|
||||||
|
### --log LOG
|
||||||
|
log file path (default: program_directory\video2x_%Y-%m-%d_%H-%M-%S.log)
|
||||||
|
|
||||||
|
### --nolog
|
||||||
|
disable logging (default: False)
|
||||||
|
|
||||||
### -v, --version
|
### -v, --version
|
||||||
display version, lawful information and exit
|
display version, lawful information and exit
|
||||||
|
|
||||||
@@ -247,6 +254,7 @@ Available options are:
|
|||||||
- waifu2x_converter_cpp
|
- waifu2x_converter_cpp
|
||||||
- waifu2x_ncnn_vulkan
|
- waifu2x_ncnn_vulkan
|
||||||
- srmd_ncnn_vulkan
|
- srmd_ncnn_vulkan
|
||||||
|
- realsr_ncnn_vulkan
|
||||||
- anime4kcpp
|
- anime4kcpp
|
||||||
|
|
||||||
### -r RATIO, --ratio RATIO
|
### -r RATIO, --ratio RATIO
|
||||||
@@ -278,6 +286,7 @@ This project relies on the following software and projects.
|
|||||||
- [waifu2x-converter-cpp](https://github.com/DeadSix27/waifu2x-converter-cpp)
|
- [waifu2x-converter-cpp](https://github.com/DeadSix27/waifu2x-converter-cpp)
|
||||||
- [waifu2x-ncnn-vulkan](https://github.com/nihui/waifu2x-ncnn-vulkan)
|
- [waifu2x-ncnn-vulkan](https://github.com/nihui/waifu2x-ncnn-vulkan)
|
||||||
- [srmd-ncnn-vulkan](https://github.com/nihui/srmd-ncnn-vulkan)
|
- [srmd-ncnn-vulkan](https://github.com/nihui/srmd-ncnn-vulkan)
|
||||||
|
- [realsr-ncnn-vulkan](https://github.com/nihui/realsr-ncnn-vulkan)
|
||||||
- [Anime4K](https://github.com/bloc97/Anime4K)
|
- [Anime4K](https://github.com/bloc97/Anime4K)
|
||||||
- [Anime4KCPP](https://github.com/TianZerL/Anime4KCPP)
|
- [Anime4KCPP](https://github.com/TianZerL/Anime4KCPP)
|
||||||
- [Gifski](https://github.com/ImageOptim/gifski)
|
- [Gifski](https://github.com/ImageOptim/gifski)
|
||||||
@@ -286,10 +295,10 @@ This project relies on the following software and projects.
|
|||||||
|
|
||||||
Appreciations given to the following personnel who have contributed significantly to the project (specifically the technical perspective).
|
Appreciations given to the following personnel who have contributed significantly to the project (specifically the technical perspective).
|
||||||
|
|
||||||
- @BrianPetkovsek
|
- [@BrianPetkovsek](https://github.com/BrianPetkovsek)
|
||||||
- @SAT3LL
|
- [@sat3ll](https://github.com/sat3ll)
|
||||||
- @ddouglas87
|
- [@ddouglas87](https://github.com/ddouglas87)
|
||||||
- @lhanjian
|
- [@lhanjian](https://github.com/lhanjian)
|
||||||
|
|
||||||
## Related Projects
|
## Related Projects
|
||||||
|
|
||||||
|
|||||||
46
src/bilogger.py
Normal file
46
src/bilogger.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Creator: Video2X Bidirectional Logger
|
||||||
|
Author: K4YT3X
|
||||||
|
Date Created: June 4, 2020
|
||||||
|
Last Modified: June 4, 2020
|
||||||
|
"""
|
||||||
|
|
||||||
|
# built-in imports
|
||||||
|
import _io
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
|
||||||
|
class BiLogger(object):
|
||||||
|
""" A bidirectional logger that both prints the output
|
||||||
|
and log all output to file.
|
||||||
|
|
||||||
|
Original code from: https://stackoverflow.com/a/14906787
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, terminal: _io.TextIOWrapper, logfile: pathlib.Path):
|
||||||
|
""" initialize BiLogger
|
||||||
|
|
||||||
|
Args:
|
||||||
|
terminal (_io.TextIOWrapper): original terminal IO wrapper
|
||||||
|
logfile (pathlib.Path): target log file path object
|
||||||
|
"""
|
||||||
|
self.terminal = terminal
|
||||||
|
self.log = logfile.open(mode='a+')
|
||||||
|
|
||||||
|
def write(self, message: str):
|
||||||
|
""" write message to original terminal output and log file
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message (str): message to write
|
||||||
|
"""
|
||||||
|
self.terminal.write(message)
|
||||||
|
self.terminal.flush()
|
||||||
|
self.log.write(message)
|
||||||
|
self.log.flush()
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
""" flush logger (for compability only)
|
||||||
|
"""
|
||||||
|
pass
|
||||||
@@ -82,7 +82,7 @@ Copy-Item "dist\video2x.exe" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2
|
|||||||
Copy-Item "dist\video2x_gui.exe" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
Copy-Item "dist\video2x_gui.exe" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
||||||
Copy-Item "dist\video2x_setup.exe" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
Copy-Item "dist\video2x_setup.exe" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
||||||
Copy-Item "video2x.yaml" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
Copy-Item "video2x.yaml" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
||||||
Copy-Item "requirements-windows.txt" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
Copy-Item "requirements.txt" -Destination "$($VIDEO2X_VERSION)\video2x-$($VIDEO2X_VERSION)-win32-light\"
|
||||||
|
|
||||||
# clean up temporary files
|
# clean up temporary files
|
||||||
Write-Host -ForegroundColor White "`nDeleting temporary files"
|
Write-Host -ForegroundColor White "`nDeleting temporary files"
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
avalon_framework
|
|
||||||
colorama
|
|
||||||
patool
|
|
||||||
psutil
|
|
||||||
pyqt5
|
|
||||||
python-magic
|
|
||||||
pyunpack
|
|
||||||
pyyaml
|
|
||||||
requests
|
|
||||||
tqdm
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
avalon_framework
|
|
||||||
colorama
|
|
||||||
patool
|
|
||||||
psutil
|
|
||||||
pyqt5
|
|
||||||
python-magic
|
|
||||||
python-magic-bin
|
|
||||||
pyunpack
|
|
||||||
pyyaml
|
|
||||||
requests
|
|
||||||
tqdm
|
|
||||||
9
src/requirements.txt
Normal file
9
src/requirements.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
avalon_framework
|
||||||
|
colorama
|
||||||
|
patool
|
||||||
|
pyqt5
|
||||||
|
python-magic; platform_system != "Windows"
|
||||||
|
python-magic-bin; platform_system == "Windows"
|
||||||
|
pyyaml
|
||||||
|
requests
|
||||||
|
tqdm
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
Name: Video2X Upscaler
|
Name: Video2X Upscaler
|
||||||
Author: K4YT3X
|
Author: K4YT3X
|
||||||
Date Created: December 10, 2018
|
Date Created: December 10, 2018
|
||||||
Last Modified: May 29, 2020
|
Last Modified: June 4, 2020
|
||||||
|
|
||||||
Description: This file contains the Upscaler class. Each
|
Description: This file contains the Upscaler class. Each
|
||||||
instance of the Upscaler class is an upscaler on an image or
|
instance of the Upscaler class is an upscaler on an image or
|
||||||
@@ -50,7 +50,7 @@ language.install()
|
|||||||
_ = language.gettext
|
_ = language.gettext
|
||||||
|
|
||||||
# version information
|
# version information
|
||||||
UPSCALER_VERSION = '4.2.0'
|
UPSCALER_VERSION = '4.2.1'
|
||||||
|
|
||||||
# these names are consistent for
|
# these names are consistent for
|
||||||
# - driver selection in command line
|
# - driver selection in command line
|
||||||
@@ -469,9 +469,12 @@ class Upscaler:
|
|||||||
self.current_input_file, output_path = self.processing_queue.get()
|
self.current_input_file, output_path = self.processing_queue.get()
|
||||||
|
|
||||||
# get file type
|
# get file type
|
||||||
input_file_mime_type = magic.from_file(str(self.current_input_file.absolute()), mime=True)
|
try:
|
||||||
input_file_type = input_file_mime_type.split('/')[0]
|
input_file_mime_type = magic.from_file(str(self.current_input_file.absolute()), mime=True)
|
||||||
input_file_subtype = input_file_mime_type.split('/')[1]
|
input_file_type = input_file_mime_type.split('/')[0]
|
||||||
|
input_file_subtype = input_file_mime_type.split('/')[1]
|
||||||
|
except magic.magic.MagicException:
|
||||||
|
input_file_type = input_file_subtype = None
|
||||||
|
|
||||||
# in case python-magic fails to detect file type
|
# in case python-magic fails to detect file type
|
||||||
# try guessing file mime type with mimetypes
|
# try guessing file mime type with mimetypes
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ __ __ _ _ ___ __ __
|
|||||||
Name: Video2X Controller
|
Name: Video2X Controller
|
||||||
Creator: K4YT3X
|
Creator: K4YT3X
|
||||||
Date Created: Feb 24, 2018
|
Date Created: Feb 24, 2018
|
||||||
Last Modified: May 23, 2020
|
Last Modified: June 4, 2020
|
||||||
|
|
||||||
Editor: BrianPetkovsek
|
Editor: BrianPetkovsek
|
||||||
Last Modified: June 17, 2019
|
Last Modified: June 17, 2019
|
||||||
@@ -49,12 +49,14 @@ smooth and edges sharp.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
|
from bilogger import BiLogger
|
||||||
from upscaler import AVAILABLE_DRIVERS
|
from upscaler import AVAILABLE_DRIVERS
|
||||||
from upscaler import UPSCALER_VERSION
|
from upscaler import UPSCALER_VERSION
|
||||||
from upscaler import Upscaler
|
from upscaler import Upscaler
|
||||||
|
|
||||||
# built-in imports
|
# built-in imports
|
||||||
import argparse
|
import argparse
|
||||||
|
import datetime
|
||||||
import gettext
|
import gettext
|
||||||
import importlib
|
import importlib
|
||||||
import locale
|
import locale
|
||||||
@@ -79,8 +81,7 @@ language = gettext.translation(DOMAIN, LOCALE_DIRECTORY, [default_locale], fallb
|
|||||||
language.install()
|
language.install()
|
||||||
_ = language.gettext
|
_ = language.gettext
|
||||||
|
|
||||||
|
CLI_VERSION = '4.1.0'
|
||||||
CLI_VERSION = '4.0.1'
|
|
||||||
|
|
||||||
LEGAL_INFO = _('''Video2X CLI Version: {}
|
LEGAL_INFO = _('''Video2X CLI Version: {}
|
||||||
Upscaler Version: {}
|
Upscaler Version: {}
|
||||||
@@ -118,6 +119,9 @@ def parse_arguments():
|
|||||||
|
|
||||||
video2x_options.add_argument('-c', '--config', type=pathlib.Path, help=_('video2x config file path'), action='store',
|
video2x_options.add_argument('-c', '--config', type=pathlib.Path, help=_('video2x config file path'), action='store',
|
||||||
default=pathlib.Path(__file__).parent.absolute() / 'video2x.yaml')
|
default=pathlib.Path(__file__).parent.absolute() / 'video2x.yaml')
|
||||||
|
video2x_options.add_argument('--log', type=pathlib.Path, help=_('log file path'),
|
||||||
|
default=pathlib.Path(__file__).parent.absolute() / f'video2x_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.log')
|
||||||
|
video2x_options.add_argument('--nolog', help=_('disable logging'), action='store_true')
|
||||||
video2x_options.add_argument('-v', '--version', help=_('display version, lawful information and exit'), action='store_true')
|
video2x_options.add_argument('-v', '--version', help=_('display version, lawful information and exit'), action='store_true')
|
||||||
|
|
||||||
# scaling options
|
# scaling options
|
||||||
@@ -179,6 +183,13 @@ if video2x_args.version:
|
|||||||
print(LEGAL_INFO)
|
print(LEGAL_INFO)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
# redirect output to both terminal and log file
|
||||||
|
if video2x_args.nolog is False:
|
||||||
|
LOGFILE = video2x_args.log
|
||||||
|
Avalon.debug_info(_('Redirecting console logs to {}').format(LOGFILE))
|
||||||
|
sys.stdout = BiLogger(sys.stdout, LOGFILE)
|
||||||
|
sys.stderr = BiLogger(sys.stderr, LOGFILE)
|
||||||
|
|
||||||
# read configurations from configuration file
|
# read configurations from configuration file
|
||||||
config = read_config(video2x_args.config)
|
config = read_config(video2x_args.config)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Name: Video2X Configuration File
|
# Name: Video2X Configuration File
|
||||||
# Creator: K4YT3X
|
# Creator: K4YT3X
|
||||||
# Date Created: October 23, 2018
|
# Date Created: October 23, 2018
|
||||||
# Last Modified: May 26, 2020
|
# Last Modified: May 29, 2020
|
||||||
# Values here are the default values. Change the value here to
|
# Values here are the default values. Change the value here to
|
||||||
# save the default value permanently.
|
# save the default value permanently.
|
||||||
# Items commented out are parameters irrelevant to this context
|
# Items commented out are parameters irrelevant to this context
|
||||||
@@ -167,6 +167,6 @@ gifski:
|
|||||||
nosort: false # Use files exactly in the order given, rather than sorted
|
nosort: false # Use files exactly in the order given, rather than sorted
|
||||||
quiet: false # Do not show a progress bar
|
quiet: false # Do not show a progress bar
|
||||||
video2x:
|
video2x:
|
||||||
video2x_cache_directory: null # default: %TEMP%\video2x
|
video2x_cache_directory: null # default: %TEMP%\video2x, directory where cache files are stored, will be deleted if preserve_frames is not set to true
|
||||||
image_format: png
|
image_format: png # png/jpg intermediate file format used for extracted frames during video processing
|
||||||
preserve_frames: false
|
preserve_frames: false # if set to true, the cache directory won't be cleaned upon task completion
|
||||||
|
|||||||
@@ -4,16 +4,18 @@
|
|||||||
Creator: Video2X GUI
|
Creator: Video2X GUI
|
||||||
Author: K4YT3X
|
Author: K4YT3X
|
||||||
Date Created: May 5, 2020
|
Date Created: May 5, 2020
|
||||||
Last Modified: May 26, 2020
|
Last Modified: June 4, 2020
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
|
from bilogger import BiLogger
|
||||||
from upscaler import UPSCALER_VERSION
|
from upscaler import UPSCALER_VERSION
|
||||||
from upscaler import Upscaler
|
from upscaler import Upscaler
|
||||||
from wrappers.ffmpeg import Ffmpeg
|
from wrappers.ffmpeg import Ffmpeg
|
||||||
|
|
||||||
# built-in imports
|
# built-in imports
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import datetime
|
||||||
import json
|
import json
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import os
|
import os
|
||||||
@@ -32,7 +34,7 @@ from PyQt5.QtGui import *
|
|||||||
from PyQt5.QtWidgets import *
|
from PyQt5.QtWidgets import *
|
||||||
import magic
|
import magic
|
||||||
|
|
||||||
GUI_VERSION = '2.5.0'
|
GUI_VERSION = '2.6.0'
|
||||||
|
|
||||||
LEGAL_INFO = f'''Video2X GUI Version: {GUI_VERSION}\\
|
LEGAL_INFO = f'''Video2X GUI Version: {GUI_VERSION}\\
|
||||||
Upscaler Version: {UPSCALER_VERSION}\\
|
Upscaler Version: {UPSCALER_VERSION}\\
|
||||||
@@ -131,9 +133,12 @@ class InputTableModel(QAbstractTableModel):
|
|||||||
# if path is single file
|
# if path is single file
|
||||||
# determine file type
|
# determine file type
|
||||||
elif file_path.is_file():
|
elif file_path.is_file():
|
||||||
input_file_mime_type = magic.from_file(str(file_path.absolute()), mime=True)
|
try:
|
||||||
input_file_type = input_file_mime_type.split('/')[0]
|
input_file_mime_type = magic.from_file(str(file_path.absolute()), mime=True)
|
||||||
input_file_subtype = input_file_mime_type.split('/')[1]
|
input_file_type = input_file_mime_type.split('/')[0]
|
||||||
|
input_file_subtype = input_file_mime_type.split('/')[1]
|
||||||
|
except magic.magic.MagicException:
|
||||||
|
input_file_type = input_file_subtype = None
|
||||||
|
|
||||||
# in case python-magic fails to detect file type
|
# in case python-magic fails to detect file type
|
||||||
# try guessing file mime type with mimetypes
|
# try guessing file mime type with mimetypes
|
||||||
@@ -187,6 +192,9 @@ class Video2XMainWindow(QMainWindow):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
uic.loadUi(str(resource_path('video2x_gui.ui')), self)
|
uic.loadUi(str(resource_path('video2x_gui.ui')), self)
|
||||||
|
|
||||||
|
# generate log file name
|
||||||
|
self.logfile = pathlib.Path(__file__).parent.absolute() / f'video2x_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.log'
|
||||||
|
|
||||||
# create thread pool for upscaler workers
|
# create thread pool for upscaler workers
|
||||||
self.threadpool = QThreadPool()
|
self.threadpool = QThreadPool()
|
||||||
|
|
||||||
@@ -834,12 +842,9 @@ class Video2XMainWindow(QMainWindow):
|
|||||||
self.input_table_view.setModel(self.input_table_model)
|
self.input_table_view.setModel(self.input_table_model)
|
||||||
|
|
||||||
def input_table_delete_selected(self):
|
def input_table_delete_selected(self):
|
||||||
items_to_delete = []
|
indexes_to_delete = [i.row() for i in self.input_table_view.selectedIndexes()]
|
||||||
for index in [i.row() for i in self.input_table_view.selectedIndexes()]:
|
for index in sorted(indexes_to_delete, reverse=True):
|
||||||
items_to_delete.append(self.input_table_data[index])
|
del self.input_table_data[index]
|
||||||
|
|
||||||
for item in items_to_delete:
|
|
||||||
self.input_table_data.remove(item)
|
|
||||||
|
|
||||||
self.update_output_path()
|
self.update_output_path()
|
||||||
self.update_input_table()
|
self.update_input_table()
|
||||||
@@ -890,9 +895,12 @@ class Video2XMainWindow(QMainWindow):
|
|||||||
if input_path.is_file():
|
if input_path.is_file():
|
||||||
|
|
||||||
# generate suffix automatically
|
# generate suffix automatically
|
||||||
input_file_mime_type = magic.from_file(str(input_path.absolute()), mime=True)
|
try:
|
||||||
input_file_type = input_file_mime_type.split('/')[0]
|
input_file_mime_type = magic.from_file(str(input_path.absolute()), mime=True)
|
||||||
input_file_subtype = input_file_mime_type.split('/')[1]
|
input_file_type = input_file_mime_type.split('/')[0]
|
||||||
|
input_file_subtype = input_file_mime_type.split('/')[1]
|
||||||
|
except magic.magic.MagicException:
|
||||||
|
input_file_type = input_file_subtype = None
|
||||||
|
|
||||||
# in case python-magic fails to detect file type
|
# in case python-magic fails to detect file type
|
||||||
# try guessing file mime type with mimetypes
|
# try guessing file mime type with mimetypes
|
||||||
@@ -1026,8 +1034,9 @@ class Video2XMainWindow(QMainWindow):
|
|||||||
{}\\
|
{}\\
|
||||||
Check the console output for details.\\
|
Check the console output for details.\\
|
||||||
When reporting an error, please include console output.\\
|
When reporting an error, please include console output.\\
|
||||||
You can [submit an issue on GitHub](https://github.com/k4yt3x/video2x/issues/new?assignees=K4YT3X&labels=bug&template=bug-report.md&title={}) to report this error.'''
|
You can [submit an issue on GitHub](https://github.com/k4yt3x/video2x/issues/new?assignees=K4YT3X&labels=bug&template=bug-report.md&title={}) to report this error.\\
|
||||||
message_box.setText(error_message.format(exception, urllib.parse.quote(str(exception))))
|
It\'s also highly recommended for you to attach the [log file]({}) under the programs\'s parent folder named {}.'''
|
||||||
|
message_box.setText(error_message.format(exception, urllib.parse.quote(str(exception)), self.logfile.as_uri(), self.logfile.name))
|
||||||
message_box.exec_()
|
message_box.exec_()
|
||||||
|
|
||||||
def progress_monitor(self, progress_callback: pyqtSignal):
|
def progress_monitor(self, progress_callback: pyqtSignal):
|
||||||
@@ -1131,6 +1140,10 @@ You can [submit an issue on GitHub](https://github.com/k4yt3x/video2x/issues/new
|
|||||||
self.show_warning('Output path unspecified')
|
self.show_warning('Output path unspecified')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
print(f'Redirecting console logs to {self.logfile}', file=sys.stderr)
|
||||||
|
sys.stdout = BiLogger(sys.stdout, self.logfile)
|
||||||
|
sys.stderr = BiLogger(sys.stderr, self.logfile)
|
||||||
|
|
||||||
if len(self.input_table_data) == 1:
|
if len(self.input_table_data) == 1:
|
||||||
input_directory = self.input_table_data[0]
|
input_directory = self.input_table_data[0]
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
Name: Video2X Setup Script
|
Name: Video2X Setup Script
|
||||||
Creator: K4YT3X
|
Creator: K4YT3X
|
||||||
Date Created: November 28, 2018
|
Date Created: November 28, 2018
|
||||||
Last Modified: May 29, 2020
|
Last Modified: May 30, 2020
|
||||||
|
|
||||||
Editor: BrianPetkovsek
|
Editor: BrianPetkovsek
|
||||||
Editor: SAT3LL
|
Editor: SAT3LL
|
||||||
@@ -44,7 +44,7 @@ import zipfile
|
|||||||
# Therefore, they will be installed during the Python dependency
|
# Therefore, they will be installed during the Python dependency
|
||||||
# installation step and imported later in the script.
|
# installation step and imported later in the script.
|
||||||
|
|
||||||
SETUP_VERSION = '2.2.0'
|
SETUP_VERSION = '2.2.1'
|
||||||
|
|
||||||
# global static variables
|
# global static variables
|
||||||
LOCALAPPDATA = pathlib.Path(os.getenv('localappdata'))
|
LOCALAPPDATA = pathlib.Path(os.getenv('localappdata'))
|
||||||
@@ -56,7 +56,7 @@ DRIVER_OPTIONS = ['all',
|
|||||||
'waifu2x_converter_cpp',
|
'waifu2x_converter_cpp',
|
||||||
'waifu2x_ncnn_vulkan',
|
'waifu2x_ncnn_vulkan',
|
||||||
'srmd_ncnn_vulkan',
|
'srmd_ncnn_vulkan',
|
||||||
# 'realsr_ncnn_vulkan',
|
'realsr_ncnn_vulkan',
|
||||||
'anime4kcpp']
|
'anime4kcpp']
|
||||||
|
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ class Video2xSetup:
|
|||||||
def _install_python_requirements(self):
|
def _install_python_requirements(self):
|
||||||
""" Read requirements.txt and return its content
|
""" Read requirements.txt and return its content
|
||||||
"""
|
"""
|
||||||
pip_install('requirements-windows.txt')
|
pip_install('requirements.txt')
|
||||||
|
|
||||||
def _cleanup(self):
|
def _cleanup(self):
|
||||||
""" Cleanup all the temp files downloaded
|
""" Cleanup all the temp files downloaded
|
||||||
@@ -139,7 +139,7 @@ class Video2xSetup:
|
|||||||
print('\nInstalling Gifski')
|
print('\nInstalling Gifski')
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
# Get latest release of waifu2x-ncnn-vulkan via Github API
|
# Get latest release of Gifski via Github API
|
||||||
latest_release = requests.get('https://api.github.com/repos/ImageOptim/gifski/releases/latest').json()
|
latest_release = requests.get('https://api.github.com/repos/ImageOptim/gifski/releases/latest').json()
|
||||||
|
|
||||||
for a in latest_release['assets']:
|
for a in latest_release['assets']:
|
||||||
@@ -195,7 +195,7 @@ class Video2xSetup:
|
|||||||
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']:
|
for a in latest_release['assets']:
|
||||||
if re.search(r'waifu2x-ncnn-vulkan-\d*\.zip', a['browser_download_url']):
|
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())
|
waifu2x_ncnn_vulkan_zip = download(a['browser_download_url'], tempfile.gettempdir())
|
||||||
self.trash.append(waifu2x_ncnn_vulkan_zip)
|
self.trash.append(waifu2x_ncnn_vulkan_zip)
|
||||||
|
|
||||||
@@ -211,6 +211,32 @@ class Video2xSetup:
|
|||||||
# rename the newly extracted 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')
|
||||||
|
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()
|
||||||
|
|
||||||
|
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'
|
||||||
|
with zipfile.ZipFile(srmd_ncnn_vulkan_zip) as zipf:
|
||||||
|
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)
|
||||||
|
|
||||||
def _install_realsr_ncnn_vulkan(self):
|
def _install_realsr_ncnn_vulkan(self):
|
||||||
""" Install realsr-ncnn-vulkan
|
""" Install realsr-ncnn-vulkan
|
||||||
"""
|
"""
|
||||||
@@ -221,7 +247,7 @@ class Video2xSetup:
|
|||||||
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']:
|
for a in latest_release['assets']:
|
||||||
if re.search(r'realsr-ncnn-vulkan-\d*\.zip', a['browser_download_url']):
|
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())
|
realsr_ncnn_vulkan_zip = download(a['browser_download_url'], tempfile.gettempdir())
|
||||||
self.trash.append(realsr_ncnn_vulkan_zip)
|
self.trash.append(realsr_ncnn_vulkan_zip)
|
||||||
|
|
||||||
@@ -266,32 +292,6 @@ class Video2xSetup:
|
|||||||
shutil.rmtree(LOCALAPPDATA / 'video2x' / 'anime4kcpp')
|
shutil.rmtree(LOCALAPPDATA / 'video2x' / 'anime4kcpp')
|
||||||
patoolib.extract_archive(str(anime4kcpp_7z), outdir=str(LOCALAPPDATA / 'video2x' / 'anime4kcpp'))
|
patoolib.extract_archive(str(anime4kcpp_7z), outdir=str(LOCALAPPDATA / 'video2x' / 'anime4kcpp'))
|
||||||
|
|
||||||
def _install_srmd_ncnn_vulkan(self):
|
|
||||||
""" 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()
|
|
||||||
|
|
||||||
for a in latest_release['assets']:
|
|
||||||
if re.search(r'srmd-ncnn-vulkan-\d*\.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'
|
|
||||||
with zipfile.ZipFile(srmd_ncnn_vulkan_zip) as zipf:
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def download(url, save_path, chunk_size=4096):
|
def download(url, save_path, chunk_size=4096):
|
||||||
""" Download file to local with requests library
|
""" Download file to local with requests library
|
||||||
|
|||||||
Reference in New Issue
Block a user