diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..61ce182 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 xiaobao-810216 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0fe7eb4 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# X/Twitter Video Downloader + +## 项目描述 +一个简单、高效的 X/Twitter 视频下载工具,支持快速从 Twitter 和 X.com 下载视频。 + +## 特性 +- 支持 X/Twitter 视频下载 +- 桌面直接保存 +- 高性能下载 +- 实时下载进度 +- 简洁的 Web 界面 + +## 技术栈 +- Python 3.10+ +- Flask +- yt-dlp +- HTML5 +- JavaScript + +## 安装步骤 + +### 前提条件 +- Python 3.10 或更高版本 +- pip +- FFmpeg + +### 克隆仓库 +```bash +git clone https://github.com/yourusername/x-video-downloader.git +cd x-video-downloader +``` + +### 创建虚拟环境 +```bash +python -m venv venv +.\venv\Scripts\activate # Windows +source venv/bin/activate # macOS/Linux +``` + +### 安装依赖 +```bash +pip install -r requirements.txt +``` + +## 运行应用 +```bash +python app.py +``` + +访问 `http://localhost:5000` + +## 使用方法 +1. 打开网页 +2. 粘贴 X/Twitter 视频链接 +3. 点击下载 +4. 视频将保存到桌面 + +## 版本 +- v1.0.0 - 初始发布 + +## 许可证 +MIT License + +## 免责声明 +仅供学习和个人使用,请尊重版权 diff --git a/app.py b/app.py new file mode 100644 index 0000000..2fc826e --- /dev/null +++ b/app.py @@ -0,0 +1,288 @@ +import logging +import os +import sys +import subprocess +import json +import traceback +import re +import yt_dlp +from flask import Flask, request, jsonify, render_template +from flask import send_from_directory, Response + +# 尝试导入 flask_cors,如果失败则给出友好提示 +try: + from flask_cors import CORS +except ImportError: + print("未找到 flask_cors 模块。请运行 'pip install flask-cors' 安装。") + CORS = None # 提供一个备选方案 + +# 设置更详细的日志 +logging.basicConfig( + level=logging.DEBUG, # 改为 DEBUG 级别 + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(), # 输出到控制台 + logging.FileHandler('app.log', encoding='utf-8') # 同时写入日志文件 + ] +) +logger = logging.getLogger(__name__) + +# 设置 aria2c 路径 +ARIA2C_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'aria2', 'aria2-1.36.0-win-64bit-build1', 'aria2c.exe') + +# 设置代理,如果需要的话 +PROXY = None + +app = Flask(__name__, static_folder='static', static_url_path='/static') +if CORS: + CORS(app) # 启用 CORS + +@app.route('/') +def index(): + try: + return render_template('index.html') + except Exception as e: + logger.error(f"Error rendering template: {str(e)}") + return f"Error: {str(e)}", 500 + +@app.route('/video_info', methods=['GET', 'POST']) +def video_info(): + logger.debug(f"收到视频信息请求,方法: {request.method}") + logger.debug(f"请求参数: {request.args}") + logger.debug(f"请求表单: {request.form}") + + try: + if request.method == 'POST': + url = request.form.get('url') + else: + url = request.args.get('url') + + logger.debug(f"解析出的 URL: {url}") + + if not url: + logger.error("未提供视频链接") + return jsonify({'error': '请提供视频链接'}), 400 + + logger.info(f"请求视频信息的 URL: {url}") + try: + logger.info("开始提取视频 ID...") + video_id = extract_video_id(url) + if not video_id: + logger.error("未能提取视频 ID") + logger.error(f"视频链接:{url}") + return jsonify({'error': '无效的视频链接'}), 400 + logger.info(f"成功提取视频 ID: {video_id}") + logger.info("开始获取视频信息...") + try: + # 使用 yt-dlp 获取详细的格式信息 + ydl_opts = { + 'quiet': False, # 改为 False 以获取更多信息 + 'no_warnings': False, # 改为 False 以获取警告信息 + 'no_color': True, + 'extract_flat': False, # 改为 False 以获取完整信息 + 'format': 'best' # 确保获取最佳格式 + } + + # 转换 URL 为 Twitter 域名 + twitter_url = url.replace('x.com', 'twitter.com') + + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + logger.debug(f"开始使用 yt-dlp 提取 {twitter_url} 的信息") + info_dict = ydl.extract_info(twitter_url, download=False) + + logger.debug(f"成功获取视频信息字典: {info_dict.keys()}") + + # 处理格式信息 + formats = [] + if 'formats' in info_dict: + for fmt in info_dict['formats']: + # 只保留视频格式 + if fmt.get('vcodec', 'none') != 'none': + format_info = { + 'format_id': fmt.get('format_id', ''), + 'resolution': f"{fmt.get('width', 0)}x{fmt.get('height', 0)}", + 'ext': fmt.get('ext', 'mp4'), + 'filesize': fmt.get('filesize', 0) or 0, + 'tbr': fmt.get('tbr', 0) # 总比特率 + } + formats.append(format_info) + + # 按分辨率排序 + formats.sort(key=lambda x: int(x['resolution'].split('x')[1]) if 'x' in x['resolution'] else 0, reverse=True) + + video_data = { + 'title': info_dict.get('title', f'Twitter Video {video_id}'), + 'formats': formats + } + + logger.info(f"成功获取视频信息: {video_data}") + return jsonify(video_data) + + except Exception as extract_error: + logger.error(f"yt-dlp 提取信息失败: {str(extract_error)}") + logger.error(f"错误详情: {traceback.format_exc()}") + return jsonify({'error': f'无法获取视频信息: {str(extract_error)}'}), 500 + + except Exception as e: + logger.error(f"获取视频信息时发生错误: {str(e)}") + logger.error(f"错误详情: {traceback.format_exc()}") + return jsonify({'error': f'获取视频信息失败: {str(e)}'}), 500 + except Exception as e: + logger.error(f"获取视频信息时发生错误: {str(e)}") + logger.error(f"错误详情: {traceback.format_exc()}") + return jsonify({'error': f'获取视频信息失败: {str(e)}'}), 500 + + except Exception as e: + logger.error(f"处理视频信息请求时发生错误: {str(e)}") + logger.error(f"错误详情: {traceback.format_exc()}") + return jsonify({'error': f'处理请求失败: {str(e)}'}), 500 + +@app.route('/download', methods=['GET']) +def download_video(): + try: + url = request.args.get('url') + + logger.info(f"下载请求 - URL: {url}") + + if not url: + logger.error("缺少 URL 参数") + return jsonify({'error': '缺少必要的下载参数'}), 400 + + # 转换 URL 为 Twitter 域名 + twitter_url = url.replace('x.com', 'twitter.com') + + def generate(): + try: + # 桌面路径 + desktop_path = os.path.expanduser('~/Desktop') + + # 极简和高性能的 yt-dlp 配置 + ydl_opts = { + 'format': 'best[ext=mp4]', # 选择最佳 MP4 格式 + 'merge_output_format': 'mp4', + 'outtmpl': os.path.join(desktop_path, '%(title).80s.%(ext)s'), # 缩短文件名 + + # 性能优化 + 'no_color': True, + 'quiet': True, # 最小化日志 + 'no_warnings': True, + 'nooverwrites': True, + + # 网络性能极致优化 + 'socket_timeout': 5, # 缩短超时 + 'retries': 1, # 减少重试 + 'fragment_retries': 1, + 'concurrent_fragments': 16, # 增加并发数 + 'buffer_size': '16M', # 增大缓冲区 + + # 精简信息提取 + 'extract_flat': True, + + # 最小化处理开销 + 'no_mtime': True, + 'no_part': True, + 'ignoreerrors': True, + + # 进度钩子 + 'progress_hooks': [ + lambda d: logger.info(f"下载进度: {d.get('_percent_str', 'N/A')}") + ], + + # 后处理优化 + 'postprocessors': [{ + 'key': 'FFmpegVideoConvertor', + 'preferedformat': 'mp4', + }], + 'postprocessor_args': ['-vcodec', 'libx264', '-acodec', 'aac', '-threads', '0', '-preset', 'ultrafast'] + } + + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + logger.info(f"开始快速下载: {twitter_url}") + + try: + # 单步获取信息并下载 + info_dict = ydl.extract_info(twitter_url, download=True) + + # 准备文件路径 + downloaded_file = ydl.prepare_filename(info_dict) + + # 快速检查文件 + if os.path.exists(downloaded_file): + file_size = os.path.getsize(downloaded_file) + logger.info(f"视频已下载: {downloaded_file} ({file_size} 字节)") + + # 发送下载完成事件 + yield f"data: {json.dumps({'percent': 100, 'message': '下载完成', 'file': downloaded_file})}\n\n" + else: + logger.error(f"文件未找到: {downloaded_file}") + yield f"data: {json.dumps({'error': '视频下载失败'})}\n\n" + + except Exception as e: + logger.error(f"下载过程错误: {str(e)}") + logger.error(f"错误追踪: {traceback.format_exc()}") + yield f"data: {json.dumps({'error': str(e)})}\n\n" + + except Exception as e: + logger.error(f"处理过程未知错误: {str(e)}") + logger.error(f"错误追踪: {traceback.format_exc()}") + yield f"data: {json.dumps({'error': str(e)})}\n\n" + + return Response(generate(), mimetype='text/event-stream') + + except Exception as e: + logger.error(f"请求处理错误: {str(e)}") + logger.error(f"错误追踪: {traceback.format_exc()}") + return jsonify({'error': f'处理下载请求失败: {str(e)}'}), 500 + +@app.route('/test') +def test(): + return "Hello, this is a test page!" + +def extract_video_id(url): + # 使用正则表达式提取 Twitter/X 视频 ID + match = re.search(r'/status/(\d+)', url) + if match: + return match.group(1) + return None + +def get_video_data(url): + # 这里是获取视频信息的逻辑 + # 假设我们返回一个模拟的视频数据 + return { + 'title': '示例视频', + 'description': '这是一个示例视频描述', + 'url': url + } + +if __name__ == '__main__': + print("启动 Flask 应用...") + print(f"Python 版本: {sys.version}") + + try: + import flask + print(f"Flask 版本: {flask.__version__}") + + # 添加更多的调试信息 + print("尝试配置应用...") + + # 确保日志输出到文件 + file_handler = logging.FileHandler('flask_debug.log', encoding='utf-8') + file_handler.setLevel(logging.DEBUG) + logger.addHandler(file_handler) + + # 运行应用 + print("开始运行应用...") + app.run( + host='0.0.0.0', + port=5000, + debug=True, + use_reloader=False # 禁用重载器以便更好地捕获错误 + ) + except Exception as e: + print(f"启动失败,错误信息: {e}") + print(f"详细错误追踪: {traceback.format_exc()}") + # 将错误写入日志文件 + with open('startup_error.log', 'w', encoding='utf-8') as f: + f.write(f"启动失败,错误信息: {e}\n") + f.write(f"详细错误追踪: {traceback.format_exc()}") diff --git a/aria2.zip b/aria2.zip new file mode 100644 index 0000000..260e3a4 Binary files /dev/null and b/aria2.zip differ diff --git a/aria2/aria2-1.36.0-win-64bit-build1/AUTHORS b/aria2/aria2-1.36.0-win-64bit-build1/AUTHORS new file mode 100644 index 0000000..98382bc --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/AUTHORS @@ -0,0 +1,69 @@ +These are people who made lots of contributions: + +Tatsuhiro Tsujikawa +Ross Smith II (Windows port) +Nils Maier + +The aria2 contributor's list extracted from commit logs [1]: + +103yiran +Alexander Amanuel +Ali MJ Al-Nasrawy +Anthony Bryan +Artur Petrov +Athmane Madjoudj +Ben Chaney +Char +Cristian Rodríguez +Dan Fandrich +David Macek +Florian Gamböck +Fredrik Fornwall +ITriskTI +Igor Khomyakov +Jarda Snajdr +JimmyZ +Juan Francisco Cantero Hurtado +Kcchouette +Kurt Kartaltepe +Michał Górny +Michał Leśniewski +Mingye Wang +Natanael Copa +Nils Maier +ORiON- +ReadmeCritic +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 +amtlib-dot-dll +c3mb0 +diadistis +eric1932 +geetam +gilberto dos santos alves +gt +klemens +kwkam +luokar +mozillazg +multisnow +nicolov +oliviercommelarbre +qweaszxcdf +rotor +sleepymac +suzker +tcely + +[1] https://gist.github.com/tatsuhiro-t/deaffeb064652104ad11 diff --git a/aria2/aria2-1.36.0-win-64bit-build1/COPYING b/aria2/aria2-1.36.0-win-64bit-build1/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/COPYING @@ -0,0 +1,340 @@ + 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 Library 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. + + + Copyright (C) + + 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. + + , 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 Library General +Public License instead of this License. diff --git a/aria2/aria2-1.36.0-win-64bit-build1/ChangeLog b/aria2/aria2-1.36.0-win-64bit-build1/ChangeLog new file mode 100644 index 0000000..0f7fafa --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/ChangeLog @@ -0,0 +1,263 @@ +commit 21f476588c5deedbfef87073d3860b78abed3991 (HEAD, tag: release-1.36.0, origin/master, origin/HEAD, master) +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-21 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-21 + + Fix sphinx build error + +commit da3b2ff457a4faa2c04120d6202741d8f8528729 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-21 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-21 + + Update sphinx_rtd_theme + +commit 337ed0561f448e7a751d2f425921547e57f4a907 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-21 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-21 + + Bump version to 1.36.0 + +commit b6e7ac59f1fd3744b23ba4d8c0111b8a11a4fd10 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-21 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-21 + + Update AUTHORS + +commit 3330817246c317db8a8e6454367a5a8385caa23f +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-21 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-21 + + Update NEWS + +commit 490aa4a3d616d2ebb37f26fdf6a6737829d44c96 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-13 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-13 + + Update doc + +commit ca4179e76c819142259e6515e540d3fec25e7083 +Merge: 63f6ed72 5d77701b +Author: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com> +AuthorDate: 2021-08-13 +Commit: GitHub +CommitDate: 2021-08-13 + + Merge pull request #1672 from sleepymac/python3-bash-completion + + Updates the make_bash_completion script to Python3. + +commit 63f6ed726eec62d97ab6dfbafaebd1485703793f +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-12 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-13 + + Update wslay + +commit a151b5bcefd8beee262b8be544e5384766c30624 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-12 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-13 + + Bump win build dependencies + +commit e088857a2c195ec20b1ca47f2dd3247440499b8b +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-12 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-12 + + Replace the deprecated std::ptr_fun with std::function + +commit 9f2f78b96abb538b0709d5bc5022d8dbb5c50353 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2021-08-12 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2021-08-12 + + Bump android build dependencies + +commit faa6955c8d7bb7b6541e0b7fbb84f7d213f761ab +Author: Tatsuhiro Tsujikawa +AuthorDate: 2020-12-28 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2020-12-28 + + Add GitHub Actions workflow build + +commit f292bbba857fe559d79de80ca1fc180739b7b22f +Merge: 15cad965 2d0171e9 +Author: Tatsuhiro Tsujikawa +AuthorDate: 2020-12-28 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2020-12-28 + + Merge branch 'ncopa-fix-time64' into master + +commit 2d0171e95636eead0c7d26d8bef99f451ab3e20d +Author: Natanael Copa +AuthorDate: 2020-08-07 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2020-12-28 + + Fix segfault when time_t is 64bit on 32bit arch (#1666) + + On some platforms, like with musl libc, time_t may be 64 bit even on + 32bit platforms. Fix segfault by convert time_t to 64 bit and use 64bit + format modifier instead of assume time_t is %ld + +commit 5d77701bc12c539e226232dbe86789ed30687329 +Author: sleepymac +AuthorDate: 2020-08-15 +Commit: sleepymac +CommitDate: 2020-08-15 + + Updates the make_bash_completion script to Python3. + +commit 15cad965eb75c8b7f11bc2fc94354d1873bf6261 +Merge: 9d0a48ac 01969fc5 +Author: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com> +AuthorDate: 2020-06-25 +Commit: GitHub +CommitDate: 2020-06-25 + + Merge pull request #1644 from aliemjay/sync-caches + + prevent corrupt downloads after app and/or system crash + +commit 01969fc5304a738718c00b6153d672ce4f085747 +Author: Ali MJ Al-Nasrawy +AuthorDate: 2020-06-17 +Commit: Ali MJ Al-Nasrawy +CommitDate: 2020-06-17 + + flush OS write buffers before saving control file + + This ensures that pieces are physically written to disk before + marking them as finished in the control file. + + This should prevent data loss and corruption when resuming downloads + after a system crash. + + Signed-off-by: Ali MJ Al-Nasrawy + +commit 870e2a6014462c55cc252140f5e215374881c6e9 +Author: Ali MJ Al-Nasrawy +AuthorDate: 2020-06-17 +Commit: Ali MJ Al-Nasrawy +CommitDate: 2020-06-17 + + flush internal buffers before auto-saving control file + + Otherwise, some pieces may be marked as finished in the control file + though they have not yet been written to the storage file. + + This should prevent data loss and corruption when resuming downloads + after an app crash. + + Signed-off-by: Ali MJ Al-Nasrawy + +commit 9d0a48ac8147c5e56402706d5c17efa8bf6340f2 +Merge: 902f86f5 6ebdddb9 +Author: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com> +AuthorDate: 2019-10-12 +Commit: GitHub +CommitDate: 2019-10-12 + + Merge pull request #1487 from aria2/reset-download-upload-length + + Reset sessionDownloadLength and sessionUploadLength on download start + +commit 902f86f5745857eccab81cb17dd2c27169b1906c +Merge: 53b3169a 3e0134fe +Author: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com> +AuthorDate: 2019-10-12 +Commit: GitHub +CommitDate: 2019-10-12 + + Merge pull request #1477 from ITriskTI/patch-1 + + Update aria2c.rst + +commit 6ebdddb9f159e87923736f25900897b3602305f9 (origin/reset-download-upload-length) +Author: Tatsuhiro Tsujikawa +AuthorDate: 2019-10-12 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2019-10-12 + + Reset sessionDownloadLength and sessionUploadLength on download start + + This commit resets sessionDownloadLength and sessionUploadLength when + a download restarted (including unpause RPC method). + + Fixes #1486 + +commit 3e0134fef975137ab995d24eb13e1743412acd8b +Author: ITriskTI +AuthorDate: 2019-10-06 +Commit: ITriskTI +CommitDate: 2019-10-06 + + Update aria2c.rst + +commit 53b3169a22fd60f07ea0f1ef5b284cb6944b5d31 +Author: Nils Maier +AuthorDate: 2019-10-06 +Commit: Nils Maier +CommitDate: 2019-10-06 + + AppleTLS: even more correctly define kTLSProtocol13 + + Yes, again + +commit a184ceb9e2d129e5d20bfd7d3dc5f1ea49d27592 +Author: Nils Maier +AuthorDate: 2019-10-06 +Commit: Nils Maier +CommitDate: 2019-10-06 + + AppleTLS: correctly define kTLSProtocol13 + +commit 1677aba1b2554d0ef0af81e0a9cb7dca44e0f4c7 +Author: Nils Maier +AuthorDate: 2019-10-06 +Commit: Nils Maier +CommitDate: 2019-10-06 + + Update macOS dependencies + +commit 40e01dbb4cbc4fbd9d4c454e609a02a2406ae802 +Author: Nils Maier +AuthorDate: 2019-10-06 +Commit: Nils Maier +CommitDate: 2019-10-06 + + AppleTLS: update cipher suites + +commit a6671aec37cc408335657b11c8013f8be18bbad9 +Author: Nils Maier +AuthorDate: 2019-10-06 +Commit: Nils Maier +CommitDate: 2019-10-06 + + AppleTLS: TLSv3 + +commit 6b362244537e7c815b89ba6763ca4c56f0e7eb1e +Author: Tatsuhiro Tsujikawa +AuthorDate: 2019-10-06 +Commit: Tatsuhiro Tsujikawa +CommitDate: 2019-10-06 + + Fix make dist diff --git a/aria2/aria2-1.36.0-win-64bit-build1/LICENSE.OpenSSL b/aria2/aria2-1.36.0-win-64bit-build1/LICENSE.OpenSSL new file mode 100644 index 0000000..bf6b4b9 --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/LICENSE.OpenSSL @@ -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.] + */ diff --git a/aria2/aria2-1.36.0-win-64bit-build1/NEWS b/aria2/aria2-1.36.0-win-64bit-build1/NEWS new file mode 100644 index 0000000..cac9c0f --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/NEWS @@ -0,0 +1,40 @@ +aria2 1.36.0 +============ + +Release Note +------------ + +This release fixes several bugs. See Changes for details. + +Changes +------- + +* Update wslay + +* Bump Windows build dependencies + +* Bump android build dependencies + +* Fix segfault when time_t is 64bit on 32bit arch + + Patch from Natanael Copa + + GH-1666 + +* Updates the make_bash_completion script to Python3. + + Patch from sleepymac + + GH-1672 + +* Prevent corrupt downloads after app and/or system crash + + Patch from Ali MJ Al-Nasrawy + + GH-1644 + +* Reset sessionDownloadLength and sessionUploadLength on download start + + GH-1486 + +* AppleTLS: Add TLSv1.3 support diff --git a/aria2/aria2-1.36.0-win-64bit-build1/README.html b/aria2/aria2-1.36.0-win-64bit-build1/README.html new file mode 100644 index 0000000..8689e0f --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/README.html @@ -0,0 +1,904 @@ + + + + + + +aria2 - The ultra fast download utility + + + +
+

