http://bbs.htpc1.com/archiver/tid-198731-page-3.html
三、构建多级目录(上)
假设有这样一个视频网站,网站首页上有3大栏目,进入大栏目可看到5个小栏目,小栏目再进去可以看到10个视频链接。针对网站这样的布局,很容易设想出要做的视频插件要有3级目录,进入到第3级,也就是末级,才开始观看视频。
在做这样的插件前,我们必须首先学习xbmcplugin.addDirectoryItem()这个函数的用法,这是构建目录时用到的最为关键的一个函数。
先看函数的原型(原文在[url=http://xbmc.sourceforge.net/python-docs/xbmcplugin.html]这里[/url])
[quote]addDirectoryItem(handle, url, listitem [,isFolder, totalItems]) -- Callback function to pass directory contents back to XBMC.
- Returns a bool for successful completion.
handle : integer - handle the plugin was started with.
url : string - url of the entry. would be plugin:// for another virtual directory
listitem : ListItem - item to add.
isFolder : [opt] bool - True=folder / False=not a folder(default).
totalItems : [opt] integer - total number of items that will be passed.(used for progressbar)[/quote]
这个函数向xbmc传递目录的内容,即往目录上添加目录项,返回值表示是否成功。
函数有5个输入参数,其中前3个必需,后2个可选。
handle: 整数值,句柄,xbmc启动插件时赋予插件一个句柄
url: 字符串,视频的网址。如果是另一个目录的话则必须以plugin://打头,plugin://后跟插件id名,意思是下一级子目录由这个插件生成
listitem: ListItem对象,要加入的目录项,ListItem对象中有很多属性和方法,用来存放一个视频的标题、图片、路径等,详细见[url=http://xbmc.sourceforge.net/python-docs/xbmcgui.html#ListItem]这里[/url],这里我们只设置它的label属性
isFolder: 布尔值,True表示本项是个目录,点下去还有子目录,False表示本项是末级目录,缺省值是False
totalItems: 整数值,要加入的目录项的总数,xbmc用来确定目录生成时进度条的进度,不给这个参数,进度条上无进度显示
为加深对这个函数的理解,请你做个小试验,把下面的代码复制到helloworld.py中,启动xbmc,进入helloworld插件看看,再去查看xbmc的运行日志文件xmbc.log,仔细研究日志中"BEGIN"和“END”之间的日志记录,把url的值换成另一个,再试一次,再去看日志记录有什么不同,直到试完5个替换值,然后把xbmcplugin.addDirectoryItem()中的isFolder参数的值由True换成False,再来一次,再看看日志记录。经过这样的试验后,基本上你就可以搞清楚xbmcplugin.addDirectoryItem()这个函数该怎么用才能正确地生成目录而不会出错。
[code]# -*- coding: utf-8 -*-
# helloworld.py
# hello world demo2
import xbmcplugin, xbmcgui
url='plugin://plugin.video.hello'
#url='plugin://plugin.noname.noname'
#url='plugin://plugin.video.tudou/'
#url='plugin://plugin.video.hello/abc/index.htm?url=example&name=123'
#url='http://tv1.btv.com.cn/asset/2012/03/27/BTV1_20120327_183405049_742928_23560.mp4'
print 'BEGIN: '+sys.argv[0]+'|'+sys.argv[1]+'|'+sys.argv[2]+'|'
handle=int(sys.argv[1])
listitem=xbmcgui.ListItem('Hello, World!')
xbmcplugin.addDirectoryItem(handle, url, listitem, True)
xbmcplugin.endOfDirectory(handle)
print 'END'[/code]
程序说明:
增加了两个print语句,一个打印插件脚本启动时xbmc传递给脚本的3个参数,另一个报告脚本执行完毕。
在xbmc中运行插件程序和一般环境中运行python程序不同,是没有调试器可用的,程序的运行状况又不能显示到xbmc界面上,程序的调试只能靠在程序中加些print语句打印变量值,再到xbmc的日志记录中去查看。
三、构建多级目录(下)
经过上一篇的小试验,我们了解了xbmc调用python脚本生成目录的机制,以及xbmcplugin.addDirectoryItem()的用法,现在做一个小结:
1、插件脚本生成完目录后会退出不再运行,等到点击某个目录项,xbmc又再次调用脚本生成新的目录,但是也有可能不再调用脚本,而是直接播放视频,这取决于生成该目录项时所使用的isFolder参数是True还是False;
2、如果生成目录项时的isFolder参数是True,目录项点击后,xbmc会根据生成目录项时的另一个参数url调用对应的脚本生成下一级目录;
3、xbmc调用脚本时会传递3个参数:
[quote]sys.argv[0]: 格式:plugin://插件id名/部分网址,首次调用时无部分网址
sys.argv[1]: 句柄,通常是0,末级目录是-1
sys.argv[2]: 部分网址(问号以后),首次调用时为空白[/quote]
显然要形成多级目录,需要xbmc在用户的操作下多次调用脚本,而我们可以通过精心设置url的值,把生成目录所需要的有关参数传递给即将运行的脚本,如网页的网址和处理模式、目录的名称等。
这里作为举例说明,我把url设计成这种形式:plugin://插件id名/?下一级目录的级数,因为我的脚本只需要知道目录级数就能把目录做出来。
下面的代码就是针对开头提到那个假想网站所作,它生成3X5X10的目录,对应网站的3大栏目、5小栏目、10个视频的架构
[code]# -*- coding: utf-8 -*-
# helloworld.py
# hello world demo3
import xbmcplugin, xbmcgui
# 各级目录的名称,项目数
dirs=[('大栏目', 3), ('小栏目', 5), ('视频', 10)]
# 准备构建目录要用到的handle, url, isFolder变量
handle=int(sys.argv[1])
dir_level=0
isFolder=True
if sys.argv[2]!='':
dir_level=int(sys.argv[2][1:])
url=sys.argv[0]+'?'+str(dir_level+1)
if dir_level==2: # 如果是最后一级目录
isFolder=False
url='http://tv1.btv.com.cn/asset/2012/03/27/BTV1_20120327_183405049_742928_23560.mp4'
# 构建n条目录项
for i in range(dirs[dir_level][1]):
listitem=xbmcgui.ListItem(dirs[dir_level][0]+str(i+1))
xbmcplugin.addDirectoryItem(handle, url, listitem, isFolder)
# 目录构建完了,显示吧
xbmcplugin.endOfDirectory(handle)[/code]
多级目录做好了,哪位帮忙发个屏幕截图上来?