(function (){
Vue.app({
data(){
return {
list:[],
current:0,
listOpen:false
}
},
methods:{
onSizeChange:function (width,height){
var winCom = parent.webos.util.getCurrentWinByIframe(window);
if(winCom){
var maxHeight = parseInt((parent.document.body.clientHeight-48)*0.9);
var maxWidth = parseInt(parent.document.body.clientWidth*0.9);
var possibleHeight = parseInt(maxWidth*height/width);
if(possibleHeight<=maxHeight){
winCom.winChangeSize(maxWidth,possibleHeight);
}else{
var possibleWidth = parseInt(maxHeight*width/height);
winCom.winChangeSize(possibleWidth,maxHeight);
}
}
},
playData:async function (index){
var that = this;
var data = that.list[index];
that.lastTime = new Date().getTime();
var mainName = data.name;
that.current = index;
var url = "";
var parentPath = "";
if(!data.path){
var param = new URL(location.href).searchParams;
url = param.get("url");
}else{
url = await parent.webos.fileSystem.zl(data.path);
parentPath = parent.webos.util.getParentPath(data.path);
}
var ext = data.ext;
if(that.art){
that.art.destroy();
}
if(ext === "m3u8x"){
ext = "m3u8";
utils.syncLoadData(url,function(res){
url = res.trim();
});
}
that.art = new Artplayer({
container: '#artplayer-app',
url: url,
title: mainName,
volume: 0.5,
isLive: false,
muted: false,
autoplay: true,
pip: true,
autoSize: true,
autoMini: true,
screenshot: true,
setting: true,
loop: true,
flip: true,
playbackRate: true,
aspectRatio: true,
fullscreen: true,
fullscreenWeb: false,
subtitleOffset: true,
miniProgressBar: true,
mutex: true,
backdrop: true,
playsInline: true,
autoPlayback: true,
airplay: true,
theme: '#23ade5',
type: ext,
lang: navigator.language.toLowerCase(),
whitelist: ['*'],
moreVideoAttr: {
crossOrigin: 'anonymous',
},
controls:[
{
position: 'right',
html: '

',
tooltip: '节目列表',
style: {
color: 'green',
},
click: function () {
that.listOpen = !that.listOpen;
},
}
],
settings: [
{
width: 200,
html: '字幕语言',
tooltip: 'SRT字幕',
icon: '
',
selector: [
{
html: '显示字幕',
tooltip: '显示',
switch: true,
onSwitch: function (item) {
item.tooltip = item.switch ? '隐藏' : '显示';
that.art.subtitle.show = !item.switch;
return !item.switch;
},
},
{
default: true,
html: 'SRT字幕',
url: await parent.webos.fileSystem.zlByName(parentPath+"/"+mainName+".srt"),
},
{
html: 'VTT字幕',
url: await parent.webos.fileSystem.zlByName(parentPath+"/"+mainName+".vtt"),
},
{
html: 'ASS字幕',
url: await parent.webos.fileSystem.zlByName(parentPath+"/"+mainName+".ass"),
}
],
onSelect: function (item) {
that.art.subtitle.switch(item.url, {
name: item.html,
});
return item.html;
},
}
],
subtitle: {
url: await parent.webos.fileSystem.zlByName(parentPath+"/"+mainName+".srt"),
type: 'srt',
style: {
color: '#fe9200',
fontSize: '20px',
},
encoding: 'utf-8',
},
customType: {
flv: function (video, url) {
console.log("播放flv",video,url)
if (flvjs.isSupported()) {
const flvPlayer = flvjs.createPlayer({
type: 'flv',
url: url,
});
flvPlayer.attachMediaElement(video);
flvPlayer.load();
} else {
parent.webos.message.error("不支持此视频")
}
},
m3u8: function (video, url) {
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(url);
hls.attachMedia(video);
} else {
const canPlay = video.canPlayType('application/vnd.apple.mpegurl');
if (canPlay === 'probably' || canPlay === 'maybe') {
video.src = url;
} else {
parent.webos.message.error("不支持此视频")
}
}
},
mpd: function (video, url) {
var player = dashjs.MediaPlayer().create();
player.initialize(video, url, true);
},
torrent: function (video, url, art) {
var client = new WebTorrent();
that.art.loading.show = true;
client.add(url, function (torrent) {
var file = torrent.files[0];
file.renderTo(video, {
autoplay: true,
});
});
},
}
});
that.art.on('video:loadeddata', function(){
setTimeout(function (){
that.onSizeChange(that.art.width,that.art.height);
},500);
});
that.art.on('video:ended',function (){
var index = that.current + 1;
if(index >= that.list.length){
index = 0;
}
that.playData(index);
});
},
removeData:function (index){
var that = this;
var data = that.list[index];
parent.utils.$.confirm("确认删除'"+data.name+"'视频吗?",async function(flag){
if(!flag){
return;
}
that.list.splice(index,1);
await parent.webos.softUserData.syncList("video_list",that.list);
if(index >= that.list.length){
index = that.list.length - 1;
}
that.playData(index);
});
},
removeDataAll:function (){
var that = this;
parent.utils.$.confirm("确认移除全部视频吗?此操作不可逆",async function(flag){
if(!flag){
return;
}
that.list = [];
await parent.webos.softUserData.syncList("video_list",that.list);
});
},
init:async function (){
var that = this;
var mfetch = window.fetch;
window.fetch = function (a,b){
if(b){
b.mode = undefined;
b.referrerPolicy = undefined
}
return mfetch(a,b);
}
parent.webos.util.setParentSimple(window);
var param = new URL(location.href).searchParams;
var list = await parent.webos.softUserData.syncList("video_list");
var expAction = param.get("expAction");
var index = -1;
if(expAction == "open"){
//打开模式
var data = {
name:"",
path:param.get("path"),
ext:param.get("ext")
}
if(param.get("fname")){
data.name = parent.webos.util.getMainByName(param.get("fname"));
}
index = player.hasInList(list,data);
if(index == -1){
list.push(data);
index = list.length - 1;
}
}else if(expAction == "playlist"){
//播放列表
var files = await parent.webos.util.getBigData("addAllFiles");
for (let i = 0; i < files.length; i++) {
var file = files[i];
var data = {name:"",ext:file.ext,path:file.path};
if(file.name){
data.name = parent.webos.util.getMainByName(file.name);
}
var tmpIndex = player.hasInList(list,data);
if(tmpIndex == -1){
list.push(data);
tmpIndex = list.length - 1;
}
if(index == -1){
index = tmpIndex;
}
}
}
if(index == -1){
index = 0;
}
parent.webos.softUserData.syncList("video_list",list);
that.list = list;
that.playData(index);
}
},
mounted:function(){
var that = this;
that.init();
document.onclick = function (e){
var flag = parent.webos.el.isInClass(e.target,"list-btn");
var flag2 = parent.webos.el.isInClass(e.target,"play-list");
if(flag || flag2){
return;
}
that.listOpen = false;
}
}
});
})()