aria2 - The ultra fast download utility

+ +
+

Disclaimer

+

This program comes with no warranty. +You must use this program at your own risk.

+
+
+

Introduction

+

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.

+

The project page is located at https://aria2.github.io/.

+

See aria2 Online Manual (Russian translation, Portuguese +translation) to learn +how to use aria2.

+
+
+

Features

+

Here is a list of features:

+
    +
  • Command-line interface
  • +
  • Download files through HTTP(S)/FTP/SFTP/BitTorrent
  • +
  • Segmented downloading
  • +
  • Metalink version 4 (RFC 5854) support(HTTP/FTP/SFTP/BitTorrent)
  • +
  • Metalink version 3.0 support(HTTP/FTP/SFTP/BitTorrent)
  • +
  • Metalink/HTTP (RFC 6249) support
  • +
  • HTTP/1.1 implementation
  • +
  • HTTP Proxy support
  • +
  • HTTP BASIC authentication support
  • +
  • HTTP Proxy authentication support
  • +
  • Well-known environment variables for proxy: http_proxy, +https_proxy, ftp_proxy, all_proxy and no_proxy
  • +
  • HTTP gzip, deflate content encoding support
  • +
  • Verify peer using given trusted CA certificate in HTTPS
  • +
  • Client certificate authentication in HTTPS
  • +
  • Chunked transfer encoding support
  • +
  • Load Cookies from file using the Firefox3 format, Chromium/Google Chrome +and the Mozilla/Firefox +(1.x/2.x)/Netscape format.
  • +
  • Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format.
  • +
  • Custom HTTP Header support
  • +
  • Persistent Connections support
  • +
  • FTP/SFTP through HTTP Proxy
  • +
  • Download/Upload speed throttling
  • +
  • BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE, +Multi-Tracker, UDP tracker
  • +
  • BitTorrent WEB-Seeding. +aria2 requests chunks more than piece size to reduce the request +overhead. It also supports pipelined requests with piece size.
  • +
  • BitTorrent Local Peer Discovery
  • +
  • Rename/change the directory structure of BitTorrent downloads +completely
  • +
  • JSON-RPC (over HTTP and WebSocket)/XML-RPC interface
  • +
  • Run as a daemon process
  • +
  • Selective download in multi-file torrent/Metalink
  • +
  • Chunk checksum validation in Metalink
  • +
  • Can disable segmented downloading in Metalink
  • +
  • Netrc support
  • +
  • Configuration file support
  • +
  • Download URIs found in a text file or stdin and the destination +directory and output file name can be specified optionally
  • +
  • Parameterized URI support
  • +
  • IPv6 support with Happy Eyeballs
  • +
  • Disk cache to reduce disk activity
  • +
