一、插件的结构
每个插件保存在各自的文件夹里,打开xbmc插件的安装目录addons,可以看到很多安装好的插件的文件夹。
一个典型的视频插件的文件夹里通常要有这三个文件:
l:说明文件,用来告诉xbmc该插件所提供的内容以及安装要求;
icon.png:图标文件,256x256像素,xbmc插件清单旁边显示的就是这个图标;
*.py:python主程序文件,名字随便起,l中有一项会用到这个文件名。
如果插件的子程序和用到的数据较多,可以在下面再开子文件夹来保存。
重点看l的结构:
首先第一行申明这是一个xml文件,且是utf-8编码的,接着是<addon>元素,在<addon>和</addon>之间,有一个或多个<extension>元素,每个<extension>告诉xbmc这个插件扩展了哪一部分的功能,只有最后一个<extension>比较特别,只是用来向用户做个说明。
<addon>元素有4个属性:id, version, name, provider-name
id属性:插件id,必须是唯一的,小写,插件zip文件解压后,以id命名文件夹,所以不能重名,建议以plugin.<类别>.<唯一名>的形式命名,类别可以是video, audio, script等;
version属性:插件版本号,格式为x.x.x,xbmc用来确定是否应升级插件;
name属性:插件名称;
provider-name属性:插件作者。
<extension>元素通过point属性告诉xbmc该插件扩展的类型,有多种类型,用python写的视频插件属xbmc.python.pluginsource类型,同时还应加上一个library属性告诉xbmc启动插件时运行哪个python程序。<provides>video</provides>告诉xbmc这是对视频功能的扩展。最后一个adata类型的<extension>元素用来说明插件的运行环境、摘要、详情、申明等,英文的必须有,中文的可有可无。
插件做好后,把所有文件压缩进zip文件包中发行,xbmc在安装插件时会检查其中的l,确认格式无误后,才把它解压到addons目录下,成为一个可用的插件。
二、做一个hello world版的插件
很多计算机语言的教程开篇都有“hello world”的最简单的例子,让读者马上体验一下该编程语言的特点,在这里我们也做一个最简单的xbmc插件,只要会复制粘贴就能做出来。它显示一个“Hello, World!"的菜单,点击菜单可看一则网络视频。
做法:
1、在xbmc的插件目录addons下新建一个子目录plugin.video.hello,它的目录名也是插件的id名,用来存放插件的3个文件
2、把下面的icon.png文件拷进新建的目录
3、用记事本编辑和保存一个名为l的文件,内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.hello"
  name="helloworld演示"
  version="0.0.1"
  provider-name="Tau">
  <extension point="xbmc.python.pluginsource" library="helloworld.py">
  <provides>video</provides>
  </extension>
  <extension point="adata">
    <platform>all</platform>
    <summary>hello world plugin</summary>
    <summary lang="zh">helloworld演示插件</summary>
    <description>hello world plugin, python script</description>
    <description lang="zh">helloworld演示插件,python脚本</description>
    <disclaimer>For demonstration only</disclaimer>
  </extension>
</addon>
4、再用记事本生成一个名为helloworld.py的文件,内容如下:
# -*- coding: utf-8 -*-
# helloworld.py
# hello world demo
import xbmcplugin, xbmcgui
url='tv1.btv/asset/2012/03/27/BTV1_20120327_183405049_742928_23560.mp4'
handle=int(sys.argv[1])
listitem=xbmcgui.ListItem('Hello, World!')
xbmcplugin.addDirectoryItem(handle, url, listitem)
dOfDirectory(handle)
注意:以上两个文本文件都必须以utf-8的编码方式保存。记事本用“文件-另存为”保存文件,选择“编码”为“UTF-8"。注意复制时不能“添油加醋”,在语句前加点空格什么的。
启动xbmc,进入视频扩展功能,就可以看到一个新加入的插件”helloworld演示“,进入插件看看是什么效果。
helloworld.py程序的说明:
前3行为注释,同时第1行说明本文件采用utf-8编码;
import导入xbmc的两个库,即xbmc对外提供的对外编程接口API,使用其中的类、函数可以操控xbmc的界面;
handle=...从命令行参数中获得句柄,句柄是xbmc启动插件脚本时赋予脚本的一个整数值;
xbmcgui.ListItem(...)创建一个ListItem类的实例对象,它带有"Hello, World!"的文本标签;
xbmcplugin.addDirectoryItem(...)把上面的ListItem对象和视频网址url作为一个菜单项添加到菜单上;
dOfDirectory(...)告诉xbmc菜单项已全部添加完毕,可以显示了。
小试验:
把程序的最后一行去掉会怎么样?
把url换成普通网页的网址会怎么样?
不用担心,尽管试,你的xbmc没那么容易崩溃。
三、构建多级目录(上)
假设有这样一个视频网站,网站首页上有3大栏目,进入大栏目可看到5个小栏目,小栏目再进去可以看到10个视频链接。针对网站这样的布局,很容易设想出要做的视频插件要有3级目录,进入到第3级,也就是末级,才开始观看视频。
在做这样的插件前,我们必须首先学习xbmcplugin.addDirectoryItem()这个函数的用法,这是构建目录时用到的最为关键的一个函数。
先看函数的原型
如何制作网页插件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)
这个函数向xbmc传递目录的内容,即往目录上添加目录项,返回值表示是否成功。
函数有5个输入参数,其中前3个必需,后2个可选。
handle: 整数值,句柄,xbmc启动插件时赋予插件一个句柄
url: 字符串,视频的网址。如果是另一个目录的话则必须以plugin://打头,plugin://后跟插件id名,意思是下一级子目录由这个插件生成
listitem: ListItem对象,要加入的目录项,ListItem对象中有很多属性和方法,用来存放一个视频的标题、图片、路径等,详细见这里,这里我们只设置它的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()这个函数该怎么用才能正确地生成目录而不会出错。
# -*- coding: utf-8 -*-

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。