mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-01-23 13:34:54 +03:00
feat: using aria2 for http downloads
This commit is contained in:
parent
8eca067aed
commit
a39082d326
80
aria2/AUTHORS
Normal file
80
aria2/AUTHORS
Normal file
@ -0,0 +1,80 @@
|
||||
These are people who made lots of contributions:
|
||||
|
||||
Tatsuhiro Tsujikawa <tatsuhiro.t at gmail dot com>
|
||||
Ross Smith II <aria2spam at netebb dot com> (Windows port)
|
||||
Nils Maier <maierman at web dot Germany>
|
||||
|
||||
The aria2 contributor's list extracted from commit logs [1]:
|
||||
|
||||
103yiran
|
||||
Alexander Amanuel
|
||||
Alexander Egorenkov
|
||||
Ali MJ Al-Nasrawy
|
||||
Anthony Bryan
|
||||
Artur Petrov
|
||||
Athmane Madjoudj
|
||||
Ben Chaney
|
||||
Char
|
||||
Cristian Rodríguez
|
||||
Dan Church
|
||||
Dan Fandrich
|
||||
David Macek
|
||||
Emmanuel Engelhart
|
||||
FH0
|
||||
Florian Gamböck
|
||||
Fredrik Fornwall
|
||||
Hernan Martinez
|
||||
ITriskTI
|
||||
Igor Khomyakov
|
||||
Jarda Snajdr
|
||||
JimmyZ
|
||||
Juan Francisco Cantero Hurtado
|
||||
Kcchouette
|
||||
Kurt Kartaltepe
|
||||
Michał Górny
|
||||
Michał Leśniewski
|
||||
Mingye Wang
|
||||
Natanael Copa
|
||||
Nikita Ofitserov
|
||||
Nils Maier
|
||||
ORiON-
|
||||
ReadmeCritic
|
||||
Richard Nias
|
||||
Rosen Penev
|
||||
Ross Smith II
|
||||
Ryan Steinmetz
|
||||
Ryo ONODERA
|
||||
Sarim Khan
|
||||
Sergey Zolotarev
|
||||
Sonny Piers
|
||||
Sébastien Cabaniols
|
||||
Tatsuhiro Tsujikawa
|
||||
Torbjörn Lönnemark
|
||||
Tse Kit Yam
|
||||
Vasilij Schneidermann
|
||||
Zoltan Toth-Czifra
|
||||
a1346054
|
||||
amtlib-dot-dll
|
||||
c3mb0
|
||||
carsonzhu
|
||||
diadistis
|
||||
eric1932
|
||||
geetam
|
||||
gilberto dos santos alves
|
||||
gt
|
||||
klemens
|
||||
kwkam
|
||||
luokar
|
||||
mozillazg
|
||||
multisnow
|
||||
nicolov
|
||||
nkh0472
|
||||
oliviercommelarbre
|
||||
qweaszxcdf
|
||||
rotor
|
||||
sleepymac
|
||||
suzker
|
||||
tcely
|
||||
yixinBC
|
||||
|
||||
[1] https://gist.github.com/tatsuhiro-t/deaffeb064652104ad11
|
339
aria2/COPYING
Normal file
339
aria2/COPYING
Normal file
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) 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
|
||||
this service 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 make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. 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.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
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
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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 a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE 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.
|
||||
|
||||
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
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 2 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, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision 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, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This 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.
|
1181
aria2/ChangeLog
Normal file
1181
aria2/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
137
aria2/LICENSE.OpenSSL
Normal file
137
aria2/LICENSE.OpenSSL
Normal file
@ -0,0 +1,137 @@
|
||||
Certain source files in this program permit linking with the OpenSSL
|
||||
library (http://www.openssl.org), which otherwise wouldn't be allowed
|
||||
under the GPL. For purposes of identifying OpenSSL, most source files
|
||||
giving this permission limit it to versions of OpenSSL having a license
|
||||
identical to that listed in this file (LICENSE.OpenSSL). It is not
|
||||
necessary for the copyright years to match between this file and the
|
||||
OpenSSL version in question. However, note that because this file is
|
||||
an extension of the license statements of these source files, this file
|
||||
may not be changed except with permission from all copyright holders
|
||||
of source files in this program which reference this file.
|
||||
|
||||
|
||||
LICENSE ISSUES
|
||||
==============
|
||||
|
||||
The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
|
||||
the OpenSSL License and the original SSLeay license apply to the toolkit.
|
||||
See below for the actual license texts. Actually both licenses are BSD-style
|
||||
Open Source licenses. In case of any license issues related to OpenSSL
|
||||
please contact openssl-core@openssl.org.
|
||||
|
||||
OpenSSL License
|
||||
---------------
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
Original SSLeay License
|
||||
-----------------------
|
||||
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
7
aria2/NEWS
Normal file
7
aria2/NEWS
Normal file
@ -0,0 +1,7 @@
|
||||
aria2 1.37.0
|
||||
============
|
||||
|
||||
Release Note
|
||||
------------
|
||||
|
||||
See https://github.com/aria2/aria2/releases/tag/release-1.37.0
|
904
aria2/README.html
Normal file
904
aria2/README.html
Normal file
@ -0,0 +1,904 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
|
||||
<title>aria2 - The ultra fast download utility</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
.subscript {
|
||||
vertical-align: sub;
|
||||
font-size: smaller }
|
||||
|
||||
.superscript {
|
||||
vertical-align: super;
|
||||
font-size: smaller }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
table.align-center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
.align-top {
|
||||
vertical-align: top }
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle }
|
||||
|
||||
.align-bottom {
|
||||
vertical-align: bottom }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="aria2-the-ultra-fast-download-utility">
|
||||
<h1 class="title">aria2 - The ultra fast download utility</h1>
|
||||
|
||||
<div class="section" id="disclaimer">
|
||||
<h1>Disclaimer</h1>
|
||||
<p>This program comes with no warranty.
|
||||
You must use this program at your own risk.</p>
|
||||
</div>
|
||||
<div class="section" id="introduction">
|
||||
<h1>Introduction</h1>
|
||||
<p>aria2 is a utility for downloading files. The supported protocols are
|
||||
HTTP(S), FTP, SFTP, BitTorrent, and Metalink. aria2 can download a
|
||||
file from multiple sources/protocols and tries to utilize your maximum
|
||||
download bandwidth. It supports downloading a file from
|
||||
HTTP(S)/FTP/SFTP and BitTorrent at the same time, while the data
|
||||
downloaded from HTTP(S)/FTP/SFTP is uploaded to the BitTorrent
|
||||
swarm. Using Metalink's chunk checksums, aria2 automatically validates
|
||||
chunks of data while downloading a file like BitTorrent.</p>
|
||||
<p>The project page is located at <a class="reference external" href="https://aria2.github.io/">https://aria2.github.io/</a>.</p>
|
||||
<p>See the <a class="reference external" href="https://aria2.github.io/manual/en/html/">aria2 Online Manual</a> (<a class="reference external" href="https://aria2.github.io/manual/ru/html/">Russian translation</a>, <a class="reference external" href="https://aria2.github.io/manual/pt/html/">Portuguese
|
||||
translation</a>) to learn
|
||||
how to use aria2.</p>
|
||||
</div>
|
||||
<div class="section" id="features">
|
||||
<h1>Features</h1>
|
||||
<p>Here is a list of features:</p>
|
||||
<ul class="simple">
|
||||
<li>Command-line interface</li>
|
||||
<li>Download files through HTTP(S)/FTP/SFTP/BitTorrent</li>
|
||||
<li>Segmented downloading</li>
|
||||
<li>Metalink version 4 (RFC 5854) support(HTTP/FTP/SFTP/BitTorrent)</li>
|
||||
<li>Metalink version 3.0 support(HTTP/FTP/SFTP/BitTorrent)</li>
|
||||
<li>Metalink/HTTP (RFC 6249) support</li>
|
||||
<li>HTTP/1.1 implementation</li>
|
||||
<li>HTTP Proxy support</li>
|
||||
<li>HTTP BASIC authentication support</li>
|
||||
<li>HTTP Proxy authentication support</li>
|
||||
<li>Well-known environment variables for proxy: <tt class="docutils literal">http_proxy</tt>,
|
||||
<tt class="docutils literal">https_proxy</tt>, <tt class="docutils literal">ftp_proxy</tt>, <tt class="docutils literal">all_proxy</tt> and <tt class="docutils literal">no_proxy</tt></li>
|
||||
<li>HTTP gzip, deflate content encoding support</li>
|
||||
<li>Verify peer using given trusted CA certificate in HTTPS</li>
|
||||
<li>Client certificate authentication in HTTPS</li>
|
||||
<li>Chunked transfer encoding support</li>
|
||||
<li>Load Cookies from the file using the Firefox3 format, Chromium/Google Chrome
|
||||
and the Mozilla/Firefox
|
||||
(1.x/2.x)/Netscape format.</li>
|
||||
<li>Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format.</li>
|
||||
<li>Custom HTTP Header support</li>
|
||||
<li>Persistent Connections support</li>
|
||||
<li>FTP/SFTP through HTTP Proxy</li>
|
||||
<li>Download/Upload speed throttling</li>
|
||||
<li>BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE,
|
||||
Multi-Tracker, UDP tracker</li>
|
||||
<li>BitTorrent <a class="reference external" href="http://getright.com/seedtorrent.html">WEB-Seeding</a>.
|
||||
aria2 requests chunk more than piece size to reduce the request
|
||||
overhead. It also supports pipelined requests with piece size.</li>
|
||||
<li>BitTorrent Local Peer Discovery</li>
|
||||
<li>Rename/change the directory structure of BitTorrent downloads
|
||||
completely</li>
|
||||
<li>JSON-RPC (over HTTP and WebSocket)/XML-RPC interface</li>
|
||||
<li>Run as a daemon process</li>
|
||||
<li>Selective download in multi-file torrent/Metalink</li>
|
||||
<li>Chunk checksum validation in Metalink</li>
|
||||
<li>Can disable segmented downloading in Metalink</li>
|
||||
<li>Netrc support</li>
|
||||
<li>Configuration file support</li>
|
||||
<li>Download URIs found in a text file or stdin and the destination
|
||||
directory and output file name can be specified optionally</li>
|
||||
<li>Parameterized URI support</li>
|
||||
<li>IPv6 support with Happy Eyeballs</li>
|
||||
<li>Disk cache to reduce disk activity</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="versioning-and-release-schedule">
|
||||
<h1>Versioning and release schedule</h1>
|
||||
<p>We use 3 numbers for the aria2 version: MAJOR.MINOR.PATCH. We will ship
|
||||
MINOR updates on the 15th of every month. We may skip a release if we have
|
||||
had no changes since the last release. The feature and documentation
|
||||
freeze happens 10 days before the release day (the 5th day of the month)
|
||||
for translation teams. We will raise an issue about the upcoming
|
||||
release around that day.</p>
|
||||
<p>We may release PATCH releases between regular releases if we have
|
||||
security issues.</p>
|
||||
<p>The MAJOR version will stay at 1 for the time being.</p>
|
||||
</div>
|
||||
<div class="section" id="how-to-get-source-code">
|
||||
<h1>How to get source code</h1>
|
||||
<p>We maintain the source code at Github:
|
||||
<a class="reference external" href="https://github.com/aria2/aria2">https://github.com/aria2/aria2</a></p>
|
||||
<p>To get the latest source code, run the following command:</p>
|
||||
<pre class="literal-block">
|
||||
$ git clone https://github.com/aria2/aria2.git
|
||||
</pre>
|
||||
<p>This will create an aria2 directory in your current directory and source
|
||||
files are stored there.</p>
|
||||
</div>
|
||||
<div class="section" id="dependency">
|
||||
<h1>Dependency</h1>
|
||||
<table border="1" class="docutils">
|
||||
<colgroup>
|
||||
<col width="35%" />
|
||||
<col width="65%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr><th class="head">features</th>
|
||||
<th class="head">dependency</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr><td>HTTPS</td>
|
||||
<td>OSX or GnuTLS or OpenSSL or Windows</td>
|
||||
</tr>
|
||||
<tr><td>SFTP</td>
|
||||
<td>libssh2</td>
|
||||
</tr>
|
||||
<tr><td>BitTorrent</td>
|
||||
<td>None. Optional: libnettle+libgmp or libgcrypt
|
||||
or OpenSSL (see note)</td>
|
||||
</tr>
|
||||
<tr><td>Metalink</td>
|
||||
<td>libxml2 or Expat.</td>
|
||||
</tr>
|
||||
<tr><td>Checksum</td>
|
||||
<td>None. Optional: OSX or libnettle or libgcrypt
|
||||
or OpenSSL or Windows (see note)</td>
|
||||
</tr>
|
||||
<tr><td>gzip, deflate in HTTP</td>
|
||||
<td>zlib</td>
|
||||
</tr>
|
||||
<tr><td>Async DNS</td>
|
||||
<td>C-Ares</td>
|
||||
</tr>
|
||||
<tr><td>Firefox3/Chromium cookie</td>
|
||||
<td>libsqlite3</td>
|
||||
</tr>
|
||||
<tr><td>XML-RPC</td>
|
||||
<td>libxml2 or Expat.</td>
|
||||
</tr>
|
||||
<tr><td>JSON-RPC over WebSocket</td>
|
||||
<td>libnettle or libgcrypt or OpenSSL</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="admonition note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p class="last">libxml2 has precedence over Expat if both libraries are installed.
|
||||
If you prefer Expat, run configure with <tt class="docutils literal"><span class="pre">--without-libxml2</span></tt>.</p>
|
||||
</div>
|
||||
<div class="admonition note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p>On Apple OSX, OS-level SSL/TLS support will be preferred. Hence
|
||||
neither GnuTLS nor OpenSSL is required on that platform. If you'd
|
||||
like to disable this behavior, run configure with
|
||||
<tt class="docutils literal"><span class="pre">--without-appletls</span></tt>.</p>
|
||||
<p>GnuTLS has precedence over OpenSSL if both libraries are installed.
|
||||
If you prefer OpenSSL, run configure with <tt class="docutils literal"><span class="pre">--without-gnutls</span></tt>
|
||||
<tt class="docutils literal"><span class="pre">--with-openssl</span></tt>.</p>
|
||||
<p class="last">On Windows, there is SSL implementation available that is based on
|
||||
the native Windows SSL capabilities (Schannel) and it will be
|
||||
preferred. Hence neither GnuTLS nor OpenSSL is required on that
|
||||
platform. If you'd like to disable this behavior, run configure
|
||||
with <tt class="docutils literal"><span class="pre">--without-wintls</span></tt>.</p>
|
||||
</div>
|
||||
<div class="admonition note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p>On Apple OSX, the OS-level checksum support will be preferred,
|
||||
unless aria2 is configured with <tt class="docutils literal"><span class="pre">--without-appletls</span></tt>.</p>
|
||||
<p>libnettle has precedence over libgcrypt if both libraries are
|
||||
installed. If you prefer libgcrypt, run configure with
|
||||
<tt class="docutils literal"><span class="pre">--without-libnettle</span> <span class="pre">--with-libgcrypt</span></tt>. If OpenSSL is selected over
|
||||
GnuTLS, neither libnettle nor libgcrypt will be used.</p>
|
||||
<p>If none of the optional dependencies are installed, an internal
|
||||
implementation that only supports md5 and sha1 will be used.</p>
|
||||
<p class="last">On Windows, there is SSL implementation available that is based on
|
||||
the native Windows capabilities and it will be preferred, unless
|
||||
aria2 is configured with <tt class="docutils literal"><span class="pre">--without-wintls</span></tt>.</p>
|
||||
</div>
|
||||
<p>A user can have one of the following configurations for SSL and crypto
|
||||
libraries:</p>
|
||||
<ul class="simple">
|
||||
<li>OpenSSL</li>
|
||||
<li>GnuTLS + libgcrypt</li>
|
||||
<li>GnuTLS + libnettle</li>
|
||||
<li>Apple TLS (OSX only)</li>
|
||||
<li>Windows TLS (Windows only)</li>
|
||||
</ul>
|
||||
<p>You can disable BitTorrent and Metalink support by providing
|
||||
<tt class="docutils literal"><span class="pre">--disable-bittorrent</span></tt> and <tt class="docutils literal"><span class="pre">--disable-metalink</span></tt> to the configure
|
||||
script respectively.</p>
|
||||
<p>To enable async DNS support, you need c-ares.</p>
|
||||
<ul class="simple">
|
||||
<li>c-ares: <a class="reference external" href="http://c-ares.haxx.se/">http://c-ares.haxx.se/</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="how-to-build">
|
||||
<h1>How to build</h1>
|
||||
<p>aria2 is primarily written in C++. Initially, it was written based on
|
||||
C++98/C++03 standard features. We are now migrating aria2 to the C++11
|
||||
standard. The current source code requires a C++11 aware compiler. For
|
||||
well-known compilers, such as g++ and clang, the <tt class="docutils literal"><span class="pre">-std=c++11</span></tt> or
|
||||
<tt class="docutils literal"><span class="pre">-std=c++0x</span></tt> flag must be supported.</p>
|
||||
<p>To build aria2 from the source package, you need the following
|
||||
development packages (package name may vary depending on the
|
||||
distribution you use):</p>
|
||||
<ul class="simple">
|
||||
<li>libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)</li>
|
||||
<li>nettle-dev (Required for BitTorrent, Checksum support)</li>
|
||||
<li>libgmp-dev (Required for BitTorrent)</li>
|
||||
<li>libssh2-1-dev (Required for SFTP support)</li>
|
||||
<li>libc-ares-dev (Required for async DNS support)</li>
|
||||
<li>libxml2-dev (Required for Metalink support)</li>
|
||||
<li>zlib1g-dev (Required for gzip, deflate decoding support in HTTP)</li>
|
||||
<li>libsqlite3-dev (Required for Firefox3/Chromium cookie support)</li>
|
||||
<li>pkg-config (Required to detect installed libraries)</li>
|
||||
</ul>
|
||||
<p>You can use libgcrypt-dev instead of nettle-dev and libgmp-dev:</p>
|
||||
<ul class="simple">
|
||||
<li>libgpg-error-dev (Required for BitTorrent, Checksum support)</li>
|
||||
<li>libgcrypt-dev (Required for BitTorrent, Checksum support)</li>
|
||||
</ul>
|
||||
<p>You can use libssl-dev instead of
|
||||
libgnutls-dev, nettle-dev, libgmp-dev, libgpg-error-dev and libgcrypt-dev:</p>
|
||||
<ul class="simple">
|
||||
<li>libssl-dev (Required for HTTPS, BitTorrent, Checksum support)</li>
|
||||
</ul>
|
||||
<p>You can use libexpat1-dev instead of libxml2-dev:</p>
|
||||
<ul class="simple">
|
||||
<li>libexpat1-dev (Required for Metalink support)</li>
|
||||
</ul>
|
||||
<p>On Fedora you need the following packages: gcc, gcc-c++, kernel-devel,
|
||||
libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit</p>
|
||||
<p>If you downloaded source code from a git repository, you have to install
|
||||
the following packages to get autoconf macros:</p>
|
||||
<ul class="simple">
|
||||
<li>libxml2-dev</li>
|
||||
<li>libcppunit-dev</li>
|
||||
<li>autoconf</li>
|
||||
<li>automake</li>
|
||||
<li>autotools-dev</li>
|
||||
<li>autopoint</li>
|
||||
<li>libtool</li>
|
||||
</ul>
|
||||
<p>And run the following command to generate configure script and other files
|
||||
necessary to build the program:</p>
|
||||
<pre class="literal-block">
|
||||
$ autoreconf -i
|
||||
</pre>
|
||||
<p>Also, you need <a class="reference external" href="http://sphinx-doc.org/">Sphinx</a> to build the man page.</p>
|
||||
<p>If you are building aria2 for Mac OS X, take a look at
|
||||
the makerelease-osx.mk GNU Make makefile.</p>
|
||||
<p>The quickest way to build aria2 is first to run configure script:</p>
|
||||
<pre class="literal-block">
|
||||
$ ./configure
|
||||
</pre>
|
||||
<p>To build statically linked aria2, use <tt class="docutils literal">ARIA2_STATIC=yes</tt>
|
||||
command-line option:</p>
|
||||
<pre class="literal-block">
|
||||
$ ./configure ARIA2_STATIC=yes
|
||||
</pre>
|
||||
<p>After configuration is done, run <tt class="docutils literal">make</tt> to compile the program:</p>
|
||||
<pre class="literal-block">
|
||||
$ make
|
||||
</pre>
|
||||
<p>See <a class="reference internal" href="#cross-compiling-windows-binary">Cross-compiling Windows binary</a> to create a Windows binary.
|
||||
See <a class="reference internal" href="#cross-compiling-android-binary">Cross-compiling Android binary</a> to create an Android binary.</p>
|
||||
<p>The configure script checks available libraries and enables as many
|
||||
features as possible except for experimental features not enabled by
|
||||
default.</p>
|
||||
<p>Since 1.1.0, aria2 checks the certificate of HTTPS servers by default.
|
||||
If you build with OpenSSL or the recent version of GnuTLS which has
|
||||
<tt class="docutils literal">gnutls_certificate_set_x509_system_trust()</tt> function and the
|
||||
library is properly configured to locate the system-wide CA
|
||||
certificates store, aria2 will automatically load those certificates
|
||||
at the startup. If it is not the case, I recommend supplying the path
|
||||
to the CA bundle file. For example, in Debian the path to CA bundle
|
||||
file is '/etc/ssl/certs/ca-certificates.crt' (in ca-certificates
|
||||
package). This may vary depending on your distribution. You can give
|
||||
it to configure script using <tt class="docutils literal"><span class="pre">--with-ca-bundle</span> option</tt>:</p>
|
||||
<pre class="literal-block">
|
||||
$ ./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt'
|
||||
$ make
|
||||
</pre>
|
||||
<p>Without <tt class="docutils literal"><span class="pre">--with-ca-bundle</span></tt> option, you will encounter the error when
|
||||
accessing HTTPS servers because the certificate cannot be verified
|
||||
without the CA bundle. In such a case, you can specify the CA bundle file
|
||||
using aria2's <tt class="docutils literal"><span class="pre">--ca-certificate</span></tt> option. If you don't have the CA bundle
|
||||
file installed, then the last resort is to disable the certificate
|
||||
validation using <tt class="docutils literal"><span class="pre">--check-certificate=false</span></tt>.</p>
|
||||
<p>Using the native OSX (AppleTLS) and/or Windows (WinTLS) implementation
|
||||
will automatically use the system certificate store, so
|
||||
<tt class="docutils literal"><span class="pre">--with-ca-bundle</span></tt> is not necessary and will be ignored when using
|
||||
these implementations.</p>
|
||||
<p>By default, the bash_completion file named <tt class="docutils literal">aria2c</tt> is installed to
|
||||
the directory <tt class="docutils literal">$prefix/share/doc/aria2/bash_completion</tt>. To change
|
||||
the install directory of the file, use <tt class="docutils literal"><span class="pre">--with-bashcompletiondir</span></tt>
|
||||
option.</p>
|
||||
<p>After a <tt class="docutils literal">make</tt>, the executable is located at <tt class="docutils literal">src/aria2c</tt>.</p>
|
||||
<p>aria2 uses CppUnit for automated unit testing. To run the unit test:</p>
|
||||
<pre class="literal-block">
|
||||
$ make check
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section" id="cross-compiling-windows-binary">
|
||||
<h1>Cross-compiling Windows binary</h1>
|
||||
<p>In this section, we describe how to build a Windows binary using a
|
||||
mingw-w64 (<a class="reference external" href="http://mingw-w64.org/doku.php">http://mingw-w64.org/doku.php</a>) cross-compiler on Debian
|
||||
Linux. The MinGW (<a class="reference external" href="http://www.mingw.org/">http://www.mingw.org/</a>) may not be able to build
|
||||
aria2.</p>
|
||||
<p>The easiest way to build Windows binary is using Dockerfile.mingw. See
|
||||
Dockerfile.mingw how to build a binary. If you cannot use Dockerfile,
|
||||
then continue to read the following paragraphs.</p>
|
||||
<p>Basically, after compiling and installing depended libraries, you can
|
||||
do cross-compile just passing appropriate <tt class="docutils literal"><span class="pre">--host</span></tt> option and
|
||||
specifying <tt class="docutils literal">CPPFLAGS</tt>, <tt class="docutils literal">LDFLAGS</tt>, and <tt class="docutils literal">PKG_CONFIG_LIBDIR</tt>
|
||||
variables to configure. For convenience and to lower our own
|
||||
development cost, we provide an easier way to configure the build
|
||||
settings.</p>
|
||||
<p><tt class="docutils literal"><span class="pre">mingw-config</span></tt> script is a configure script wrapper for mingw-w64.
|
||||
We use it to create official Windows build. This script assumes
|
||||
the following libraries have been built for cross-compile:</p>
|
||||
<ul class="simple">
|
||||
<li>c-ares</li>
|
||||
<li>expat</li>
|
||||
<li>sqlite3</li>
|
||||
<li>zlib</li>
|
||||
<li>libssh2</li>
|
||||
<li>cppunit</li>
|
||||
</ul>
|
||||
<p>Some environment variables can be adjusted to change build settings:</p>
|
||||
<dl class="docutils">
|
||||
<dt><tt class="docutils literal">HOST</tt></dt>
|
||||
<dd>cross-compile to build programs to run on <tt class="docutils literal">HOST</tt>. It defaults to
|
||||
<tt class="docutils literal"><span class="pre">i686-w64-mingw32</span></tt>. To build a 64bit binary, specify
|
||||
<tt class="docutils literal"><span class="pre">x86_64-w64-mingw32</span></tt>.</dd>
|
||||
<dt><tt class="docutils literal">PREFIX</tt></dt>
|
||||
<dd>Prefix to the directory where dependent libraries are installed. It
|
||||
defaults to <tt class="docutils literal"><span class="pre">/usr/local/$HOST</span></tt>. <tt class="docutils literal"><span class="pre">-I$PREFIX/include</span></tt> will be
|
||||
added to <tt class="docutils literal">CPPFLAGS</tt>. <tt class="docutils literal"><span class="pre">-L$PREFIX/lib</span></tt> will be added to
|
||||
<tt class="docutils literal">LDFLAGS</tt>. <tt class="docutils literal">$PREFIX/lib/pkgconfig</tt> will be set to
|
||||
<tt class="docutils literal">PKG_CONFIG_LIBDIR</tt>.</dd>
|
||||
</dl>
|
||||
<p>For example, to build a 64bit binary do this:</p>
|
||||
<pre class="literal-block">
|
||||
$ HOST=x86_64-w64-mingw32 ./mingw-config
|
||||
</pre>
|
||||
<p>If you want libaria2 dll with <tt class="docutils literal"><span class="pre">--enable-libaria2</span></tt>, then don't use
|
||||
<tt class="docutils literal">ARIA2_STATIC=yes</tt> and prepare the DLL version of external
|
||||
libraries.</p>
|
||||
</div>
|
||||
<div class="section" id="cross-compiling-android-binary">
|
||||
<h1>Cross-compiling Android binary</h1>
|
||||
<p>In this section, we describe how to build Android binary using Android
|
||||
NDK cross-compiler on Debian Linux.</p>
|
||||
<p>At the time of this writing, Android NDK r21e should compile aria2
|
||||
without errors.</p>
|
||||
<p><tt class="docutils literal"><span class="pre">android-config</span></tt> script is a configure script wrapper for Android
|
||||
build. We use it to create an official Android build. This script
|
||||
assumes the following libraries have been built for cross-compile:</p>
|
||||
<ul class="simple">
|
||||
<li>c-ares</li>
|
||||
<li>openssl</li>
|
||||
<li>expat</li>
|
||||
<li>zlib</li>
|
||||
<li>libssh2</li>
|
||||
</ul>
|
||||
<p>When building the above libraries, make sure that disable shared
|
||||
library and enable only static library. We are going to link those
|
||||
libraries statically.</p>
|
||||
<p><tt class="docutils literal"><span class="pre">android-config</span></tt> assumes that <tt class="docutils literal">$ANDROID_HOME</tt> and <tt class="docutils literal">$NDK</tt>
|
||||
environment variables are defined.</p>
|
||||
<p>We currently use Android NDK r21e. <tt class="docutils literal">$NDK</tt> should point to the
|
||||
directory to Android NDK. The build tools will be found under
|
||||
<tt class="docutils literal"><span class="pre">$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/</span></tt>.</p>
|
||||
<p>All the dependent libraries must be installed under
|
||||
<tt class="docutils literal">$ANDROID_HOME/usr/local</tt>.</p>
|
||||
<p>After <tt class="docutils literal"><span class="pre">android-config</span></tt>, run <tt class="docutils literal">make</tt> to compile sources.</p>
|
||||
</div>
|
||||
<div class="section" id="building-documentation">
|
||||
<h1>Building documentation</h1>
|
||||
<p><a class="reference external" href="http://sphinx-doc.org/">Sphinx</a> is used to building the
|
||||
documentation. aria2 man pages will be build when you run <tt class="docutils literal">make</tt> if
|
||||
they are not up-to-date. You can also build an HTML version of the aria2
|
||||
man page by <tt class="docutils literal">make html</tt>. The HTML version manual is also available
|
||||
<a class="reference external" href="https://aria2.github.io/manual/en/html/">online</a> (<a class="reference external" href="https://aria2.github.io/manual/ru/html/">Russian
|
||||
translation</a>, <a class="reference external" href="https://aria2.github.io/manual/pt/html/">Portuguese
|
||||
translation</a>).</p>
|
||||
</div>
|
||||
<div class="section" id="bittorrent">
|
||||
<h1>BitTorrent</h1>
|
||||
<div class="section" id="about-file-names">
|
||||
<h2>About file names</h2>
|
||||
<p>The file name of the downloaded file is determined as follows:</p>
|
||||
<dl class="docutils">
|
||||
<dt>single-file mode</dt>
|
||||
<dd>If "name" key is present in .torrent file, the file name is the value
|
||||
of "name" key. Otherwise, the file name is the base name of .torrent
|
||||
file appended by ".file". For example, .torrent file is
|
||||
"test.torrent", then file name is "test.torrent.file". The
|
||||
directory to store the downloaded file can be specified by -d
|
||||
option.</dd>
|
||||
<dt>multi-file mode</dt>
|
||||
<dd>The complete directory/file structure mentioned in .torrent file
|
||||
is created. The directory to store the top directory of
|
||||
downloaded files can be specified by -d option.</dd>
|
||||
</dl>
|
||||
<p>Before download starts, a complete directory structure is created if
|
||||
needed. By default, aria2 opens at most 100 files mentioned in
|
||||
.torrent file, and directly writes to and reads from these files.
|
||||
The number of files to open simultaneously can be controlled by
|
||||
<tt class="docutils literal"><span class="pre">--bt-max-open-files</span></tt> option.</p>
|
||||
</div>
|
||||
<div class="section" id="dht">
|
||||
<h2>DHT</h2>
|
||||
<p>aria2 supports mainline compatible DHT. By default, the routing table
|
||||
for IPv4 DHT is saved to <tt class="docutils literal">$XDG_CACHE_HOME/aria2/dht.dat</tt> and the
|
||||
routing table for IPv6 DHT is saved to
|
||||
<tt class="docutils literal">$XDG_CACHE_HOME/aria2/dht6.dat</tt> unless files exist at
|
||||
<tt class="docutils literal"><span class="pre">$HOME/.aria2/dht.dat</span></tt> or <tt class="docutils literal"><span class="pre">$HOME/.aria2/dht6.dat</span></tt>. aria2 uses the
|
||||
same port number to listen on for both IPv4 and IPv6 DHT.</p>
|
||||
</div>
|
||||
<div class="section" id="udp-tracker">
|
||||
<h2>UDP tracker</h2>
|
||||
<p>UDP tracker support is enabled when IPv4 DHT is enabled. The port
|
||||
number of the UDP tracker is shared with DHT. Use <tt class="docutils literal"><span class="pre">--dht-listen-port</span></tt>
|
||||
option to change the port number.</p>
|
||||
</div>
|
||||
<div class="section" id="other-things-should-be-noted">
|
||||
<h2>Other things should be noted</h2>
|
||||
<ul class="simple">
|
||||
<li><tt class="docutils literal"><span class="pre">-o</span></tt> option is used to change the file name of .torrent file itself,
|
||||
not a file name of a file in .torrent file. For this purpose, use
|
||||
<tt class="docutils literal"><span class="pre">--index-out</span></tt> option instead.</li>
|
||||
<li>The port numbers that aria2 uses by default are 6881-6999 for TCP
|
||||
and UDP.</li>
|
||||
<li>aria2 doesn't configure port-forwarding automatically. Please
|
||||
configure your router or firewall manually.</li>
|
||||
<li>The maximum number of peers is 55. This limit may be exceeded when
|
||||
the download rate is low. This download rate can be adjusted using
|
||||
<tt class="docutils literal"><span class="pre">--bt-request-peer-speed-limit</span></tt> option.</li>
|
||||
<li>As of release 0.10.0, aria2 stops sending request messages after
|
||||
selective download completes.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="metalink">
|
||||
<h1>Metalink</h1>
|
||||
<p>The current implementation supports HTTP(S)/FTP/SFTP/BitTorrent. The
|
||||
other P2P protocols are ignored. Both Metalink4 (RFC 5854) and
|
||||
Metalink version 3.0 documents are supported.</p>
|
||||
<p>For checksum verification, md5, sha-1, sha-224, sha-256, sha-384, and
|
||||
sha-512 are supported. If multiple hash algorithms are provided, aria2
|
||||
uses a stronger one. If whole file checksum verification fails, aria2
|
||||
doesn't retry the download and just exits with a non-zero return code.</p>
|
||||
<p>The supported user preferences are version, language, location,
|
||||
protocol, and os.</p>
|
||||
<p>If chunk checksums are provided in the Metalink file, aria2 automatically
|
||||
validates chunks of data during download. This behavior can be turned
|
||||
off by a command-line option.</p>
|
||||
<p>If a signature is included in a Metalink file, aria2 saves it as a file
|
||||
after the completion of the download. The file name is download
|
||||
file name + ".sig". If the same file already exists, the signature file is
|
||||
not saved.</p>
|
||||
<p>In Metalink4, a multi-file torrent could appear in metalink:metaurl
|
||||
element. Since aria2 cannot download 2 same torrents at the same
|
||||
time, aria2 groups files in metalink:file element which has the same
|
||||
BitTorrent metaurl, and downloads them from a single BitTorrent swarm.
|
||||
This is a basically multi-file torrent download with file selection, so
|
||||
the adjacent files which are not in Metalink document but share the same
|
||||
piece with the selected file are also created.</p>
|
||||
<p>If relative URI is specified in metalink:url or metalink:metaurl
|
||||
element, aria2 uses the URI of Metalink file as base URI to resolve
|
||||
the relative URI. If relative URI is found in the Metalink file which is
|
||||
read from the local disk, aria2 uses the value of <tt class="docutils literal"><span class="pre">--metalink-base-uri</span></tt>
|
||||
option as base URI. If this option is not specified, the relative URI
|
||||
will be ignored.</p>
|
||||
</div>
|
||||
<div class="section" id="metalink-http">
|
||||
<h1>Metalink/HTTP</h1>
|
||||
<p>The current implementation only uses rel=duplicate links. aria2
|
||||
understands Digest header fields and check whether it matches the
|
||||
digest value from other sources. If it differs, drop the connection.
|
||||
aria2 also uses this digest value to perform checksum verification
|
||||
after the download is finished. aria2 recognizes geo value. To tell aria2
|
||||
which location you prefer, you can use <tt class="docutils literal"><span class="pre">--metalink-location</span></tt> option.</p>
|
||||
</div>
|
||||
<div class="section" id="netrc">
|
||||
<h1>netrc</h1>
|
||||
<p>netrc support is enabled by default for HTTP(S)/FTP/SFTP. To disable
|
||||
netrc support, specify -n command-line option. Your .netrc file
|
||||
should have correct permissions(600).</p>
|
||||
</div>
|
||||
<div class="section" id="websocket">
|
||||
<h1>WebSocket</h1>
|
||||
<p>The WebSocket server embedded in aria2 implements the specification
|
||||
defined in RFC 6455. The supported protocol version is 13.</p>
|
||||
</div>
|
||||
<div class="section" id="libaria2">
|
||||
<h1>libaria2</h1>
|
||||
<p>The libaria2 is a C++ library that offers aria2 functionality to the
|
||||
client code. Currently, libaria2 is not built by default. To enable
|
||||
libaria2, use <tt class="docutils literal"><span class="pre">--enable-libaria2</span></tt> configure option. By default,
|
||||
only the shared library is built. To build a static library, use
|
||||
<tt class="docutils literal"><span class="pre">--enable-static</span></tt> configure option as well. See libaria2
|
||||
documentation to know how to use API.</p>
|
||||
</div>
|
||||
<div class="section" id="references">
|
||||
<h1>References</h1>
|
||||
<ul class="simple">
|
||||
<li><a class="reference external" href="https://aria2.github.io/manual/en/html/">aria2 Online Manual</a></li>
|
||||
<li><a class="reference external" href="https://aria2.github.io/">https://aria2.github.io/</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc959">RFC 959 FILE TRANSFER PROTOCOL (FTP)</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc1738">RFC 1738 Uniform Resource Locators (URL)</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc2428">RFC 2428 FTP Extensions for IPv6 and NATs</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc2616">RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc3659">RFC 3659 Extensions to FTP</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc3986">RFC 3986 Uniform Resource Identifier (URI): Generic Syntax</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc4038">RFC 4038 Application Aspects of IPv6 Transition</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc5854">RFC 5854 The Metalink Download Description Format</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc6249">RFC 6249 Metalink/HTTP: Mirrors and Hashes</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc6265">RFC 6265 HTTP State Management Mechanism</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc6266">RFC 6266 Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc6455">RFC 6455 The WebSocket Protocol</a></li>
|
||||
<li><a class="reference external" href="http://tools.ietf.org/html/rfc6555">RFC 6555 Happy Eyeballs: Success with Dual-Stack Hosts</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0003.html">The BitTorrent Protocol Specification</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0005.html">BitTorrent: DHT Protocol</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0006.html">BitTorrent: Fast Extension</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0007.html">BitTorrent: IPv6 Tracker Extension</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0009.html">BitTorrent: Extension for Peers to Send Metadata Files</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0010.html">BitTorrent: Extension Protocol</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0012.html">BitTorrent: Multitracker Metadata Extension</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0015.html">BitTorrent: UDP Tracker Protocol for BitTorrent</a>
|
||||
and <a class="reference external" href="http://www.rasterbar.com/products/libtorrent/udp_tracker_protocol.html">BitTorrent udp-tracker protocol specification</a>.</li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0019.html">BitTorrent: WebSeed - HTTP/FTP Seeding (GetRight style)</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0027.html">BitTorrent: Private Torrents</a></li>
|
||||
<li><a class="reference external" href="http://www.bittorrent.org/beps/bep_0032.html">BitTorrent: BitTorrent DHT Extensions for IPv6</a></li>
|
||||
<li><a class="reference external" href="http://wiki.vuze.com/w/Message_Stream_Encryption">BitTorrent: Message Stream Encryption</a></li>
|
||||
<li><a class="reference external" href="https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf">Kademlia: A Peer-to-peer Information System Based on the XOR Metric</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
52
aria2/README.mingw
Normal file
52
aria2/README.mingw
Normal file
@ -0,0 +1,52 @@
|
||||
aria2 Windows build
|
||||
===================
|
||||
|
||||
aria2 Windows build is provided in 2 flavors: 32bit version and 64bit
|
||||
version. The executable was compiled using mingw-w64 cross compiler on
|
||||
Ubuntu Linux.
|
||||
|
||||
The executable is statically linked, so no extra DLLs are
|
||||
necessary. The linked libraries are:
|
||||
|
||||
* gmp 6.3.0
|
||||
* expat 2.5.0
|
||||
* sqlite 3.43.1
|
||||
* zlib 1.3
|
||||
* c-ares 1.19.1
|
||||
* libssh2 1.11.0
|
||||
|
||||
This build has the following difference from the original release:
|
||||
|
||||
* 32bit version only: ``--disable-ipv6`` is enabled by default. (In
|
||||
other words, IPv6 support is disabled by default).
|
||||
|
||||
Known Issues
|
||||
------------
|
||||
|
||||
* TLSv1.3 does not work.
|
||||
|
||||
* --file-allocation=falloc uses SetFileValidData function to allocate
|
||||
disk space without filling zero. But it has security
|
||||
implications. Refer to
|
||||
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365544%28v=vs.85%29.aspx
|
||||
for more details.
|
||||
|
||||
* When Ctrl-C is pressed, aria2 shows "Shutdown sequence
|
||||
commencing... Press Ctrl-C again for emergency shutdown." But
|
||||
mingw32 build cannot handle second Ctrl-C properly. The second
|
||||
Ctrl-C just kills aria2 instantly without proper shutdown sequence
|
||||
and you may lose data. So don't press Ctrl-C twice.
|
||||
|
||||
* --daemon option doesn't work.
|
||||
|
||||
* 32bit version only: When ``--disable-ipv6=false`` is given,
|
||||
BitTorrent DHT may not work properly.
|
||||
|
||||
* 32bit version only: Most of the IPv6 functionality does not work
|
||||
even if ``--disable-ipv6=false`` is given.
|
||||
|
||||
References
|
||||
----------
|
||||
|
||||
* http://smithii.com/aria2
|
||||
* http://kemovitra.blogspot.com/2009/12/download-aria2-163.html
|
BIN
aria2/aria2c.exe
Normal file
BIN
aria2/aria2c.exe
Normal file
Binary file not shown.
@ -3,6 +3,7 @@ productName: Hydra
|
||||
directories:
|
||||
buildResources: build
|
||||
extraResources:
|
||||
- aria2
|
||||
- hydra-download-manager
|
||||
- seeds
|
||||
- from: node_modules/ps-list/vendor/fastlist-0.3.0-x64.exe
|
||||
|
58
electron.vite.config.1719928703430.mjs
Normal file
58
electron.vite.config.1719928703430.mjs
Normal file
@ -0,0 +1,58 @@
|
||||
// electron.vite.config.ts
|
||||
import { resolve } from "path";
|
||||
import {
|
||||
defineConfig,
|
||||
loadEnv,
|
||||
swcPlugin,
|
||||
externalizeDepsPlugin
|
||||
} from "electron-vite";
|
||||
import react from "@vitejs/plugin-react";
|
||||
import { sentryVitePlugin } from "@sentry/vite-plugin";
|
||||
import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
||||
import svgr from "vite-plugin-svgr";
|
||||
var sentryPlugin = sentryVitePlugin({
|
||||
authToken: process.env.SENTRY_AUTH_TOKEN,
|
||||
org: "hydra-launcher",
|
||||
project: "hydra-launcher"
|
||||
});
|
||||
var electron_vite_config_default = defineConfig(({ mode }) => {
|
||||
loadEnv(mode);
|
||||
return {
|
||||
main: {
|
||||
build: {
|
||||
sourcemap: true,
|
||||
rollupOptions: {
|
||||
external: ["better-sqlite3"]
|
||||
}
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
"@main": resolve("src/main"),
|
||||
"@locales": resolve("src/locales"),
|
||||
"@resources": resolve("resources"),
|
||||
"@shared": resolve("src/shared")
|
||||
}
|
||||
},
|
||||
plugins: [externalizeDepsPlugin(), swcPlugin(), sentryPlugin]
|
||||
},
|
||||
preload: {
|
||||
plugins: [externalizeDepsPlugin()]
|
||||
},
|
||||
renderer: {
|
||||
build: {
|
||||
sourcemap: true
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
"@renderer": resolve("src/renderer/src"),
|
||||
"@locales": resolve("src/locales"),
|
||||
"@shared": resolve("src/shared")
|
||||
}
|
||||
},
|
||||
plugins: [svgr(), react(), vanillaExtractPlugin(), sentryPlugin]
|
||||
}
|
||||
};
|
||||
});
|
||||
export {
|
||||
electron_vite_config_default as default
|
||||
};
|
@ -23,7 +23,7 @@
|
||||
"start": "electron-vite preview",
|
||||
"dev": "electron-vite dev",
|
||||
"build": "npm run typecheck && electron-vite build",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"postinstall": "electron-builder install-app-deps && node ./postinstall.cjs",
|
||||
"build:unpack": "npm run build && electron-builder --dir",
|
||||
"build:win": "electron-vite build && electron-builder --win",
|
||||
"build:mac": "electron-vite build && electron-builder --mac",
|
||||
@ -41,6 +41,7 @@
|
||||
"@sentry/electron": "^5.1.0",
|
||||
"@vanilla-extract/css": "^1.14.2",
|
||||
"@vanilla-extract/recipes": "^0.5.2",
|
||||
"aria2": "^4.1.2",
|
||||
"auto-launch": "^5.0.6",
|
||||
"axios": "^1.6.8",
|
||||
"better-sqlite3": "^9.5.0",
|
||||
|
50
postinstall.cjs
Normal file
50
postinstall.cjs
Normal file
@ -0,0 +1,50 @@
|
||||
const { default: axios } = require("axios");
|
||||
const util = require("node:util");
|
||||
const fs = require("node:fs");
|
||||
|
||||
const exec = util.promisify(require("node:child_process").exec);
|
||||
|
||||
const downloadAria2 = async () => {
|
||||
if (fs.existsSync("aria2")) {
|
||||
console.log("Aria2 already exists, skipping download...");
|
||||
return;
|
||||
}
|
||||
|
||||
const file =
|
||||
process.platform === "win32"
|
||||
? "aria2-1.37.0-win-64bit-build1.zip"
|
||||
: "aria2-1.37.0-1-x86_64.pkg.tar.zst";
|
||||
|
||||
const downloadUrl =
|
||||
process.platform === "win32"
|
||||
? `https://github.com/aria2/aria2/releases/download/release-1.37.0/${file}`
|
||||
: "https://archlinux.org/packages/extra/x86_64/aria2/download/";
|
||||
|
||||
console.log(`Downloading ${file}...`);
|
||||
|
||||
const response = await axios.get(downloadUrl, { responseType: "stream" });
|
||||
|
||||
const stream = response.data.pipe(fs.createWriteStream(file));
|
||||
|
||||
stream.on("finish", async () => {
|
||||
console.log(`Downloaded ${file}, extracting...`);
|
||||
|
||||
if (process.platform === "win32") {
|
||||
await exec(`npx extract-zip ${file}`);
|
||||
console.log("Extracted. Renaming folder...");
|
||||
|
||||
fs.renameSync(file.replace(".zip", ""), "aria2");
|
||||
} else {
|
||||
await exec(`tar --zstd -xvf ${file} usr/bin/aria2c`);
|
||||
console.log("Extracted. Copying binary file...");
|
||||
fs.mkdirSync("aria2");
|
||||
fs.copyFileSync("usr/bin/aria2c", "aria2/aria2c");
|
||||
fs.rmSync("usr", { recursive: true });
|
||||
}
|
||||
|
||||
console.log(`Extracted ${file}, removing compressed downloaded file...`);
|
||||
fs.rmSync(file);
|
||||
});
|
||||
};
|
||||
|
||||
downloadAria2();
|
80
src/main/declaration.d.ts
vendored
Normal file
80
src/main/declaration.d.ts
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
declare module "aria2" {
|
||||
export type Aria2Status =
|
||||
| "active"
|
||||
| "waiting"
|
||||
| "paused"
|
||||
| "error"
|
||||
| "complete"
|
||||
| "removed";
|
||||
|
||||
export interface StatusResponse {
|
||||
gid: string;
|
||||
status: Aria2Status;
|
||||
totalLength: string;
|
||||
completedLength: string;
|
||||
uploadLength: string;
|
||||
bitfield: string;
|
||||
downloadSpeed: string;
|
||||
uploadSpeed: string;
|
||||
infoHash?: string;
|
||||
numSeeders?: string;
|
||||
seeder?: boolean;
|
||||
pieceLength: string;
|
||||
numPieces: string;
|
||||
connections: string;
|
||||
errorCode?: string;
|
||||
errorMessage?: string;
|
||||
followedBy?: string[];
|
||||
following: string;
|
||||
belongsTo: string;
|
||||
dir: string;
|
||||
files: {
|
||||
path: string;
|
||||
length: string;
|
||||
completedLength: string;
|
||||
selected: string;
|
||||
}[];
|
||||
bittorrent?: {
|
||||
announceList: string[][];
|
||||
comment: string;
|
||||
creationDate: string;
|
||||
mode: "single" | "multi";
|
||||
info: {
|
||||
name: string;
|
||||
verifiedLength: string;
|
||||
verifyIntegrityPending: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export default class Aria2 {
|
||||
constructor(options: any);
|
||||
open: () => Promise<void>;
|
||||
call(
|
||||
method: "addUri",
|
||||
uris: string[],
|
||||
options: { dir: string }
|
||||
): Promise<string>;
|
||||
call(
|
||||
method: "tellStatus",
|
||||
gid: string,
|
||||
keys?: string[]
|
||||
): Promise<StatusResponse>;
|
||||
call(method: "pause", gid: string): Promise<string>;
|
||||
call(method: "forcePause", gid: string): Promise<string>;
|
||||
call(method: "unpause", gid: string): Promise<string>;
|
||||
call(method: "remove", gid: string): Promise<string>;
|
||||
call(method: "forceRemove", gid: string): Promise<string>;
|
||||
call(method: "pauseAll"): Promise<string>;
|
||||
call(method: "forcePauseAll"): Promise<string>;
|
||||
listNotifications: () => [
|
||||
"onDownloadStart",
|
||||
"onDownloadPause",
|
||||
"onDownloadStop",
|
||||
"onDownloadComplete",
|
||||
"onDownloadError",
|
||||
"onBtDownloadComplete",
|
||||
];
|
||||
on: (event: string, callback: (params: any) => void) => void;
|
||||
}
|
||||
}
|
23
src/main/services/aria2c.ts
Normal file
23
src/main/services/aria2c.ts
Normal file
@ -0,0 +1,23 @@
|
||||
import path from "node:path";
|
||||
import { spawn } from "node:child_process";
|
||||
import { app } from "electron";
|
||||
|
||||
export const startAria2 = () => {
|
||||
const binaryPath = app.isPackaged
|
||||
? path.join(process.resourcesPath, "aria2", "aria2c")
|
||||
: path.join(__dirname, "..", "..", "aria2", "aria2c");
|
||||
|
||||
return spawn(
|
||||
binaryPath,
|
||||
[
|
||||
"--enable-rpc",
|
||||
"--rpc-listen-all",
|
||||
"--file-allocation=none",
|
||||
"--allow-overwrite=true",
|
||||
"--enable-peer-exchange=false",
|
||||
"--enable-dht=false",
|
||||
"--bt-enable-lpd=false",
|
||||
],
|
||||
{ stdio: "inherit", windowsHide: true }
|
||||
);
|
||||
};
|
@ -84,7 +84,7 @@ export class DownloadManager {
|
||||
|
||||
static async cancelDownload(gameId: number) {
|
||||
if (this.currentDownloader === Downloader.RealDebrid) {
|
||||
RealDebridDownloader.cancelDownload();
|
||||
RealDebridDownloader.cancelDownload(gameId);
|
||||
} else {
|
||||
TorrentDownloader.cancelDownload(gameId);
|
||||
}
|
||||
|
@ -1,123 +1,77 @@
|
||||
import path from "node:path";
|
||||
import fs from "node:fs";
|
||||
import crypto from "node:crypto";
|
||||
|
||||
import axios, { type AxiosProgressEvent } from "axios";
|
||||
import { app } from "electron";
|
||||
import type { ChildProcess } from "node:child_process";
|
||||
import { logger } from "../logger";
|
||||
import { sleep } from "@main/helpers";
|
||||
import { startAria2 } from "../aria2c";
|
||||
import Aria2 from "aria2";
|
||||
|
||||
export class HttpDownload {
|
||||
private abortController: AbortController;
|
||||
public lastProgressEvent: AxiosProgressEvent;
|
||||
private trackerFilePath: string;
|
||||
private static gid: string | null = null;
|
||||
private static connected = false;
|
||||
private static aria2c: ChildProcess | null = null;
|
||||
|
||||
private trackerProgressEvent: AxiosProgressEvent | null = null;
|
||||
private downloadPath: string;
|
||||
private static aria2 = new Aria2({});
|
||||
|
||||
private downloadTrackersPath = path.join(
|
||||
app.getPath("documents"),
|
||||
"Hydra",
|
||||
"Downloads"
|
||||
);
|
||||
private static async connect() {
|
||||
this.aria2c = startAria2();
|
||||
|
||||
constructor(
|
||||
private url: string,
|
||||
private savePath: string
|
||||
) {
|
||||
this.abortController = new AbortController();
|
||||
let retries = 0;
|
||||
|
||||
const sha256Hasher = crypto.createHash("sha256");
|
||||
const hash = sha256Hasher.update(url).digest("hex");
|
||||
while (retries < 4 && !this.connected) {
|
||||
try {
|
||||
await this.aria2.open();
|
||||
logger.log("Connected to aria2");
|
||||
|
||||
this.trackerFilePath = path.join(
|
||||
this.downloadTrackersPath,
|
||||
`${hash}.hydradownload`
|
||||
);
|
||||
|
||||
const filename = path.win32.basename(this.url);
|
||||
this.downloadPath = path.join(this.savePath, filename);
|
||||
}
|
||||
|
||||
private updateTrackerFile() {
|
||||
if (!fs.existsSync(this.downloadTrackersPath)) {
|
||||
fs.mkdirSync(this.downloadTrackersPath, {
|
||||
recursive: true,
|
||||
});
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
this.trackerFilePath,
|
||||
JSON.stringify(this.lastProgressEvent),
|
||||
{ encoding: "utf-8" }
|
||||
);
|
||||
}
|
||||
|
||||
private removeTrackerFile() {
|
||||
if (fs.existsSync(this.trackerFilePath)) {
|
||||
fs.rm(this.trackerFilePath, (err) => {
|
||||
logger.error(err);
|
||||
});
|
||||
this.connected = true;
|
||||
} catch (err) {
|
||||
await sleep(100);
|
||||
logger.log("Failed to connect to aria2, retrying...");
|
||||
retries++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async startDownload() {
|
||||
// Check if there's already a tracker file and download file
|
||||
if (
|
||||
fs.existsSync(this.trackerFilePath) &&
|
||||
fs.existsSync(this.downloadPath)
|
||||
) {
|
||||
this.trackerProgressEvent = JSON.parse(
|
||||
fs.readFileSync(this.trackerFilePath, { encoding: "utf-8" })
|
||||
);
|
||||
public static getStatus() {
|
||||
if (this.connected && this.gid) {
|
||||
return this.aria2.call("tellStatus", this.gid);
|
||||
}
|
||||
|
||||
const response = await axios.get(this.url, {
|
||||
responseType: "stream",
|
||||
signal: this.abortController.signal,
|
||||
headers: {
|
||||
Range: `bytes=${this.trackerProgressEvent?.loaded ?? 0}-`,
|
||||
},
|
||||
onDownloadProgress: (progressEvent) => {
|
||||
const total =
|
||||
this.trackerProgressEvent?.total ?? progressEvent.total ?? 0;
|
||||
const loaded =
|
||||
(this.trackerProgressEvent?.loaded ?? 0) + progressEvent.loaded;
|
||||
|
||||
const progress = loaded / total;
|
||||
|
||||
this.lastProgressEvent = {
|
||||
...progressEvent,
|
||||
total,
|
||||
progress,
|
||||
loaded,
|
||||
};
|
||||
this.updateTrackerFile();
|
||||
|
||||
if (progressEvent.progress === 1) {
|
||||
this.removeTrackerFile();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
response.data.pipe(
|
||||
fs.createWriteStream(this.downloadPath, {
|
||||
flags: "a",
|
||||
})
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
public async pauseDownload() {
|
||||
this.abortController.abort();
|
||||
public static disconnect() {
|
||||
if (this.aria2c) {
|
||||
this.aria2c.kill();
|
||||
this.connected = false;
|
||||
}
|
||||
}
|
||||
|
||||
public cancelDownload() {
|
||||
this.pauseDownload();
|
||||
static async cancelDownload(gid: string) {
|
||||
await this.aria2.call("forceRemove", gid);
|
||||
if (this.gid === gid) {
|
||||
this.gid = null;
|
||||
}
|
||||
}
|
||||
|
||||
fs.rm(this.downloadPath, (err) => {
|
||||
if (err) logger.error(err);
|
||||
});
|
||||
fs.rm(this.trackerFilePath, (err) => {
|
||||
if (err) logger.error(err);
|
||||
});
|
||||
static async pauseDownload() {
|
||||
if (this.gid) {
|
||||
await this.aria2.call("forcePause", this.gid);
|
||||
this.gid = null;
|
||||
}
|
||||
}
|
||||
|
||||
static async resumeDownload(gid: string) {
|
||||
await this.aria2.call("unpause", gid);
|
||||
this.gid = gid;
|
||||
}
|
||||
|
||||
static async startDownload(downloadPath: string, downloadUrl: string) {
|
||||
if (!this.connected) await this.connect();
|
||||
|
||||
const options = {
|
||||
dir: downloadPath,
|
||||
};
|
||||
|
||||
this.gid = await this.aria2.call("addUri", [downloadUrl], options);
|
||||
return this.gid;
|
||||
}
|
||||
}
|
||||
|
@ -6,10 +6,10 @@ import { DownloadProgress } from "@types";
|
||||
import { HttpDownload } from "./http-download";
|
||||
|
||||
export class RealDebridDownloader {
|
||||
private static downloads = new Map<number, string>();
|
||||
private static downloadingGame: Game | null = null;
|
||||
|
||||
private static realDebridTorrentId: string | null = null;
|
||||
private static httpDownload: HttpDownload | null = null;
|
||||
|
||||
private static async getRealDebridDownloadUrl() {
|
||||
if (this.realDebridTorrentId) {
|
||||
@ -35,73 +35,43 @@ export class RealDebridDownloader {
|
||||
}
|
||||
|
||||
public static async getStatus() {
|
||||
const lastProgressEvent = this.httpDownload?.lastProgressEvent;
|
||||
const status = await HttpDownload.getStatus();
|
||||
|
||||
if (status) {
|
||||
const progress =
|
||||
Number(status.completedLength) / Number(status.totalLength);
|
||||
|
||||
if (lastProgressEvent) {
|
||||
await gameRepository.update(
|
||||
{ id: this.downloadingGame!.id },
|
||||
{
|
||||
bytesDownloaded: lastProgressEvent.loaded,
|
||||
fileSize: lastProgressEvent.total,
|
||||
progress: lastProgressEvent.progress,
|
||||
bytesDownloaded: Number(status.completedLength),
|
||||
fileSize: Number(status.totalLength),
|
||||
progress,
|
||||
status: "active",
|
||||
}
|
||||
);
|
||||
|
||||
const progress = {
|
||||
return {
|
||||
numPeers: 0,
|
||||
numSeeds: 0,
|
||||
downloadSpeed: lastProgressEvent.rate,
|
||||
downloadSpeed: Number(status.downloadSpeed),
|
||||
timeRemaining: calculateETA(
|
||||
lastProgressEvent.total ?? 0,
|
||||
lastProgressEvent.loaded,
|
||||
lastProgressEvent.rate ?? 0
|
||||
Number(status.totalLength),
|
||||
Number(status.completedLength),
|
||||
Number(status.downloadSpeed)
|
||||
),
|
||||
isDownloadingMetadata: false,
|
||||
isCheckingFiles: false,
|
||||
progress: lastProgressEvent.progress,
|
||||
progress,
|
||||
gameId: this.downloadingGame!.id,
|
||||
} as DownloadProgress;
|
||||
|
||||
if (lastProgressEvent.progress === 1) {
|
||||
this.pauseDownload();
|
||||
}
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
||||
if (this.realDebridTorrentId && this.downloadingGame) {
|
||||
const torrentInfo = await RealDebridClient.getTorrentInfo(
|
||||
this.realDebridTorrentId
|
||||
);
|
||||
|
||||
const { status } = torrentInfo;
|
||||
|
||||
if (status === "downloaded") {
|
||||
this.startDownload(this.downloadingGame);
|
||||
}
|
||||
|
||||
const progress = torrentInfo.progress / 100;
|
||||
const totalDownloaded = progress * torrentInfo.bytes;
|
||||
|
||||
return {
|
||||
numPeers: 0,
|
||||
numSeeds: torrentInfo.seeders,
|
||||
downloadSpeed: torrentInfo.speed,
|
||||
timeRemaining: calculateETA(
|
||||
torrentInfo.bytes,
|
||||
totalDownloaded,
|
||||
torrentInfo.speed
|
||||
),
|
||||
isDownloadingMetadata: status === "magnet_conversion",
|
||||
} as DownloadProgress;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static async pauseDownload() {
|
||||
this.httpDownload?.pauseDownload();
|
||||
HttpDownload.pauseDownload();
|
||||
this.realDebridTorrentId = null;
|
||||
this.downloadingGame = null;
|
||||
}
|
||||
@ -114,12 +84,20 @@ export class RealDebridDownloader {
|
||||
|
||||
if (downloadUrl) {
|
||||
this.realDebridTorrentId = null;
|
||||
this.httpDownload = new HttpDownload(downloadUrl, game!.downloadPath!);
|
||||
this.httpDownload.startDownload();
|
||||
const gid = await HttpDownload.startDownload(
|
||||
game.downloadPath!,
|
||||
downloadUrl
|
||||
);
|
||||
|
||||
this.downloads.set(game.id!, gid);
|
||||
}
|
||||
}
|
||||
|
||||
static cancelDownload() {
|
||||
return this.httpDownload?.cancelDownload();
|
||||
static async cancelDownload(gameId: number) {
|
||||
const gid = this.downloads.get(gameId);
|
||||
if (gid) {
|
||||
await HttpDownload.cancelDownload(gid);
|
||||
this.downloads.delete(gameId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
15
yarn.lock
15
yarn.lock
@ -2665,6 +2665,14 @@ aria-query@^5.3.0:
|
||||
dependencies:
|
||||
dequal "^2.0.3"
|
||||
|
||||
aria2@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/aria2/-/aria2-4.1.2.tgz#0ecbc50beea82856c88b4de71dac336154f67362"
|
||||
integrity sha512-qTBr2RY8RZQmiUmbj2KXFvkErNxU4aTHZszszzwhE8svy2PEVX+IYR/c4Rp9Tuw4QkeU8cylGy6McV6Yl8i7Qw==
|
||||
dependencies:
|
||||
node-fetch "^2.6.1"
|
||||
ws "^7.4.0"
|
||||
|
||||
array-buffer-byte-length@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz"
|
||||
@ -5813,7 +5821,7 @@ node-domexception@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz"
|
||||
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
|
||||
|
||||
node-fetch@^2.6.7:
|
||||
node-fetch@^2.6.1, node-fetch@^2.6.7:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
|
||||
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
|
||||
@ -7609,6 +7617,11 @@ wrappy@1:
|
||||
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
|
||||
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
|
||||
|
||||
ws@^7.4.0:
|
||||
version "7.5.10"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
|
||||
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
|
||||
|
||||
ws@^8.16.0:
|
||||
version "8.17.0"
|
||||
resolved "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz"
|
||||
|
Loading…
Reference in New Issue
Block a user