alist下载

news/2025/1/18 21:14:33/文章来源:https://www.cnblogs.com/meetrice/p/18678876
import requests
import os
from tqdm import tqdmdef get_token(alist_url, username, password):"""登录并获取token"""login_url = f"{alist_url}/api/auth/login"data = {"username": username,"password": password}response = requests.post(login_url, json=data)if response.status_code == 200:return response.json()["data"]["token"]raise Exception("登录失败")def download_file(alist_url, token, file_path, save_path):"""下载文件"""headers = {"Authorization": token}# 获取文件下载链接fs_url = f"{alist_url}/api/fs/get"params = {"path": file_path}response = requests.get(fs_url, headers=headers, params=params)if response.status_code == 200:download_url = response.json()["data"]["raw_url"]# 获取文件大小response = requests.get(download_url, stream=True)total_size = int(response.headers.get('content-length', 0))# 在进度条之前只显示一次文件名print(f"\n正在下载: {os.path.basename(file_path)}")# 使用tqdm创建进度条,不再显示文件名progress_bar = tqdm(total=total_size,unit='iB',unit_scale=True,leave=True,ncols=100,bar_format='{percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}]'  # 移除desc
        )# 下载文件并更新进度条with open(save_path, 'wb') as f:for chunk in response.iter_content(chunk_size=8192):size = f.write(chunk)progress_bar.update(size)progress_bar.close()# 下载完成后再打印一个换行print("")if total_size != 0 and progress_bar.n != total_size:return Falsereturn Truereturn Falsedef list_directory(alist_url, token, dir_path):"""列出目录内容"""headers = {"Authorization": token}fs_list_url = f"{alist_url}/api/fs/list"params = {"path": dir_path}response = requests.post(fs_list_url, headers=headers, json=params)if response.status_code == 200:return response.json()["data"]["content"]return []def recursive_download(alist_url, token, current_path, base_save_path, target_keyword, level=0):"""递归遍历目录并下载符合条件的文件"""items = list_directory(alist_url, token, current_path)indent = "  " * levelprint(f"{indent}📁 当前目录: {current_path}")# 如果关键字为空,则不检查目录名is_target_dir = True if not target_keyword else target_keyword in os.path.basename(current_path)for item in items:# 统一使用正斜杠item_path = os.path.join(current_path, item["name"]).replace("\\", "/")if item["is_dir"]:recursive_download(alist_url, token, item_path, base_save_path, target_keyword, level + 1)else:file_size = f"({item.get('size', 0)} bytes)"if is_target_dir and item["name"].lower().endswith('.mp4'):# 处理保存路径,统一使用正斜杠relative_path = item_path.lstrip("/")save_path = os.path.join(base_save_path, *relative_path.split("/"))# 确保目录存在,使用规范化的路径save_dir = os.path.dirname(save_path)if not os.path.exists(save_dir):try:os.makedirs(save_dir, exist_ok=True)except Exception as e:print(f"{indent}    ❌ 创建目录失败: {save_dir}")print(f"{indent}    错误信息: {str(e)}")continueif os.path.exists(save_path):print(f"{indent}  📄 文件: {item['name']} {file_size} - 已存在,跳过下载")continuematching_info = f"- 匹配目录关键字「{target_keyword}」" if target_keyword else "- 所有MP4文件"print(f"{indent}  📄 文件: {item['name']} {file_size} {matching_info}")if download_file(alist_url, token, item_path, save_path):print(f"{indent}    ✅ 成功下载: {item_path}")else:print(f"{indent}    ❌ 下载失败: {item_path}")else:print(f"{indent}  📄 文件: {item['name']} {file_size}")def main():# Alist服务器配置ALIST_URL = "http://localhost:5244"USERNAME = "admin"PASSWORD = "123456"# 基础保存路径,确保使用正斜杠BASE_SAVE_PATH = "d:/videos"  # 修改这里,使用正斜杠TARGET_KEYWORD = ""  # 如果需要下载所有mp4文件,将此值设为空字符串 ""try:token = get_token(ALIST_URL, USERNAME, PASSWORD)keyword_info = f"关键字「{TARGET_KEYWORD}」" if TARGET_KEYWORD else "所有MP4文件"print(f"开始扫描目录... 查找{keyword_info}")recursive_download(ALIST_URL, token, "/", BASE_SAVE_PATH, TARGET_KEYWORD)print("\n所有文件处理完成")except Exception as e:print(f"发生错误: {str(e)}")if __name__ == "__main__":main()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 7

