用途
dlna 用于控制本地网络中的 DLNA/UPnP MediaRenderer 设备,例如智能电视、支持 DLNA 的音箱或回音壁、以及其他 UPnP MediaRenderer 设备。它可以帮助你在命令行或 Python 代码中完成设备发现与媒体播放控制。
主要能力
- 发现设备:扫描本地网络中的 DLNA 设备。
- 播放媒体:将媒体 URL 推送到指定设备或默认设备上播放。
- 停止播放:停止设备上的播放。
- 查询状态:获取设备当前的播放状态。
- 配置默认设备:设置、查看或清除默认设备,设置后播放无需重复指定设备名。
命令一览
| 命令 | 说明 |
|---|---|
discover |
扫描 DLNA 设备 |
play <url> [device] |
在设备上播放媒体 URL |
stop [device] |
停止播放 |
status [device] |
获取播放状态 |
config |
显示配置 |
config --device <name> |
设置默认设备 |
config --unset-device |
清除默认设备 |
使用方式
快速开始示例:
# Discover devices
uv run dlna discover
# Set default device (optional but convenient)
uv run dlna config --device "HT-Z9F"
# Play with default device (no need to specify device name)
uv run dlna play "http://example.com/video.mp4"
# Or play with specific device
uv run dlna play "http://example.com/video.mp4" "Living Room TV"
停止播放:
uv run dlna stop
配置默认设备保存在技能目录下的 .dlna/config.json:
# Set default device
uv run dlna config --device "HT-Z9F"
# Show current config
uv run dlna config
# Clear default device
uv run dlna config --unset-device
播放本地文件
DLNA 设备只能播放 URL,不能播放本地文件路径。要播放本地文件,需要先通过 HTTP 服务把文件提供为 URL。
建议使用后台任务启动 HTTP 服务器,这样可以:
- 避免僵尸进程:会话结束时服务器自动终止;
- 资源管理清晰:服务器生命周期与会话绑定;
- 避免端口冲突:完成后服务器停止,释放端口。
示例步骤:
- 在后台启动 HTTP 服务器(后台运行,会话结束时自动停止)。
- 获取本机 IP:
import socket
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
- 构造 URL 并播放:
url = f"http://{get_ip()}:8000/video.mp4"
# uv run dlna play url
Python API
import asyncio
from dlna import discover_devices, find_device, play_url, set_default_device
async def main():
# Set default device
set_default_device("Living Room TV")
# Find device (uses default if no name provided)
device = await find_device() # Uses default
if device:
# Play remote URL
await play_url(device, "http://example.com/video.mp4")
asyncio.run(main())
支持的设备
- 智能电视(Sony、Samsung、LG 等)
- 支持 DLNA 的回音壁与音箱
- 任何 UPnP MediaRenderer 设备
限制
- DLNA 设备只能播放 URL,不能直接播放本地文件路径,播放本地文件需自行搭建 HTTP 服务。
- 关于收费、价格、平台支持范围等更多信息,暂未提供。