Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a80b51ab7 | |||
|
|
36052461e6 | ||
|
|
4cb382a151 | ||
| fbf2c789f0 | |||
| a8eb1a60f5 | |||
| 514c88a286 | |||
|
|
28355be163 | ||
|
|
9074a3072b | ||
|
|
1738c345c2 | ||
| bfee31c0db | |||
| eb242ae4af | |||
| 034602590b | |||
| cecb01fba4 | |||
|
|
817814e4c7 | ||
|
|
e286ccf942 | ||
|
|
86e774e0b5 | ||
| fc6f892a35 | |||
|
|
135d026fa6 | ||
|
|
6f9a443fe7 | ||
| 05d77ae5b8 | |||
| 9795034d74 | |||
| c01948dc3f | |||
| 73661fae19 | |||
| 739f17283f | |||
| a3d1362d50 | |||
| 573450dee9 | |||
|
|
ad64287a8a | ||
|
|
9569e46b75 | ||
|
|
506baf2cd3 | ||
| f0346465fd | |||
| 600fbc8cc7 | |||
| 30c6e353c9 | |||
| ecd654abd9 | |||
| 04e77906a7 | |||
| 3091b4baca | |||
| 4e902360b7 | |||
| 8669ff0ee2 | |||
| bb44362a3e | |||
| d19435277f | |||
| 98f2ec28ce | |||
| b79e206f0d | |||
| 7377625812 | |||
|
|
7299250437 | ||
|
|
ce284540a6 | ||
|
|
d187a70452 | ||
| 7ef00cee24 | |||
| 9bad807528 | |||
| 9f29990faf | |||
| 842db05488 | |||
| bf30e40759 | |||
|
|
c977c9e754 | ||
| 8f7f6d71b7 | |||
| b28d2dd68e | |||
| f199fbded3 | |||
| de096496c7 | |||
| ab6d07d4bd | |||
| 0ea2d1d375 | |||
| 69205a1d8a | |||
| 60ffb862dc | |||
| 9fabb64161 | |||
| e247d7a524 | |||
| 430c271f62 | |||
| 41b8dd6d03 | |||
| e3d1ff1228 | |||
| bf2931085f | |||
|
|
58e114e368 | ||
|
|
9eee7a9878 | ||
|
|
5099959082 | ||
| bf4e85f6c1 | |||
|
|
619e24d332 | ||
| efc15a45cd | |||
|
|
fcddfd6292 | ||
|
|
72bcaa3131 | ||
|
|
d2a4ddc5ec | ||
|
|
d9ea3774c9 | ||
|
|
942c234931 | ||
|
|
ccd50e2cf4 | ||
|
|
bcf8c0be3d | ||
|
|
f5edfa8109 |
7
.desktop
7
.desktop
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=Image & Video Upscaler
|
|
||||||
Comment=Upscale your videos and images with different upscalers
|
|
||||||
Path=/opt/imagevideoupscaler
|
|
||||||
Exec=/opt/imagevideoupscaler/imagevideoupscaler
|
|
||||||
Icon=imagevideoupscaler
|
|
||||||
18
.gitignore
vendored
18
.gitignore
vendored
@@ -1,18 +0,0 @@
|
|||||||
#
|
|
||||||
# FSRImageVideoUpscalerFrontend - .gitignore
|
|
||||||
#
|
|
||||||
# Created by Janis Hutz 05/24/2023, Licensed under the GPL V3 License
|
|
||||||
# https://janishutz.com, development@janishutz.com
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# remove pycache
|
|
||||||
__pycache__
|
|
||||||
|
|
||||||
# remove node_modules from repo
|
|
||||||
node_modules
|
|
||||||
|
|
||||||
# ignore build & dist folders
|
|
||||||
build
|
|
||||||
dist
|
|
||||||
674
LICENSE
674
LICENSE
@@ -1,674 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
A simple PyQT5 frontend to upscale both videos and images
|
|
||||||
Copyright (C) 2023 Janis Hutz
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
ImageVideoUpscalerFrontend Copyright (C) 2023 Janis Hutz
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
||||||
90
README.md
Executable file → Normal file
90
README.md
Executable file → Normal file
@@ -1,44 +1,40 @@
|
|||||||
<div id="title" align="center">
|
<div id="title" align="center">
|
||||||
<img src="./logo.png" width="300">
|
<img src="./assets/logo.png" width="300">
|
||||||
<h1>ImageVideoUpscalerFrontend</h1>
|
<h1>SimpleMediaUpscalerLite</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="badges" align="center">
|
<div id="badges" align="center">
|
||||||
<img src="https://img.shields.io/github/release/simplePCBuilding/FSRImageVideoUpscalerFrontend.svg">
|
<img src="https://img.shields.io/github/license/simplePCBuilding/SimpleMediaUpscalerLite.svg">
|
||||||
<img src="https://img.shields.io/github/license/simplePCBuilding/FSRImageVideoUpscalerFrontend.svg">
|
<img src="https://img.shields.io/github/repo-size/simplePCBuilding/SimpleMediaUpscalerLite.svg">
|
||||||
<img src="https://img.shields.io/github/repo-size/simplePCBuilding/FSRImageVideoUpscalerFrontend.svg">
|
<img alt="Lines of code" src="https://img.shields.io/tokei/lines/github/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
<img src="https://img.shields.io/tokei/lines/github/simplePCBuilding/FSRImageVideoUpscalerFrontend">
|
<img src="https://img.shields.io/github/languages/top/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
<img src="https://img.shields.io/github/issues-pr-raw/simplePCBuilding/FSRImageVideoUpscalerFrontend">
|
<img src="https://img.shields.io/github/directory-file-count/simplePCBuilding/SimpleMediaUpscalerLite.svg">
|
||||||
<img src="https://img.shields.io/github/languages/top/simplePCBuilding/FSRImageVideoUpscalerFrontend">
|
<br>
|
||||||
<img src="https://img.shields.io/github/directory-file-count/simplePCBuilding/FSRImageVideoUpscalerFrontend.svg">
|
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
<img src="https://img.shields.io/github/package-json/v/simplePCBuilding/FSRImageVideoUpscalerFrontend.svg">
|
<img alt="GitHub watchers" src="https://img.shields.io/github/watchers/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
|
<img src="https://img.shields.io/github/issues-pr-raw/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
|
<img alt="GitHub forks" src="https://img.shields.io/github/forks/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
|
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/simplePCBuilding/SimpleMediaUpscalerLite">
|
||||||
|
<br>
|
||||||
|
<img alt="GitHub all releases" src="https://img.shields.io/github/downloads/simplePCBuilding/SimpleMediaUpscalerLite/total?label=Downloads (total)">
|
||||||
|
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/downloads/simplePCBuilding/SimpleMediaUpscalerLite/latest/total?label=Downloads (latest)">
|
||||||
|
<img src="https://img.shields.io/github/release/simplePCBuilding/SimpleMediaUpscalerLite.svg">
|
||||||
|
<img src="https://img.shields.io/github/package-json/v/simplePCBuilding/SimpleMediaUpscalerLite.svg?label=Development Version">
|
||||||
</div>
|
</div>
|
||||||
An Electron App with Python CLI to upscale images and videos using multiple different upscaling engines.
|
|
||||||
|
<div id="donate" align="center">
|
||||||
|
<a href="https://store.janishutz.com/donate" target="_blank"><img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
# BIG REWRITE
|
||||||
|
smuL is currently undergoing a BIG rewrite. The new version will be completely Electron-Based and will entirely drop the CLI interface, as all and more features will be available in GUI!
|
||||||
|
|
||||||
|
|
||||||
|
smuL (pronounced like "small") is an Electron App with Python CLI to upscale images and videos using multiple different upscaling engines.
|
||||||
|
|
||||||
# Functionality
|
# Functionality
|
||||||
This app allows you to fully automatically upscale a single file or a full on folder with one of many different engines.
|
smuL features a GUI that allows you to select input and output files, scaling factors and many more settings. It can be easily extended using plugins.
|
||||||
- Choose an input & output file from a GUI filemanager.
|
|
||||||
- Choose from different quality presets or set your own multiplier
|
|
||||||
- You may upscale Images (currently .png, .jpg and .jpeg) or Videos (currently .mp4 and .mkv)
|
|
||||||
- Choose from one of many different upscaling algorithms.
|
|
||||||
- Add plugins to add even more upscaling engines to it
|
|
||||||
|
|
||||||
## Engines
|
|
||||||
- AMD Fidelity FX Super Resolution
|
|
||||||
- Cubic scaling
|
|
||||||
- High Quality Cubic
|
|
||||||
- Real-ESGRAN
|
|
||||||
- more to come!
|
|
||||||
|
|
||||||
This App also features a CLI interface.
|
|
||||||
- Options:
|
|
||||||
```
|
|
||||||
-s SCALEFACTOR --scalefactor SCALEFACTOR Factor of form 2x, maximum 4x
|
|
||||||
-S SHARPENING --sharpening SHARPENING Value (0 - 1)
|
|
||||||
-T THREADCOUNT --threads THREADCOUNT Choose how many threads in parallel. Maximum is max threads of your CPU
|
|
||||||
-F FILETYPE --filetype FILETYPE Choose file type of temporary image files when upscaling videos (required)
|
|
||||||
-N --noscaling No upscaling, requires -S option (Sharpening option)
|
|
||||||
```
|
|
||||||
|
|
||||||
# Supported OS
|
# Supported OS
|
||||||
- Windows 10, 11 (officially)
|
- Windows 10, 11 (officially)
|
||||||
@@ -47,25 +43,26 @@ This App also features a CLI interface.
|
|||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
If you have any suggestions or features you'd like to have implemented, you may either implement the feature yourself and open a pull request, or open an issue on this GitHub page. Both things are appreciated!
|
If you have any suggestions or features you'd like to have implemented, you may either implement the feature yourself and open a pull request, or open an issue on this GitHub page. Both things are appreciated!
|
||||||
*I am looking for somebody willing to maintain the Windows version (including installer) as I am running Linux*
|
|
||||||
|
|
||||||
--> Follow the rules layed out in CONTRIBUTING.md
|
--> Follow the rules layed out in CONTRIBUTING.md
|
||||||
--> We will add a linter that will then run on circleci to ensure code quality is high
|
--> We will add a linter that will then run on circleci to ensure code quality is high
|
||||||
|
|
||||||
### Current Contributers
|
### Current Contributers
|
||||||
- simplePCBuilding (Maintainer) [Core (CLI), Docs, Website, Frontend, Linux packages]
|
- simplePCBuilding (Maintainer) [Core (CLI), Docs, Website, Frontend, Linux packages]
|
||||||
- ThatPlasma (Testing, Packager) [Testing, Windows Package]
|
- ThatPlasma (Testing, Packager) [Testing]
|
||||||
|
|
||||||
|
|
||||||
# Roadmap
|
# Roadmap
|
||||||
V1.1.0:
|
V2.0.0:
|
||||||
- Migrate to PyQt5 (or create Electron app and make python app CLI only)
|
- Migrate to Electron app -- ✅
|
||||||
- Create Windows & Mac Version
|
- Package Windows & Linux Version -- ✅
|
||||||
- Refactor backend to add plugin support
|
- Add packaging script for Linux & Windows version -- ✅
|
||||||
- Add more scaling engines
|
- Make python app CLI only -- ✅
|
||||||
- Expand Wiki to feature documentation on how to create a plugin (and maybe add a project website)
|
- Refactor backend to add plugin support -- ✅
|
||||||
|
|
||||||
V1.2.0:
|
V2.1.0:
|
||||||
|
- Add more scaling engines
|
||||||
|
- Expand Wiki to feature documentation on how to create a plugin (and maybe add a project website)
|
||||||
- Show progress of scaling
|
- Show progress of scaling
|
||||||
|
|
||||||
# Issues
|
# Issues
|
||||||
@@ -73,6 +70,7 @@ If you encounter any problems with this app, please don't hesitate to open an is
|
|||||||
|
|
||||||
## Known issues
|
## Known issues
|
||||||
- Electron App is not available yet
|
- Electron App is not available yet
|
||||||
|
- Electron App shows that it is out of date if running in the development version
|
||||||
- GTK version only runs on Linux
|
- GTK version only runs on Linux
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
@@ -88,7 +86,7 @@ If the OS is not officially supported, we may not be able to help you, since we
|
|||||||
|
|
||||||
**Q: Why no worky on MacOS? / Can you port to MacOS?**
|
**Q: Why no worky on MacOS? / Can you port to MacOS?**
|
||||||
|
|
||||||
A: MacOS cannot run some of the upscalers included by default so we cannot support it. If you find a way to run all upscalers on Mac, feel free to open a PR to add that functionality
|
A: Wine support on MacOS is still mediocre and most likely cannot run some of the upscalers included by default so we cannot support it. I will be testing it at some point in a VM, but that won't necesarily speak for full functionality. If you find a way to run all upscalers on Mac, feel free to open a PR to add that functionality or just let us know what you did in an issue.
|
||||||
|
|
||||||
**Q: Upscaled XXX looks not as great as I want**
|
**Q: Upscaled XXX looks not as great as I want**
|
||||||
|
|
||||||
@@ -96,4 +94,8 @@ A: Try out different engines (that's why we support so many) and try to use shar
|
|||||||
|
|
||||||
**Q: How can I support you?**
|
**Q: How can I support you?**
|
||||||
|
|
||||||
A: You may contribute to this project by writing documentation, improving the website, adding plugins, fixing bugs, testing or by donating.
|
A: You may contribute to this project by writing documentation, improving the website, adding plugins, fixing bugs, testing or by donating.
|
||||||
|
|
||||||
|
<div id="donate" align="center">
|
||||||
|
<a href="https://store.janishutz.com/donate" target="_blank"><img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px"></a>
|
||||||
|
</div>
|
||||||
BIN
assets/logo.png
Normal file
BIN
assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 592 KiB |
BIN
assets/logo.xcf
Normal file
BIN
assets/logo.xcf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"abbr":"FSR",
|
|
||||||
"displayName":"FidelityFX_CLI",
|
|
||||||
"lastUsedFilePath":"sc",
|
|
||||||
"fileNameBeginning":"ig",
|
|
||||||
"cliModeOptions": {
|
|
||||||
"fsr":{ "displayName": "FidelityFX Super Resolution", "default": true },
|
|
||||||
"c":{ "displayName": "Cubic", "default": false },
|
|
||||||
"hqc":{ "displayName": "High Quality Cubic", "default": false }
|
|
||||||
},
|
|
||||||
"pluginCreator": "Janis Hutz",
|
|
||||||
"pluginCreatorLink": "https://janishutz.com",
|
|
||||||
"engineLink": "",
|
|
||||||
"supports": [ "upscaling", "sharpening" ]
|
|
||||||
}
|
|
||||||
@@ -1,294 +0,0 @@
|
|||||||
import os
|
|
||||||
import multiprocessing
|
|
||||||
import time
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
class Scaler:
|
|
||||||
def __init__( self ):
|
|
||||||
self.os_type = sys.platform
|
|
||||||
self.command = ''
|
|
||||||
self.tmppath = ''
|
|
||||||
self.videometa = {}
|
|
||||||
|
|
||||||
def singleScaler ( self, input_path, output_path, scalefactor, threads, mode ):
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.command = f'wine ./bin/lib/FidelityFX_CLI.exe -Mode { mode } -Scale {scalefactor} {scalefactor} {input_path} {output_path}'
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.command = f'FidelityFX_CLI -Mode { mode } -Scale {scalefactor} {scalefactor} {input_path} {output_path}'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
os.system( self.command )
|
|
||||||
print( '\n\n==>Photo upscaled' );
|
|
||||||
|
|
||||||
def videoScaler ( self, tmppath, threads, scalefactor, sharpening, filetype, mode ):
|
|
||||||
self.isScaling = True
|
|
||||||
if ( scalefactor == 0 or scalefactor == None ):
|
|
||||||
self.isScaling = False
|
|
||||||
|
|
||||||
# Locate Images and assemble FSR-Command
|
|
||||||
self.file_list = []
|
|
||||||
self.filelist = os.listdir( tmppath )
|
|
||||||
self.filelist.pop(0)
|
|
||||||
self.filelist.sort()
|
|
||||||
self.number = 0
|
|
||||||
if sharpening != 0 and sharpening != None:
|
|
||||||
for self.file in self.filelist:
|
|
||||||
self.number += 1
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.file_list.append( f"{tmppath}{self.file} {tmppath}up\\up{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
else:
|
|
||||||
self.file_list.append( f"{tmppath}{self.file} {tmppath}up/up{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
try:
|
|
||||||
os.mkdir( f'{tmppath}up' )
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
for self.file in self.filelist:
|
|
||||||
self.number += 1
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.file_list.append( f"{tmppath}{self.file} {tmppath}sc\\ig{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
else:
|
|
||||||
self.file_list.append( f"{tmppath}{self.file} {tmppath}sc/ig{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.mkdir( f'{tmppath}sc' )
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.maxlength = 8000
|
|
||||||
else:
|
|
||||||
self.maxlength = 31900
|
|
||||||
self.pos = 1
|
|
||||||
|
|
||||||
############################################
|
|
||||||
#
|
|
||||||
# Thread optimisation: Divide workload up into different threads & upscale using helper function
|
|
||||||
#
|
|
||||||
############################################
|
|
||||||
self.threads = threads
|
|
||||||
if ( threads > multiprocessing.cpu_count() ):
|
|
||||||
self.threads = multiprocessing.cpu_count();
|
|
||||||
|
|
||||||
if ( self.isScaling ):
|
|
||||||
engines = { 'c': 'Cubic', 'hqc': 'High Quality Cubic', 'fsr':'FidelityFX Super Resolution' }
|
|
||||||
print( f'\n\n==> Upscaling using { self.threads } threads <==\n\n' );
|
|
||||||
print( f'\n\n==> Upscaling Engine is FidelityFX_CLI with algorithm { engines[ mode.lower() ] } <==\n\n' );
|
|
||||||
|
|
||||||
time.sleep( 2 );
|
|
||||||
|
|
||||||
self.command_list = [];
|
|
||||||
self.file_list_length = len( self.file_list );
|
|
||||||
for i in range( self.threads ):
|
|
||||||
self.files = '';
|
|
||||||
for _ in range( int( self.file_list_length // self.threads ) ):
|
|
||||||
self.files += self.file_list.pop( 0 );
|
|
||||||
|
|
||||||
if ( i == self.threads - 1 ):
|
|
||||||
for element in self.file_list:
|
|
||||||
self.files += element;
|
|
||||||
self.command_list.append( ( self.files, scalefactor, i, self.maxlength, self.os_type, mode ) )
|
|
||||||
|
|
||||||
self.pool = multiprocessing.Pool( self.threads )
|
|
||||||
self.pool.starmap( upscalerEngine, self.command_list );
|
|
||||||
self.pool.close();
|
|
||||||
self.pool.join();
|
|
||||||
|
|
||||||
if sharpening != 0 and sharpening != None:
|
|
||||||
print( f'\n\n\n==> Sharpening using { self.threads } threads <==\n\n' );
|
|
||||||
time.sleep( 2 );
|
|
||||||
|
|
||||||
self.pathSharpening = tmppath
|
|
||||||
|
|
||||||
if ( self.isScaling ):
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.pathSharpening += 'up\\'
|
|
||||||
elif ( self.os_type == 'linux' ):
|
|
||||||
self.pathSharpening += 'up/'
|
|
||||||
|
|
||||||
time.sleep( 2 );
|
|
||||||
try:
|
|
||||||
os.mkdir( f'{tmppath}sc' )
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
# Locate Images and assemble FSR-Command
|
|
||||||
self.file_list = []
|
|
||||||
self.filelist = os.listdir( self.pathSharpening )
|
|
||||||
self.filelist.pop(0)
|
|
||||||
self.filelist.sort()
|
|
||||||
self.number = 0
|
|
||||||
for self.file in self.filelist:
|
|
||||||
self.number += 1
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.file_list.append( f"{self.pathSharpening}{self.file} {tmppath}sc\\ig{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
else:
|
|
||||||
self.file_list.append( f"{self.pathSharpening}{self.file} {tmppath}sc/ig{str(self.number).zfill(8)}.{ filetype } " );
|
|
||||||
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.maxlength = 8000
|
|
||||||
else:
|
|
||||||
self.maxlength = 31900
|
|
||||||
self.pos = 1
|
|
||||||
|
|
||||||
# assemble command list
|
|
||||||
self.command_list = [];
|
|
||||||
self.file_list_length = len( self.file_list );
|
|
||||||
for i in range( self.threads ):
|
|
||||||
self.files = '';
|
|
||||||
for _ in range( int( self.file_list_length // self.threads ) ):
|
|
||||||
self.files += self.file_list.pop( 0 );
|
|
||||||
|
|
||||||
if ( i == self.threads - 1 ):
|
|
||||||
for element in self.file_list:
|
|
||||||
self.files += element;
|
|
||||||
self.command_list.append( ( self.files, i, self.maxlength, self.os_type, sharpening, not sharpening ) )
|
|
||||||
|
|
||||||
self.pool = multiprocessing.Pool( self.threads )
|
|
||||||
self.pool.starmap( sharpeningEngine, self.command_list );
|
|
||||||
self.pool.close();
|
|
||||||
self.pool.join();
|
|
||||||
|
|
||||||
# Add return values
|
|
||||||
|
|
||||||
def upscalerEngine ( files, scalefactor, number, maxlength, os_type, version ):
|
|
||||||
scaler = 'FSR'
|
|
||||||
if ( version.upper() == 'HQC' ):
|
|
||||||
scaler = 'HighQualityCubic'
|
|
||||||
elif ( version.upper() == 'C' ):
|
|
||||||
scaler = 'Cubic'
|
|
||||||
files = files;
|
|
||||||
# Refactoring of commands that are longer than 32K characters
|
|
||||||
fileout = [];
|
|
||||||
pos = 0;
|
|
||||||
if len( files ) > maxlength:
|
|
||||||
while files[maxlength - pos:maxlength - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
file_processing = files[:maxlength - pos]
|
|
||||||
if file_processing[len(file_processing) - 14:len(file_processing) - 12] == 'ig':
|
|
||||||
pos += 5
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
while files[maxlength - pos:maxlength - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
fileout.append(files[:maxlength - pos])
|
|
||||||
filesopt = files[maxlength - pos:]
|
|
||||||
posx = 0
|
|
||||||
posy = maxlength
|
|
||||||
|
|
||||||
# Command refactoring for commands that are longer than 64K characters
|
|
||||||
if len(filesopt) > maxlength:
|
|
||||||
while len(filesopt) > maxlength:
|
|
||||||
posx += maxlength - pos
|
|
||||||
posy += maxlength - pos
|
|
||||||
pos = 1
|
|
||||||
while files[posy - pos:posy - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
file_processing = files[posx:posy - pos]
|
|
||||||
if file_processing[len(file_processing) - 14:len(file_processing) - 12] == 'ig':
|
|
||||||
pos += 5
|
|
||||||
while files[posy - pos:posy - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
|
|
||||||
file_processing = files[posx:posy - pos]
|
|
||||||
fileout.append(file_processing)
|
|
||||||
filesopt = files[posy - pos:]
|
|
||||||
fileout.append(filesopt)
|
|
||||||
else:
|
|
||||||
fileout.append(files[maxlength - pos:])
|
|
||||||
else:
|
|
||||||
fileout.append(files)
|
|
||||||
|
|
||||||
# Upscaling images
|
|
||||||
print( '\n\n\nUpscaling images... \n\n\n\n\n\n PROCESS: ', number, '\n\n\n' )
|
|
||||||
|
|
||||||
while len( fileout ) > 0:
|
|
||||||
files_handle = fileout.pop(0)
|
|
||||||
if os_type == 'linux':
|
|
||||||
command_us = f'wine ./bin/lib/FidelityFX_CLI.exe -Mode { scaler } -Scale {scalefactor}x {scalefactor}x {files_handle}'
|
|
||||||
elif os_type == 'win32':
|
|
||||||
command_us = f'FidelityFX_CLI -Mode { scaler } -Scale {scalefactor}x {scalefactor}x {files_handle}'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' )
|
|
||||||
return False
|
|
||||||
sub = subprocess.Popen( command_us, shell=True );
|
|
||||||
sub.wait();
|
|
||||||
time.sleep(3)
|
|
||||||
print( '\n\nCompleted executing Job\n\n\n PROCESS: ', number, '\n\n\n' );
|
|
||||||
|
|
||||||
|
|
||||||
########################
|
|
||||||
#
|
|
||||||
# Sharpening
|
|
||||||
#
|
|
||||||
#######################
|
|
||||||
|
|
||||||
def sharpeningEngine ( files, number, maxlength, os_type, sharpening, didUpscale ):
|
|
||||||
files = files;
|
|
||||||
# Refactoring of commands that are longer than 32K characters
|
|
||||||
fileout = [];
|
|
||||||
pos = 0;
|
|
||||||
if len( files ) > maxlength:
|
|
||||||
while files[maxlength - pos:maxlength - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
file_processing = files[:maxlength - pos]
|
|
||||||
if ( didUpscale ):
|
|
||||||
if file_processing[len(file_processing) - 14:len(file_processing) - 12] == 'up':
|
|
||||||
pos += 5
|
|
||||||
else:
|
|
||||||
if file_processing[len(file_processing) - 17:len(file_processing) - 15] == 'ru':
|
|
||||||
pos += 8
|
|
||||||
while files[maxlength - pos:maxlength - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
fileout.append(files[:maxlength - pos])
|
|
||||||
filesopt = files[maxlength - pos:]
|
|
||||||
posx = 0
|
|
||||||
posy = maxlength
|
|
||||||
|
|
||||||
# Command refactoring for commands that are longer than 64K characters
|
|
||||||
if len(filesopt) > maxlength:
|
|
||||||
while len(filesopt) > maxlength:
|
|
||||||
posx += maxlength - pos
|
|
||||||
posy += maxlength - pos
|
|
||||||
pos = 1
|
|
||||||
while files[posy - pos:posy - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
file_processing = files[posx:posy - pos]
|
|
||||||
if ( didUpscale ):
|
|
||||||
if file_processing[len(file_processing) - 14:len(file_processing) - 12] == 'up':
|
|
||||||
pos += 5
|
|
||||||
else:
|
|
||||||
if file_processing[len(file_processing) - 17:len(file_processing) - 15] == 'ru':
|
|
||||||
pos += 8
|
|
||||||
while files[posy - pos:posy - pos + 1] != ' ':
|
|
||||||
pos += 1
|
|
||||||
|
|
||||||
file_processing = files[posx:posy - pos]
|
|
||||||
fileout.append(file_processing)
|
|
||||||
filesopt = files[posy - pos:]
|
|
||||||
fileout.append(filesopt)
|
|
||||||
else:
|
|
||||||
fileout.append(files[maxlength - pos:])
|
|
||||||
else:
|
|
||||||
fileout.append(files)
|
|
||||||
|
|
||||||
# Upscaling images
|
|
||||||
print( '\n\n\nSharpening images... \n\n\n\n\n\n PROCESS: ', number, '\n\n\n' )
|
|
||||||
|
|
||||||
while len( fileout ) > 0:
|
|
||||||
files_handle = fileout.pop(0)
|
|
||||||
print( '\n\n\n PROCESS: ', number, '\nRunning sharpening filter\n\n\n' );
|
|
||||||
if os_type == 'linux':
|
|
||||||
command_sharpening = f'wine ./bin/lib/FidelityFX_CLI.exe -Mode CAS -Sharpness {sharpening} {files_handle}'
|
|
||||||
elif os_type == 'win32':
|
|
||||||
command_sharpening = f'FidelityFX_CLI -Mode CAS -Sharpness {sharpening} {files_handle}'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' )
|
|
||||||
return False
|
|
||||||
sub2 = subprocess.Popen( command_sharpening, shell=True );
|
|
||||||
sub2.wait()
|
|
||||||
time.sleep(3)
|
|
||||||
print( '\n\nCompleted executing Job\n\n\n PROCESS: ', number, '\n\n\n' );
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"abbr":"SS",
|
|
||||||
"displayName":"Real-ESGRAN",
|
|
||||||
"lastUsedFilePath":"sc",
|
|
||||||
"fileNameBeginning":"ig",
|
|
||||||
"cliModeOptions": {
|
|
||||||
"av3":{ "displayName": "realesr-animevideov3", "default": true },
|
|
||||||
"x4plus":{ "displayName": "realesrgan-x4plus-anime", "default": false }
|
|
||||||
},
|
|
||||||
"pluginCreator": "Janis Hutz",
|
|
||||||
"pluginCreatorLink": "https://janishutz.com",
|
|
||||||
"engineLink": "",
|
|
||||||
"supports": [ "upscaling" ]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import multiprocessing
|
|
||||||
import time
|
|
||||||
import sys
|
|
||||||
|
|
||||||
class Scaler:
|
|
||||||
def __init__(self):
|
|
||||||
self.os_type = sys.platform
|
|
||||||
self.command = ""
|
|
||||||
self.tmppath = ""
|
|
||||||
self.videometa = {}
|
|
||||||
|
|
||||||
def singleScaler ( self, input_path, output_path, scalefactor, threads, mode ):
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.command = f'wine ./bin/lib/FidelityFX_CLI.exe -Scale {scalefactor} {scalefactor} {input_path} {output_path} -n { mode }'
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.command = f'realesrgan-ncnn-vulkan -i {input_path} -o {output_path} -s {scalefactor} -j {threads}:{threads}:{threads} -n { mode }'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
os.system( self.command )
|
|
||||||
print( '\n\n==>Photo upscaled' );
|
|
||||||
|
|
||||||
def videoScaler ( self, tmppath, threads, scalefactor, sharpening, filetype, mode ):
|
|
||||||
modes = { 'av3':'realesr-animevideov3', 'x4plus': 'realesrgan-x4plus-anime' }
|
|
||||||
print( '\n\n==> Preparing to upscale videos <==\n\n==> You will see a lot of numbers flying by showing the progress of the upscaling of each individual image.\n==> This process might take a long time, depending on the length of the video.\n\n')
|
|
||||||
time.sleep( 2 );
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.mkdir( f'{tmppath}sc' )
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.command = f'realesrgan-ncnn-vulkan -i {tmppath} -o {tmppath}sc -s {scalefactor} -j {threads}:{threads}:{threads} -n {modes[ mode ]}'
|
|
||||||
elif ( self.os_type == 'linux' ):
|
|
||||||
self.command = f'wine ./bin/lib/realesrgan-ncnn-vulkan.exe -i {tmppath} -o {tmppath}sc -s {scalefactor} -j {threads}:{threads}:{threads} -n {modes[ mode ]}'
|
|
||||||
os.system( self.command );
|
|
||||||
172
bin/handler.py
172
bin/handler.py
@@ -1,172 +0,0 @@
|
|||||||
'''
|
|
||||||
* FSRImageVideoUpscalerFrontend - handler.py
|
|
||||||
*
|
|
||||||
* Created by Janis Hutz 03/14/2023, Licensed under the GPL V3 License
|
|
||||||
* https://janishutz.com, development@janishutz.com
|
|
||||||
*
|
|
||||||
*
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import bin.probe
|
|
||||||
ffmpeg = bin.probe
|
|
||||||
import configparser
|
|
||||||
import json
|
|
||||||
import importlib
|
|
||||||
import shutil
|
|
||||||
import time
|
|
||||||
|
|
||||||
importedModules = {}
|
|
||||||
|
|
||||||
engineList = os.listdir( 'bin/engines' );
|
|
||||||
engineList.pop( 0 )
|
|
||||||
|
|
||||||
for element in engineList:
|
|
||||||
importedModules[ element ] = importlib.import_module( 'bin.engines.' + element + '.' + element ).Scaler()
|
|
||||||
|
|
||||||
# Loading the config file to get user preferred temp path
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
config.read('./config/settings.ini')
|
|
||||||
|
|
||||||
|
|
||||||
class Handler:
|
|
||||||
def __init__(self):
|
|
||||||
self.os_type = sys.platform
|
|
||||||
self.command = ''
|
|
||||||
self.tmppath = ''
|
|
||||||
self.videometa = {}
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: CHECK if this upscaler is any good: https://github.com/Maximellerbach/Image-Processing-using-AI (looks quite promising)
|
|
||||||
|
|
||||||
def handler( self, filepath, scalefactor, output_path, sharpening, filetype, engine, mode, threads=4 ):
|
|
||||||
# Function to be called when using this class as this function automatically determines if file is video or image
|
|
||||||
print( '\n\n ImageVideoUpscaler - V1.1.0\n\n(c) 2023 ImageVideoUpscaler contributors\n\n\n\n' );
|
|
||||||
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.tmppath = config['PathSettings']['tmpPathLinux']
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.tmppath = config['PathSettings']['tmpPathWindows']
|
|
||||||
else:
|
|
||||||
print('OS CURRENTLY UNSUPPORTED!')
|
|
||||||
return False
|
|
||||||
if ( self.os_type == 'win32' ):
|
|
||||||
self.tmppath += '\\fsru\\'
|
|
||||||
else:
|
|
||||||
if ( self.tmppath[len(self.tmppath) - 1: ] == '/' ):
|
|
||||||
self.tmppath += 'fsru/'
|
|
||||||
else:
|
|
||||||
self.tmppath += '/fsru/'
|
|
||||||
|
|
||||||
# checking for spaces in filepath (for use with terminal commands)
|
|
||||||
self.filepath = ''
|
|
||||||
for self.letter in filepath:
|
|
||||||
if self.letter == ' ':
|
|
||||||
self.filepath += '\ '
|
|
||||||
else:
|
|
||||||
self.filepath += self.letter
|
|
||||||
|
|
||||||
# Determining filetype
|
|
||||||
if str(filepath)[len(filepath) - 4:] == '.mp4' or str(filepath)[len(filepath) - 4:] == '.mkv' or str(filepath)[len(filepath) - 4:] == '.MP4':
|
|
||||||
print( '\n\n==> Upscaling video' )
|
|
||||||
self.video_scaling( filepath, output_path, scalefactor, threads, sharpening, filetype, mode, engine )
|
|
||||||
elif str(filepath)[len(filepath) - 4:] == '.JPG' or str(filepath)[len(filepath) - 4:] == '.png' or str(filepath)[len(filepath) - 4:] == '.jpg' or str(filepath)[len(filepath) - 5:] == '.jpeg':
|
|
||||||
print( '\n==>upscaling image' )
|
|
||||||
self.photo_scaling( scalefactor, output_path, engine )
|
|
||||||
else:
|
|
||||||
print('not supported')
|
|
||||||
return False
|
|
||||||
|
|
||||||
def photo_scaling(self, scalefactor, output_path, engine, mode):
|
|
||||||
# DO NOT CALL THIS! Use Handler().handler() instead!
|
|
||||||
pass
|
|
||||||
|
|
||||||
def video_scaling( self, input_path, output_path, scalefactor, threads, sharpening, filetype, mode, engine ):
|
|
||||||
self.engineSetting = json.load( open( 'bin/engines/' + engine + '/config.json' ) )
|
|
||||||
# DO NOT CALL THIS! Use Handler().handler() instead!
|
|
||||||
|
|
||||||
# Splitting video into frames
|
|
||||||
try:
|
|
||||||
shutil.rmtree(self.tmppath)
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
os.mkdir(self.tmppath)
|
|
||||||
except FileExistsError:
|
|
||||||
print( '==> ERROR: Temp path does not exist! <==' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
print( '\n==> Created directory' )
|
|
||||||
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.command = f'ffmpeg -i {str(self.filepath)} {self.tmppath}ig%08d.{ filetype }'
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.command = f'ffmpeg -i {str(self.filepath)} \"{self.tmppath}ig%08d.{ filetype }\"'
|
|
||||||
else:
|
|
||||||
print('OS CURRENTLY UNSUPPORTED!')
|
|
||||||
return False
|
|
||||||
|
|
||||||
os.system( self.command )
|
|
||||||
print( '\n==> Video split ' )
|
|
||||||
|
|
||||||
# Retrieving Video metadata
|
|
||||||
self.filelist = os.listdir(self.tmppath)
|
|
||||||
self.videometa = ffmpeg.probe(str(input_path))['streams'].pop(0)
|
|
||||||
|
|
||||||
self.duration = self.videometa.get( 'duration' )
|
|
||||||
self.frames = len( self.filelist )
|
|
||||||
try:
|
|
||||||
self.framerate = round(float(self.frames) / float(self.duration), 1)
|
|
||||||
except TypeError:
|
|
||||||
print( '\n\n=> using fallback method to get framerate' )
|
|
||||||
self.infos = str( self.videometa.get( 'r_frame_rate' ) )
|
|
||||||
self.framerate = float( self.infos[:len(self.infos) - 2] )
|
|
||||||
|
|
||||||
print( '\n\n==> Video duration is: ', self.duration, 's' )
|
|
||||||
print( '==> Framecount is: ', self.frames, ' frames' )
|
|
||||||
print( '==> Frame rate is: ', self.framerate, ' FPS' )
|
|
||||||
print( '==> Running with: ', threads, ' threads\n\n' )
|
|
||||||
|
|
||||||
time.sleep( 2 );
|
|
||||||
|
|
||||||
importedModules[ engine ].videoScaler ( self.tmppath, int( threads ), int( scalefactor ), float( sharpening ), filetype, mode )
|
|
||||||
|
|
||||||
# get Video's audio
|
|
||||||
print( '\n\n==>Finished Upscaling individual images. \n==>Retrieving Video audio to append\n\n' )
|
|
||||||
|
|
||||||
try:
|
|
||||||
self.framerate = round(float(self.frames) / float(self.duration), 1)
|
|
||||||
except TypeError:
|
|
||||||
print( '\n\n=> using fallback method to get framerate' )
|
|
||||||
self.infos = str( self.videometa.get( 'r_frame_rate' ) )
|
|
||||||
self.framerate = float( self.infos[:len(self.infos) - 2] )
|
|
||||||
|
|
||||||
time.sleep( 2 );
|
|
||||||
try:
|
|
||||||
os.remove(f'{self.tmppath}audio.aac')
|
|
||||||
os.remove(f'{output_path}')
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.command = f'ffmpeg -i {self.filepath} -vn -acodec copy {self.tmppath}audio.aac'
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.command = f'ffmpeg -i {self.filepath} -vn -acodec copy {self.tmppath}audio.aac'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' )
|
|
||||||
return False
|
|
||||||
os.system( self.command )
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# reassemble Video
|
|
||||||
print( '\n\n==> Reassembling Video... with framerate @', self.framerate, '\n\n' )
|
|
||||||
if self.os_type == 'linux':
|
|
||||||
self.command = f'ffmpeg -framerate {self.framerate} -i {self.tmppath}{self.engineSetting[ "lastUsedFilePath" ]}/{self.engineSetting[ "fileNameBeginning" ]}%08d.{filetype} {output_path} -i {self.tmppath}audio.aac'
|
|
||||||
elif self.os_type == 'win32':
|
|
||||||
self.command = f'ffmpeg -framerate {self.framerate} -i \'{self.tmppath}{self.engineSetting[ "lastUsedFilePath" ]}\\{self.engineSetting[ "fileNameBeginning" ]}%08d.{filetype}\' {output_path} -i {self.tmppath}audio.aac'
|
|
||||||
else:
|
|
||||||
print( 'OS CURRENTLY UNSUPPORTED!' );
|
|
||||||
return False
|
|
||||||
os.system( self.command )
|
|
||||||
Binary file not shown.
Binary file not shown.
154
bin/lib/edi.py
154
bin/lib/edi.py
@@ -1,154 +0,0 @@
|
|||||||
import cv2
|
|
||||||
import numpy as np
|
|
||||||
from matplotlib import pyplot as plt
|
|
||||||
import math
|
|
||||||
import sys
|
|
||||||
|
|
||||||
"""
|
|
||||||
Author:
|
|
||||||
|
|
||||||
hu.leying@columbia.edu
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
EDI_predict(img, m, s)
|
|
||||||
|
|
||||||
# img is the input image
|
|
||||||
# m is the sampling window size, not scaling factor! The larger the m, more blurry the image. Ideal m >= 4.
|
|
||||||
# s is the scaling factor, support any s > 0 (e.g. use s=2 to upscale by 2, use s=0.5 to downscale by 2)
|
|
||||||
|
|
||||||
If you want to directly call EDI_upscale to upscale image by the scale of 2:
|
|
||||||
|
|
||||||
EDI_upscale(img, m)
|
|
||||||
|
|
||||||
# m should be the power of 2. Will increment by 1 if input m is odd
|
|
||||||
|
|
||||||
If you want to directly call EDI_downscale to downscale image by the scale of 2:
|
|
||||||
|
|
||||||
EDI_downscale(img)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def EDI_downscale(img):
|
|
||||||
|
|
||||||
# initializing downgraded image
|
|
||||||
w, h = img.shape
|
|
||||||
imgo2 = np.zeros((w//2, h//2))
|
|
||||||
|
|
||||||
# downgrading image
|
|
||||||
for i in range(w//2):
|
|
||||||
for j in range(h//2):
|
|
||||||
imgo2[i][j] = int(img[2*i][2*j])
|
|
||||||
|
|
||||||
return imgo2.astype(img.dtype)
|
|
||||||
|
|
||||||
def EDI_upscale(img, m):
|
|
||||||
|
|
||||||
# m should be equal to a power of 2
|
|
||||||
if m%2 != 0:
|
|
||||||
m += 1
|
|
||||||
|
|
||||||
# initializing image to be predicted
|
|
||||||
w, h = img.shape
|
|
||||||
imgo = np.zeros((w*2,h*2))
|
|
||||||
|
|
||||||
# Place low-resolution pixels
|
|
||||||
for i in range(w):
|
|
||||||
for j in range(h):
|
|
||||||
imgo[2*i][2*j] = img[i][j]
|
|
||||||
|
|
||||||
y = np.zeros((m**2,1)) # pixels in the window
|
|
||||||
C = np.zeros((m**2,4)) # interpolation neighbours of each pixel in the window
|
|
||||||
|
|
||||||
# Reconstruct the points with the form of (2*i+1,2*j+1)
|
|
||||||
for i in range(math.floor(m/2), w-math.floor(m/2)):
|
|
||||||
for j in range(math.floor(m/2), h-math.floor(m/2)):
|
|
||||||
tmp = 0
|
|
||||||
for ii in range(i-math.floor(m/2), i+math.floor(m/2)):
|
|
||||||
for jj in range(j-math.floor(m/2), j+math.floor(m/2)):
|
|
||||||
y[tmp][0] = imgo[2*ii][2*jj]
|
|
||||||
C[tmp][0] = imgo[2*ii-2][2*jj-2]
|
|
||||||
C[tmp][1] = imgo[2*ii+2][2*jj-2]
|
|
||||||
C[tmp][2] = imgo[2*ii+2][2*jj+2]
|
|
||||||
C[tmp][3] = imgo[2*ii-2][2*jj+2]
|
|
||||||
tmp += 1
|
|
||||||
|
|
||||||
# calculating weights
|
|
||||||
# a = (C^T * C)^(-1) * (C^T * y) = (C^T * C) \ (C^T * y)
|
|
||||||
a = np.matmul(np.matmul(np.linalg.pinv(np.matmul(np.transpose(C),C)), np.transpose(C)), y)
|
|
||||||
imgo[2*i+1][2*j+1] = np.matmul([imgo[2*i][2*j], imgo[2*i+2][2*j], imgo[2*i+2][2*j+2], imgo[2*i][2*j+2]], a)
|
|
||||||
|
|
||||||
# Reconstructed the points with the forms of (2*i+1,2*j) and (2*i,2*j+1)
|
|
||||||
for i in range(math.floor(m/2), w-math.floor(m/2)):
|
|
||||||
for j in range(math.floor(m/2), h-math.floor(m/2)):
|
|
||||||
tmp = 0
|
|
||||||
for ii in range(i-math.floor(m/2), i+math.floor(m/2)):
|
|
||||||
for jj in range(j-math.floor(m/2), j+math.floor(m/2)):
|
|
||||||
y[tmp][0] = imgo[2*ii+1][2*jj-1]
|
|
||||||
C[tmp][0] = imgo[2*ii-1][2*jj-1]
|
|
||||||
C[tmp][1] = imgo[2*ii+1][2*jj-3]
|
|
||||||
C[tmp][2] = imgo[2*ii+3][2*jj-1]
|
|
||||||
C[tmp][3] = imgo[2*ii+1][2*jj+1]
|
|
||||||
tmp += 1
|
|
||||||
|
|
||||||
# calculating weights
|
|
||||||
# a = (C^T * C)^(-1) * (C^T * y) = (C^T * C) \ (C^T * y)
|
|
||||||
a = np.matmul(np.matmul(np.linalg.pinv(np.matmul(np.transpose(C),C)), np.transpose(C)), y)
|
|
||||||
imgo[2*i+1][2*j] = np.matmul([imgo[2*i][2*j], imgo[2*i+1][2*j-1], imgo[2*i+2][2*j], imgo[2*i+1][2*j+1]], a)
|
|
||||||
imgo[2*i][2*j+1] = np.matmul([imgo[2*i-1][2*j+1], imgo[2*i][2*j], imgo[2*i+1][2*j+1], imgo[2*i][2*j+2]], a)
|
|
||||||
|
|
||||||
# Fill the rest with bilinear interpolation
|
|
||||||
np.clip(imgo, 0, 255.0, out=imgo)
|
|
||||||
imgo_bilinear = cv2.resize(img, dsize=(h*2,w*2), interpolation=cv2.INTER_LINEAR)
|
|
||||||
imgo[imgo==0] = imgo_bilinear[imgo==0]
|
|
||||||
|
|
||||||
return imgo.astype(img.dtype)
|
|
||||||
|
|
||||||
def EDI_predict(img, m, s):
|
|
||||||
|
|
||||||
try:
|
|
||||||
w, h = img.shape
|
|
||||||
except:
|
|
||||||
sys.exit("Error input: Please input a valid grayscale image!")
|
|
||||||
|
|
||||||
output_type = img.dtype
|
|
||||||
|
|
||||||
if s <= 0:
|
|
||||||
sys.exit("Error input: Please input s > 0!")
|
|
||||||
|
|
||||||
elif s == 1:
|
|
||||||
print("No need to rescale since s = 1")
|
|
||||||
return img
|
|
||||||
|
|
||||||
elif s < 1:
|
|
||||||
# Calculate how many times to do the EDI downscaling
|
|
||||||
n = math.floor(math.log(1/s, 2))
|
|
||||||
|
|
||||||
# Downscale to the expected size with linear interpolation
|
|
||||||
linear_factor = 1/s / math.pow(2, n)
|
|
||||||
if linear_factor != 1:
|
|
||||||
img = cv2.resize(img, dsize=(int(h/linear_factor),int(w/linear_factor)), interpolation=cv2.INTER_LINEAR).astype(output_type)
|
|
||||||
|
|
||||||
for i in range(n):
|
|
||||||
img = EDI_downscale(img)
|
|
||||||
return img
|
|
||||||
|
|
||||||
elif s < 2:
|
|
||||||
# Linear Interpolation is enough for upscaling not over 2
|
|
||||||
return cv2.resize(img, dsize=(int(h*s),int(w*s)), interpolation=cv2.INTER_LINEAR).astype(output_type)
|
|
||||||
|
|
||||||
else:
|
|
||||||
# Calculate how many times to do the EDI upscaling
|
|
||||||
n = math.floor(math.log(s, 2))
|
|
||||||
for i in range(n):
|
|
||||||
img = EDI_upscale(img, m)
|
|
||||||
|
|
||||||
# Upscale to the expected size with linear interpolation
|
|
||||||
linear_factor = s / math.pow(2, n)
|
|
||||||
if linear_factor == 1:
|
|
||||||
return img.astype(output_type)
|
|
||||||
|
|
||||||
# Update new shape
|
|
||||||
w, h = img.shape
|
|
||||||
return cv2.resize(img, dsize=(int(h*linear_factor),int(w*linear_factor)), interpolation=cv2.INTER_LINEAR).astype(output_type)
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1,43 +0,0 @@
|
|||||||
7767517
|
|
||||||
41 42
|
|
||||||
Input input.1 0 1 data
|
|
||||||
Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1
|
|
||||||
Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728
|
|
||||||
PReLU PRelu_1 1 1 54 56 0=64
|
|
||||||
Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_3 1 1 57 59 0=64
|
|
||||||
Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_5 1 1 60 62 0=64
|
|
||||||
Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_7 1 1 63 65 0=64
|
|
||||||
Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_9 1 1 66 68 0=64
|
|
||||||
Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_11 1 1 69 71 0=64
|
|
||||||
Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_13 1 1 72 74 0=64
|
|
||||||
Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_15 1 1 75 77 0=64
|
|
||||||
Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_17 1 1 78 80 0=64
|
|
||||||
Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_19 1 1 81 83 0=64
|
|
||||||
Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_21 1 1 84 86 0=64
|
|
||||||
Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_23 1 1 87 89 0=64
|
|
||||||
Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_25 1 1 90 92 0=64
|
|
||||||
Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_27 1 1 93 95 0=64
|
|
||||||
Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_29 1 1 96 98 0=64
|
|
||||||
Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_31 1 1 99 101 0=64
|
|
||||||
Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_33 1 1 102 104 0=64
|
|
||||||
Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648
|
|
||||||
PixelShuffle DepthToSpace_35 1 1 105 106 0=4
|
|
||||||
Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00
|
|
||||||
BinaryOp Add_38 2 1 106 111 112
|
|
||||||
Interp Resize_40 1 1 112 output 0=3 1=5.000000e-01 2=5.000000e-01
|
|
||||||
Binary file not shown.
@@ -1,43 +0,0 @@
|
|||||||
7767517
|
|
||||||
41 42
|
|
||||||
Input input.1 0 1 data
|
|
||||||
Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1
|
|
||||||
Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728
|
|
||||||
PReLU PRelu_1 1 1 54 56 0=64
|
|
||||||
Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_3 1 1 57 59 0=64
|
|
||||||
Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_5 1 1 60 62 0=64
|
|
||||||
Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_7 1 1 63 65 0=64
|
|
||||||
Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_9 1 1 66 68 0=64
|
|
||||||
Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_11 1 1 69 71 0=64
|
|
||||||
Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_13 1 1 72 74 0=64
|
|
||||||
Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_15 1 1 75 77 0=64
|
|
||||||
Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_17 1 1 78 80 0=64
|
|
||||||
Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_19 1 1 81 83 0=64
|
|
||||||
Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_21 1 1 84 86 0=64
|
|
||||||
Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_23 1 1 87 89 0=64
|
|
||||||
Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_25 1 1 90 92 0=64
|
|
||||||
Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_27 1 1 93 95 0=64
|
|
||||||
Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_29 1 1 96 98 0=64
|
|
||||||
Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_31 1 1 99 101 0=64
|
|
||||||
Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_33 1 1 102 104 0=64
|
|
||||||
Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648
|
|
||||||
PixelShuffle DepthToSpace_35 1 1 105 106 0=4
|
|
||||||
Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00
|
|
||||||
BinaryOp Add_38 2 1 106 111 112
|
|
||||||
Interp Resize_40 1 1 112 output 0=3 1=7.500000e-01 2=7.500000e-01
|
|
||||||
Binary file not shown.
@@ -1,42 +0,0 @@
|
|||||||
7767517
|
|
||||||
40 41
|
|
||||||
Input input.1 0 1 data
|
|
||||||
Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1
|
|
||||||
Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728
|
|
||||||
PReLU PRelu_1 1 1 54 56 0=64
|
|
||||||
Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_3 1 1 57 59 0=64
|
|
||||||
Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_5 1 1 60 62 0=64
|
|
||||||
Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_7 1 1 63 65 0=64
|
|
||||||
Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_9 1 1 66 68 0=64
|
|
||||||
Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_11 1 1 69 71 0=64
|
|
||||||
Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_13 1 1 72 74 0=64
|
|
||||||
Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_15 1 1 75 77 0=64
|
|
||||||
Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_17 1 1 78 80 0=64
|
|
||||||
Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_19 1 1 81 83 0=64
|
|
||||||
Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_21 1 1 84 86 0=64
|
|
||||||
Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_23 1 1 87 89 0=64
|
|
||||||
Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_25 1 1 90 92 0=64
|
|
||||||
Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_27 1 1 93 95 0=64
|
|
||||||
Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_29 1 1 96 98 0=64
|
|
||||||
Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_31 1 1 99 101 0=64
|
|
||||||
Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
PReLU PRelu_33 1 1 102 104 0=64
|
|
||||||
Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648
|
|
||||||
PixelShuffle DepthToSpace_35 1 1 105 106 0=4
|
|
||||||
Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00
|
|
||||||
BinaryOp Add_38 2 1 106 111 output
|
|
||||||
Binary file not shown.
@@ -1,270 +0,0 @@
|
|||||||
7767517
|
|
||||||
268 473
|
|
||||||
Input input.1 0 1 data
|
|
||||||
Convolution Conv_0 1 1 data 193 0=64 1=3 4=1 5=1 6=1728
|
|
||||||
Split splitncnn_0 1 8 193 193_splitncnn_0 193_splitncnn_1 193_splitncnn_2 193_splitncnn_3 193_splitncnn_4 193_splitncnn_5 193_splitncnn_6 193_splitncnn_7
|
|
||||||
Convolution Conv_1 1 1 193_splitncnn_7 195 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_1 1 4 195 195_splitncnn_0 195_splitncnn_1 195_splitncnn_2 195_splitncnn_3
|
|
||||||
Concat Concat_3 2 1 193_splitncnn_6 195_splitncnn_3 196
|
|
||||||
Convolution Conv_4 1 1 196 198 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_2 1 3 198 198_splitncnn_0 198_splitncnn_1 198_splitncnn_2
|
|
||||||
Concat Concat_6 3 1 193_splitncnn_5 195_splitncnn_2 198_splitncnn_2 199
|
|
||||||
Convolution Conv_7 1 1 199 201 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_3 1 2 201 201_splitncnn_0 201_splitncnn_1
|
|
||||||
Concat Concat_9 4 1 193_splitncnn_4 195_splitncnn_1 198_splitncnn_1 201_splitncnn_1 202
|
|
||||||
Convolution Conv_10 1 1 202 204 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_12 5 1 193_splitncnn_3 195_splitncnn_0 198_splitncnn_0 201_splitncnn_0 204 205
|
|
||||||
Convolution Conv_13 1 1 205 206 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_16 2 1 206 193_splitncnn_2 209 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_4 1 6 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 209_splitncnn_3 209_splitncnn_4 209_splitncnn_5
|
|
||||||
Convolution Conv_17 1 1 209_splitncnn_5 211 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_5 1 4 211 211_splitncnn_0 211_splitncnn_1 211_splitncnn_2 211_splitncnn_3
|
|
||||||
Concat Concat_19 2 1 209_splitncnn_4 211_splitncnn_3 212
|
|
||||||
Convolution Conv_20 1 1 212 214 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_6 1 3 214 214_splitncnn_0 214_splitncnn_1 214_splitncnn_2
|
|
||||||
Concat Concat_22 3 1 209_splitncnn_3 211_splitncnn_2 214_splitncnn_2 215
|
|
||||||
Convolution Conv_23 1 1 215 217 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_7 1 2 217 217_splitncnn_0 217_splitncnn_1
|
|
||||||
Concat Concat_25 4 1 209_splitncnn_2 211_splitncnn_1 214_splitncnn_1 217_splitncnn_1 218
|
|
||||||
Convolution Conv_26 1 1 218 220 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_28 5 1 209_splitncnn_1 211_splitncnn_0 214_splitncnn_0 217_splitncnn_0 220 221
|
|
||||||
Convolution Conv_29 1 1 221 222 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_32 2 1 222 209_splitncnn_0 225 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_8 1 6 225 225_splitncnn_0 225_splitncnn_1 225_splitncnn_2 225_splitncnn_3 225_splitncnn_4 225_splitncnn_5
|
|
||||||
Convolution Conv_33 1 1 225_splitncnn_5 227 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_9 1 4 227 227_splitncnn_0 227_splitncnn_1 227_splitncnn_2 227_splitncnn_3
|
|
||||||
Concat Concat_35 2 1 225_splitncnn_4 227_splitncnn_3 228
|
|
||||||
Convolution Conv_36 1 1 228 230 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_10 1 3 230 230_splitncnn_0 230_splitncnn_1 230_splitncnn_2
|
|
||||||
Concat Concat_38 3 1 225_splitncnn_3 227_splitncnn_2 230_splitncnn_2 231
|
|
||||||
Convolution Conv_39 1 1 231 233 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_11 1 2 233 233_splitncnn_0 233_splitncnn_1
|
|
||||||
Concat Concat_41 4 1 225_splitncnn_2 227_splitncnn_1 230_splitncnn_1 233_splitncnn_1 234
|
|
||||||
Convolution Conv_42 1 1 234 236 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_44 5 1 225_splitncnn_1 227_splitncnn_0 230_splitncnn_0 233_splitncnn_0 236 237
|
|
||||||
Convolution Conv_45 1 1 237 238 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_48 2 1 238 225_splitncnn_0 241 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_51 2 1 241 193_splitncnn_1 244 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_12 1 7 244 244_splitncnn_0 244_splitncnn_1 244_splitncnn_2 244_splitncnn_3 244_splitncnn_4 244_splitncnn_5 244_splitncnn_6
|
|
||||||
Convolution Conv_52 1 1 244_splitncnn_6 246 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_13 1 4 246 246_splitncnn_0 246_splitncnn_1 246_splitncnn_2 246_splitncnn_3
|
|
||||||
Concat Concat_54 2 1 244_splitncnn_5 246_splitncnn_3 247
|
|
||||||
Convolution Conv_55 1 1 247 249 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_14 1 3 249 249_splitncnn_0 249_splitncnn_1 249_splitncnn_2
|
|
||||||
Concat Concat_57 3 1 244_splitncnn_4 246_splitncnn_2 249_splitncnn_2 250
|
|
||||||
Convolution Conv_58 1 1 250 252 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_15 1 2 252 252_splitncnn_0 252_splitncnn_1
|
|
||||||
Concat Concat_60 4 1 244_splitncnn_3 246_splitncnn_1 249_splitncnn_1 252_splitncnn_1 253
|
|
||||||
Convolution Conv_61 1 1 253 255 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_63 5 1 244_splitncnn_2 246_splitncnn_0 249_splitncnn_0 252_splitncnn_0 255 256
|
|
||||||
Convolution Conv_64 1 1 256 257 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_67 2 1 257 244_splitncnn_1 260 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_16 1 6 260 260_splitncnn_0 260_splitncnn_1 260_splitncnn_2 260_splitncnn_3 260_splitncnn_4 260_splitncnn_5
|
|
||||||
Convolution Conv_68 1 1 260_splitncnn_5 262 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_17 1 4 262 262_splitncnn_0 262_splitncnn_1 262_splitncnn_2 262_splitncnn_3
|
|
||||||
Concat Concat_70 2 1 260_splitncnn_4 262_splitncnn_3 263
|
|
||||||
Convolution Conv_71 1 1 263 265 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_18 1 3 265 265_splitncnn_0 265_splitncnn_1 265_splitncnn_2
|
|
||||||
Concat Concat_73 3 1 260_splitncnn_3 262_splitncnn_2 265_splitncnn_2 266
|
|
||||||
Convolution Conv_74 1 1 266 268 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_19 1 2 268 268_splitncnn_0 268_splitncnn_1
|
|
||||||
Concat Concat_76 4 1 260_splitncnn_2 262_splitncnn_1 265_splitncnn_1 268_splitncnn_1 269
|
|
||||||
Convolution Conv_77 1 1 269 271 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_79 5 1 260_splitncnn_1 262_splitncnn_0 265_splitncnn_0 268_splitncnn_0 271 272
|
|
||||||
Convolution Conv_80 1 1 272 273 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_83 2 1 273 260_splitncnn_0 276 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_20 1 6 276 276_splitncnn_0 276_splitncnn_1 276_splitncnn_2 276_splitncnn_3 276_splitncnn_4 276_splitncnn_5
|
|
||||||
Convolution Conv_84 1 1 276_splitncnn_5 278 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_21 1 4 278 278_splitncnn_0 278_splitncnn_1 278_splitncnn_2 278_splitncnn_3
|
|
||||||
Concat Concat_86 2 1 276_splitncnn_4 278_splitncnn_3 279
|
|
||||||
Convolution Conv_87 1 1 279 281 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_22 1 3 281 281_splitncnn_0 281_splitncnn_1 281_splitncnn_2
|
|
||||||
Concat Concat_89 3 1 276_splitncnn_3 278_splitncnn_2 281_splitncnn_2 282
|
|
||||||
Convolution Conv_90 1 1 282 284 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_23 1 2 284 284_splitncnn_0 284_splitncnn_1
|
|
||||||
Concat Concat_92 4 1 276_splitncnn_2 278_splitncnn_1 281_splitncnn_1 284_splitncnn_1 285
|
|
||||||
Convolution Conv_93 1 1 285 287 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_95 5 1 276_splitncnn_1 278_splitncnn_0 281_splitncnn_0 284_splitncnn_0 287 288
|
|
||||||
Convolution Conv_96 1 1 288 289 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_99 2 1 289 276_splitncnn_0 292 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_102 2 1 292 244_splitncnn_0 295 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_24 1 7 295 295_splitncnn_0 295_splitncnn_1 295_splitncnn_2 295_splitncnn_3 295_splitncnn_4 295_splitncnn_5 295_splitncnn_6
|
|
||||||
Convolution Conv_103 1 1 295_splitncnn_6 297 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_25 1 4 297 297_splitncnn_0 297_splitncnn_1 297_splitncnn_2 297_splitncnn_3
|
|
||||||
Concat Concat_105 2 1 295_splitncnn_5 297_splitncnn_3 298
|
|
||||||
Convolution Conv_106 1 1 298 300 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_26 1 3 300 300_splitncnn_0 300_splitncnn_1 300_splitncnn_2
|
|
||||||
Concat Concat_108 3 1 295_splitncnn_4 297_splitncnn_2 300_splitncnn_2 301
|
|
||||||
Convolution Conv_109 1 1 301 303 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_27 1 2 303 303_splitncnn_0 303_splitncnn_1
|
|
||||||
Concat Concat_111 4 1 295_splitncnn_3 297_splitncnn_1 300_splitncnn_1 303_splitncnn_1 304
|
|
||||||
Convolution Conv_112 1 1 304 306 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_114 5 1 295_splitncnn_2 297_splitncnn_0 300_splitncnn_0 303_splitncnn_0 306 307
|
|
||||||
Convolution Conv_115 1 1 307 308 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_118 2 1 308 295_splitncnn_1 311 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_28 1 6 311 311_splitncnn_0 311_splitncnn_1 311_splitncnn_2 311_splitncnn_3 311_splitncnn_4 311_splitncnn_5
|
|
||||||
Convolution Conv_119 1 1 311_splitncnn_5 313 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_29 1 4 313 313_splitncnn_0 313_splitncnn_1 313_splitncnn_2 313_splitncnn_3
|
|
||||||
Concat Concat_121 2 1 311_splitncnn_4 313_splitncnn_3 314
|
|
||||||
Convolution Conv_122 1 1 314 316 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_30 1 3 316 316_splitncnn_0 316_splitncnn_1 316_splitncnn_2
|
|
||||||
Concat Concat_124 3 1 311_splitncnn_3 313_splitncnn_2 316_splitncnn_2 317
|
|
||||||
Convolution Conv_125 1 1 317 319 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_31 1 2 319 319_splitncnn_0 319_splitncnn_1
|
|
||||||
Concat Concat_127 4 1 311_splitncnn_2 313_splitncnn_1 316_splitncnn_1 319_splitncnn_1 320
|
|
||||||
Convolution Conv_128 1 1 320 322 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_130 5 1 311_splitncnn_1 313_splitncnn_0 316_splitncnn_0 319_splitncnn_0 322 323
|
|
||||||
Convolution Conv_131 1 1 323 324 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_134 2 1 324 311_splitncnn_0 327 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_32 1 6 327 327_splitncnn_0 327_splitncnn_1 327_splitncnn_2 327_splitncnn_3 327_splitncnn_4 327_splitncnn_5
|
|
||||||
Convolution Conv_135 1 1 327_splitncnn_5 329 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_33 1 4 329 329_splitncnn_0 329_splitncnn_1 329_splitncnn_2 329_splitncnn_3
|
|
||||||
Concat Concat_137 2 1 327_splitncnn_4 329_splitncnn_3 330
|
|
||||||
Convolution Conv_138 1 1 330 332 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_34 1 3 332 332_splitncnn_0 332_splitncnn_1 332_splitncnn_2
|
|
||||||
Concat Concat_140 3 1 327_splitncnn_3 329_splitncnn_2 332_splitncnn_2 333
|
|
||||||
Convolution Conv_141 1 1 333 335 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_35 1 2 335 335_splitncnn_0 335_splitncnn_1
|
|
||||||
Concat Concat_143 4 1 327_splitncnn_2 329_splitncnn_1 332_splitncnn_1 335_splitncnn_1 336
|
|
||||||
Convolution Conv_144 1 1 336 338 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_146 5 1 327_splitncnn_1 329_splitncnn_0 332_splitncnn_0 335_splitncnn_0 338 339
|
|
||||||
Convolution Conv_147 1 1 339 340 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_150 2 1 340 327_splitncnn_0 343 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_153 2 1 343 295_splitncnn_0 346 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_36 1 7 346 346_splitncnn_0 346_splitncnn_1 346_splitncnn_2 346_splitncnn_3 346_splitncnn_4 346_splitncnn_5 346_splitncnn_6
|
|
||||||
Convolution Conv_154 1 1 346_splitncnn_6 348 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_37 1 4 348 348_splitncnn_0 348_splitncnn_1 348_splitncnn_2 348_splitncnn_3
|
|
||||||
Concat Concat_156 2 1 346_splitncnn_5 348_splitncnn_3 349
|
|
||||||
Convolution Conv_157 1 1 349 351 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_38 1 3 351 351_splitncnn_0 351_splitncnn_1 351_splitncnn_2
|
|
||||||
Concat Concat_159 3 1 346_splitncnn_4 348_splitncnn_2 351_splitncnn_2 352
|
|
||||||
Convolution Conv_160 1 1 352 354 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_39 1 2 354 354_splitncnn_0 354_splitncnn_1
|
|
||||||
Concat Concat_162 4 1 346_splitncnn_3 348_splitncnn_1 351_splitncnn_1 354_splitncnn_1 355
|
|
||||||
Convolution Conv_163 1 1 355 357 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_165 5 1 346_splitncnn_2 348_splitncnn_0 351_splitncnn_0 354_splitncnn_0 357 358
|
|
||||||
Convolution Conv_166 1 1 358 359 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_169 2 1 359 346_splitncnn_1 362 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_40 1 6 362 362_splitncnn_0 362_splitncnn_1 362_splitncnn_2 362_splitncnn_3 362_splitncnn_4 362_splitncnn_5
|
|
||||||
Convolution Conv_170 1 1 362_splitncnn_5 364 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_41 1 4 364 364_splitncnn_0 364_splitncnn_1 364_splitncnn_2 364_splitncnn_3
|
|
||||||
Concat Concat_172 2 1 362_splitncnn_4 364_splitncnn_3 365
|
|
||||||
Convolution Conv_173 1 1 365 367 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_42 1 3 367 367_splitncnn_0 367_splitncnn_1 367_splitncnn_2
|
|
||||||
Concat Concat_175 3 1 362_splitncnn_3 364_splitncnn_2 367_splitncnn_2 368
|
|
||||||
Convolution Conv_176 1 1 368 370 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_43 1 2 370 370_splitncnn_0 370_splitncnn_1
|
|
||||||
Concat Concat_178 4 1 362_splitncnn_2 364_splitncnn_1 367_splitncnn_1 370_splitncnn_1 371
|
|
||||||
Convolution Conv_179 1 1 371 373 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_181 5 1 362_splitncnn_1 364_splitncnn_0 367_splitncnn_0 370_splitncnn_0 373 374
|
|
||||||
Convolution Conv_182 1 1 374 375 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_185 2 1 375 362_splitncnn_0 378 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_44 1 6 378 378_splitncnn_0 378_splitncnn_1 378_splitncnn_2 378_splitncnn_3 378_splitncnn_4 378_splitncnn_5
|
|
||||||
Convolution Conv_186 1 1 378_splitncnn_5 380 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_45 1 4 380 380_splitncnn_0 380_splitncnn_1 380_splitncnn_2 380_splitncnn_3
|
|
||||||
Concat Concat_188 2 1 378_splitncnn_4 380_splitncnn_3 381
|
|
||||||
Convolution Conv_189 1 1 381 383 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_46 1 3 383 383_splitncnn_0 383_splitncnn_1 383_splitncnn_2
|
|
||||||
Concat Concat_191 3 1 378_splitncnn_3 380_splitncnn_2 383_splitncnn_2 384
|
|
||||||
Convolution Conv_192 1 1 384 386 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_47 1 2 386 386_splitncnn_0 386_splitncnn_1
|
|
||||||
Concat Concat_194 4 1 378_splitncnn_2 380_splitncnn_1 383_splitncnn_1 386_splitncnn_1 387
|
|
||||||
Convolution Conv_195 1 1 387 389 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_197 5 1 378_splitncnn_1 380_splitncnn_0 383_splitncnn_0 386_splitncnn_0 389 390
|
|
||||||
Convolution Conv_198 1 1 390 391 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_201 2 1 391 378_splitncnn_0 394 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_204 2 1 394 346_splitncnn_0 397 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_48 1 7 397 397_splitncnn_0 397_splitncnn_1 397_splitncnn_2 397_splitncnn_3 397_splitncnn_4 397_splitncnn_5 397_splitncnn_6
|
|
||||||
Convolution Conv_205 1 1 397_splitncnn_6 399 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_49 1 4 399 399_splitncnn_0 399_splitncnn_1 399_splitncnn_2 399_splitncnn_3
|
|
||||||
Concat Concat_207 2 1 397_splitncnn_5 399_splitncnn_3 400
|
|
||||||
Convolution Conv_208 1 1 400 402 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_50 1 3 402 402_splitncnn_0 402_splitncnn_1 402_splitncnn_2
|
|
||||||
Concat Concat_210 3 1 397_splitncnn_4 399_splitncnn_2 402_splitncnn_2 403
|
|
||||||
Convolution Conv_211 1 1 403 405 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_51 1 2 405 405_splitncnn_0 405_splitncnn_1
|
|
||||||
Concat Concat_213 4 1 397_splitncnn_3 399_splitncnn_1 402_splitncnn_1 405_splitncnn_1 406
|
|
||||||
Convolution Conv_214 1 1 406 408 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_216 5 1 397_splitncnn_2 399_splitncnn_0 402_splitncnn_0 405_splitncnn_0 408 409
|
|
||||||
Convolution Conv_217 1 1 409 410 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_220 2 1 410 397_splitncnn_1 413 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_52 1 6 413 413_splitncnn_0 413_splitncnn_1 413_splitncnn_2 413_splitncnn_3 413_splitncnn_4 413_splitncnn_5
|
|
||||||
Convolution Conv_221 1 1 413_splitncnn_5 415 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_53 1 4 415 415_splitncnn_0 415_splitncnn_1 415_splitncnn_2 415_splitncnn_3
|
|
||||||
Concat Concat_223 2 1 413_splitncnn_4 415_splitncnn_3 416
|
|
||||||
Convolution Conv_224 1 1 416 418 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_54 1 3 418 418_splitncnn_0 418_splitncnn_1 418_splitncnn_2
|
|
||||||
Concat Concat_226 3 1 413_splitncnn_3 415_splitncnn_2 418_splitncnn_2 419
|
|
||||||
Convolution Conv_227 1 1 419 421 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_55 1 2 421 421_splitncnn_0 421_splitncnn_1
|
|
||||||
Concat Concat_229 4 1 413_splitncnn_2 415_splitncnn_1 418_splitncnn_1 421_splitncnn_1 422
|
|
||||||
Convolution Conv_230 1 1 422 424 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_232 5 1 413_splitncnn_1 415_splitncnn_0 418_splitncnn_0 421_splitncnn_0 424 425
|
|
||||||
Convolution Conv_233 1 1 425 426 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_236 2 1 426 413_splitncnn_0 429 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_56 1 6 429 429_splitncnn_0 429_splitncnn_1 429_splitncnn_2 429_splitncnn_3 429_splitncnn_4 429_splitncnn_5
|
|
||||||
Convolution Conv_237 1 1 429_splitncnn_5 431 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_57 1 4 431 431_splitncnn_0 431_splitncnn_1 431_splitncnn_2 431_splitncnn_3
|
|
||||||
Concat Concat_239 2 1 429_splitncnn_4 431_splitncnn_3 432
|
|
||||||
Convolution Conv_240 1 1 432 434 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_58 1 3 434 434_splitncnn_0 434_splitncnn_1 434_splitncnn_2
|
|
||||||
Concat Concat_242 3 1 429_splitncnn_3 431_splitncnn_2 434_splitncnn_2 435
|
|
||||||
Convolution Conv_243 1 1 435 437 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_59 1 2 437 437_splitncnn_0 437_splitncnn_1
|
|
||||||
Concat Concat_245 4 1 429_splitncnn_2 431_splitncnn_1 434_splitncnn_1 437_splitncnn_1 438
|
|
||||||
Convolution Conv_246 1 1 438 440 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_248 5 1 429_splitncnn_1 431_splitncnn_0 434_splitncnn_0 437_splitncnn_0 440 441
|
|
||||||
Convolution Conv_249 1 1 441 442 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_252 2 1 442 429_splitncnn_0 445 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_255 2 1 445 397_splitncnn_0 448 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_60 1 7 448 448_splitncnn_0 448_splitncnn_1 448_splitncnn_2 448_splitncnn_3 448_splitncnn_4 448_splitncnn_5 448_splitncnn_6
|
|
||||||
Convolution Conv_256 1 1 448_splitncnn_6 450 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_61 1 4 450 450_splitncnn_0 450_splitncnn_1 450_splitncnn_2 450_splitncnn_3
|
|
||||||
Concat Concat_258 2 1 448_splitncnn_5 450_splitncnn_3 451
|
|
||||||
Convolution Conv_259 1 1 451 453 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_62 1 3 453 453_splitncnn_0 453_splitncnn_1 453_splitncnn_2
|
|
||||||
Concat Concat_261 3 1 448_splitncnn_4 450_splitncnn_2 453_splitncnn_2 454
|
|
||||||
Convolution Conv_262 1 1 454 456 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_63 1 2 456 456_splitncnn_0 456_splitncnn_1
|
|
||||||
Concat Concat_264 4 1 448_splitncnn_3 450_splitncnn_1 453_splitncnn_1 456_splitncnn_1 457
|
|
||||||
Convolution Conv_265 1 1 457 459 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_267 5 1 448_splitncnn_2 450_splitncnn_0 453_splitncnn_0 456_splitncnn_0 459 460
|
|
||||||
Convolution Conv_268 1 1 460 461 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_271 2 1 461 448_splitncnn_1 464 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_64 1 6 464 464_splitncnn_0 464_splitncnn_1 464_splitncnn_2 464_splitncnn_3 464_splitncnn_4 464_splitncnn_5
|
|
||||||
Convolution Conv_272 1 1 464_splitncnn_5 466 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_65 1 4 466 466_splitncnn_0 466_splitncnn_1 466_splitncnn_2 466_splitncnn_3
|
|
||||||
Concat Concat_274 2 1 464_splitncnn_4 466_splitncnn_3 467
|
|
||||||
Convolution Conv_275 1 1 467 469 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_66 1 3 469 469_splitncnn_0 469_splitncnn_1 469_splitncnn_2
|
|
||||||
Concat Concat_277 3 1 464_splitncnn_3 466_splitncnn_2 469_splitncnn_2 470
|
|
||||||
Convolution Conv_278 1 1 470 472 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_67 1 2 472 472_splitncnn_0 472_splitncnn_1
|
|
||||||
Concat Concat_280 4 1 464_splitncnn_2 466_splitncnn_1 469_splitncnn_1 472_splitncnn_1 473
|
|
||||||
Convolution Conv_281 1 1 473 475 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_283 5 1 464_splitncnn_1 466_splitncnn_0 469_splitncnn_0 472_splitncnn_0 475 476
|
|
||||||
Convolution Conv_284 1 1 476 477 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_287 2 1 477 464_splitncnn_0 480 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Split splitncnn_68 1 6 480 480_splitncnn_0 480_splitncnn_1 480_splitncnn_2 480_splitncnn_3 480_splitncnn_4 480_splitncnn_5
|
|
||||||
Convolution Conv_288 1 1 480_splitncnn_5 482 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_69 1 4 482 482_splitncnn_0 482_splitncnn_1 482_splitncnn_2 482_splitncnn_3
|
|
||||||
Concat Concat_290 2 1 480_splitncnn_4 482_splitncnn_3 483
|
|
||||||
Convolution Conv_291 1 1 483 485 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_70 1 3 485 485_splitncnn_0 485_splitncnn_1 485_splitncnn_2
|
|
||||||
Concat Concat_293 3 1 480_splitncnn_3 482_splitncnn_2 485_splitncnn_2 486
|
|
||||||
Convolution Conv_294 1 1 486 488 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Split splitncnn_71 1 2 488 488_splitncnn_0 488_splitncnn_1
|
|
||||||
Concat Concat_296 4 1 480_splitncnn_2 482_splitncnn_1 485_splitncnn_1 488_splitncnn_1 489
|
|
||||||
Convolution Conv_297 1 1 489 491 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01
|
|
||||||
Concat Concat_299 5 1 480_splitncnn_1 482_splitncnn_0 485_splitncnn_0 488_splitncnn_0 491 492
|
|
||||||
Convolution Conv_300 1 1 492 493 0=64 1=3 4=1 5=1 6=110592
|
|
||||||
Eltwise Add_303 2 1 493 480_splitncnn_0 496 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Eltwise Add_306 2 1 496 448_splitncnn_0 499 0=1 -23301=2,2.000000e-01,1.000000e+00
|
|
||||||
Convolution Conv_307 1 1 499 500 0=64 1=3 4=1 5=1 6=36864
|
|
||||||
BinaryOp Add_308 2 1 193_splitncnn_0 500 501
|
|
||||||
Interp Resize_310 1 1 501 506 0=1 1=2.000000e+00 2=2.000000e+00
|
|
||||||
Convolution Conv_311 1 1 506 508 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Interp Resize_314 1 1 508 513 0=1 1=2.000000e+00 2=2.000000e+00
|
|
||||||
Convolution Conv_315 1 1 513 515 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Convolution Conv_317 1 1 515 517 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01
|
|
||||||
Convolution Conv_319 1 1 517 output 0=3 1=3 4=1 5=1 6=1728
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
import edi
|
|
||||||
import numpy as np
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
ap = argparse.ArgumentParser( description='Testing for edi. NOTE: No error catching!' )
|
|
||||||
ap.add_argument( 'inputfile', help='Input file for upscaling' )
|
|
||||||
ap.add_argument( 'outputfile', help='Output file' )
|
|
||||||
ap.add_argument( '-S', '--scalefactor', help='Scale factor' )
|
|
||||||
ap.add_argument( '-a', '--sampling', help='Sampling window size. The bigger, the blurrier. Best >= 4')
|
|
||||||
ap.set_defaults( sampling=4 )
|
|
||||||
ap.set_defaults( scalefactor=2 )
|
|
||||||
|
|
||||||
args = ap.parse_args()
|
|
||||||
|
|
||||||
print( edi.EDI_predict( np.load( args.inputfile, allow_pickle=True ), args.sampling, args.scalefactor ) )
|
|
||||||
64
bin/probe.py
64
bin/probe.py
@@ -1,64 +0,0 @@
|
|||||||
"""
|
|
||||||
This file here was created from multiple parts of ffmpeg-python
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
try:
|
|
||||||
from collections.abc import Iterable
|
|
||||||
except ImportError:
|
|
||||||
from collections import Iterable
|
|
||||||
|
|
||||||
def convert_kwargs_to_cmd_line_args(kwargs):
|
|
||||||
"""Helper function to build command line arguments out of dict."""
|
|
||||||
args = []
|
|
||||||
for k in sorted(kwargs.keys()):
|
|
||||||
v = kwargs[k]
|
|
||||||
if isinstance(v, Iterable) and not isinstance(v, str):
|
|
||||||
for value in v:
|
|
||||||
args.append('-{}'.format(k))
|
|
||||||
if value is not None:
|
|
||||||
args.append('{}'.format(value))
|
|
||||||
continue
|
|
||||||
args.append('-{}'.format(k))
|
|
||||||
if v is not None:
|
|
||||||
args.append('{}'.format(v))
|
|
||||||
return args
|
|
||||||
|
|
||||||
class Error(Exception):
|
|
||||||
def __init__(self, cmd, stdout, stderr):
|
|
||||||
super(Error, self).__init__(
|
|
||||||
'{} error (see stderr output for detail)'.format(cmd)
|
|
||||||
)
|
|
||||||
self.stdout = stdout
|
|
||||||
self.stderr = stderr
|
|
||||||
|
|
||||||
def probe(filename, cmd='ffprobe', timeout=None, **kwargs):
|
|
||||||
"""Run ffprobe on the specified file and return a JSON representation of the output.
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
:class:`ffmpeg.Error`: if ffprobe returns a non-zero exit code,
|
|
||||||
an :class:`Error` is returned with a generic error message.
|
|
||||||
The stderr output can be retrieved by accessing the
|
|
||||||
``stderr`` property of the exception.
|
|
||||||
"""
|
|
||||||
args = [cmd, '-show_format', '-show_streams', '-of', 'json']
|
|
||||||
args += convert_kwargs_to_cmd_line_args(kwargs)
|
|
||||||
args += [filename]
|
|
||||||
|
|
||||||
if ( sys.platform == 'win32' ):
|
|
||||||
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
||||||
else:
|
|
||||||
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
||||||
communicate_kwargs = {}
|
|
||||||
if timeout is not None:
|
|
||||||
communicate_kwargs['timeout'] = timeout
|
|
||||||
out, err = p.communicate(**communicate_kwargs)
|
|
||||||
if p.returncode != 0:
|
|
||||||
raise Error('ffprobe', out, err)
|
|
||||||
return json.loads(out.decode('utf-8'))
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['probe']
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[PathSettings]
|
|
||||||
defaultOutputPath = $HOME/FSRImageVideoUpscaler/
|
|
||||||
tmpPathLinux = /tmp/
|
|
||||||
tmpPathWindows = C:\temp
|
|
||||||
|
|
||||||
[DevSettings]
|
|
||||||
loggerReqLevel = DEBUG
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
> 1%
|
|
||||||
last 2 versions
|
|
||||||
not dead
|
|
||||||
not ie 11
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
env: {
|
|
||||||
node: true
|
|
||||||
},
|
|
||||||
'extends': [
|
|
||||||
'plugin:vue/vue3-essential',
|
|
||||||
'eslint:recommended'
|
|
||||||
],
|
|
||||||
parserOptions: {
|
|
||||||
parser: '@babel/eslint-parser'
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# imagevideoupscaler
|
|
||||||
|
|
||||||
## Project setup
|
|
||||||
```
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and hot-reloads for development
|
|
||||||
```
|
|
||||||
npm run serve
|
|
||||||
```
|
|
||||||
|
|
||||||
### Compiles and minifies for production
|
|
||||||
```
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Lints and fixes files
|
|
||||||
```
|
|
||||||
npm run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
### Customize configuration
|
|
||||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/cli-plugin-babel/preset'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "es5",
|
|
||||||
"module": "esnext",
|
|
||||||
"baseUrl": "./",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"paths": {
|
|
||||||
"@/*": [
|
|
||||||
"src/*"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"lib": [
|
|
||||||
"esnext",
|
|
||||||
"dom",
|
|
||||||
"dom.iterable",
|
|
||||||
"scripthost"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
27957
frontend/package-lock.json
generated
27957
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,33 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "imagevideoupscaler",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"serve": "vue-cli-service serve",
|
|
||||||
"build": "vue-cli-service build",
|
|
||||||
"lint": "vue-cli-service lint",
|
|
||||||
"electron:build": "vue-cli-service electron:build",
|
|
||||||
"electron:serve": "vue-cli-service electron:serve",
|
|
||||||
"postinstall": "electron-builder install-app-deps",
|
|
||||||
"postuninstall": "electron-builder install-app-deps"
|
|
||||||
},
|
|
||||||
"main": "background.js",
|
|
||||||
"dependencies": {
|
|
||||||
"core-js": "^3.8.3",
|
|
||||||
"electron": "^24.3.1",
|
|
||||||
"vue": "^3.2.13",
|
|
||||||
"vue-router": "^4.0.3"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@babel/core": "^7.12.16",
|
|
||||||
"@babel/eslint-parser": "^7.12.16",
|
|
||||||
"@vue/cli-plugin-babel": "~5.0.0",
|
|
||||||
"@vue/cli-plugin-eslint": "~5.0.0",
|
|
||||||
"@vue/cli-plugin-router": "~5.0.0",
|
|
||||||
"@vue/cli-service": "~5.0.0",
|
|
||||||
"electron-devtools-installer": "^3.1.0",
|
|
||||||
"eslint": "^7.32.0",
|
|
||||||
"eslint-plugin-vue": "^8.0.3",
|
|
||||||
"vue-cli-plugin-electron-builder": "~2.1.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
|
||||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app"></div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
<template>
|
|
||||||
<nav>
|
|
||||||
<router-link to="/">Home</router-link> |
|
|
||||||
<router-link to="/about">About</router-link>
|
|
||||||
</nav>
|
|
||||||
<router-view v-slot="{ Component, route }">
|
|
||||||
<transition :name="route.meta.transition || 'scale'" mode="out-in">
|
|
||||||
<component :is="Component" />
|
|
||||||
</transition>
|
|
||||||
</router-view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'app',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
theme: '',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
changeTheme () {
|
|
||||||
if ( this.theme === '☼' ) {
|
|
||||||
document.documentElement.classList.remove( 'dark' );
|
|
||||||
document.documentElement.classList.add( 'light' );
|
|
||||||
sessionStorage.setItem( 'theme', '☽' );
|
|
||||||
this.theme = '☽';
|
|
||||||
} else if ( this.theme === '☽' ) {
|
|
||||||
document.documentElement.classList.remove( 'light' );
|
|
||||||
document.documentElement.classList.add( 'dark' );
|
|
||||||
sessionStorage.setItem( 'theme', '☼' );
|
|
||||||
this.theme = '☼';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
this.theme = sessionStorage.getItem( 'theme' ) ? sessionStorage.getItem( 'theme' ) : '';
|
|
||||||
if ( window.matchMedia( '(prefers-color-scheme: dark)' ).matches || this.theme === '☼' ) {
|
|
||||||
document.documentElement.classList.add( 'dark' );
|
|
||||||
this.theme = '☼';
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.add( 'light' );
|
|
||||||
this.theme = '☽';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
:root, :root.light {
|
|
||||||
--background-color: rgb(224, 222, 222);
|
|
||||||
--foreground-color: #2c3e50;
|
|
||||||
--highlight-color: rgb(221, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
:root.dark {
|
|
||||||
--background-color: rgb(34, 34, 34);
|
|
||||||
--foreground-color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
body, html {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#app {
|
|
||||||
font-family: Avenir, Helvetica, Arial, sans-serif;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
text-align: center;
|
|
||||||
background-color: var( --background-color );
|
|
||||||
color: var( --foreground-color );
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav {
|
|
||||||
padding: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav a {
|
|
||||||
font-weight: bold;
|
|
||||||
color: #2c3e50;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav a.router-link-exact-active {
|
|
||||||
color: #42b983;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scale-enter-active,
|
|
||||||
.scale-leave-active {
|
|
||||||
transition: all 0.5s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scale-enter-from,
|
|
||||||
.scale-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
transform: scale(0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-enter-active,
|
|
||||||
.fade-leave-active {
|
|
||||||
transition: opacity 0.4s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-enter-from,
|
|
||||||
.fade-leave-to {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.7 KiB |
@@ -1,81 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
|
|
||||||
import { app, protocol, BrowserWindow } from 'electron'
|
|
||||||
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
|
|
||||||
import installExtension, { VUEJS3_DEVTOOLS } from 'electron-devtools-installer'
|
|
||||||
const isDevelopment = process.env.NODE_ENV !== 'production'
|
|
||||||
|
|
||||||
// Scheme must be registered before the app is ready
|
|
||||||
protocol.registerSchemesAsPrivileged([
|
|
||||||
{ scheme: 'app', privileges: { secure: true, standard: true } }
|
|
||||||
])
|
|
||||||
|
|
||||||
async function createWindow() {
|
|
||||||
// Create the browser window.
|
|
||||||
const win = new BrowserWindow({
|
|
||||||
width: 800,
|
|
||||||
height: 600,
|
|
||||||
webPreferences: {
|
|
||||||
|
|
||||||
// Use pluginOptions.nodeIntegration, leave this alone
|
|
||||||
// See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
|
|
||||||
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
|
|
||||||
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (process.env.WEBPACK_DEV_SERVER_URL) {
|
|
||||||
// Load the url of the dev server if in development mode
|
|
||||||
await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
|
|
||||||
if (!process.env.IS_TEST) win.webContents.openDevTools()
|
|
||||||
} else {
|
|
||||||
createProtocol('app')
|
|
||||||
// Load the index.html when not in development
|
|
||||||
win.loadURL('app://./index.html')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
// On macOS it is common for applications and their menu bar
|
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('activate', () => {
|
|
||||||
// On macOS it's common to re-create a window in the app when the
|
|
||||||
// dock icon is clicked and there are no other windows open.
|
|
||||||
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
|
||||||
})
|
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
|
||||||
// initialization and is ready to create browser windows.
|
|
||||||
// Some APIs can only be used after this event occurs.
|
|
||||||
app.on('ready', async () => {
|
|
||||||
if (isDevelopment && !process.env.IS_TEST) {
|
|
||||||
// Install Vue Devtools
|
|
||||||
try {
|
|
||||||
await installExtension(VUEJS3_DEVTOOLS)
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Vue Devtools failed to install:', e.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createWindow()
|
|
||||||
})
|
|
||||||
|
|
||||||
// Exit cleanly on request from parent process in development mode.
|
|
||||||
if (isDevelopment) {
|
|
||||||
if (process.platform === 'win32') {
|
|
||||||
process.on('message', (data) => {
|
|
||||||
if (data === 'graceful-exit') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
process.on('SIGTERM', () => {
|
|
||||||
app.quit()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="hello">
|
|
||||||
<h1>{{ msg }}</h1>
|
|
||||||
<p>
|
|
||||||
For a guide and recipes on how to configure / customize this project,<br>
|
|
||||||
check out the
|
|
||||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
|
|
||||||
</p>
|
|
||||||
<h3>Installed CLI Plugins</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
|
|
||||||
</ul>
|
|
||||||
<h3>Essential Links</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
|
|
||||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
|
|
||||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
|
|
||||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
|
|
||||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
|
|
||||||
</ul>
|
|
||||||
<h3>Ecosystem</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
|
|
||||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
|
|
||||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
|
|
||||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'HelloWorld',
|
|
||||||
props: {
|
|
||||||
msg: String
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
||||||
<style scoped>
|
|
||||||
h3 {
|
|
||||||
margin: 40px 0 0;
|
|
||||||
}
|
|
||||||
ul {
|
|
||||||
list-style-type: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
li {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 10px;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #42b983;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
import { createApp } from 'vue'
|
|
||||||
import App from './App.vue'
|
|
||||||
import router from './router'
|
|
||||||
|
|
||||||
createApp(App).use(router).mount('#app')
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
|
|
||||||
import HomeView from '../views/HomeView.vue'
|
|
||||||
|
|
||||||
const routes = [
|
|
||||||
{
|
|
||||||
path: '/',
|
|
||||||
name: 'home',
|
|
||||||
component: HomeView
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/about',
|
|
||||||
name: 'about',
|
|
||||||
// route level code-splitting
|
|
||||||
// this generates a separate chunk (about.[hash].js) for this route
|
|
||||||
// which is lazy-loaded when the route is visited.
|
|
||||||
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
const router = createRouter({
|
|
||||||
history: process.env.IS_ELECTRON ? createWebHashHistory() : createWebHistory(process.env.BASE_URL),
|
|
||||||
routes
|
|
||||||
})
|
|
||||||
|
|
||||||
export default router
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="about">
|
|
||||||
<img src="@/assets/logo.png">
|
|
||||||
<h1>About ImageVideoUpscaler</h1>
|
|
||||||
<p>ImageVideoUpscaler is an application that allows you to upscale your videos and / or images. It uses an Electron GUI (Graphical User Interface) and a Python CLI (Command Line Interface).</p>
|
|
||||||
<h3>Contributors</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Janis Hutz (simplePCBuilding): Maintainer, CLI & GUI development, Packaging</li>
|
|
||||||
<li>ThatPlasma: App name, Logo, testing, Windows installer</li>
|
|
||||||
</ul>
|
|
||||||
<div class="version-info">
|
|
||||||
<h3>You are currently running version 1.1.0</h3>
|
|
||||||
<h3>Changelog</h3>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
Version 1.0
|
|
||||||
<ul></ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
version: '',
|
|
||||||
isUpToDate: true,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
fetch( 'https://github.com/simplePCBuilding/ImageVideoUpscaler/blob/master/package.json' ).then( res => {
|
|
||||||
console.log( res );
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="home">
|
|
||||||
<h1>ImageVideoUpscaler</h1>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'HomeView',
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
const { defineConfig } = require('@vue/cli-service')
|
|
||||||
module.exports = defineConfig({
|
|
||||||
transpileDependencies: true
|
|
||||||
})
|
|
||||||
14
gui/.eslintrc.cjs
Normal file
14
gui/.eslintrc.cjs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* eslint-env node */
|
||||||
|
require('@rushstack/eslint-patch/modern-module-resolution')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
'extends': [
|
||||||
|
'plugin:vue/vue3-essential',
|
||||||
|
'eslint:recommended',
|
||||||
|
'@vue/eslint-config-typescript'
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 'latest'
|
||||||
|
}
|
||||||
|
}
|
||||||
30
frontend/.gitignore → gui/.gitignore
vendored
30
frontend/.gitignore → gui/.gitignore
vendored
@@ -1,26 +1,30 @@
|
|||||||
.DS_Store
|
# Logs
|
||||||
node_modules
|
logs
|
||||||
/dist
|
*.log
|
||||||
|
|
||||||
|
|
||||||
# local env files
|
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
# Log files
|
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
pnpm-debug.log*
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
coverage
|
||||||
|
*.local
|
||||||
|
|
||||||
|
/cypress/videos/
|
||||||
|
/cypress/screenshots/
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
|
||||||
*.suo
|
*.suo
|
||||||
*.ntvs*
|
*.ntvs*
|
||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
#Electron-builder output
|
*.tsbuildinfo
|
||||||
/dist_electron
|
|
||||||
7
gui/.vscode/extensions.json
vendored
Normal file
7
gui/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"Vue.volar",
|
||||||
|
"Vue.vscode-typescript-vue-plugin",
|
||||||
|
"dbaeumer.vscode-eslint"
|
||||||
|
]
|
||||||
|
}
|
||||||
46
gui/README.md
Normal file
46
gui/README.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# SimpleMediaUpscalerLite
|
||||||
|
|
||||||
|
This template should help get you started developing with Vue 3 in Vite.
|
||||||
|
|
||||||
|
## Recommended IDE Setup
|
||||||
|
|
||||||
|
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
|
||||||
|
|
||||||
|
## Type Support for `.vue` Imports in TS
|
||||||
|
|
||||||
|
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
|
||||||
|
|
||||||
|
If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
|
||||||
|
|
||||||
|
1. Disable the built-in TypeScript Extension
|
||||||
|
1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
|
||||||
|
2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
|
||||||
|
2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
|
||||||
|
|
||||||
|
## Customize configuration
|
||||||
|
|
||||||
|
See [Vite Configuration Reference](https://vitejs.dev/config/).
|
||||||
|
|
||||||
|
## Project Setup
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compile and Hot-Reload for Development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Type-Check, Compile and Minify for Production
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lint with [ESLint](https://eslint.org/)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run lint
|
||||||
|
```
|
||||||
1
gui/env.d.ts
vendored
Normal file
1
gui/env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
13
gui/index.html
Normal file
13
gui/index.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="icon" href="/favicon.ico">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Vite App</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
3277
gui/package-lock.json
generated
Normal file
3277
gui/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
33
gui/package.json
Normal file
33
gui/package.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "smul",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "run-p type-check \"build-only {@}\" --",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"build-only": "vite build",
|
||||||
|
"type-check": "vue-tsc --build --force",
|
||||||
|
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"pinia": "^2.1.7",
|
||||||
|
"vue": "^3.4.15",
|
||||||
|
"vue-router": "^4.2.5"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@rushstack/eslint-patch": "^1.3.3",
|
||||||
|
"@tsconfig/node20": "^20.1.2",
|
||||||
|
"@types/node": "^20.11.10",
|
||||||
|
"@vitejs/plugin-vue": "^5.0.3",
|
||||||
|
"@vue/eslint-config-typescript": "^12.0.0",
|
||||||
|
"@vue/tsconfig": "^0.5.1",
|
||||||
|
"eslint": "^8.49.0",
|
||||||
|
"eslint-plugin-vue": "^9.17.0",
|
||||||
|
"npm-run-all2": "^6.1.1",
|
||||||
|
"typescript": "~5.3.0",
|
||||||
|
"vite": "^5.0.11",
|
||||||
|
"vue-tsc": "^1.8.27"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
199
gui/src/App.vue
Normal file
199
gui/src/App.vue
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
<!--
|
||||||
|
* libreevent - App.vue
|
||||||
|
*
|
||||||
|
* Created by Janis Hutz 05/14/2023, Licensed under the GPL V3 License
|
||||||
|
* https://janishutz.com, development@janishutz.com
|
||||||
|
*
|
||||||
|
*
|
||||||
|
-->
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<nav>
|
||||||
|
<router-link to="/" class="main-nav-item">Home</router-link> |
|
||||||
|
<router-link to="/about" class="main-nav-item">About</router-link> |
|
||||||
|
<router-link to="/settings" class="main-nav-item">Settings</router-link>
|
||||||
|
</nav>
|
||||||
|
<router-view v-slot="{ Component, route }" id="main-view">
|
||||||
|
<transition :name="route.meta.transition ? String( route.meta.transition ) : 'fade'" mode="out-in">
|
||||||
|
<component :is="Component"></component>
|
||||||
|
</transition>
|
||||||
|
</router-view>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: var(--background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root,
|
||||||
|
:root.light {
|
||||||
|
--primary-color: #0a1520;
|
||||||
|
--secondary-color: white;
|
||||||
|
--background-color: rgb(221, 221, 221);
|
||||||
|
--nav-background: white;
|
||||||
|
--hover-color: #00457a;
|
||||||
|
--popup-color: rgb(224, 224, 224);
|
||||||
|
--overlay-color: rgba(0, 0, 0, 0.7);
|
||||||
|
--PI: 3.14159265358979;
|
||||||
|
--gray-color: rgb(53, 53, 53);
|
||||||
|
--footer-background: rgb(233, 233, 233);
|
||||||
|
--accent-background: rgb(195, 235, 243);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root.dark {
|
||||||
|
--primary-color: white;
|
||||||
|
--secondary-color: black;
|
||||||
|
--background-color: rgb(32, 32, 32);
|
||||||
|
--nav-background: rgb(54, 54, 54);
|
||||||
|
--popup-color: rgb(58, 58, 58);
|
||||||
|
--hover-color: #007ddd;
|
||||||
|
--overlay-color: rgba(104, 104, 104, 0.575);
|
||||||
|
--gray-color: rgb(207, 207, 207);
|
||||||
|
--footer-background: rgb(53, 53, 53);
|
||||||
|
--accent-background: rgb(24, 12, 58);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--primary-color: white;
|
||||||
|
--secondary-color: black;
|
||||||
|
--background-color: rgb(32, 32, 32);
|
||||||
|
--nav-background: rgb(54, 54, 54);
|
||||||
|
--popup-color: rgb(58, 58, 58);
|
||||||
|
--hover-color: #007ddd;
|
||||||
|
--overlay-color: rgba(104, 104, 104, 0.575);
|
||||||
|
--gray-color: rgb(207, 207, 207);
|
||||||
|
--footer-background: rgb(53, 53, 53);
|
||||||
|
--accent-background: rgb(24, 12, 58);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection {
|
||||||
|
background-color: #7c8cec;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
transition: 0.5s;
|
||||||
|
background-color: var(--background-color);
|
||||||
|
font-family: 'Plus Jakarta Sans', sans-serif;
|
||||||
|
/* font-family: Avenir, Helvetica, Arial, sans-serif; */
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--primary-color);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-grow: 1;
|
||||||
|
width: 100vw;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-view {
|
||||||
|
min-height: 60vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scale-enter-active,
|
||||||
|
.scale-leave-active {
|
||||||
|
transition: all 0.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scale-enter-from,
|
||||||
|
.scale-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-enter-active,
|
||||||
|
.fade-leave-active {
|
||||||
|
transition: opacity 0.4s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-enter-from,
|
||||||
|
.fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-symbols-outlined {
|
||||||
|
font-variation-settings:
|
||||||
|
'FILL' 0,
|
||||||
|
'wght' 400,
|
||||||
|
'GRAD' 0,
|
||||||
|
'opsz' 48
|
||||||
|
}
|
||||||
|
|
||||||
|
.clr-open {
|
||||||
|
border: black solid 1px !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
nav {
|
||||||
|
height: 10vh;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-nav-item {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-nav-item.router-link-exact-active {
|
||||||
|
color: #2080ca;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.fancy-button {
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
border: none;
|
||||||
|
background: linear-gradient(45deg, rgb(0, 33, 139), rgb(151, 0, 0));
|
||||||
|
font-size: larger;
|
||||||
|
transition: all 0.5s;
|
||||||
|
background-size: 150%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy-button:hover {
|
||||||
|
border-radius: 5px;
|
||||||
|
background-position: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy-button-inactive {
|
||||||
|
background: linear-gradient(45deg, rgba(0, 33, 139, 0.6), rgba(151, 0, 0, 0.6));
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fancy-button-inactive:hover {
|
||||||
|
border-radius: 20px;
|
||||||
|
background-position: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { RouterView } from 'vue-router';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
let isAtTop = ref( true );
|
||||||
|
|
||||||
|
if ( window.scrollY === 0 ) {
|
||||||
|
isAtTop.value = true;
|
||||||
|
} else {
|
||||||
|
isAtTop.value = false;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
BIN
gui/src/assets/logo.png
Normal file
BIN
gui/src/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 592 KiB |
12
gui/src/main.ts
Normal file
12
gui/src/main.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { createApp } from 'vue'
|
||||||
|
import { createPinia } from 'pinia'
|
||||||
|
|
||||||
|
import App from './App.vue'
|
||||||
|
import router from './router'
|
||||||
|
|
||||||
|
const app = createApp(App)
|
||||||
|
|
||||||
|
app.use(createPinia())
|
||||||
|
app.use(router)
|
||||||
|
|
||||||
|
app.mount('#app')
|
||||||
25
gui/src/router/index.ts
Normal file
25
gui/src/router/index.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
|
import HomeView from '../views/HomeView.vue'
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/',
|
||||||
|
name: 'home',
|
||||||
|
component: HomeView
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/about',
|
||||||
|
name: 'about',
|
||||||
|
component: () => import('../views/AboutView.vue')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/settings',
|
||||||
|
name: 'settings',
|
||||||
|
component: () => import('../views/SettingsView.vue')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router
|
||||||
12
gui/src/stores/counter.ts
Normal file
12
gui/src/stores/counter.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { ref, computed } from 'vue'
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
|
export const useCounterStore = defineStore('counter', () => {
|
||||||
|
const count = ref(0)
|
||||||
|
const doubleCount = computed(() => count.value * 2)
|
||||||
|
function increment() {
|
||||||
|
count.value++
|
||||||
|
}
|
||||||
|
|
||||||
|
return { count, doubleCount, increment }
|
||||||
|
})
|
||||||
7
gui/src/views/AboutView.vue
Normal file
7
gui/src/views/AboutView.vue
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<template>
|
||||||
|
<div class="about">
|
||||||
|
<img src="@/assets/logo.png" alt="smuL Logo">
|
||||||
|
<h1>SimpleMediaUpscalerLite</h1>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
9
gui/src/views/HomeView.vue
Normal file
9
gui/src/views/HomeView.vue
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main>
|
||||||
|
<h1>SimpleMediaUpscalerLite</h1>
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
7
gui/src/views/SettingsView.vue
Normal file
7
gui/src/views/SettingsView.vue
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<template>
|
||||||
|
<div class="about">
|
||||||
|
<h1>Settings</h1>
|
||||||
|
<img src="@/assets/logo.png" alt="smuL Logo">
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
14
gui/tsconfig.app.json
Normal file
14
gui/tsconfig.app.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||||
|
"exclude": ["src/**/__tests__/*"],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
gui/tsconfig.json
Normal file
11
gui/tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.node.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.app.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
19
gui/tsconfig.node.json
Normal file
19
gui/tsconfig.node.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"extends": "@tsconfig/node20/tsconfig.json",
|
||||||
|
"include": [
|
||||||
|
"vite.config.*",
|
||||||
|
"vitest.config.*",
|
||||||
|
"cypress.config.*",
|
||||||
|
"nightwatch.conf.*",
|
||||||
|
"playwright.config.*"
|
||||||
|
],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"types": ["node"]
|
||||||
|
}
|
||||||
|
}
|
||||||
19
gui/vite.config.ts
Normal file
19
gui/vite.config.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import vue from '@vitejs/plugin-vue'
|
||||||
|
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
vue(),
|
||||||
|
],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
port: 8080
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
"""
|
|
||||||
* FSRImageVideoUpscalerFrontend - fsrimagevideoupscaler-cli.py
|
|
||||||
*
|
|
||||||
* Created by Janis Hutz 03/15/2023, Licensed under the GPL V3 License
|
|
||||||
* https://janishutz.com, development@janishutz.com
|
|
||||||
*
|
|
||||||
*
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import bin.handler
|
|
||||||
import os
|
|
||||||
import multiprocessing
|
|
||||||
import json
|
|
||||||
|
|
||||||
engineList = os.listdir( 'bin/engines' );
|
|
||||||
engineList.pop( 0 )
|
|
||||||
|
|
||||||
engineInfo = {}
|
|
||||||
|
|
||||||
for engine in engineList:
|
|
||||||
engineInfo[ engine ] = json.load( open( 'bin/engines/' + engine + '/config.json' ) )
|
|
||||||
|
|
||||||
allowedFiletypes = [ 'png', 'jpg' ];
|
|
||||||
|
|
||||||
def performChecks ( args, ap ):
|
|
||||||
if ( args.details == None or args.details == '' ):
|
|
||||||
if ( not args.printengines ):
|
|
||||||
if ( not args.version ):
|
|
||||||
# Check if input and output file arguments are available
|
|
||||||
if ( args.inputfile == None or args.inputfile == '' or args.outputfile == None or args.outputfile == '' ):
|
|
||||||
print( '\n\n ==> ERROR: Input and output file required! <==\n\n' )
|
|
||||||
ap.print_usage();
|
|
||||||
return False
|
|
||||||
|
|
||||||
# check if output file exists and if, prompt user if it should be overwritten and remove if, if yes
|
|
||||||
if ( os.path.exists( args.outputfile ) ):
|
|
||||||
doReplace = input( '--> File already exists. Do you want to replace it? (Y/n) ' ).lower()
|
|
||||||
if ( doReplace == 'y' or doReplace == '' ):
|
|
||||||
os.remove( args.outputfile );
|
|
||||||
else:
|
|
||||||
print( '\n==> Refusing to Upscale video. Please delete the file or specify another filepath! <==' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# check if engine argument is valid
|
|
||||||
try:
|
|
||||||
engineInfo[ args.engine.lower() ]
|
|
||||||
except KeyError:
|
|
||||||
print( '\n==> ERROR: Engine not available. Ensure you have specified a valid engine' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Check scalefactor argument and also verify that engine supports upscaling
|
|
||||||
if ( args.scalefactor != None and args.scalefactor != 0 ):
|
|
||||||
if ( int( args.scalefactor ) > 4 and int( args.scalefactor ) < -4 ):
|
|
||||||
print( '\n==> ERROR: Invalid scale factor. Value has to be an integer between -4 and 4 (option -s)' )
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
if ( not 'upscaling' in engineInfo[ args.engine ][ 'supports' ] ):
|
|
||||||
print( '\n==> ERROR: This engine does NOT support upscaling' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Check sharpening argument and also verify that engine supports it
|
|
||||||
if ( args.sharpening != None and args.sharpening != 0 ):
|
|
||||||
if ( float( args.sharpening ) >= 1 and float( args.sharpening ) <= 0 ):
|
|
||||||
print( '\n==> ERROR: Invalid value for sharpening. Value has to be between 0 and 1' )
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
if ( not 'sharpening' in engineInfo[ args.engine ][ 'supports' ] ):
|
|
||||||
print( '\n==> ERROR: This engine does NOT support sharpening' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# check if scalefactor and / or sharpening is available
|
|
||||||
if ( ( args.scalefactor == 0 or args.scalefactor == None ) and ( args.sharpening == 0 or args.sharpening == None ) ):
|
|
||||||
print( '\n==> ERROR: Either scalefactor or sharpening argument required!' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Check if filetype argument is valid
|
|
||||||
if ( not args.filetype in allowedFiletypes ):
|
|
||||||
print( '\n==> ERROR: Unknown filetype for temp files. Can be png or jpg' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Check if mode of engine is valid
|
|
||||||
if ( args.mode != None ):
|
|
||||||
try:
|
|
||||||
engineInfo[ args.engine.lower() ][ 'cliModeOptions' ][ args.mode.lower() ]
|
|
||||||
except KeyError:
|
|
||||||
print( '\n==> ERROR: The specified mode is not supported by this engine. Options:' )
|
|
||||||
for option in engineInfo[ args.engine ][ 'cliModeOptions' ]:
|
|
||||||
print( ' --> ' + engineInfo[ args.engine ][ 'cliModeOptions' ][ option ][ 'displayName' ] + ' (' + option + ')' )
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
print( '\n\n==> You are running Version 1.1.0 of ImageVideoScaler-CLI <==\n' )
|
|
||||||
else:
|
|
||||||
print( '\n\n==> Available engines <==\n' )
|
|
||||||
for entry in engineList:
|
|
||||||
print( '--> ' + entry )
|
|
||||||
print( '\n\n' )
|
|
||||||
else:
|
|
||||||
print( '\n\n ==> INFOS about ' + engineInfo[ args.details.lower() ][ 'displayName' ] + '\n' )
|
|
||||||
print( ' --> Engine cli option is: ' + engineInfo[ args.details ][ 'abbr' ].lower() )
|
|
||||||
print( ' --> CLI mode options are: ' )
|
|
||||||
for mode in engineInfo[ args.details ][ 'cliModeOptions' ]:
|
|
||||||
print( ' -> ' + engineInfo[ args.details ][ 'cliModeOptions' ][ mode ][ 'displayName' ] + ':' )
|
|
||||||
print( ' > CLI name: ' + mode )
|
|
||||||
print( ' > Is the default: ' + str( engineInfo[ args.details ][ 'cliModeOptions' ][ mode ][ 'default' ] ) )
|
|
||||||
print( '\n\n' )
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
ap = argparse.ArgumentParser( description='ImageVideoUpscaler - CLI, a CLI application to upscale videos and images using different upscaling engines.' )
|
|
||||||
ap.add_argument( '-i', '--inputfile', help='File path for the video / image to be upscaled' )
|
|
||||||
ap.add_argument( '-o', '--outputfile', help='Output file path for the video / image that was upscaled' )
|
|
||||||
ap.add_argument( '-s', '--scalefactor', help='Scale factor for the video / image. Can be a integer from -4 to 4' )
|
|
||||||
ap.add_argument( '-S', '--sharpening', help='Sharpening factor (between 0 and 1 whereas 0 means no sharpening, 1 the most sharpening. Recommendation: Do not exceed 0.25, as it often looks bad)' )
|
|
||||||
ap.add_argument( '-T', '--threads', help='Thread count to use. Cannot exceed CPU thread count. Scaling non-linear (using 2 threads is not exactly 2x the speed of 1 thread). Scales well with FSR, barely with Real-ESRGAN, as it uses mostly the GPU to upscale' )
|
|
||||||
ap.add_argument( '-E', '--engine', help='Upscaling engine. By default can be fsr or ss. Use the -p option to see all installed engines' )
|
|
||||||
ap.add_argument( '-M', '--mode', help='Specify a special mode for a specific engine. Might not be available in every engine. Use the -d option to find out more' )
|
|
||||||
ap.add_argument( '-F', '--filetype', help='Change the file type of the temporary image files. Supports png, jpg. Video quality: png > jpg. PNG is default, if not specified.' )
|
|
||||||
ap.add_argument( '-d', '--details', help='Get details on usage of a particular engine and exit. Reads the config.json file of that engine and displays it in a HR manner' )
|
|
||||||
ap.add_argument( '-p', '--printengines', help='Print all engines and exit', action='store_true' )
|
|
||||||
ap.add_argument( '-v', '--version', help='Print version and exit', action='store_true' )
|
|
||||||
ap.set_defaults( scaling = 0, sharpening = 0, threads = 4, engine = 'fsr', filetype = 'png' )
|
|
||||||
args = ap.parse_args()
|
|
||||||
|
|
||||||
handler = bin.handler.Handler()
|
|
||||||
|
|
||||||
multiprocessing.freeze_support();
|
|
||||||
|
|
||||||
if ( performChecks( args, ap ) ):
|
|
||||||
mode = 'fsr'
|
|
||||||
if ( args.mode != None ):
|
|
||||||
mode = args.mode
|
|
||||||
else:
|
|
||||||
for option in engineInfo[ args.engine ][ 'cliModeOptions' ]:
|
|
||||||
if ( engineInfo[ args.engine ][ 'cliModeOptions' ][ option ][ 'default' ] ):
|
|
||||||
mode = option
|
|
||||||
break
|
|
||||||
handler.handler( args.inputfile, args.scalefactor, args.outputfile, args.sharpening, args.filetype, args.engine, mode, args.threads )
|
|
||||||
print( '\n\n---------------------------------------------------------------------------------\n\nDONE \n\n\n\nImageVideoUpscalerFrontend V1.1.0\n\nCopyright 2023 FSRImageVideoUpscalerFrontend contributors\nThis application comes with absolutely no warranty to the extent permitted by applicable law\n\n\n\nOutput was written to ' + args.outputfile + '\n\n\n' )
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
|
||||||
|
|
||||||
|
|
||||||
block_cipher = None
|
|
||||||
|
|
||||||
|
|
||||||
a = Analysis(
|
|
||||||
['imagevideoupscaler-cli.py'],
|
|
||||||
pathex=[],
|
|
||||||
binaries=[],
|
|
||||||
datas=[],
|
|
||||||
hiddenimports=[],
|
|
||||||
hookspath=[],
|
|
||||||
hooksconfig={},
|
|
||||||
runtime_hooks=[],
|
|
||||||
excludes=[],
|
|
||||||
win_no_prefer_redirects=False,
|
|
||||||
win_private_assemblies=False,
|
|
||||||
cipher=block_cipher,
|
|
||||||
noarchive=False,
|
|
||||||
)
|
|
||||||
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
||||||
|
|
||||||
exe = EXE(
|
|
||||||
pyz,
|
|
||||||
a.scripts,
|
|
||||||
[],
|
|
||||||
exclude_binaries=True,
|
|
||||||
name='imagevideoupscaler',
|
|
||||||
debug=False,
|
|
||||||
bootloader_ignore_signals=False,
|
|
||||||
strip=False,
|
|
||||||
upx=True,
|
|
||||||
console=True,
|
|
||||||
disable_windowed_traceback=False,
|
|
||||||
argv_emulation=False,
|
|
||||||
target_arch=None,
|
|
||||||
codesign_identity=None,
|
|
||||||
entitlements_file=None,
|
|
||||||
)
|
|
||||||
coll = COLLECT(
|
|
||||||
exe,
|
|
||||||
a.binaries,
|
|
||||||
a.zipfiles,
|
|
||||||
a.datas,
|
|
||||||
strip=False,
|
|
||||||
upx=True,
|
|
||||||
upx_exclude=[],
|
|
||||||
name='imagevideoupscaler',
|
|
||||||
)
|
|
||||||
27
package.json
27
package.json
@@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "imagevideoupscaler",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "A frontend to upscale your videos and images using different upscale engines",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/simplePCBuilding/FSRImageVideoUpscalerFrontend.git"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"upscaler",
|
|
||||||
"electron",
|
|
||||||
"python",
|
|
||||||
"frontend",
|
|
||||||
"videos",
|
|
||||||
"images"
|
|
||||||
],
|
|
||||||
"author": "Janis Hutz",
|
|
||||||
"license": "GPL-3.0-or-later",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/simplePCBuilding/FSRImageVideoUpscalerFrontend/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/simplePCBuilding/FSRImageVideoUpscalerFrontend#readme"
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=FSR Image & Video Upscaler
|
|
||||||
Comment=Upscale your videos and images with FSR
|
|
||||||
Path=/opt/fsrimageupscaler
|
|
||||||
Exec=/opt/fsrimageupscaler/FSR\ Image\ \&\ Video\ Upscaler
|
|
||||||
Icon=fsrimageupscaler
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 43 KiB |
@@ -1,18 +0,0 @@
|
|||||||
#! /bin/bash
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# Make linux executable
|
|
||||||
pyinstaller imagevideoupscaler-cli.spec
|
|
||||||
mv -r ./dist/imagevideupscaler ./dist/imagevideupscaler-linux
|
|
||||||
cp -r ./bin ./dist/imagevideupscaler-linux
|
|
||||||
cp -r ./config ./dist/imagevideupscaler-linux
|
|
||||||
cp ./imagevideupscaler-cli.py ./dist/imagevideupscaler-linux
|
|
||||||
cp ./LICENSE ./dist/imagevideupscaler-linux
|
|
||||||
cp ./logo.png ./dist/imagevideupscaler-linux
|
|
||||||
|
|
||||||
# package rpm & deb
|
|
||||||
# TODO: create packager
|
|
||||||
|
|
||||||
# Make windows executable
|
|
||||||
# TODO: create compiler
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
curl -o ./pythonInstaller.exe https://www.python.org/ftp/python/3.10.11/python-3.10.11-amd64.exe
|
|
||||||
|
|
||||||
wine pythonInstaller.exe
|
|
||||||
|
|
||||||
currentPath = pwd
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Writing plugins for ImageVideoUpscaler
|
|
||||||
|
|
||||||
Your plugin has to fulfill the following requirements:
|
|
||||||
- Name of class it exposes has to be [name of engine]Scaler. The name of the file should be just the name of the engine in all lower case.
|
|
||||||
- It has to support a folder or an individual file as an input and the function, has to take the following arguments:
|
|
||||||
|
|
||||||
Argument | Variable type
|
|
||||||
---------|---------------
|
|
||||||
x | y
|
|
||||||
|
|
||||||
- The function has to return the path to the folder where the final resulting images are located.
|
|
||||||
Reference in New Issue
Block a user