NASSAV 是一个基于 Python 开发的多源影视资源下载管理工具,支持从多个数据源自动下载、整理和刮削影视资源。
项目采用模块化设计,支持自定义下载器,并提供了完整的元数据管理功能和配套服务。
- 🎥 多源下载支持:支持 MissAV、Jable、HohoJ、Memo (持续添加中)等多个数据源
- 📝 智能元数据管理:从JavBus自动获取影片信息、封面、海报等元数据
- 🔄 队列管理:支持批量下载任务管理。使用sqlite去重,防止重复下载
- 🌐 远程控制:提供 HTTP API 接口,支持远程控制下载任务
- 🔒 文件锁机制:确保同一时间只有一个下载任务运行
- 🎨 媒体服务器兼容:自动生成 NFO 文件,支持主流媒体服务器
- 稳定的网络连接和代理服务
- Python 3.11.2 或更高版本
- FFmpeg
- Go 1.22.6 或更高版本(仅用于编译 HTTP 服务器)
- 克隆项目并安装依赖:
git clone https://github.com/Satoing/NASSAV.git
cd NASSAV
pip3 install -r requirements.txt
- 安装 FFmpeg:
sudo apt install ffmpeg
- 配置项目:
- 复制
cfg/configs.json.example
为cfg/configs.json
- 修改配置文件中的关键参数:
SavePath
:设置视频保存路径Proxy
:配置代理服务器地址(如果不需要使用代理,设置成""即可)Downloader
:配置下载器及其优先级IsNeedVideoProxy
:下载视频是否优先使用代理(最终都会尝试使用代理和不使用代理)
- 复制
- 初始化,修改配置文件。主要关注的字段:
- SavePath:下载保存的位置
- Proxy:http代理服务器url(如果不需要使用代理,设置成""即可)
- IsNeedVideoProxy:下载视频是否使用代理
{
"LogPath": "./logs",
"SavePath": "/vol2/1000/MissAV",
"DBPath": "./db/downloaded.db",
"QueuePath": "./db/download_queue.txt",
"Proxy": "http://127.0.0.1:7897",
"IsNeedVideoProxy": false,
}
- 如果本地已有资源,需要先整理目录结构,车牌号大写作为文件夹名字,视频同名放在文件夹里面:
...
├── SVGAL-009
│ └── SVGAL-009.mp4
├── STCVS-007
│ └── STCVS-007.mp4
...
然后执行python3 metadata.py
,爬取元数据。最后生成的目录结构:
...
├── SVGAL-009
│ ├── metadata.json
│ ├── SVGAL-009-fanart.jpg
│ ├── SVGAL-009.mp4
│ ├── SVGAL-009.nfo
│ └── SVGAL-009-poster.jpg
├── thumb
│ ├── JULIA.jpg
│ ├── ちゃんよた.jpg
│ ├── 七森莉莉.jpg
│ ├── 七泽米亚.jpg
...
- 下载单个资源:
python3 main.py <车牌号>
- 强制下载(忽略重复检查——下载过程中ctrl-c就会出现这种情况):
python3 main.py <车牌号> -f
-
前置作業如基本使用
-
Build Docker (初次使用才需要)
(sudo) docker build -t nassav .
- 下載
(sudo) docker run --rm -v "<本機存片位置>:<cfg/configs.json存片位置>" nassav <車號>
- 将车牌号添加到
db/download_queue.txt
中 - 设置定时任务:
20 * * * * cd /path/to/NASSAV && bash cron_task.sh
- 编译并启动 HTTP 服务器:
cd backend
go build -o main
./main
- 发送下载请求:
curl -X POST http://127.0.0.1:49530/process -d "车牌号"
刮削时下载了大量fanart,故提供一个网页预览。
后端提供了两个API:
- 获取车牌号列表:/api/videos
- 获取车牌号详细信息:/api/videos/FPRE-017
请求结果如下:
/api/videos
-----------------------------
[{"id":"ACHJ-057","title":"ACHJ-057 時には勝手に痴女りたい…。Madonna専属 究極美熟女『めぐり』お貸ししますー。","poster":"/file/ACHJ-057/ACHJ-057-poster.jpg"},{"id":"ADN-604","title":"ADN-604 お義父さんは私の事、どう思ってますか? 七海ティナ","poster":"/file/ADN-604/ADN-604-poster.jpg"},{"id":"AGAV-122","title":"AGAV-122 顔で抜く!!顔面ドアップPOV 関西弁でイチャサド射精管理してくる年上彼女との同棲生活 流川莉央","poster":"/file/AGAV-122/AGAV-122-poster.jpg"},...]
/api/videos/FPRE-017
-----------------------------
{"id":"FPRE-017","title":"FPRE-017 爆乳セレブ痴女に見つめられて犯●れたい 菊乃らん","releaseDate":"2024-02-02","fanarts":["/file/FPRE-017/FPRE-017-fanart-1.jpg","/file/FPRE-017/FPRE-017-fanart-10.jpg","/file/FPRE-017/FPRE-017-fanart-11.jpg","/file/FPRE-017/FPRE-017-fanart-12.jpg","/file/FPRE-017/FPRE-017-fanart-13.jpg","/file/FPRE-017/FPRE-017-fanart-14.jpg","/file/FPRE-017/FPRE-017-fanart-15.jpg","/file/FPRE-017/FPRE-017-fanart-16.jpg","/file/FPRE-017/FPRE-017-fanart-17.jpg","/file/FPRE-017/FPRE-017-fanart-18.jpg","/file/FPRE-017/FPRE-017-fanart-19.jpg","/file/FPRE-017/FPRE-017-fanart-2.jpg","/file/FPRE-017/FPRE-017-fanart-20.jpg","/file/FPRE-017/FPRE-017-fanart-21.jpg","/file/FPRE-017/FPRE-017-fanart-3.jpg","/file/FPRE-017/FPRE-017-fanart-4.jpg","/file/FPRE-017/FPRE-017-fanart-5.jpg","/file/FPRE-017/FPRE-017-fanart-6.jpg","/file/FPRE-017/FPRE-017-fanart-7.jpg","/file/FPRE-017/FPRE-017-fanart-8.jpg","/file/FPRE-017/FPRE-017-fanart-9.jpg","/file/FPRE-017/FPRE-017-fanart.jpg"],"videoFile":"/file/FPRE-017/FPRE-017.mp4"}
据此使用Vue实现一个前端,预览list和detail。
前端部署方式:
- 先调整
frontend/src/api/videos.js
中后端的配置:
import axios from 'axios'
const API_BASE = 'http://192.168.31.61:31471' // 改成自己的ip
- 重新生成静态文件到dist目录下:
cd frontend
npm run build
- 使用nginx部署静态网页:
127.0.0.1:5177
在 configs.json
中可以配置多个下载源及其优先级:
"Downloader": [
{
"downloaderName": "MissAV",
"domain": "missav.ai",
"weight": 300
},
{
"downloaderName": "Jable",
"domain": "jable.tv",
"weight": 500
},
{
"downloaderName": "HohoJ",
"domain": "hohoj.tv",
"weight": 0
}
]
-
MissAV
- 优点:资源全面,反爬限制较少
- 缺点:清晰度一般(720p-1080p)
-
Jable
- 优点:中文字幕资源多,清晰度高(1080p)
- 缺点:反爬限制较严格
-
HohoJ
- 优点:清晰度高(1080p),基本无反爬限制
- 缺点:中文字幕资源较少
-
Memo
- 优点:资源较新,更新及时
- 缺点:部分资源需要会员
- 在
src/downloader/
目录下创建新的下载器类 - 继承
Downloader
基类,实现必要的方法:getDownloaderName()
getHTML()
parseHTML()
- 在
DownloaderMgr
中注册新下载器 - 在配置文件中添加相应的配置项
示例代码:
class NewDownloader(Downloader):
def getDownloaderName(self) -> str:
return "NewDownloader"
def getHTML(self, avid: str) -> Optional[str]:
# 实现获取HTML的逻辑
pass
def parseHTML(self, html: str) -> Optional[AVDownloadInfo]:
# 实现解析HTML的逻辑
pass
- 使用本项目需要稳定的代理服务
- 请遵守相关法律法规,合理使用本工具
- 建议定期备份数据库文件
- 下载过程中请确保网络稳定
- 下载频率不要过高。否则会被cloudflare安排进贤者时间
本项目采用 MIT 许可证。详见 LICENSE 文件。