+
+
+

Versioning and release schedule

+

We use 3 numbers for aria2 version: MAJOR.MINOR.PATCH. We will ship +MINOR update on 15th of every month. We may skip a release if we have +no changes since the last release. The feature and documentation +freeze happens 10 days before the release day (5th day of the month) +for translation teams. We will raise an issue about the upcoming +release around that day.

+

We may release PATCH releases between regular releases if we have +security issues.

+

MAJOR version will stay at 1 for the time being.

+
+
+

How to get source code

+

We maintain the source code at Github: +https://github.com/aria2/aria2

+

To get the latest source code, run following command:

+
+$ git clone https://github.com/aria2/aria2.git
+
+

This will create aria2 directory in your current directory and source +files are stored there.

+
+
+

Dependency

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
featuresdependency
HTTPSOSX or GnuTLS or OpenSSL or Windows
SFTPlibssh2
BitTorrentNone. Optional: libnettle+libgmp or libgcrypt +or OpenSSL (see note)
Metalinklibxml2 or Expat.
ChecksumNone. Optional: OSX or libnettle or libgcrypt +or OpenSSL or Windows (see note)
gzip, deflate in HTTPzlib
Async DNSC-Ares
Firefox3/Chromium cookielibsqlite3
XML-RPClibxml2 or Expat.
JSON-RPC over WebSocketlibnettle or libgcrypt or OpenSSL
+
+

