You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Juying/SrcLive.js

1048 lines
46 KiB

//本代码仅用于个人学习,请勿用于其他作用,下载后请24小时内删除,代码虽然是公开学习的,但请尊重作者,应留下说明
require(config.依赖.replace(/[^/]*$/,'') + 'SrcJyPublic.js');
function Live() {
addListener("onClose", $.toString(() => {
clearMyVar('editmode');
clearMyVar('JYlivenum');
clearMyVar('JYlivedyurl');
clearMyVar('selectgroup');
clearMyVar('JYlivelocal');
}));
var d = [];
d.push({
title: '⚙管理中心⚙',
img: getIcon("聚影.svg"),
url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
LiveSet();
}),
col_type: 'avatar'
});
let livecfgfile = "hiker://files/rules/Src/Juying2/liveconfig.json";
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
} else {
var liveconfig = {};
}
let livedata = liveconfig['data'] || [];
livedata = livedata.filter(item => {
return item.show != 0;
})
let JYlivefile = rulepath + "live.txt";
let JYlive = "";
let JYlivedyurl = getMyVar('JYlivedyurl', 'juying');
if (getMyVar('JYlivelocal', '0') == "1") {
JYlive = fetch(JYlivefile);
} else {
if (JYlivedyurl == "juying") {
JYlive = fetch(JYlivefile);
if (JYlive == "" && livedata.length > 0) {
JYlivedyurl = livedata[0].url ? livedata[0].url : JYlivedyurl;
putMyVar('JYlivedyurl', JYlivedyurl);
}
}
if (JYlivedyurl != "juying") {
try {
showLoading('发现订阅源,正在初始化');
let YChtml = fetchCache(JYlivedyurl, 48, { timeout: 3000 }).replace(/TV-/g, 'TV').replace(/\[.*\]/g, '');
if (YChtml.indexOf('#genre#') > -1 || YChtml.indexOf('#EXTINF:-1') > -1) {
JYlive = YChtml;
}
hideLoading();
} catch (e) {
hideLoading();
log(e.message);
}
}
}
let color = getItem("主题颜色", "#2EC99D");
if (livedata.length > 0) {
d.push({
col_type: 'line'
})
for (let i = 0; i < 9; i++) {
d.push({
col_type: "blank_block"
})
}
d.push({
title: JYlivedyurl == "juying" ? `‘‘’’<b><span style="color:`+color+`">` + '本地' : '本地',
url: $("#noLoading#").lazyRule(() => {
putMyVar('JYlivedyurl', 'juying');
putMyVar('JYlivelocal', '1');
refreshPage(false);
return "toast://聚影直播本地源数据";
}),
col_type: 'scroll_button',
extra: {
backgroundColor: JYlivedyurl=="juying"?"#20" + color.replace('#',''):""
}
})
for (let i = 0; i < livedata.length; i++) {
let dyname = livedata[i].name;
let dyurl = livedata[i].url;
//if(livedata[i].show!=0){
d.push({
title: JYlivedyurl == dyurl ? `‘‘’’<b><span style="color:`+color+`">` + dyname : dyname,
url: $("#noLoading#").lazyRule((dyname, dyurl) => {
putMyVar('JYlivedyurl', dyurl);
clearMyVar('JYlivelocal');
clearMyVar('editmode');
refreshPage(false);
return "toast://已切换远程订阅:" + dyname;
}, dyname, dyurl),
col_type: 'scroll_button',
extra: {
backgroundColor: JYlivedyurl==dyurl?"#20" + color.replace('#',''):""
}
})
//}
}
d.push({
col_type: 'line'
})
}
let JYlives = [];
if (JYlive) {
if (JYlive.indexOf('#genre#') > -1) {
JYlives = JYlive.split('\n');
} else if (JYlive.indexOf('#EXTINF:-1') > -1) {
JYlives = JYlive.split('#EXTINF:-1 ');
}
}
if (JYlives.length > 0) {
let datalist = [];
let datalist2 = [];
let group = "";
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlive.indexOf('#genre#') > -1) {
if (JYlives[i].indexOf('#genre#') > -1) {
group = JYlives[i].split(',')[0];
} else if (JYlives[i].indexOf(',') > -1) {
datalist.push({ group: group, name: JYlives[i].split(',')[0].trim() });
}
} else if (JYlives[i].indexOf('group-title') > -1) {
datalist.push({ group: JYlives[i].match(/group-title="(.*?)"/)[1], name: JYlives[i].match(/",(.*?)\n/)[1] });
}
} catch (e) {
//log(e.message);
}
}
let obj = {};
if (JYlivedyurl == "juying") { putMyVar('JYlivenum', datalist.length); }
datalist = datalist.reduce((newArr, next) => {
obj[next.name] ? "" : (obj[next.name] = true && newArr.push(next));
return newArr;
}, []);
d.push({
title: "🔍",
url: $.toString((guanlidata, datalist) => {
if (datalist.length > 0) {
deleteItemByCls('livelist');
let lists = datalist.filter(item => {
return item.name.includes(input);
})
let gldatalist = guanlidata(lists);
addItemAfter('liveloading', gldatalist);
}
return "hiker://empty";
}, guanlidata, datalist),
desc: "搜你想要的...",
col_type: "input",
extra: {
id: "livesearch",
titleVisible: true
}
});
let grouplist = datalist.map((list) => {
return list.group;
})
function uniq(array) {
var temp = [];
for (var i = 0; i < array.length; i++) {
if (temp.indexOf(array[i]) == -1) {
temp.push(array[i]);
}
}
return temp;
}
grouplist = uniq(grouplist);
let index = 0;
for (var i in grouplist) {
let lists = datalist.filter(item => {
return item.group == grouplist[i];
})
if (lists.length > 0) {
let groupname = grouplist[i] ? grouplist[i] : "未分组";
let longClick = getMyVar('editmode', '0') == "1" ? [{
title: "删除此分组",
js: $.toString((groupname, lists) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return GroupEdit(groupname, 'del', lists);
}, groupname, lists)
}, {
title: "重命名分组",
js: $.toString((groupname) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return GroupEdit(groupname, 'rename');
}, groupname)
}] : [];
if (getItem('enabledpush', '') == '1') {
longClick.push({
title: "推送至TVBOX",
js: $.toString((groupname, lists) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return GroupEdit(groupname, 'pushBox', lists);
}, groupname, lists)
})
}
d.push({
title: index == 0 ? `‘‘’’<b><span style="color:`+color+`">` + groupname : groupname,
url: $('#noLoading#').lazyRule((grouplist, groupname, guanlidata, lists) => {
if (getMyVar('selectgroup') != groupname) {
putMyVar('selectgroup', groupname);
for (let i in grouplist) {
if (grouplist[i] == groupname) {
updateItem(groupname, { title: `‘‘’’<b><span style="color:`+getItem("主题颜色", "#2EC99D")+`">` + groupname })
} else {
updateItem(grouplist[i], { title: grouplist[i] })
}
}
deleteItemByCls('livelist');
let gldatalist = guanlidata(lists);
addItemAfter('liveloading', gldatalist);
}
return "hiker://empty";
}, grouplist, groupname, guanlidata, lists),
col_type: "scroll_button",
extra: {
id: groupname,
longClick: longClick
}
});
if (index == 0) {
datalist2 = lists;
index = 1;
}
}
}
d.push({
col_type: 'line',
extra: {
id: 'liveloading'
}
});
datalist = datalist2;
d = d.concat(guanlidata(datalist));
d.push({
title: '<br>',
col_type: 'rich_text'
});
} else {
d.push({
title: '没有直播数据源',
col_type: 'rich_text'
});
}
setHomeResult(d);
}
function GroupEdit(groupname, mode, lists) {
let JYlivefile = rulepath + "live.txt";
if (mode == 'del') {
try {
showLoading('删除中,请稍候...');
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
if (JYlives[i].indexOf('#genre#') > -1 && JYlives[i].indexOf(groupname) > -1) {
JYlives.splice(i, 1);
i = i - 1;
} else if (JYlives[i].indexOf('#genre#') == -1 && JYlives[i].indexOf(',') > -1 && lists.some(item => item.name == JYlives[i].split(',')[0].trim())) {
JYlives.splice(i, 1);
i = i - 1;
}
}
writeFile(JYlivefile, JYlives.join('\n'));
deleteItem(groupname);
let playlist = lists.map((list) => {
return list.name;
});
deleteItem(playlist);
hideLoading();
return "toast://已删除分组 <" + groupname + "> 所有地址";
} catch (e) {
hideLoading();
log(e.message);
return "toast://删除分组失败,详情查看日志";
}
} else if (mode == 'rename') {
return $("", "输入新的分组名").input((JYlivefile, groupname) => {
if (input) {
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf('#genre#') > -1 && JYlives[i].indexOf(groupname) > -1) {
JYlives[i] = JYlives[i].replace(groupname, input);
}
} catch (e) { }
}
writeFile(JYlivefile, JYlives.join('\n'));
updateItem(groupname, { title: input });
return "toast:// <" + groupname + "> 分组改名为 <" + input + ">";
} else {
return "toast://输入不能为空"
}
}, JYlivefile, groupname)
} else if (mode == 'pushBox') {
let push = {
"name": groupname,
"pic": 'https://hikerfans.com/tubiao/ke/156.png',
"content": '聚影直播推送',
"director": "分组推送",
"actor": "列表可能有点凌乱"
};
let urls = [];
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf('#genre#') == -1 && JYlives[i].indexOf(',') > -1 && lists.some(item => item.name == JYlives[i].split(',')[0].trim())) {
urls.push(JYlives[i].split(',')[0].trim() + '$' + JYlives[i].split(',')[1].split('#')[0]);
}
} catch (e) {
}
}
let tvip = getItem('hikertvboxset', '');
if (urls.length > 0) {
push['from'] = groupname;
push['url'] = urls.join('#').replace(/\&/g, '&&');
var state = request(tvip + '/action', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
//'X-Requested-With': 'XMLHttpRequest',
'Referer': tvip
},
timeout: 2000,
body: 'do=push&url=' + JSON.stringify(push),
method: 'POST'
});
if (state == 'ok') {
return 'toast://推送成功,如果不能播放则TVBOX版本不支持,分组推送完成。';
} else {
return 'toast://推送失败';
}
} else {
return 'toast://播放地址为空';
}
}
}
function guanlidata(datalist) {
let list = [];
for (let i = 0; i < datalist.length; i++) {
let name = datalist[i].name;
let longClick = getMyVar('editmode', '0') == "1" ? [{
title: "删除此频道",
js: $.toString((name) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return LiveEdit(name, 'del');
}, name)
}, {
title: "重命名频道",
js: $.toString((name) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return LiveEdit(name, 'rename');
}, name)
}] : [];
if (getItem('enabledpush', '') == '1') {
longClick.push({
title: "推送至TVBOX",
js: $.toString((name) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return LiveEdit(name, 'pushBox');
}, name)
})
}
list.push({
title: name,
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-tv.svg"),
col_type: 'icon_2_round',
url: $('#noLoading#').lazyRule((name) => {
require(config.依赖.replace(/[^/]*$/,'') + 'SrcLive.js');
return LivePlay(name);
}, name),
extra: {
id: name,
cls: 'livelist',
longClick: longClick
}
});
}
return list;
}
function LivePlay(name) {
let JYlive = getMyVar('JYlivedyurl', 'juying') == "juying" ? fetch(rulepath + "live.txt") : fetchCache(getMyVar('JYlivedyurl'), 24, { timeout: 3000 });
let JYlives = [];
if (JYlive.indexOf('#genre#') > -1) {
JYlives = JYlive.split('\n');
} else if (JYlive.indexOf('#EXTINF:-1') > -1) {
JYlives = JYlive.split('#EXTINF:-1 ');
}
let urls = [];
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlive.indexOf('#genre#') > -1) {
if (JYlives[i].indexOf(',') > -1 && JYlives[i].indexOf('#genre#') == -1 && JYlives[i].split(',')[0].replace(/TV-/g, 'TV').replace(/\[.*\]/g, '').trim() == name) {
let url = JYlives[i].split(',')[1].trim();
let urll = url.split('#');
urll.forEach(item => {
if (/\\r^/.test(item)) {
item = item.slice(0, item.length - 2);
}
if (item) {
urls.push(item + '#isVideo=true#');
}
})
}
} else if (JYlives[i].indexOf('group-title') > -1 && JYlives[i].match(/",(.*?)\n/)[1].replace(/TV-/g, 'TV').replace(/\[.*\]/g, '').trim() == name) {
let urll = JYlives[i].split('\n');
urls.push(urll[1] + '#isVideo=true#');
}
} catch (e) {
//log(e.message);
}
}
if (urls.length == 0) {
return "toast://无播放地址";
} else if (urls.length == 1) {
return urls[0];
} else {
return JSON.stringify({
urls: urls
});
}
}
function LiveEdit(name, mode) {
let JYlivefile = rulepath + "live.txt";
if (mode == 'del') {
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf('#genre#') == -1 && JYlives[i].indexOf(',') > -1 && JYlives[i].split(',')[0].replace(/TV-/g, 'TV').replace(/\[.*\]/g, '').trim() == name) {
JYlives.splice(i, 1);
i = i - 1;
}
} catch (e) { }
}
writeFile(JYlivefile, JYlives.join('\n'));
deleteItem(name);
return "toast://已删除 <" + name + ">";
} else if (mode == 'rename') {
return $("", "输入新的地址名").input((name, JYlivefile) => {
if (input) {
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf(',') > -1 && JYlives[i].indexOf(name) > -1) {
JYlives[i] = JYlives[i].replace(name, input);
}
} catch (e) { }
}
writeFile(JYlivefile, JYlives.join('\n'));
updateItem(name, {
title: input
});
return "toast:// <" + name + "> 改名为 <" + input + ">";
} else {
return "toast://输入不能为空"
}
}, name, JYlivefile)
} else if (mode == 'pushBox') {
let push = {
"name": name,
"pic": 'https://hikerfans.com/tubiao/ke/156.png',
"content": '聚影直播推送',
"director": "频道推送",
"actor": "单个频道所有线路"
};
let urls = [];
let JYlive = fetch(JYlivefile);
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf('#genre#') == -1 && JYlives[i].indexOf(',') > -1 && JYlives[i].split(',')[0].replace(/TV-/g, 'TV').replace(/\[.*\]/g, '').trim() == name) {
urls.push(JYlives[i].split(',')[1]);
}
} catch (e) { }
}
let tvip = getItem('hikertvboxset', '');
if (urls.length > 0) {
push['from'] = name;
push['url'] = { urls: urls };//urls.join('#').replace(/\&/g, '&&');
var state = request(tvip + '/action', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
//'X-Requested-With': 'XMLHttpRequest',
'Referer': tvip
},
timeout: 2000,
body: 'do=push&url=' + JSON.stringify(push),
method: 'POST'
});
if (state == 'ok') {
return 'toast://推送成功,如果不能播放则TVBOX版本不支持,单频道推送完成。';
} else {
return 'toast://推送失败';
}
} else {
return 'toast://播放地址为空';
}
}
}
function LiveSet() {
addListener("onClose", $.toString(() => {
if (getMyVar('isEdit') == "1") {
refreshPage(false);
}
clearMyVar('isEdit');
}));
//setPageTitle("⚙直播设置⚙");
var d = [];
d.push({
title: '👦哥就是帅,不接受反驳...',
col_type: "rich_text"
});
d.push({
col_type: "line_blank",
});
d.push({
title: "直播管理",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-管理.svg"),
col_type: "avatar",
url: "hiker://empty",
});
d.push({
title: "订阅源管理",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-箭头.svg"),
url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => {
addListener("onClose", $.toString(() => {
//refreshPage(false);
}));
let livecfgfile = globalMap0.getVar('Jy_gmParams').rulepath + "liveconfig.json";
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
} else {
var liveconfig = {};
}
var d = [];
d.push({
title: '‘‘’’<b>📺 订阅源管理</b> &nbsp &nbsp <small>添加自定义链接</small>',
img: "https://img.vinua.cn/images/QqyC.png",
url: $("", "输入通用格式的tv链接地址").input((livecfgfile, liveconfig) => {
if (input) {
if (/\/storage\/emulated\//.test(input)) { input = "file://" + input }
let livedata = liveconfig['data'] || [];
if (!livedata.some(item => item.url == input)) {
showLoading('正在验证链接有效性...');
let YChtml = request(input, { timeout: 3000 });
if (YChtml.indexOf('#genre#') > -1 || YChtml.indexOf('#EXTINF:-1') > -1) {
hideLoading();
return $("", "链接有效,起个名字保存").input((livedata, url, livecfgfile, liveconfig) => {
if (input) {
livedata.push({ name: input, url: url });
liveconfig['data'] = livedata;
writeFile(livecfgfile, JSON.stringify(liveconfig));
refreshPage(false);
return "toast://增加自定义tv链接地址成功";
} else {
return "toast://输入不能为空"
}
}, livedata, input, livecfgfile, liveconfig)
} else {
hideLoading();
return "toast://无法识别,需含#genre#的通用格式";
}
} else {
return "toast://已存在";
}
} else {
return "toast://地址不能为空";
}
}, livecfgfile, liveconfig),
col_type: 'text_1'
});
let livedata = liveconfig['data'] || [];
if (livedata.length > 0) {
d.push({
title: '点击下方的订阅源条目,进行操作👇',
col_type: "rich_text"
});
d.push({
col_type: "line"
});
function getide(is) {
if (is == 1) {
return '‘‘’’<strong><font color="#f13b66a">◉ </front></strong>';
} else {
return '‘‘’’<strong><font color="#F54343">◉ </front></strong>';
}
}
for (let i = 0; i < livedata.length; i++) {
d.push({
title: (livedata[i].show != 0 ? getide(1) : getide(0)) + livedata[i].name,
desc: livedata[i].url,
url: $(["复制链接", "修改名称", "导入本地", "更新缓存", "删除订阅", livedata[i].show != 0 ? "停用订阅" : "启用订阅"], 2, "").select((livecfgfile, url, name) => {
try {
if (input == "更新缓存") {
showLoading('正在缓存,请稍后.');
let YChtml = request(url, { timeout: 3000 });
if (YChtml.indexOf('#genre#') > -1) {
deleteCache(url);
let YChtml = fetchCache(url, 24, { timeout: 3000 }).replace(/TV-/g, 'TV').replace(/\[.*\]/g, '');
hideLoading();
return "toast://更新文件缓存成功";
} else {
hideLoading();
return "toast://更新失败";
}
} else if (input == "删除订阅") {
if (/^http/.test(url)) {
deleteCache(url);
}
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
let livedata = liveconfig['data'] || [];
for (let i = 0; i < livedata.length; i++) {
if (livedata[i].url == url) {
livedata.splice(i, 1);
break;
}
}
liveconfig['data'] = livedata;
writeFile(livecfgfile, JSON.stringify(liveconfig));
refreshPage(false);
}
} else if (input == "修改名称") {
return $(name, "修改新名称").input((livecfgfile,url)=>{
if(input.trim()==""){
return "toast://名称不能为空";
}
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
let livedata = liveconfig['data'] || [];
for (let i = 0; i < livedata.length; i++) {
if (livedata[i].url == url) {
livedata[i].name = input;
break;
}
}
liveconfig['data'] = livedata;
writeFile(livecfgfile, JSON.stringify(liveconfig));
refreshPage(false);
}
}, livecfgfile, url)
} else if (input == "导入本地") {
showLoading('叠加导入直播,最大万行限制');
let YChtml = fetchCache(url, 24, { timeout: 3000 }).replace(/TV-/g, 'TV').replace(/\[.*\]/g, '');
if (YChtml.indexOf('#genre#') > -1) {
var YClives = YChtml.split('\n');
} else {
var YClives = [];
}
if (YClives.length > 0) {
let importnum = 0;
let JYlivefile = globalMap0.getVar('Jy_gmParams').rulepath + "live.txt";
let JYlive = fetch(JYlivefile);
if (JYlive) {
var JYlives = JYlive.split('\n');
let id = 0;
let py = 0;
for (let i = 0; i < YClives.length; i++) {
if (JYlives.length > 10000) {
log('直播数据源文件已大于10000行,为保证效率停止导入');
break;
} else {
if (YClives[i].indexOf('#genre#') > -1 && JYlives.indexOf(YClives[i]) > -1) {
id = JYlives.indexOf(YClives[i]);
py = 0;
} else if (YClives[i].indexOf('#genre#') > -1 && JYlives.indexOf(YClives[i]) == -1) {
id = JYlives.length + 1;
py = 0;
JYlives.splice(id + 1, 0, YClives[i]);
} else if (YClives[i].indexOf(',') > -1 && JYlives.indexOf(YClives[i]) == -1 && YClives[i].trim() != "") {
JYlives.splice(id + 1 + py, 0, YClives[i]);
py++;
importnum++;
}
}
}
} else {
var JYlives = YClives;
importnum = JYlives.length;
}
writeFile(JYlivefile, JYlives.join('\n'));
hideLoading();
if (importnum > 0 && getMyVar('JYlivedyurl', 'juying') == "juying") {
putMyVar('isEdit', '1');
}
return "toast://成功导入" + importnum;
} else {
hideLoading();
return "toast://文件异常或不支持的格式,导入失败";
}
} else if (input == "复制链接") {
copy(url);
} else if (input == "停用订阅" || input == "启用订阅") {
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
let livedata = liveconfig['data'] || [];
for (let i = 0; i < livedata.length; i++) {
if (livedata[i].url == url) {
livedata[i].show = input == "停用订阅" ? 0 : 1;
break;
}
}
liveconfig['data'] = livedata;
writeFile(livecfgfile, JSON.stringify(liveconfig));
refreshPage(false);
}
}
return "hiker://empty";
} catch (e) {
hideLoading();
log(e.message);
return "toast://操作异常,详情查看日志";
}
}, livecfgfile, livedata[i].url, livedata[i].name),
col_type: "text_1"
});
}
} else {
d.push({
title: '↻无记录',
col_type: "rich_text"
});
}
setHomeResult(d);
}),
col_type: "text_icon"
});
d.push({
title: "box配置订阅",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-箭头.svg"),
col_type: "text_icon",
url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => {
addListener("onClose", $.toString(() => {
clearMyVar('importinput');
}));
let cfgfile = "hiker://files/rules/Src/Juying2/config.json";
let Juconfig = {};
let Jucfg = fetch(cfgfile);
if (Jucfg != "") {
eval("Juconfig=" + Jucfg + ";");
}
let d = [];
d.push({
title: '本地',
col_type: 'input',
desc: '请输入链接地址',
url: $.toString(() => {
return `fileSelect://` + $.toString(() => {
return "toast://" + input;
})
}),
extra: {
titleVisible: false,
defaultValue: getMyVar('importinput', ''),
onChange: 'putMyVar("importinput",input)'
}
});
d.push({
title: '⏏ 本地文件',
col_type: 'text_2',
url: `fileSelect://` + $.toString(() => {
putMyVar("importinput", "file://" + input);
refreshPage();
return "toast://" + input;
})
})
d.push({
title: '🆗 确定导入',
col_type: 'text_2',
url: $('#noLoading#').lazyRule((Juconfig, cfgfile) => {
let input = getMyVar('importinput', '');
if (input == "") {
return 'toast://请先输入链接地址'
}
let importrecord = Juconfig['importrecord'] || [];
if (importrecord.length > 20) {//保留20个记录
importrecord.shift();
}
if (!importrecord.some(item => item.url == input && item.type == '1')) {
importrecord.push({ type: '1', url: input });
Juconfig['importrecord'] = importrecord;
writeFile(cfgfile, JSON.stringify(Juconfig));
}
let data;
try {
showLoading('检测文件有效性');
if (/\/storage\/emulated\//.test(input)) { input = "file://" + input }
let html = request(input, { timeout: 2000 });
if (html.includes('LuUPraez**')) {
html = base64Decode(html.split('LuUPraez**')[1]);
}
eval('data = ' + html)
} catch (e) {
hideLoading();
log('TVBox文件检测失败>' + e.message);
return "toast://TVBox导入失败:链接文件无效或内容有错";
}
hideLoading();
let lives = data.lives || [];
if (lives.length > 0) {
showLoading('正在导入');
try {
let urls = [];
for (let i = 0; i < lives.length; i++) {
if (lives[i].channels) {
let channels = lives[i].channels;
if (channels.length > 0) {
for (let j = 0; j < channels.length; j++) {
let live = channels[i].urls;
for (let k = 0; k < live.length; k++) {
let url = live[i].replace('proxy://do=live&type=txt&ext=', '');
if (!/^http/.test(url)) {
url = base64Decode(url);
}
urls.push({ name: url.substr(url.lastIndexOf('/') + 1).split('.')[0], url: url });
}
}
}
} else if (lives[i].url) {
let url = lives[i].url;
if (/^\./.test(url)) {
url = input.match(/http(s)?:\/\/.*\//)[0] + url.replace("./", "");
}
urls.push({ name: lives[i].name || url.substr(url.lastIndexOf('/') + 1).split('.')[0], url: url });
}
}
if (urls.length > 0) {
livenum = 0;
let livecfgfile = "hiker://files/rules/Src/Juying2/liveconfig.json";
let livecfg = fetch(livecfgfile);
if (livecfg != "") {
eval("var liveconfig = " + livecfg);
} else {
var liveconfig = {};
}
let livedata = liveconfig['data'] || [];
for (let i = 0; i < urls.length; i++) {
if (!livedata.some(item => item.url == urls[i].url)) {
let YChtml = request(urls[i].url, { timeout: 5000 }).replace(/TV-/g, 'TV');
if (YChtml.indexOf('#genre#') > -1 || YChtml.indexOf('#EXTINF:-1') > -1) {
livedata.push(urls[i]);
livenum++;
}
}
}
if (livenum > 0) {
liveconfig['data'] = livedata;
writeFile(livecfgfile, JSON.stringify(liveconfig));
}
hideLoading();
return 'toast://成功订阅:' + livenum;
}
} catch (e) {
log('TVBox导入live保存失败>' + e.message);
}
}
hideLoading();
return 'toast://失败';
}, Juconfig, cfgfile)
})
d.push({
title: '🆖 历史记录',
col_type: "rich_text"
});
let importrecord = Juconfig['importrecord'] || [];
let lists = importrecord.filter(item => {
return item.type == '1';
})
if (lists.length > 0) {
lists.reverse();
for (let i = 0; i < lists.length; i++) {
d.push({
title: lists[i].url,
url: $('#noLoading#').lazyRule((url) => {
putMyVar('importinput', url);
refreshPage(true);
return "toast://已选择,需确认";
}, lists[i].url),
col_type: "text_1",
extra: {
id: lists[i].url,
longClick: [{
title: "删除",
js: $.toString((cfgfile, Juconfig, url) => {
let importrecord = Juconfig['importrecord']||[];
for(let j=0;j<importrecord.length;j++){
if(importrecord[j].url==url&&importrecord[j].type=='1'){
importrecord.splice(j,1);
break;
}
}
Juconfig['importrecord'] = importrecord;
writeFile(cfgfile, JSON.stringify(Juconfig));
refreshPage(false);
return "toast://已删除";
},cfgfile, Juconfig, lists[i].url)
}]
}
});
}
}
setResult(d);
})
});
d.push({
col_type: "line",
});
d.push({
title: "编辑本地源",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-箭头.svg"),
col_type: "text_icon",
url:
getMyVar("JYlivedyurl", "juying") == "juying"
? $("#noLoading#").lazyRule(() => {
if (getMyVar("JYlivenum", "0") == "0") {
return "toast://本地数据源为空,无法进入编辑模式";
}
putMyVar("editmode", "1");
putMyVar("isEdit", "1");
return "toast://进入编辑模式,长按分组或频道选择操作";
})
: "toast://当前为远程订阅源,无法进入编辑模式",
});
d.push({
title: "清空直播源",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-箭头.svg"),
col_type: "text_icon",
url: $("确定清空聚影直播本地文件?").confirm(() => {
writeFile(globalMap0.getVar('Jy_gmParams').rulepath + "live.txt", "");
if (getMyVar("JYlivedyurl", "juying") == "juying") {
putMyVar("isEdit", "1");
}
clearMyVar("JYlivenum");
refreshPage(false);
return "toast://已清空";
}),
});
d.push({
col_type: "line_blank",
});
d.push({
title: "清理失效",
img: globalMap0.getVar('Jy_gmParams').getIcon("直播-清理.svg"),
col_type: "avatar",
url: "hiker://empty",
});
d.push({
title: "‘‘实验功能可能存在误删,谨慎操作!’’",
desc: "通过判断地址是否可以访问来甄别有效性\n聚影本地直播源地址有:" + getMyVar("JYlivenum", "0"),
col_type: 'text_center_1',
url: $('#noLoading#').lazyRule(() => {
putMyVar('isEdit', '1');
let urls = [];
let JYlivefile = globalMap0.getVar('Jy_gmParams').rulepath + "live.txt";
let JYlive = fetch(JYlivefile);
if (JYlive != "") {
var task = function (obj) {
try {
let url = obj.split(',')[1];
let code = JSON.parse(request(url, { onlyHeaders: true, timeout: 1000 }));
if (code.statusCode != 200) {
fails.push(obj);
}
} catch (e) {
}
return 1;
}
let JYlives = JYlive.split('\n');
for (let i = 0; i < JYlives.length; i++) {
try {
if (JYlives[i].indexOf(',') > -1 && JYlives[i].indexOf('#genre#') == -1) {
urls.push(JYlives[i]);
}
} catch (e) { }
}
showLoading('检测' + urls.length + '条,保持屏幕亮屏');
let fails = [];
for (var i = 0; i < urls.length; i++) {
let UrlList = [];
let p = i + 799;
for (let s = i; s < p; s++) {
UrlList.push(urls[s]);
i = s;
}
let urlscheck = UrlList.map((list) => {
return {
func: task,
param: list,
id: list
}
});
be(urlscheck, {
func: function (obj, id, error, taskResult) {
},
param: {
}
});
}
for (let i = 0; i < JYlives.length; i++) {
if (fails.indexOf(JYlives[i]) > -1) {
JYlives.splice(i, 1);
i = i - 1;
}
}
writeFile(JYlivefile, JYlives.join('\n'));
hideLoading();
if (fails.length > 0 && getMyVar('JYlivedyurl', 'juying') == "juying") {
putMyVar('isEdit', '1');
}
return "toast://删除疑似失效源" + fails.length + "条";
} else {
return "toast://没有直播数据源";
}
})
});
setHomeResult(d);
}