DeepSeek与NAS结合下载影片

以下是实现通过 DeepSeek 控制 NAS 工具链的完整方案,实现自然语言指令触发影视下载、刮削并同步至 Jellyfin 的自动化流程:


1. 架构设计

graph LR A[用户指令] --> B(DeepSeek NLP解析) B --> C{指令类型} C -->|影视下载| D[生成下载任务] C -->|状态查询| E[查询系统状态] D --> F[调用NAS Tools API] F --> G[触发qBittorrent下载] G --> H[自动刮削重命名] H --> I[Jellyfin媒体库更新]

2. DeepSeek 服务部署

2.1 创建专用 Docker 容器

在现有 docker-compose.yml 中添加:

deepseek:
  image: deepseek-image:latest  # 需自定义或使用开源NLP镜像
  volumes:
    - ./deepseek/config:/app/config
    - /var/run/docker.sock:/var/run/docker.sock  # 谨慎授权
  environment:
    - NASTOOLS_API=http://nastools:3000
    - JELLYFIN_API=http://jellyfin:8096
  networks:
    - internal_net
  restart: unless-stopped

2.2 权限控制

# 创建低权限用户
sudo useradd -r -s /bin/false deepseek
# 允许执行特定命令
echo "deepseek ALL=(root) NOPASSWD: /usr/bin/docker exec nastools" >> /etc/sudoers

3. 指令解析与任务生成

3.1 自然语言处理模块(Python示例)

# nlp_processor.py
import re
from spacy import load

nlp = load("zh_core_web_sm")

def parse_command(text):
    doc = nlp(text)
    action = None
    target = None
    
    # 识别动作关键词
    action_keywords = {'下载', '查找', '播放', '删除'}
    for token in doc:
        if token.text in action_keywords:
            action = token.text
        if token.ent_type_ == "WORK_OF_ART":  # 识别作品名称
            target = token.text
    
    return {"action": action, "target": target}

# 示例:解析 "帮我下载星际穿越"
# 输出 {'action': '下载', 'target': '星际穿越'}

3.2 任务队列实现

使用 Redis 作为任务队列:

# docker-compose.yml 新增
redis:
  image: redis:alpine
  volumes:
    - redis_data:/data
  networks:
    - internal_net

volumes:
  redis_data:

4. NAS Tools 接口调用

4.1 模拟人工操作(浏览器自动化)

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

def trigger_download(movie_name):
    opts = Options()
    opts.headless = True
    driver = Firefox(options=opts)
    
    try:
        driver.get("http://nastools:3000/")
        # 登录操作
        driver.find_element("id", "username").send_keys("admin")
        driver.find_element("id", "password").send_keys("your_password")
        driver.find_element("id", "login-btn").click()
        
        # 添加下载任务
        driver.find_element("xpath", "//button[contains(text(),'手动添加')]").click()
        driver.find_element("name", "title").send_keys(movie_name)
        driver.find_element("xpath", "//input[@value='电影']").click()
        driver.find_element("id", "confirm-btn").click()
        
    finally:
        driver.quit()

4.2 直接数据库操作(备用方案)

import psycopg2

def add_download_task(movie_name):
    conn = psycopg2.connect(
        host="postgres",
        database="main_db",
        user="admin",
        password="your_strong_password"
    )
    cur = conn.cursor()
    
    # 插入下载任务记录(需根据NAS Tools实际表结构调整)
    cur.execute("""
        INSERT INTO download_tasks 
        (title, type, status) 
        VALUES (%s, 'movie', 'pending')
    """, (movie_name,))
    
    conn.commit()
    cur.close()
    conn.close()

5. 安全通信机制

5.1 JWT 身份验证

# DeepSeek API 服务端
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.post("/command")
async def handle_command(
    command: str, 
    token: str = Depends(oauth2_scheme)
):
    # 验证令牌有效性
    if not validate_token(token):
        raise HTTPException(status_code=403)
    
    # 处理指令逻辑
    return process_command(command)

5.2 访问控制列表(ACL)

# 使用 iptables 限制访问
sudo iptables -A INPUT -p tcp --dport 8000 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8000 -j DROP

6. 完整工作流程示例

  1. 用户发送指令

    curl -X POST http://deepseek:8000/command \
         -H "Authorization: Bearer YOUR_TOKEN" \
         -d "请下载《奥本海默》并更新到影视库"
    
  2. DeepSeek 处理流程

    def process_command(command):
        # 自然语言解析
        parsed = parse_command(command)
        
        # 生成下载任务
        if parsed["action"] == "下载":
            add_download_task(parsed["target"])
            
            # 监控任务状态
            while True:
                status = check_download_status(parsed["target"])
                if status == "completed":
                    trigger_jellyfin_refresh()
                    return {"status": "success"}
                elif status == "failed":
                    return {"status": "failed"}
                time.sleep(60)
    
  3. Jellyfin 媒体库刷新

    import requests
    
    def trigger_jellyfin_refresh():
        headers = {"X-Emby-Token": "YOUR_JELLYFIN_API_KEY"}
        response = requests.post(
            "http://jellyfin:8096/Library/Refresh",
            headers=headers
        )
        return response.status_code == 204
    

7. 监控与日志

7.1 可视化监控(Grafana)

# docker-compose.yml 新增
grafana:
  image: grafana/grafana:latest
  ports:
    - "3001:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  networks:
    - internal_net

7.2 日志聚合

# 使用 Loki + Promtail
docker run -d --name loki -p 3100:3100 grafana/loki
docker run -d --name promtail --link loki -v /var/log:/var/log grafana/promtail -config.file=/etc/promtail/config.yml

8. 高级功能扩展

8.1 语音指令支持

import speech_recognition as sr

def speech_to_text(audio_file):
    r = sr.Recognizer()
    with sr.AudioFile(audio_file) as source:
        audio = r.record(source)
    return r.recognize_google(audio, language="zh-CN")

8.2 自动字幕下载

def download_subtitle(movie_path):
    from subprocess import run
    run([
        "subliminal", "download",
        "-l", "zh",
        "--providers", "opensubtitles",
        movie_path
    ])

关键安全配置

  1. 容器隔离

    # 在 docker-compose.yml 中限制权限
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    
  2. 定期凭证轮换

    # 使用 Vault 管理密钥
    docker run -d --name vault -p 8200:8200 vault server -dev
    
  3. 网络分段

    networks:
      media_net:
        driver: bridge
        internal: true
      public_net:
        driver: bridge
    

通过以上方案,您可以通过自然语言指令实现:

  1. 影视资源自动搜索下载(下载《流浪地球2》
  2. 智能重命名与元数据刮削
  3. 自动触发 Jellyfin 媒体库更新
  4. 实时任务状态查询(《奥本海默》下载进度如何?

建议配合硬件加速(如 Intel QuickSync)提升媒体处理效率,并通过 Telegram/Discord 机器人接口扩展指令输入渠道。

posted @ 2025-02-11 16:37  BaldButStrong  阅读(83)  评论(0)    收藏  举报