Note

+

libxml2 has precedence over Expat if both libraries are installed. +If you prefer Expat, run configure with --without-libxml2.

+
+
+

Note

+

On Apple OSX the OS-level SSL/TLS support will be preferred. Hence +neither GnuTLS nor OpenSSL are required on that platform. If you'd +like to disable this behavior, run configure with +--without-appletls.

+

GnuTLS has precedence over OpenSSL if both libraries are installed. +If you prefer OpenSSL, run configure with --without-gnutls +--with-openssl.

+

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 are required on that +platform. If you'd like to disable this behavior, run configure +with --without-wintls.

+
+
+

Note

+

On Apple OSX the OS-level checksum support will be preferred, +unless aria2 is configured with --without-appletls.

+

libnettle has precedence over libgcrypt if both libraries are +installed. If you prefer libgcrypt, run configure with +--without-libnettle --with-libgcrypt. If OpenSSL is selected over +GnuTLS, neither libnettle nor libgcrypt will be used.

+

If none of the optional dependencies are installed, an internal +implementation that only supports md5 and sha1 will be used.

+

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 --without-wintls.

+
+

A user can have one of the following configurations for SSL and crypto +libraries:

+
    +
  • OpenSSL
  • +
  • GnuTLS + libgcrypt
  • +
  • GnuTLS + libnettle
  • +
  • Apple TLS (OSX only)
  • +
  • Windows TLS (Windows only)
  • +
