插件编写指南
Moon Player插件使用python语言编写。具体示例可以参考Moon Player自带的插件(在/usr/share/moonplayer/plugins下)。这里用解析新浪视频的插件为例简单介绍Moon Player插件的编写方法。
```
!/usr/bin/python
from utils.utils import list_links import re import moonplayer
Search videos
def search(kw, page): kw = kw.replace(' ', '+') url = 'http://video.sina.com.cn/search/index.php?m1=f&k='+ kw + '&page=' + str(page) moonplayer.get_url(url, search_cb, None)
def search_cb(content, data): links = list_links(content, 'http://video.sina.com.cn/v/b/') moonplayer.show_list(links)
Parse videos
video_re = re.compile(r'http://video.sina.com.cn/v/b/(\d+)-\d+.html') def parse(url, options): match = video_re.match(url) if match: url = 'http://v.iask.com/v_play.php?vid=' + group(1) moonplayer.get_url(url, parse_cb, options) else: moonplayer.warn('Wrong url')
name_re = re.compile(r'http://.+?)]') def parse_cb(content, options): url_match = url_re.search(content) name_match = name_re.search(content) if name_match and url_match: name = name_match.group(1) + '.hlv' url = url_match.group(1) if options & moonplayer.OPT_DOWNLOAD: moonplayer.download([name, url]) else: moonplayer.play([name, url]) else: moonplayer.warn('Fail') ```
开始
from utils.utils import list_links
import re
import moonplayer
第一行导入了/plugins/utils/下定义的一个函数,用于列出搜索结果页中的超链接。
第二行导入python的正则表达式库。
search 函数
def search(kw, page):
kw = kw.replace(' ', '+')
url = 'http://video.sina.com.cn/search/index.php?m1=f&k='+ kw + '&page=' + str(page)
moonplayer.get_url(url, search_cb, None)
当funPlayer中的搜索(Go)按钮被按下后会调用这个函数。参数kw是搜索的关键词,是一个UTF-8编码的字符串;参数page是页码数,是一个整数,由1开始。
第四行调用get_url函数得到下载页。函数原型如下:
def get_url(url, callback_func, second_arg)
这是funPlayer内部的一个函数,url为要下载的网页的地址,callback_func为下载完成后调用的回调函数,second_arg为传入回调函数的第二个参数,这里用不到,所以传入了None。
回调函数
def search_cb(content, data):
links = list_links(content, 'http://video.sina.com.cn/v/b/')
moonplayer.show_list(links)
content为下载的页面,是一个字符串,data就是刚才传入的None。
第三行使用show_list函数显示搜索结果。它接受一个List,并且必须这样排列:[name1, url1, name2, url2, name3, url3...]
第一行调用了刚才导入的list_links函数,它可列出content中以'http://video.sina.com.cn/v/b/'开头的超链接,并返回符合要求的List。
parse 函数
video_re = re.compile(r'http://video.sina.com.cn/v/b/(\d+)-\d+.html')
def parse(url, options):
match = video_re.match(url)
if match:
url = 'http://v.iask.com/v_play.php?vid=' + group(1)
moonplayer.get_url(url, parse_cb, options)
else:
moonplayer.warn('Wrong url')
这个函数在双击搜索结果或者点击“下载”按钮时会被调用,用以解析视频地址。第一个参数表示视频播放页面的URL,第二个参数为解析选项,这里把它传递给回调函数。
如果需要弹出警告窗口,可以使用warn函数,它接受一个UTF-8的字符串。
关于options:指定了解析视频的选项,目前有以下三个值,可以通过“&”运算符取得: ``` moonplayer.OPT_QL_SUPER #超清视频 moonplayer.OPT_QL_HIGH #高清视频 moonplayer.OPT_DOWNLOAD #下载视频
例如,要判断解析何种清晰度的视频, 可以这样:
if options & moonplayer.OPT_QL_SUPER: dosomething... elif options & moonplayer.OPT_QL_HIGH: dosomething... else: dosomething... ```
parse_cb 回调函数
name_re = re.compile(r'<vname><!\[CDATA\[(.+?)]')
url_re = re.compile(r'(http://.+?)]')
def parse_cb(content, options):
url_match = url_re.search(content)
name_match = name_re.search(content)
if name_match and url_match:
name = name_match.group(1) + '.hlv'
url = url_match.group(1)
if options & moonplayer.OPT_DOWNLOAD:
moonplayer.download([name, url])
else:
moonplayer.play([name, url])
else:
moonplayer.warn('Fail')
第九行判断用户是否点击了“下载”按钮。如果是,调用download函数下载视频;否则,调用play函数播放视频。它们都接受一个List,同样是[name1, url1, name2, url2...]的格式。
如果不能一步完成解析,可以继续在回调函数里调用get_url。
其他
其他moonplayer api:
def moonplayer.warn(msg) #显示警告信息
def moonplayer.question(msg) #显示提问对话框,返回布尔值
def moonplayer.show_album(list) #同show_list,用于显示专辑
def moonplayer.set_list_item_color(i, color) #设置项目颜色
还有一些可选择实现的函数
def search_album(keyword, page)
同search,在按下专辑(album)按钮时调用,用于搜索专辑。
最后
把文件保存为plugin_xxx.py,放到~/.moonplayer/plugins下,就可以使用啦!