恒星播放器插件系统
一. 什么是恒星播放器插件?
恒星插件是基于恒星播放器提供的接口开发的各式各样的小程序。这些小程序的运行依赖恒星播放器,使用这些小程序你可以实现诸如多媒体文件管理,视频处理等等各种功能。
二. 在哪里找到各式各样的恒星插件?
尝试在百度,贴吧,博客,知乎等地方搜索“恒星播放器 插件”,有些酷酷的小伙伴可能会在这些地方分享自己开发的插件链接,将链接粘贴在恒星播放器插件管理页面中,即可体验这些各式各样的插件。
恒星播放器公开了插件开发的接口和教程,对开发感兴趣的小伙伴都可以开发自己的专属插件,然后上传python代码文件到github上,最后在各类社区或自媒体分享你的插件github地址链接,就可以让大家体验你的作品了。
三. 如何安装恒星插件?
按照如下图步骤,安装恒星播放器插件。
插件入口
插件管理
启用插件
四. 我也能开发恒星插件吗?
插件开发者交流QQ群:614038264
插件基础信息
插件部署目录
播放器 data目录 \pyplugin\ 插件目录
基础文件结构
基础文件,作为插件必须含有main.py
和plugin.prop
两个文件
main.py # 入口文件
plugin.prop # 插件描述文件
插件目录
插件基本代码展示
main.py 内容
# -*- coding: utf-8 -*-
import StellarPlayer
class Plugin(StellarPlayer.IStellarPlayerPlugin):
def __init__(self, player:StellarPlayer.IStellarPlayer):
super().__init__(player)
def handleRequest(self, method, args):
if hasattr(self.simple, f"on_{method}"):
getattr(self.simple, f"on_{method}")(args)
def start(self):
print("插件启动")
def stop(self):
super().stop()
print("插件停止")
def newPlugin(player:StellarPlayer.IStellarPlayer,*arg):
print("插件初始化")
return Plugin(player)
插件运行原理
插件启动过程
播放器启动
加载插件目录
main.py
播放器在Python主线程中执行
main.py
中的newPlugin
函数,执行初始化操作播放器在独立线程中执行
newPlugin
函数返回的Plugin
对象的Start
方法
插件运行状态
StellarPlayer.exe # 播放器主进程 Pid: 1000 线程 100 – python.exe demoA/main.py => PluginAObj.Start() # 插件A Python主线程 线程 101 – python.exe demoB/main.py => PluginBObj.Start() # 插件B Python主线程
main.py 介绍
main.py 为插件的主入口文件
插件初始化函数
本函数触发时机
在插件管理器手动激活插件时
播放器启动且插件在激活状态
函数会被传入一个IStellarPlayerPlugin
派生类实例,类定义请具体查看后面章节newPlugin
入口函数
def newPlugin(player):
"""函数调用入口函数
参数
----------
player : StellarPlayer.IStellarPlayer
IStellarPlayer对象实例
返回:
player
"""
destroyPlugin
销毁函数
def destroyPlugin(plugin:StellarPlayer.IStellarPlayerPlugin)
"""函数调用销毁函数
参数 ----------
plugin : StellarPlayer.IStellarPlayerPlugin
IStellarPlayerPlugin实例对象
返回:
player
"""
注意事项
本方法在解释器主线程执行,只可执行一些初始化的逻辑,执行耗时操作会导致播放器卡顿
本函数播放器在整个生命周期中只会调用一次
plugin.prop 文件介绍
为插件的描述文件,以每一行为key=value的形式表现,编码为UTF-8
文件必选字段
name
标识插件名称description
插件描述
播放器内置对象
插件系统统一命名规范
页面名称:
pageName
控件唯一标识:
controlId
元素索引:
itemIndex
IStellarPlayerPlugin 类介绍
该类为所有Python插件的通用基类,在播放器Python运行环境中内置,无需引用任何类库
插件必须实现一个继承于
IStellarPlayerPlugin
的子类
IStellarPlayerPlugin 结构及功能
class IStellarPlayerPlugin:
def __init__(self, player:StellarPlayer.IStellarPlayer):
构造函数
super().__init__(player)
def handleRequest(self, method, args):
处理播放器事件的回调函数
参数
----------
method : 播放器动作
def start(self):
插件主逻辑启动方法,播放器将主动调用此方法启动插件的核心逻辑
此方法将在python独立线程中执行
def stop(self):
插件的停止方法,调用本方法可以停止播放器对插件的线程执行
子类实现此方法必须需要调用super().stop(),否则插件线程无法停止
def onClick(self,pageName,controlId):
控件对象的回调函数
参数
----------
pageName: 被点击的页面标识
controlId: 被点击的控件标识
def onListItemDoubleClick(self,pageName,controlId,itemIndex):
列表的某一项元素被双击时,该方法会被调用
参数
----------
pageName: 被双击的页面标识
controlId: 被双击的控件标识
itemIndex: 被双击的列表元素索引
def onListItemControlClick(
self,pageName,listControlId,itemIndex,itemControlId):
列表的某一项子元素控件被单击时,该方法被调用
参数
----------
pageName: 被点击的页面标识
listControlId: 列表标识符id
itemIndex: 列表item索引, 第一个元素索引为0,以此类推
itemControlId: 被点击的子元素id
StellarPlayer 类介绍
该类为所有Python插件的通用基类,在播放器Python运行环境中内置,无需引用任何类库
IStellarPlayer 类结构及功能
class IStellarPlayer:
def call(method, *args):
事件回调函数
参数
----------
method : 播放器动作
args: 播放器传入的参数数组,为可变参数
def doModal(pageName, width, height, title, controls:list):
调用播放器弹窗组件渲染
参数
----------
pageName : 对话框唯一ID,此ID是当前播放器进程唯一存在,不可弹出2个相同的ID的对话框
width: 窗口宽度 int
height: 窗口高度 int
title: 窗口标题 string
controls: 控件配置数组,包含浮窗中渲染的控件配置信息,具体请看 插件布局系统介绍 章节
def play(url):
播放器URL地址
参数
----------
url : 媒体资源的URL地址, http、磁力链、本地文件路径
def getControlValue(pageName, controlId):
获取pageId对话框中,controlId对应的控件ID
参数
----------
pageId: 对话框Id
controlId: 控件名称
插件UI布局控件
控件分类
输入框
用户输入文本和文字信息
代码标识:edit
{
'type':'edit',
'name':'编辑器文本'
}
复选框
在一组选项中任意选择合适的选项
代码标识: check
{
'type':'check',
'name':'复选框'
}
单选框
在一组选项中选择其中一个
代码标识: radio
{
'type':'radio',
'name':'单选框'
}
按钮
实现一个按钮功能
代码标识:button
{
'type': 'button',
'name': '按钮文本'
}
超链接
实现一个超链接
代码标识:link
{
'type': 'link',
'value': 'https://www.baidu.com',
'name': '链接文本'
}
文本
显示一段文本
代码标识:label
{
'type': 'label',
'name': '文本样本'
}
图片
显示一个图片
代码标识:image
{
'type': 'image',
'value': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
}
分割对象
实现一个空白控件
代码标识:space
{
'type': 'space'
}
分组控件
用于描述控件集合
代码标识:group
{
'type': 'group',
'dir': 'horizontal' // horizontal 水平排列,vertical 垂直排列
}
列表组件
代码标识: list
{
'type': 'list',
'itemheight': 100, // list每个元素的高度, 可选,默认30
'marginSize': 10 // list每个元素的间距大小,可选,默认1
'itemlayout': [
// 列表每一行元素的布局配置
],
'value': [] # 布局的数据
}
注意事项
行元素高度宽度由
itemheight
控制,布局时请确保行元素的高宽可以容下内部元素
网格组件
代码标识: grid
{
'type': 'grid',
'itemheight': 100, // list每个元素的高度, 可选,默认30
'marginSize': 10, // list每个元素的间距大小,可选,默认1
'itemwidth': 30, // 每个元素的宽度
'itemlayout': [
// 网格每一个元素布局的配置, 数组
],
'value': [] // 布局的数据
}
注意事项
网格元素高度宽度由
itemheight
和itemwidth
控制,布局时请确保行元素的高宽可以容下内部元素
控件属性
Width属性
可选属性,不配置默认值为自动适应宽度
值配置
同一行中所有所有控件没有设定width属性
同一行中所有控件均设定了width属性
同一行中部分控件设定了width属性
所有控件将根据窗口总宽度平均分配宽度
例:窗口宽100px,4个控件,每个控件自动宽度为25px
将按照实际配置宽度渲染
例:窗口宽100px,3个控件,每个控件均设置宽度为25px,三个控件靠左渲染,实际宽度75px
设定宽度的控件按照设定宽度渲染
剩余未设定宽度的控件根据(窗口宽度 – 设定宽度控件宽度之和)平分剩余宽度
例:窗口宽100px,3个控件,2个控件设定宽度为25px,1个控件宽度未设置,实际渲染结果为 25px(设定宽度) + 25px(设定宽度) + 50px(未设定宽度)
比例值,使用浮点数,当前父容器宽度
绝对值,使用整数,单位为像素
一行多元素宽度算法
height属性
可选属性,不配置默认值为自动适应高度
值配置
比例值,使用浮点数,当前父容器高度
绝对值,使用整数,单位为像素
value属性
可选属性,用于那些些需要设定内容、值的控件
字符串
textColor属性
可选属性
字符串:设置文本颜色,使用HEX表示法:#ff0000 表示红色
fontSize属性
可选属性
整数值:设置文本字体大小,单位为像素
clickable属性
可选属性
仅适用
label
,image
控件布尔:用来表示该控件是否可点击
@click属性
值为点击回调方法名称
{
'type':'button',
'name':'Update',
'width':60,
'matchParent':True,
'@click':'on_update_click' # 点击回调方法,对应Plugin类的同名方法
}
控件布局
播放器当前使用简化布局方式,方便开发者快速定义UI布局
基本原理
为简化布局开发成本,恒星播放器当前使用简单的栅格式布局方式,以一个list列表对象为容器,列表每一个元素为一行,且可以嵌套
示例A,两个文本输入控件处于上下排列
controls = [
{'type':'edit', 'name':'用户名'},
{'type':'edit', 'name':'密码'}
]
示例B,两个文本输入控件在同一行排列
controls = [
[
{'type':'edit', 'name':'用户名'},
{'type':'edit', 'name':'密码'}
] # 行为列表,包含两个控件对象,两个控件宽度各占行的一半空间
]
示例C,
controls = [
[
{'type':'edit', 'name':'用户名'},
{'type':'edit', 'name':'密码'}
], # 第一行,双控件
{'type':'edit', 'name':'验证码'} # 第二行,单控件
]
列表、网格对象布局和赋值
功能简介
1. 列表/网格对象需要提供布局定义其元素的配置,使用 itemlayout 属性定义
2. 对列表/网格对象填充数据,需要使用 value 对象按照定义的布局格式进行填充
# 实例A
[
{
'type': 'list',
'itemheight': 100,
'itemwidth': 100,
'itemlayout': [ # 必须是数组
{
'type': 'image',
'name': 'example-photo'
'height': 100,
'width': 50
}
],
'value': [ # 渲染5行图片
{
# 这里example-photo对应layout中对象的name,每行唯一 'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg'
},
]
}
]
# 实例B
[
{
'type': 'list',
'itemheight': 100,
'itemwidth': 100,
'itemlayout': [ # 一行含有一个图片和一个文本标记元素
{
'type': 'image',
'name': 'example-photo'
},
{
'type': 'label',
'name': 'example-label'
}
],
'value': [
{
# 这里example-photo对应layout中对象的name,每行唯一
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg',
'example-label' : '这是一行演示文本'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg',
'example-label' : '这是一行演示文本'
},
{
'example-photo': 'https://wx1.sinaimg.cn/orj360/006wVUPtgy1gstem06e9sj30u018fgwy.jpg',
'example-label' : '这是一行演示文本'
}
]
}
]
插件日志目录
打开Windows文件管理器,在地址栏输入这个地址,即可打开日志目录
%APPDATA%\StellarPlayer\logs
默认播放器会拆分插件日志,格式为 Plugin-日期-时分.log
为了方便调试,可以在播放器安装目录中创建一个空白文件,名称为 single_log_flag,播放器会将所有插件日志合并到Plugin-.log一个文件中,方便调试开发
打印日志
直接使用python的print函数打印日志,打印内容会自动输出到日志文件中
插件代码重新加载
修改插件代码代码后,请在插件面板关闭并重启激活插件,播放器会重新加载插件代码并执行
参考文档
python文档编写指南
https://realpython.com/documenting-python-code/#docstring-formats
插件基础运行环境
Python 运行环境版本信息
Windows 64位 V3.8.10
Python 内置类库信息
打印已运行环境中安装的包及版本的号的代码
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
运行环境内置功能库及版本
恒星播放器用户协议
在此特别提醒,若您访问和使用恒星播放器,请事先认真阅读本协议中各条款,包括免除或者限制责任的免责条款及对您的权利限制; 如果您代表公司使用恒星播放器所提供服务,您在此向恒星播放器承诺您有权代表公司,您对本协议的接受将被自动视为您所代表的公司对本协议的接受; 本协议是您与冷湖科技(武汉)有限公司之间的协议,恒星播放器依据本协议为您提供服务。 1.1 本协议服务条款构成您(无论是个人或者单位)使用恒星播放器所提供服务之先决条件。如您不同意本协议服务条款或其随时对其的修改,您应不使用或主动取消恒星播放器提供的服务。您的使用行为将被视为您对本协议服务条款及其随时修改版本的完全接受; 1.2 这些条款可由恒星播放器随时更新,且毋须另行通知。修改后的服务条款一旦在恒星播放器上公布即取代替原来的服务条款,并构成本条款整体之一部分。您可随时登陆恒星播放器官网查阅最新的服务条款。 1.3 当用户使用恒星播放器各单项服务时,对于这些服务可能有单独的服务条款加以规范,请用户在使用有关服务时另行了解和确认,用户的使用行为视为其对该单项服务的服务条款以及冷湖科技(武汉)有限公司在该单项服务中发出的各类公告的同意。 2.1 恒星播放器仅根据您的指令,提供信息网络存储空间及相关平台服务,本身不直接上传任何内容。您利用恒星播放器服务上传的内容包括但不限于音乐、动画、文字、图片、音视频作品等,您担保对利用恒星播放器服务上载、传播的内容负全部法律责任。 2.2 您在此明确陈述并保证对所有上载、传播到恒星播放器上的内容,拥有或取得了所有必要的权利并承担全部的法律责任,包括但不限于:您有权或已取得必要的许可、授权、准许来使用或授权恒星播放器使用所有与上传作品有关的所有专利、商标、商业秘密、版权、表演者权及其他私有权利; 2.3 恒星播放器并不担保您所有上传节目能够通过恒星播放器服务为其他用户所获取、浏览,恒星播放器没有义务和责任对所有您上载、传播的节目进行监测;但恒星播放器保留根据国家法律、法规的要求对上载、传播的节目进行不定时抽查的权利,并有权在不事先通知的情况下移除获断开链接违法、侵权的作品。此款的规定并不排除您对上传内容的版权担保,亦并非表明恒星播放器有责任及能力判断您上传作品的版权归属 。 3.1 您上传的作品和内容是指您在恒星播放器上载、传播的视频、音频或其它任何形式的内容包括文字、图片、链接等; 3.2 您在恒星播放器上传或发布作品的,您保证其对该等作品享有合法著作权/版权或者相应授权,并且您同意授予恒星播放器对所有上述作品和内容的在全球范围内的免费、不可撤销的、无限期的、并且可转让的非独家使用权许可,恒星播放器有权展示、散布及推广前述内容,有权对前述内容进行任何形式的复制、修改、出版、发行及以其他方式使用或者授权第三方进行复制、修改、出版、发行及以其他方式使用; 3.3 恒星播放器在此郑重提请您注意,任何经由恒星播放器提供的服务以上载、张贴、发送电子邮件或任何其它方式传送的资讯、资料、文字、软件、音乐、音讯、照片、图形、视讯、信息或其它资料(以下简称“内容”),无论系公开还是私下传送,均由内容提供者、上传者承担责任,本公司不承担任何责任; 3.4 恒星播放器无法预先知晓并合理控制经由恒星播放器的服务传送之内容,亦无法准确判定内容上传者的真实身份。有鉴于此,您已预知使用恒星播放器的服务时,可能会接触到令人不快、不适当或令人厌恶之内容,您在此同意放弃由此而产生的针对恒星播放器的任何追索权。但恒星播放器有权依法停止传输任何前述内容并采取相应行动,包括但不限于暂停您使用恒星播放器的服务的全部或部分,保存有关记录,并向有关机关报告; 3.5 因您进行上述作品和内容在恒星播放器的上载、传播而导致任何第三方提出索赔要求或衍生的任何损害或损失,由您承担全部责任。 为方便您使用,恒星播放器服务可能会提供与第三方国际互联网网站或资源进行链接。除非另有声明,恒星播放器无法对第三方网站服务进行控制,您因使用或依赖上述网站或资源所产生的损失或损害,恒星播放器不负担任何责任。 4.1 您不得使用恒星播放器提供的服务进行任何非法、淫秽、色情及其他违反公序良俗之活动,包括但不限于非法传销、诈骗、侵权、反动行为等,恒星播放器有权依据自己的独立判断在不事先通知的情况下立即删除、停止从事此类活动的帐户使用; 4.2 除您与恒星播放器另有约定外,您同意恒星播放器的服务仅供您个人非商业性质的使用,您不可对恒星播放器服务的任何部分或服务之使用或获得进行复制、拷贝、出售,或利用恒星播放器服务进行调查、广告或其他商业目的,但恒星播放器对特定服务另有适用指引或规定的除外。 4.3 在冷湖电子公告类服务中,用户保证对向冷湖科技公司提供的个人作品享有著作权,用户的上载行为即意味着用户或用户代理的著作权人免费授权冷湖公司对上载作品享有独家的、全球范围内不可撤销的永久的复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权、使用权和收益权,而且冷湖公司还可以将上述权利转让或者转授予给其他公司或个人。如用户与冷湖公司另有约定的,从其约定。 5.1 除您自行上载、传播的内容外,恒星播放器的服务中包含的任何网页、文本、图片、图形、音频和/或视频资料、商标、服务标记、公司名称、版权等,均归属恒星播放器所有或由恒星播放器经合法授权取得,受《中华人民共和国著作权法》、《中华人民共和国商标法》和/或其它财产所有权法律的保护。未经相关权利人同意,上述资料均不得在任何媒体直接或间接发布、播放、出于播放或发布目的而改写或再发行,或者被用于其他任何商业目的。上述资料或其任何部分仅可作为私人用途而保存在某台计算机内。恒星播放器不就由上述资料产生或在传送或递交全部或部分上述资料过程中产生的延误、不准确、错误和遗漏或从中产生或由此产生的任何损害赔偿,以任何形式向您或任何第三方负法律责任; 5.2 恒星播放器为提供网络服务而使用的任何软件(包括但不限于软件中所含的任何图像、照片、动画、录像、录音、音乐、文字和附加程序、随附的帮助材料)的一切权利均属于该软件的著作权人,未经该软件的著作权人许可,您不得对该软件进行反向工程(reverse engineer)、反向编译(decompile)或反汇编(disassemble),或以其他方式发现其原始编码。 恒星播放器尊重并采取合理措施保护版权人的合法利益,我们已制定了相应的版权政策与版权投诉机制,该版权政策与投诉机制均构成本协议的有机组成部分。 版权政策与投诉机制详情请参考: “免责声明” 5.3 但是用户在注册时选择或同意,或用户与冷湖及合作单位之间就用户个人隐私信息公开或使用另有约定的除外,同时用户应自行承担因此可能产生的任何风险,冷湖对此不予负责。 5.4 用户同意个人隐私信息是指那些能够对用户进行个人辨识或涉及个人通信的信息,包括下列信息:用户的姓名,身份证号,手机号码,IP地址,电子邮件地址信息。而非个人隐私信息是指用户对本软件的操作状态以及使用习惯等一些明确且客观反映在冷湖服务器端的基本记录信息和其他一切个人隐私信息范围外的普通信息。 5.5 一般而言,冷湖公司基于下列原因需要使用到用户的信息资源:(1) 执行软件验证服务。(2)执行软件升级服务。(3)网络同步服务。(4) 提高用户的使用安全性并提供客户支持。(5)因用户使用本软件特定功能或因用户要求冷湖或合作单位提供特定服务时,冷湖或合作单位则需要把用户的信息提供给与此相关联的第三方。(6)其他有利于用户和冷湖利益的。 5.6 在不透露单个用户隐私资料的前提下,冷湖有权对整个用户数据库进行分析并对用户数据库进行商业上的利用。 6.1 冷湖公司将建立和维持一合理的程序,以保护未成年人个人资料的保密性及安全性。冷湖公司郑重声明:任何18岁以下的未成年人参加网上活动应事先得到家长或其法定监护人(以下统称为"监护人")的可经查证的同意。 6.2 监护人应承担保护未成年人在网络环境下的隐私权的首要责任。 6.3 未经监护人之同意,冷湖公司将不会使用未成年人之个人资料,亦不会向任何第三方披露或传送可识别该未成人的个人资料,但是,由于相关法律法规要求、国家机关的查询要求、或在紧急情况下竭力维护用户个人和社会大众的隐私安全等原因除外。 6.4 冷湖公司收集未成年人的个人资料,这些资料只是单纯作为保护未成年人参与网络活动时的安全,而非作为其它目的之利用。冷湖公司保证不会要求未成年人提供额外的个人资料,以作为允许其参与网上活动的条件。 恒星播放器通过中华人民共和国境内的设施提供和控制服务,恒星播放器不担保所提供或控制之服务在其他国家或地区是适当的、可行的,任何在其他司法管辖区使用恒星播放器服务的您应自行确保遵守当地的法律、法规,恒星播放器对此不负任何责任。 7.1 您同意恒星播放器有权基于其自行之考虑,因任何理由,包括但不限于缺乏使用或恒星播放器认为您已经违反本协议的文字及精神,而终止您的帐号或服务之全部或任何部分,并将您在恒星播放器的服务内的任何内容加以移除并删除; 7.2 您同意依本协议任何规定提供之服务,无需进行事先通知即可中断或终止,您承认并同意,恒星播放器可立即关闭或删除您的帐号及您帐号中所有相关信息及文件,及/或禁止继续使用前述文件或恒星播放器的服务。 此外,您同意若恒星播放器的服务之使用被中断、终止或您的帐号及相关信息和文件被关闭、删除,恒星播放器对您或任何第三人均不承担任何责任。 8.1 本协议的生效、履行、解释及争议的解决均适用中华人民共和国法律; 8.2 如就本协议内容或其执行发生任何争议,应尽量友好协商解决;协商不成时,则争议各方均可向冷湖公司注册所在地,具有管辖权的人民法院提起诉讼。 8.3 本《协议》的一切解释权与修改权归冷湖。