+

You can disable BitTorrent and Metalink support by providing +--disable-bittorrent and --disable-metalink to the configure +script respectively.

+

In order to enable async DNS support, you need c-ares.

+ +
+
+

How to build

+

aria2 is primarily written in C++. Initially it was written based on +C++98/C++03 standard features. We are now migrating aria2 to C++11 +standard. The current source code requires C++11 aware compiler. For +well-known compilers, such as g++ and clang, the -std=c++11 or +-std=c++0x flag must be supported.

+

In order to build aria2 from the source package, you need following +development packages (package name may vary depending on the +distribution you use):

+
    +
  • libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
  • +
  • nettle-dev (Required for BitTorrent, Checksum support)
  • +
  • libgmp-dev (Required for BitTorrent)
  • +
  • libssh2-1-dev (Required for SFTP support)
  • +
  • libc-ares-dev (Required for async DNS support)
  • +
  • libxml2-dev (Required for Metalink support)
  • +
  • zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
  • +
  • libsqlite3-dev (Required for Firefox3/Chromium cookie support)
  • +
  • pkg-config (Required to detect installed libraries)
  • +
+

You can use libgcrypt-dev instead of nettle-dev and libgmp-dev:

+
    +
  • libgpg-error-dev (Required for BitTorrent, Checksum support)
  • +
  • libgcrypt-dev (Required for BitTorrent, Checksum support)
  • +
