You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kodi插件开发求助:调用xbmcplugin.setResolvedUrl()报无效句柄-1

搞定Kodi插件图片显示的问题

首先得理清一个核心误区:你用错函数了!xbmcplugin.setResolvedUrl() 是专门给**可播放媒体(视频、音频)**用的——它的作用是告诉Kodi“这个列表项对应的播放流地址是啥”,完全不适合用来展示静态图片。这就是你遇到一系列问题的根源,咱们一步步拆解:

为什么会出现 Attempt to use invalid handle -1

这个错误本质是你调用 setResolvedUrl 时传入的handle参数不对。Kodi插件的handle是启动时从 sys.argv[1] 获取的整数(比如 handle = int(sys.argv[1])),你要么没正确传递这个handle,要么在错误的上下文里调用了这个函数,导致Kodi识别到无效的handle值-1。

加了 li.setProperty("IsPlayable", "true") 后错误消失但图片不显示?

你把列表项标记为“可播放”后,Kodi就切换到了媒体播放流程,不再走目录展示的逻辑。但图片不是可播放媒体,setResolvedUrl 拿到图片URL后无法处理,自然就不会显示任何内容——错误是被掩盖了,但问题根本没解决。

正确的图片展示方式

根据你的需求,分两种场景给你正确的代码示例:

场景1:在插件目录里展示带缩略图的图片项

如果只是想把图片作为目录列表里的一个项(带缩略图),用 setArt() 给列表项设置缩略图即可:

import sys
import xbmcgui
import xbmcplugin

# 必须获取正确的插件handle
handle = int(sys.argv[1])

def add_image_entry():
    # 创建列表项
    list_item = xbmcgui.ListItem(label="我的图片")
    # 设置图片作为缩略图和图标
    list_item.setArt({
        "thumb": "/path/to/your/image.jpg",
        "icon": "/path/to/your/image.jpg"
    })
    # 添加到目录,第三个参数False表示这不是子目录
    xbmcplugin.addDirectoryItems(handle, [(sys.argv[0], list_item, False)])
    # 结束目录加载
    xbmcplugin.endOfDirectory(handle)

add_image_entry()

场景2:点击项后直接打开图片查看器

如果想让用户点击后直接查看图片,调用Kodi内置的 ShowPicture 功能即可,完全不需要碰 setResolvedUrl

import sys
import xbmcgui
import xbmcplugin
import xbmc

handle = int(sys.argv[1])
IMAGE_PATH = "/path/to/your/image.jpg"

def open_image_viewer():
    # 调用Kodi内置图片查看器打开图片
    xbmc.executebuiltin(f"ShowPicture({IMAGE_PATH})")

def build_menu():
    list_item = xbmcgui.ListItem(label="查看图片")
    list_item.setArt({"thumb": IMAGE_PATH, "icon": IMAGE_PATH})
    # 给列表项绑定点击动作(通过URL参数传递)
    url = f"{sys.argv[0]}?action=show_image"
    xbmcplugin.addDirectoryItems(handle, [(url, list_item, False)])
    xbmcplugin.endOfDirectory(handle)

# 处理URL参数
if "action=show_image" in sys.argv[2]:
    open_image_viewer()
else:
    build_menu()

关键总结

  1. 别再用 xbmcplugin.setResolvedUrl() 处理图片了,它只给视频/音频用;
  2. 目录项的缩略图用 ListItem.setArt() 设置;
  3. 要打开图片查看器,调用Kodi的 ShowPicture 内置函数;
  4. 所有插件相关函数(addDirectoryItems/endOfDirectory等)必须用正确的handle(从 sys.argv[1] 获取);
  5. 只有当列表项是可播放媒体时,才设置 IsPlayable=true,别乱加。

内容的提问来源于stack exchange,提问作者Etchot

火山引擎 最新活动