DLNA控制点服务器

一个UPnP/DLNA控制点服务器,用于发现网络中的渲染器和媒体服务器,支持无缝队列播放和内容库浏览。

  • by ebongard
  • Python
  • 混合部署
  • 1 星标
  • 更新于
在 GitHub 查看 ebongard/renfield-mcp-dlna

使用说明

伦菲尔德mcp dlna

充当UPnP/DLNA的MCP服务器 控制点:发现渲染器 和 MediaServers通过SSDP向渲染器播放无缝队列,并浏览内容 图书馆。每设备类后端覆盖标准DLNA AVTransport、OpenHome (Linn,本地设备端队列)和Sonos(通过 soco).

内容可以来自任何MediaServer的ContentDirectory(例如Jellyfin的内置目录) DLNA服务器)通过 play_from_server,或通过以下方式从呼叫者提供的URL获取 play_tracks.

工具

渲染器(播放)

工具 说明
list_renderers 在网络上发现DLNA渲染器(5分钟缓存);报告 supports_queue
play_tracks 播放无缝队列的曲目列表(SetNextAVTransportURI)
stop 停止播放并清空队列
pause / resume 暂停/恢复播放
next_track / previous_track 跳到下一首/上一首曲目
seek 在当前轨迹内寻找一个位置(秒)
set_play_mode 设置播放模式: normal/repeat_one/repeat_all/shuffle/random (单UPnP播放模式,门控开启 valid_play_modes)
get_status 状态、跟踪信息、队列位置, 位置/持续时间/功能/音量/静音/有效播放模式
set_volume / get_volume 设置/获取音量(0-100)
set_mute / get_mute 静音/取消静音/查询静音

媒体服务器(内容库)

工具 说明
list_servers 在网络上发现DLNA媒体服务器(ContentDirectory)
browse_server 列出库容器的子项(分页; object_id "0" =根)
search_server 按标题搜索库(功能门控)
play_from_server 解析库对象(专辑/播放列表/曲目)并在渲染器上播放它——不需要调用方URL

安装

pip install .

用法

stdio(默认值--用于MCP子流程)

renfield-mcp-dlna
# or
python -m renfield_mcp_dlna

流式http(独立服务)

MCP_TRANSPORT=streamable-http MCP_PORT=9091 renfield-mcp-dlna

服务器正在监听 http://0.0.0.0:9091/mcp (可通过以下方式配置 MCP_HOST 和 MCP_PORT).

环境变量

变量 默认值 描述
MCP_TRANSPORT stdio 运输: stdio 或 streamable-http
MCP_HOST 0.0.0.0 绑定地址(仅限可流式传输的http)
MCP_PORT 9091 监听端口(仅限可流式传输的http)
DLNA_LISTEN_IP auto 覆盖用于UPnP事件回调URL的本地IP(多宿主主机)
RENFIELD_OPENHOME on OpenHome渲染器(Linn)默认使用本地播放列表后端(经过硬件验证);集 0 回到AVTransport
RENFIELD_SONOS 未设置 1 将Sonos渲染器路由到 soco-后端支持(暂定;需要 .[sonos])

部署

SSDP组播(239.255.255.250:1900)要求 局域网接入,所以这个服务器 必须共享主机的网络——可以直接在主机上运行,也可以在 集装箱 主机网络 (docker run --network host /库贝内特斯 hostNetwork: true).网桥/NAT网络上的容器看不到SSDP,也不会看到 发现渲染器。(运行在长寿命 streamable-http 运输也 启用被动SSDP实时缓存+会话监视器。)

码头工人

专用图像由包含的内容构建 Dockerfile (默认为 streamable-http 上 0.0.0.0:9091):

docker build -t renfield-mcp-dlna .
docker run --rm --network host renfield-mcp-dlna

要获得Sonos支持,请使用额外功能进行构建:添加 RUN pip install '.[sonos]' 或设置 RENFIELD_SONOS=1 针对包含以下内容的图像 soco.

systemd服务

# /etc/systemd/system/renfield-mcp-dlna.service
[Unit]
Description=Renfield DLNA MCP Server
After=network.target

[Service]
Type=simple
User=your-user
Environment=MCP_TRANSPORT=streamable-http
Environment=MCP_PORT=9091
Environment=MCP_HOST=0.0.0.0
ExecStart=/home/your-user/.local/bin/renfield-mcp-dlna
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now renfield-mcp-dlna

Renfield配置

在 config/mcp_servers.yaml:

- name: dlna
  transport: streamable_http
  url: "${DLNA_MCP_URL:-http://host.docker.internal:9091/mcp}"
  enabled: "${DLNA_MCP_ENABLED:-false}"

在 .env:

DLNA_MCP_ENABLED=true
# DLNA_MCP_URL=http://host.docker.internal:9091/mcp  # default

建筑

DLNA Renderers (LAN)          DLNA MCP Server (Host)         Renfield Backend (Docker)
  Linn, Samsung TV, etc.       SSDP discovery + UPnP           MCP client
        ↑                            ↑                              ↑
        │  SSDP Multicast            │  streamable-http             │
        │  239.255.255.250:1900      │  :9091/mcp                   │
        └────────────────────────────┘                              │
                                     └──────────────────────────────┘
                                      host.docker.internal:9091/mcp

依赖项

  • mcp>=1.26.0 --模型上下文协议SDK
  • async-upnp-client>=0.47.0 --UPnP/SSDP客户端(DmrDevice/DmsDevice、播放模式、元数据协商)
  • python-didl-lite>=1.4.0 --用于UPnP元数据的DIDL Lite XML
  • aiohttp>=3.9.0 --异步HTTP用于获取设备描述
  • defusedxml>=0.7 --(局域网恶搞)设备描述的强化XML解析
  • ifaddr>=0.2 --用于多接口SSDP发现的本地接口枚举

可选: pip install '.[sonos]' 添加 soco>=0.30 Sonos后端(暂定)。