+

You can use libssl-dev instead of +libgnutls-dev, nettle-dev, libgmp-dev, libgpg-error-dev and libgcrypt-dev:

+
    +
  • libssl-dev (Required for HTTPS, BitTorrent, Checksum support)
  • +
+

You can use libexpat1-dev instead of libxml2-dev:

+
    +
  • libexpat1-dev (Required for Metalink support)
  • +
+

On Fedora you need the following packages: gcc, gcc-c++, kernel-devel, +libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit

+

If you downloaded source code from git repository, you have to install +following packages to get autoconf macros:

+
    +
  • libxml2-dev
  • +
  • libcppunit-dev
  • +
  • autoconf
  • +
  • automake
  • +
  • autotools-dev
  • +
  • autopoint
  • +
  • libtool
  • +
+

And run following command to generate configure script and other files +necessary to build the program:

+
+$ autoreconf -i
+
+

Also you need Sphinx to build man page.

+

If you are building aria2 for Mac OS X, take a look at +the makerelease-osx.mk GNU Make makefile.

+

The quickest way to build aria2 is first run configure script:

+
+$ ./configure
+
+

To build statically linked aria2, use ARIA2_STATIC=yes +command-line option:

+
+$ ./configure ARIA2_STATIC=yes
+
+

After configuration is done, run make to compile the program:

+
+$ make
+
+

See Cross-compiling Windows binary to create a Windows binary. +See Cross-compiling Android binary to create an Android binary.

+

The configure script checks available libraries and enables as many +features as possible except for experimental features not enabled by +default.

+

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 +gnutls_certificate_set_x509_system_trust() 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 to supply 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 --with-ca-bundle option:

+
+$ ./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt'
+$ make
+
+

Without --with-ca-bundle option, you will encounter the error when +accessing HTTPS servers because the certificate cannot be verified +without CA bundle. In such case, you can specify the CA bundle file +using aria2's --ca-certificate option. If you don't have CA bundle +file installed, then the last resort is disable the certificate +validation using --check-certificate=false.

+

Using the native OSX (AppleTLS) and/or Windows (WinTLS) implementation +will automatically use the system certificate store, so +--with-ca-bundle is not necessary and will be ignored when using +these implementations.

+

By default, the bash_completion file named aria2c is installed to +the directory $prefix/share/doc/aria2/bash_completion. To change +the install directory of the file, use --with-bashcompletiondir +option.

+

After a make the executable is located at src/aria2c.

+

aria2 uses CppUnit for automated unit testing. To run the unit test:

+
+$ make check
+
+
+
+

Cross-compiling Windows binary

+

