const plugin = wx.createPlayletPage({fail: (res) => {console.error('【createPlayletPage】创建失败:', res.errMsg);}});
wx.createPlayletPage() 的 fail 回调会收到错误:createPlayletPage:fail page stack is full, please navigate back first。属性 | 类型 | 说明 |
playerId | String | 播放器 Id |
playletPlugin.onPageLoad((res) => {console.log('页面加载完成, 播放器ID:', res.playerId);});
属性 | 类型 | 说明 |
playerId | String | 播放器 Id |
playletPlugin.onPageDestroy((res) => {console.log('页面销毁完成, 播放器ID:', res.playerId);});
plugin.onPageLoad((info) => {const playletManager = plugin.PlayletManager.getPageManager(info.playerId);console.log('manager', playletManager);})
字段名 | 类型 | 必填 | 默认值 | 说明 |
id | String | 是 | - | 短剧 id |
serialNo | Number | 是 | - | 剧集 id |
title | String | 是 | - | 剧名 |
imgUrl | String | 否 | '' | 剧封面图 |
introduction | String | 否 | '' | 短剧简介 |
tags | Array | 否 | [] | 短剧标签 |
playRate | Number | 否 | 1 | 播放速度 |
extParam | String | 否 | {} | 扩展参数 |
clarity | Array | 否 | [ { clarity: 240 * 426, title: "360P" }, { clarity: 480 * 852, title: "480P" }, { clarity: 720 * 1280, title: "720P" }, { clarity: 1080 * 1920, title: "1080P" } ] | 清晰度 |
defaultClarity | Object | 否 | { clarity: 480 * 852, title: "480P" } | 默认清晰度 |
initial-time | Number | 否 | 0 | 起始播放时间 |
data | Array | 是 | - | 剧集状态列表 |
interaction | Object | 否 | - | 短剧级互动数据(含收藏 / 转发),详见下表 |
interaction(短剧级互动数据):字段名 | 类型 | 必填 | 默认值 | 说明 |
interaction.favorite.enabled | Boolean | 否 | - | 是否显示收藏按钮,默认 false |
interaction.favorite.isFavorited | Boolean | 否 | - | 当前是否已收藏 |
interaction.favorite.count | String | 否 | - | 收藏数文案,业务侧自行 format(如 "1.2w") |
interaction.share.enabled | Boolean | 否 | - | 是否显示转发按钮 |
interaction.share.count | String | 否 | - | 短剧级的转发总数(字符串) |
interaction.share.title | String | 否 | - | 分享卡片标题 |
interaction.share.path | String | 否 | - | 分享跳转路径 |
interaction.share.imageUrl | String | 否 | - | 自定义分享图,支持本地 / 代码包 / 网络图片 |
data(剧集数组,每一项对应每一集):字段名 | 类型 | 必填 | 默认值 | 说明 |
status | Number | 是 | - | 播放状态。0:免费;1:已解锁;2:未解锁 |
videoUrl | String | 否 | '' | 播放地址,付费剧集非必传 |
coverImg | String | 否 | - | 封面照片,不设置的时候展示 imgUrl |
license-url | String | 否 | '' | 播放许可证地址 |
Certificate-url | String | 否 | '' | 证书地址 |
provision-url | String | 否 | '' | 设备预置地址 |
interaction | Object | 否 | - | 剧集级互动数据(含点赞),详见下表 |
data[].interaction(剧集级互动数据):字段名 | 类型 | 必填 | 默认值 | 说明 |
data[].interaction.like.enabled | Boolean | 否 | - | 是否显示点赞按钮 |
data[].interaction.like.isLiked | Boolean | 否 | - | 该集点赞初始态 |
data[].interaction.like.count | String | 否 | - | 该集点赞数(字符串) |
PlayletManager.setPlaylets({id:"sid", // 剧IDserialNo: 1, // 剧集 ID 从1开始title:"名字",imgUrl:"图片地址",introduction:"短剧简介",tags: ["友情", "魔幻"],playRate: 1,extParam:"{{xxx}}",clarity:[{"360p": 240 * 426}, {"480p": 480 * 852}, {"720p": 720 * 1280}, {"1080p": 1080 * 1920}], // HLS 下才生效defaultClarity: {"720p": 720 * 1280}, // 默认清晰度'initial-time': 0,interaction: { // 短剧级互动数据(收藏 / 转发)favorite: { enabled: true, isFavorited: false, count: "1.2w" },share: { enabled: true, count: "567", title: "分享标题", path: "pages/xxx/xxx?id=1", imageUrl: "" }},data: [{license-url:"",certificate-url:"",provision-url:"",status: 0,videoUrl: "播放URL", // 非免费剧集非必传coverImg:"封面照片", // 非必传interaction: { // 剧集级互动数据(点赞)like: { enabled: true, isLiked: false, count: "2.2w" }},}]})
字段名 | 类型 | 必填 | 默认值 | 说明 |
List | Array<FreeItem> | 是 | - | 剧集解锁弹窗,最多支持四项 |
字段名 | 类型 | 必填 | 默认值 | 说明 |
Title | String | 是 | - | 解锁操作名 |
Callback | Function | 是 | - | 具体解锁操作 |
PlayletManager.setLockMenu([{title: "看广告解锁",callback: (data) => {if (!data.serialNo) {return;}PlayletManager.setCanPlay(data.serialNo, 1)}},{title: "单集购买",callback: (data) => {if (!data.serialNo) {return;}PlayletManager.setCanPlay(data.serialNo, 1)}}])
字段名 | 类型 | 必填 | 默认值 | 说明 |
SerialNo | Number | 是 | - | 剧集 id |
Status | Number | 是 | - | 播放状态 |
VideoUrl | String | 是 | - | 播放地址 |
const unlockData = [{serialNo: 6, //集数status: 1,videoUrl: 'default_video_url', // 播放地址}];PlayletManager.setCanPlay(unlockData);
manager.onCheckIsCanPlay((data) => {let episodes = [];if (data.episodes) {episodes = data.episodes;}// 批量检查并设置状态const results = episodes.map(ep => {const serialNo = ep.serialNo;let status;if (parseInt(serialNo, 10) <= 3) {// 假设前3集免费status = 0;} else {status = 2;}return { serialNo: serialNo, status: status };});manager.setCanPlay(results);});
属性 | 类型 | 说明 |
eventId | Number | 播放错误事件类型 |
属性 | 类型 | 说明 |
serialNo | Number | 剧集 id |
playerId | String | 播放器 id |
exParam | String | 分享扩展参数 |
duration | String | 当前剧集的总时长 |
playtime | String | 当前播放到的时间 |
属性 | 类型 | 说明 |
EventType | String | 'CHANGE_SERIAL':切换剧集, 例如 { slideType: 1 }。slideType 为 1 表示播放结束(不区分是否完播)自动切换,2 表示手势滑动切换,3 表示从选集弹窗切换。 'CHANGE_SPEED':切换播放速度 ,例如{ source: 1, speedType: 1.5 },返回 source(目前固定为 1),speedType 为当前播放速度。 'CHANGE_CLARITY':切换播放清晰度 ,返回当前播放清晰度 clarity。 |
manager.onCustomEvent((data) => {if (data.eventType === 'CHANGE_CLARITY') {console.log('用户切换清晰度:', data.clarity);}if (data.eventType === 'CHANGE_SERIAL') {console.log('用户切换视频:', data.slideType);}if (data.eventType === 'CHANGE_SPEED') {console.log('用户改变播放速度:', data.speedType, data.source);}});
字段名 | 描述 |
playerId | 播放器 id |
extParam | 分享扩展参数 |
serialNo | 当前剧集索引,从 1 开始计数 |
playTime | 当前播放到的时间 |
duration | 当前剧集的总时长 |
totalCount | 当前剧集总集数 |
字段名 | 描述 | 额外字段说明 |
LOAD | 进入播放器页面 | - |
SHOW | 播放器页面 show | - |
START_PLAY | 开始播放 | - |
UNLOAD_OR_HIDE | 离开页面或者退到后台 | 例如 { type: 1 }。type 为 1 表示 Unload,为 2 表示 hide; |
VIDEO_PLAY | play 事件 | - |
VIDEO_TIME_UPDATE | timeupdate 事件 | 参数参考 video 组件的 timeupdate 事件 |
VIDEO_END | 播放视频结束 | - |
manager.setInteractionState({serialNo: 1, // 集编号:type=like 必填;type=favorite/share 非必填type: 'like', // 互动类型:'like' | 'favorite' | 'share'isActive: true, // 是否选中(type=share 时可不填)count: "1.2w" // 数量文案,字符串,业务侧自行 format})
字段 | 类型 | 必填 | 说明 |
serialNo | Number | 仅 like 必填 | 集编号 |
type | String | 是 | 'like' / 'favorite' / 'share' |
isActive | Boolean | share 可不填 | 是否选中 |
count | String | 否 | 数字文案 |
manager.onLikeClick((args) => {// args.playerId 当前播放器 id// args.id 剧 id// args.serialNo 集编号// args.currentState 点击前的状态(false 表示原来未点赞)// args.extParam setPlaylets 时透传的 extParam})
manager.onFavoriteClick((args) => {// args.playerId// args.id// args.currentState 点击前的收藏状态// args.extParam})
manager.onShareClick((args) => {// args.playerId// args.id// args.serialNo// args.extParam})
manager.setActivityInfo({logo: 'https://miniprogram.tcsas-superapp.com/xxx/xxx.png'})
字段 | 类型 | 必填 | 说明 |
logo | String | 是 | 运营位 logo 图片 URL(建议正方形 PNG,尺寸 24 × 24) |
manager.onSetActivityInfo((args) => {// 用户点击运营位 logo 时触发})
manager.updateOpenArea({showLeft: true, // 是否展示左侧自定义区域playerId: '<可选>', // 指定播放器 idserialNo: 1, // 当前集编号ext: JSON.stringify({ dramaId: 1 }) // 透传给自定义组件的额外数据(字符串)})
字段 | 类型 | 必填 | 说明 |
showLeft | Boolean | 是 | true 展示,false 收起 |
playerId | String | 否 | 多播放器场景下指定具体实例 |
serialNo | Number | 否 | 当前集编号,会作为 prop 传给组件 |
ext | String | 否 | 自定义透传数据,建议 JSON.stringify 后传入 |
字段 | 类型 | 来源 |
ext | String | updateOpenArea({ ext }) 透传 |
playerId | String | 当前播放器 id |
serialNo | Number | 当前集编号 |
Component({properties: {ext: { type: String, value: '' },playerId: { type: String, value: '' },serialNo: { type: Number, value: 0 }},methods: {onJoinTap() {// 业务逻辑:跳转活动页 / 打开弹层等},onCloseTap() {this.triggerEvent('close'); // 通知插件关闭自定义区域}}});
<cover-view style="display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; height: 100%;"><!-- 活动 Banner 图 --><cover-imagesrc="https://miniprogram.tcsas-superapp.com/hackthon/upload_1755932019262.jpg"style="width: 500rpx; height: 500rpx; border-radius: 16rpx;"/><!-- 活动标题 --><cover-view style="margin-top: 30rpx; font-size: 36rpx; font-weight: bold; color: #fff;">限时福利活动</cover-view><!-- 活动描述 --><cover-view style="margin-top: 16rpx; font-size: 26rpx; color: rgba(255,255,255,0.8); text-align: center;">观看广告免费解锁全部剧集</cover-view><!-- 按钮区域 --><cover-view style="display: flex; flex-direction: row; margin-top: 40rpx; width: 100%; justify-content: center;"><cover-viewstyle="width: 200rpx; height: 100rpx; line-height: 80rpx; font-size: 28rpx; background: #FF6B6B; color: #fff; border-radius: 36rpx; text-align: center; margin-right: 20rpx;"bindtap="onJoinTap">立即参与</cover-view><cover-viewstyle="width: 200rpx; height: 100rpx; line-height: 80rpx; font-size: 28rpx; background: rgba(255,255,255,0.3); color: #fff; border-radius: 36rpx; text-align: center;"bindtap="onCloseTap">关闭</cover-view></cover-view></cover-view>
manager.setRecommend([{ id: 'drama_2', name: 'Palace Drama: Harem Legend', imgUrl: 'https://example.com/cover.jpg' },{ id: 'drama_3', name: 'Mystery: Escape Room', imgUrl: 'https://example.com/cover.jpg' }])
字段 | 类型 | 必填 | 说明 |
id | String | 是 | 推荐项唯一标识,回调时原样回传 |
name | String | 是 | 推荐剧名 |
imgUrl | String | 是 | 推荐封面图 URL |
manager.onRecommendItemClick((args) => {// args.id — 用户点击的推荐项 id(与 setRecommend 中传入的 id 一致)})
文档反馈