xbmc视频插件开发

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]

多级目录做好了,哪位帮忙发个屏幕截图上来?

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值