In this section, we describe how to build a Windows binary using a +mingw-w64 (http://mingw-w64.org/doku.php) cross-compiler on Debian +Linux. The MinGW (http://www.mingw.org/) may not be able to build +aria2.

+

The easiest way to build Windows binary is use Dockerfile.mingw. See +Dockerfile.mingw how to build binary. If you cannot use Dockerfile, +then continue to read following paragraphs.

+

Basically, after compiling and installing depended libraries, you can +do cross-compile just passing appropriate --host option and +specifying CPPFLAGS, LDFLAGS and PKG_CONFIG_LIBDIR +variables to configure. For convenience and lowering our own +development cost, we provide easier way to configure the build +settings.

+

mingw-config script is a configure script wrapper for mingw-w64. +We use it to create official Windows build. This script assumes +following libraries have been built for cross-compile:

+
    +
  • c-ares
  • +
  • expat
  • +
  • sqlite3
  • +
  • zlib
  • +
  • libssh2
  • +
  • cppunit
  • +
+

Some environment variables can be adjusted to change build settings:

+
+
HOST
+
cross-compile to build programs to run on HOST. It defaults to +i686-w64-mingw32. To build 64bit binary, specify +x86_64-w64-mingw32.
+
PREFIX
+
Prefix to the directory where dependent libraries are installed. It +defaults to /usr/local/$HOST. -I$PREFIX/include will be +added to CPPFLAGS. -L$PREFIX/lib will be added to +LDFLAGS. $PREFIX/lib/pkgconfig will be set to +PKG_CONFIG_LIBDIR.
+
+

For example, to build 64bit binary do this:

+
+$ HOST=x86_64-w64-mingw32 ./mingw-config
+
+

If you want libaria2 dll with --enable-libaria2, then don't use +ARIA2_STATIC=yes and prepare the DLL version of external +libraries.

+
+
+

Cross-compiling Android binary

+

In this section, we describe how to build Android binary using Android +NDK cross-compiler on Debian Linux.

+

At the time of this writing, Android NDK r21e should compile aria2 +without errors.

+

android-config script is a configure script wrapper for Android +build. We use it to create official Android build. This script +assumes the following libraries have been built for cross-compile:

+
    +
  • c-ares
  • +
  • openssl
  • +
  • expat
  • +
  • zlib
  • +
  • libssh2
  • +
+

When building the above libraries, make sure that disable shared +library and enable only static library. We are going to link those +libraries statically.

+

android-config assumes that $ANDROID_HOME and $NDK +environment variables are defined.

+

We currently use Android NDK r21e. $NDK should point to the +directory to Anroid NDK. The build tools will be found under +$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/.

+

All the dependent libraries must be installed under +$ANDROID_HOME/usr/local.

+

After android-config, run make to compile sources.

+
+
+

Building documentation

+

Sphinx is used to build the +documentation. aria2 man pages will be build when you run make if +they are not up-to-date. You can also build HTML version of aria2 man +page by make html. The HTML version manual is also available at +online (Russian +translation, Portuguese +translation).

+
+
+

BitTorrent

+
+

About file names

+

The file name of the downloaded file is determined as follows:

+
+
single-file mode
+
If "name" key is present in .torrent file, file name is the value +of "name" key. Otherwise, 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.
+
multi-file mode
+
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.
+
+

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 +--bt-max-open-files option.

+
+
+

DHT

+

aria2 supports mainline compatible DHT. By default, the routing table +for IPv4 DHT is saved to $XDG_CACHE_HOME/aria2/dht.dat and the +routing table for IPv6 DHT is saved to +$XDG_CACHE_HOME/aria2/dht6.dat unless files exist at +$HOME/.aria2/dht.dat or $HOME/.aria2/dht6.dat. aria2 uses same +port number to listen on for both IPv4 and IPv6 DHT.

+
+
+

UDP tracker

+

UDP tracker support is enabled when IPv4 DHT is enabled. The port +number of UDP tracker is shared with DHT. Use --dht-listen-port +option to change the port number.

+
+
+

Other things should be noted

+
    +
  • -o 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 +--index-out option instead.
  • +
  • The port numbers that aria2 uses by default are 6881-6999 for TCP +and UDP.
  • +
  • aria2 doesn't configure port-forwarding automatically. Please +configure your router or firewall manually.
  • +
  • The maximum number of peers is 55. This limit may be exceeded when +download rate is low. This download rate can be adjusted using +--bt-request-peer-speed-limit option.
  • +
  • As of release 0.10.0, aria2 stops sending request message after +selective download completes.
  • +
+
+
+ + +
+

netrc

+

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).

+
+
+

WebSocket

+

The WebSocket server embedded in aria2 implements the specification +defined in RFC 6455. The supported protocol version is 13.

+
+
+

libaria2

+

The libaria2 is a C++ library which offers aria2 functionality to the +client code. Currently, libaria2 is not built by default. To enable +libaria2, use --enable-libaria2 configure option. By default, +only the shared library is built. To build static library, use +--enable-static configure option as well. See libaria2 +documentation to know how to use API.