1月17日,继续看了一些SpringBoot视频, SpringBoot的实现步骤SpringBoot项目的起步依赖 <!-- springboot工程需要继承的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifac…

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴 官网:https://vxetable.cn<template><div><vxe-gridref="gridRef"v-bind="gridOptions"@cell-area-selection-end="cellAreaSelectionEndEvent"@cell-area-extensio…

树(基础)

树 1 定义 1.1 树是什么 树是一种数据结构,因为形似倒着的树而得名. 1.2 树的定义 递归定义 1.2.1 有根树的定义 形象化的,如图1,有根树存在根节点这一定义,从根节点可以分出任意个分支,这任意个分支又可以继续细分,分出的节点称为“子节点”。抽象化的,树也是\(N\)…

Java五子棋源码联网版+Socket+Swing+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 Java五子棋源码联网版 源码,看图: 实现了服务端和客户端。是联网版游戏基础模型。环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git整体代码结构服务器采…

Java源码:实现斗地主游戏+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 斗地主 源码,看图:视频演示效果 https://githubs.xyz/show/5.mp4 环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git项目结构 代码十分简洁,只有简单的7个…

文件蜈蚣 后台偷跑流量

我已经好久没有打开这个软件了,期间重启了很多次,他有一个服务应该开机时就启动,后台偷跑流量 filec.exe文件。 因为我没什么什么上传流量也很大,最终定位到这个文件在偷跑了。

windows安装ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 ffmpeg安装 打开 FFmpeg 官网,选择下载。 选择 Windows 平台,下面有两个链接,都是可以的,选择其一。 本文以点…

Java源码:坦克大战+swing界面+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 坦克大战 源码,看图: 演示视频 https://githubs.xyz/show/22.mp4 环境 JDK1.8 实现步骤代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git启动类 启动类是 TankCline…

免费下载CapCut海外版,解锁剪映VIP功能无广告

大家好,今天给大家带来一个超级实用的教程——剪映海外版 CapCut 下载:免费解锁剪映 VIP 功能的完整步骤!剪映是目前非常流行的视频编辑软件,它让我们的短视频创作变得更加简单和高效。不管是记录生活点滴、制作旅行回忆,还是做一些创意短视频,剪映都提供了非常强大的功能…

Java源码:植物大战僵尸 + 大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 植物大战僵尸源码,看图:视频演示 https://githubs.xyz/show/175.mp4 环境 JDK1.8代码采用原生java类库编写,完整源码获取地址: gitee.com/hadluo/java_game01.git类继承UML图源码实现 我们先从main函数看起,继承了…

Linux搭建Slurm和pbs单机版

SlurmSlurm 是高性能计算集群的出色工作调度工具。此外,当你需要同时运行多个程序并将它们排成队列,同时确保计算机或服务器不超载时,它也是本地台式机或单台服务器上的重要工具。此外,在与其他用户共享服务器或需要通宵或连续数周运行多个工作时,它也非常有用!在这里,我…

Java游戏源码:天天酷跑+大学生学习源码

学习java朋友们,福利来了,今天小编给大家带来了一款天天酷跑源码。注意:此源码仅供学习使用!!视频演示 https://githubs.xyz/show/209.mp4 源码搭建和讲解 代码采用原生java类库编写, 利用java swing作为界面框架,完整源码获取地址: gitee.com/hadluo/java_game01.git 启…