+
+ +
+ + diff --git a/aria2/aria2-1.36.0-win-64bit-build1/README.mingw b/aria2/aria2-1.36.0-win-64bit-build1/README.mingw new file mode 100644 index 0000000..ceb4d51 --- /dev/null +++ b/aria2/aria2-1.36.0-win-64bit-build1/README.mingw @@ -0,0 +1,57 @@ +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 +Debian Linux. + +* gcc-mingw-w64 10.2.1-6+24.2 +* g++-mingw-w64 10.2.1-6+24.2 +* binutils-mingw-w64-i686 2.35.2-2+8.11+b3 +* binutils-mingw-w64-x86-64 2.35.2-2+8.11+b3 + +The executable is statically linked, so no extra DLLs are +necessary. The linked libraries are: + +* gmp 6.2.1 +* expat 2.4.1 +* sqlite 3.36.0 +* zlib 1.2.11 +* c-ares 1.17.2 +* libssh2 1.9.0 (+ https://github.com/libssh2/libssh2/commit/ba149e804ef653cc05ed9803dfc94519ce9328f7.patch) + +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 diff --git a/aria2/aria2-1.36.0-win-64bit-build1/aria2c.exe b/aria2/aria2-1.36.0-win-64bit-build1/aria2c.exe new file mode 100644 index 0000000..38caa6a Binary files /dev/null and b/aria2/aria2-1.36.0-win-64bit-build1/aria2c.exe differ diff --git a/create_shortcut.vbs b/create_shortcut.vbs new file mode 100644 index 0000000..bc4a3de --- /dev/null +++ b/create_shortcut.vbs @@ -0,0 +1,7 @@ +Set oWS = WScript.CreateObject("WScript.Shell") +sLinkFile = oWS.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\Twitter Video Downloader.lnk" +Set oLink = oWS.CreateShortcut(sLinkFile) +oLink.TargetPath = oWS.ExpandEnvironmentStrings("%USERPROFILE%") & "\CascadeProjects\youtube_downloader\start.bat" +oLink.WorkingDirectory = oWS.ExpandEnvironmentStrings("%USERPROFILE%") & "\CascadeProjects\youtube_downloader" +oLink.Description = "Start Twitter Video Downloader" +oLink.Save diff --git a/export_cookies.py b/export_cookies.py new file mode 100644 index 0000000..d8039f0 --- /dev/null +++ b/export_cookies.py @@ -0,0 +1,55 @@ +import browser_cookie3 +import tempfile +import os + +def export_cookies(): + try: + # Try Chrome first + cookies = browser_cookie3.chrome(domain_name='.youtube.com') + cookies_file = os.path.join(tempfile.gettempdir(), 'youtube_cookies.txt') + + with open(cookies_file, 'w', encoding='utf-8') as f: + f.write("# Netscape HTTP Cookie File\n") + f.write("# https://curl.haxx.se/rfc/cookie_spec.html\n") + f.write("# This file was generated by browser_cookie3\n\n") + + for cookie in cookies: + if '.youtube.com' in cookie.domain: + secure = "TRUE" if cookie.secure else "FALSE" + http_only = "TRUE" if cookie.has_nonstandard_attr('HttpOnly') else "FALSE" + # Use a far future expiration date + expires = "1735689600" # 2025-01-01 + + f.write(f"{cookie.domain}\tTRUE\t{cookie.path}\t{secure}\t{expires}\t{cookie.name}\t{cookie.value}\n") + + print(f"Cookies saved to: {cookies_file}") + return cookies_file + except Exception as e: + print(f"Error with Chrome: {e}") + try: + # Try Edge if Chrome fails + cookies = browser_cookie3.edge(domain_name='.youtube.com') + cookies_file = os.path.join(tempfile.gettempdir(), 'youtube_cookies.txt') + + with open(cookies_file, 'w', encoding='utf-8') as f: + f.write("# Netscape HTTP Cookie File\n") + f.write("# https://curl.haxx.se/rfc/cookie_spec.html\n") + f.write("# This file was generated by browser_cookie3\n\n") + + for cookie in cookies: + if '.youtube.com' in cookie.domain: + secure = "TRUE" if cookie.secure else "FALSE" + http_only = "TRUE" if cookie.has_nonstandard_attr('HttpOnly') else "FALSE" + # Use a far future expiration date + expires = "1735689600" # 2025-01-01 + + f.write(f"{cookie.domain}\tTRUE\t{cookie.path}\t{secure}\t{expires}\t{cookie.name}\t{cookie.value}\n") + + print(f"Cookies saved to: {cookies_file}") + return cookies_file + except Exception as e: + print(f"Error with Edge: {e}") + return None + +if __name__ == '__main__': + export_cookies() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..082a12b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +flask==3.1.0 +yt-dlp==2024.3.10 +requests==2.31.0 +browser-cookie3==0.19.1 +flask-cors==4.0.0 diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..c406bdb --- /dev/null +++ b/start.bat @@ -0,0 +1,4 @@ +@echo off +call .\venv\Scripts\activate.bat +python app.py +pause diff --git a/start.ps1 b/start.ps1 new file mode 100644 index 0000000..4d50452 --- /dev/null +++ b/start.ps1 @@ -0,0 +1,3 @@ +.\venv\Scripts\Activate.ps1 +python app.py +pause \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..e79d274 --- /dev/null +++ b/static/favicon.ico @@ -0,0 +1,46 @@ + + + + + + X / ? + + + + + +
+ + + + + +
+
+
+ + + +

Nothing to see here

+

Looks like this page doesn’t exist. Here’s a picture of a poodle sitting in a chair for your trouble.

+ + Looking for this? + +
+ A primped poodle with a bow in its hair sitting in a chair like a human. + +
+ + + diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..ec8df33 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/x-logo.svg b/static/x-logo.svg new file mode 100644 index 0000000..ad1fd68 --- /dev/null +++ b/static/x-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..f6dc309 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,169 @@ + + + + X/Twitter 视频下载 + + + + +
+ +

X/Twitter 视频下载器

+ +
+ + +
+
+
+
+
+
+
+ + + + diff --git a/test.py b/test.py new file mode 100644 index 0000000..965a62a --- /dev/null +++ b/test.py @@ -0,0 +1,10 @@ +from flask import Flask + +app = Flask(__name__) + +@app.route('/') +def hello(): + return 'Hello, World!' + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/test_flask.py b/test_flask.py new file mode 100644 index 0000000..4cf0fc2 --- /dev/null +++ b/test_flask.py @@ -0,0 +1,10 @@ +from flask import Flask + +app = Flask(__name__) + +@app.route('/') +def hello(): + return "Hello, World!" + +if __name__ == '__main__': + app.run(debug=True, port=5000)