mirror of
https://github.com/cuiocean/ZY-Player.git
synced 2026-06-14 22:25:51 +08:00
bug修复
This commit is contained in:
@@ -222,6 +222,9 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.disableExpand div.el-table__expand-icon{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.el-input{
|
.el-input{
|
||||||
width: 200px;
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
lazy
|
lazy
|
||||||
:load="(row, treeNode, resolve) => resolve(row.channels)"
|
:load="(row, treeNode, resolve) => resolve(row.channels)"
|
||||||
:tree-props="{hasChildren: 'hasChildren'}"
|
:tree-props="{hasChildren: 'hasChildren'}"
|
||||||
|
@expand-change="expandChange"
|
||||||
@row-click="playEvent"
|
@row-click="playEvent"
|
||||||
@select="selectionCellClick"
|
@select="selectionCellClick"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
<el-table-column
|
<el-table-column
|
||||||
default-sort="ascending"
|
default-sort="ascending"
|
||||||
prop="name"
|
prop="name"
|
||||||
|
:class-name="enableBatchEdit ? 'disableExpand' : ''"
|
||||||
label="频道名">
|
label="频道名">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-input
|
<el-input
|
||||||
@@ -91,9 +93,9 @@
|
|||||||
<span>总频道数:{{ iptvList.length }}</span>
|
<span>总频道数:{{ iptvList.length }}</span>
|
||||||
</template>
|
</template>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button @click.stop="moveToTopEvent(scope.row)" type="text">置顶</el-button>
|
<el-button @click.stop="moveToTopEvent(scope.row)" type="text" v-if="scope.row.id > iptvList.length">置顶</el-button>
|
||||||
<!-- 检测时先强制批量检测一遍,如果不强制直接单个检测时第一次不会显示“检测中”-->
|
<!-- 检测时先强制批量检测一遍,如果不强制直接单个检测时第一次不会显示“检测中”-->
|
||||||
<el-button size="mini" v-if="iptvList.every(channel => channel.status)" v-show="!checkAllChannelsLoading" @click.stop="checkSingleChannel(scope.row)" type="text">检测</el-button>
|
<el-button size="mini" v-if="iptvList.every(channel => channel.status)" v-show="!checkAllChannelsLoading" @click.stop="checkChannel(scope.row)" type="text">检测</el-button>
|
||||||
<el-button @click.stop="removeEvent(scope.row)" type="text">删除</el-button>
|
<el-button @click.stop="removeEvent(scope.row)" type="text">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -125,6 +127,7 @@ export default {
|
|||||||
selectionBegin: '',
|
selectionBegin: '',
|
||||||
selectionEnd: '',
|
selectionEnd: '',
|
||||||
multipleSelection: [],
|
multipleSelection: [],
|
||||||
|
expandedRows: [],
|
||||||
checkAllChannelsLoading: false,
|
checkAllChannelsLoading: false,
|
||||||
checkProgress: 0,
|
checkProgress: 0,
|
||||||
stopFlag: false,
|
stopFlag: false,
|
||||||
@@ -184,6 +187,11 @@ export default {
|
|||||||
this.$message.info('正在检测, 请勿操作.')
|
this.$message.info('正在检测, 请勿操作.')
|
||||||
this.enableBatchEdit = false
|
this.enableBatchEdit = false
|
||||||
}
|
}
|
||||||
|
if (this.enableBatchEdit) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.expandedRows.forEach(e => this.$refs.iptvTable.toggleRowExpansion(e, false))
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -194,9 +202,9 @@ export default {
|
|||||||
selectionCellClick (selection, row) {
|
selectionCellClick (selection, row) {
|
||||||
if (this.shiftDown && this.selectionBegin !== '' && selection.includes(row)) {
|
if (this.shiftDown && this.selectionBegin !== '' && selection.includes(row)) {
|
||||||
this.selectionEnd = row.id
|
this.selectionEnd = row.id
|
||||||
const start = Math.min(this.selectionBegin, this.selectionEnd) - 1
|
const start = Math.min(this.selectionBegin, this.selectionEnd) - 1 - this.iptvList.length
|
||||||
const end = Math.max(this.selectionBegin, this.selectionEnd)
|
const end = Math.max(this.selectionBegin, this.selectionEnd) - this.iptvList.length
|
||||||
const selections = this.channelList.slice(start, end) // 多选时似乎得强制不让展开
|
const selections = this.channelList.slice(start, end) // 多选时强制不让展开
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
selections.forEach(e => this.$refs.iptvTable.toggleRowSelection(e, true))
|
selections.forEach(e => this.$refs.iptvTable.toggleRowSelection(e, true))
|
||||||
})
|
})
|
||||||
@@ -209,6 +217,14 @@ export default {
|
|||||||
this.selectionBegin = ''
|
this.selectionBegin = ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
expandChange (row, expanded) {
|
||||||
|
const index = this.expandedRows.indexOf(row)
|
||||||
|
if (expanded && index === -1) {
|
||||||
|
this.expandedRows.push(row)
|
||||||
|
} else if (!expanded && index !== -1) {
|
||||||
|
this.expandedRows.splice(index, 1)
|
||||||
|
}
|
||||||
|
},
|
||||||
handleSelectionChange (rows) {
|
handleSelectionChange (rows) {
|
||||||
this.multipleSelection = rows
|
this.multipleSelection = rows
|
||||||
},
|
},
|
||||||
@@ -228,8 +244,14 @@ export default {
|
|||||||
})
|
})
|
||||||
this.updateDatabase()
|
this.updateDatabase()
|
||||||
},
|
},
|
||||||
playEvent (e) { // 待修改
|
playEvent (e) { // 下一步与Play联动prefer
|
||||||
this.video = { iptv: { name: e.name, url: e.url, id: e.id } }
|
if (e.id <= this.iptvList.length) {
|
||||||
|
this.video = { iptv: e }
|
||||||
|
} else {
|
||||||
|
const prefer = e.channels.filter(c => c.isActive)[0]
|
||||||
|
if (!prefer) return
|
||||||
|
this.video = { iptv: prefer }
|
||||||
|
}
|
||||||
this.view = 'Play'
|
this.view = 'Play'
|
||||||
},
|
},
|
||||||
containsearchTxt (i) {
|
containsearchTxt (i) {
|
||||||
@@ -245,12 +267,16 @@ export default {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (row.id <= this.iptvList.length) {
|
if (row.url) {
|
||||||
|
debugger
|
||||||
iptv.remove(row.id)
|
iptv.remove(row.id)
|
||||||
|
const parent = this.channelList.find(e => e.id === row.channelID)
|
||||||
|
parent.channels = parent.channels.filter(e => e.id !== row.id)
|
||||||
|
channelList.remove(row.channelID)
|
||||||
|
channelList.add(parent)
|
||||||
} else {
|
} else {
|
||||||
channelList.remove(row.id)
|
channelList.remove(row.id)
|
||||||
row.channels.forEach(e => {
|
row.channels.forEach(e => {
|
||||||
e.isActive = row.isActive
|
|
||||||
iptv.remove(e.id)
|
iptv.remove(e.id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -300,6 +326,8 @@ export default {
|
|||||||
}
|
}
|
||||||
remote.dialog.showOpenDialog(options).then(result => {
|
remote.dialog.showOpenDialog(options).then(result => {
|
||||||
if (!result.canceled) {
|
if (!result.canceled) {
|
||||||
|
var _id = 1
|
||||||
|
this.iptvList.forEach(e => { e.id = _id++ }) // 导入时需重置iptvList的id
|
||||||
var docs = this.iptvList
|
var docs = this.iptvList
|
||||||
var id = docs.length + 1
|
var id = docs.length + 1
|
||||||
result.filePaths.forEach(file => {
|
result.filePaths.forEach(file => {
|
||||||
@@ -372,20 +400,18 @@ export default {
|
|||||||
iptv.clear().then(iptv.bulkAdd(defaultChannels).then(this.updateChannelList()))
|
iptv.clear().then(iptv.bulkAdd(defaultChannels).then(this.updateChannelList()))
|
||||||
},
|
},
|
||||||
removeSelectedChannels () {
|
removeSelectedChannels () {
|
||||||
this.multipleSelection.forEach(e => this.removeEvent(e))
|
this.multipleSelection.forEach(e => { channelList.remove(e.id); e.channels.forEach(c => iptv.remove(c.id)) })
|
||||||
this.$refs.iptvTable.clearFilter()
|
this.$refs.iptvTable.clearFilter()
|
||||||
this.getChannelList()
|
this.getChannelList()
|
||||||
this.updateDatabase()
|
this.updateDatabase()
|
||||||
this.enableBatchEdit = false
|
this.enableBatchEdit = false
|
||||||
},
|
},
|
||||||
updateChannelList () { // 存在些问题,有时会丢失频道,特别是“电视频道1”基本上丢完了,3、4丢失得少
|
updateChannelList () {
|
||||||
iptv.all().then(res => {
|
iptv.all().then(res => {
|
||||||
console.log('执行')
|
|
||||||
const resClone = JSON.parse(JSON.stringify(res))
|
const resClone = JSON.parse(JSON.stringify(res))
|
||||||
console.log(res.length, Array.from(new Set(this.iptvList)))
|
|
||||||
const uniqueChannelName = {}
|
const uniqueChannelName = {}
|
||||||
for (var i = 0; i < resClone.length; i++) {
|
for (var i = 0; i < resClone.length; i++) {
|
||||||
var channelName = resClone[i].name.replace(/[- ]?(1080p|蓝光|超清|高清|标清|hd|cq|4k)(\d{1,2})?/i, '')
|
var channelName = resClone[i].name.trim().replace(/[- ]?(1080p|蓝光|超清|高清|标清|hd|cq|4k)(\d{1,2})?$/i, '')
|
||||||
if (channelName.match(/cctv/i)) channelName = channelName.replace('-', '')
|
if (channelName.match(/cctv/i)) channelName = channelName.replace('-', '')
|
||||||
if (Object.keys(uniqueChannelName).some(name => channelName.match(new RegExp(`${name}(1080p|4k|(?!\\d))`, 'i')))) continue // 避免重复
|
if (Object.keys(uniqueChannelName).some(name => channelName.match(new RegExp(`${name}(1080p|4k|(?!\\d))`, 'i')))) continue // 避免重复
|
||||||
const matchRule = new RegExp(`${channelName}(1080p|4k|(?!\\d))`, 'i')
|
const matchRule = new RegExp(`${channelName}(1080p|4k|(?!\\d))`, 'i')
|
||||||
@@ -402,7 +428,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(uniqueChannelName)
|
|
||||||
res.forEach(ele => {
|
res.forEach(ele => {
|
||||||
if (ele.isActive === undefined) {
|
if (ele.isActive === undefined) {
|
||||||
ele.isActive = true
|
ele.isActive = true
|
||||||
@@ -413,8 +438,9 @@ export default {
|
|||||||
this.getIptvList()
|
this.getIptvList()
|
||||||
channelList.clear().then(channelList.bulkAdd(this.channelList))
|
channelList.clear().then(channelList.bulkAdd(this.channelList))
|
||||||
iptv.clear().then(iptv.bulkAdd(this.iptvList))
|
iptv.clear().then(iptv.bulkAdd(this.iptvList))
|
||||||
console.log(res.length, Array.from(new Set(this.iptvList)))
|
// 用于验证
|
||||||
res.forEach(e => { if (!this.iptvList.includes(e)) console.log(e) })
|
// console.log(res.length, Array.from(new Set(this.iptvList)))
|
||||||
|
// res.forEach(e => { if (!this.iptvList.includes(e)) console.log(e) })
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getChannelList () {
|
getChannelList () {
|
||||||
@@ -445,14 +471,14 @@ export default {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
moveToTopEvent (row) { // children内置顶隐藏么?
|
moveToTopEvent (row) {
|
||||||
if (this.checkAllChannelsLoading) {
|
if (this.checkAllChannelsLoading) {
|
||||||
this.$message.info('正在检测, 请勿操作.')
|
this.$message.info('正在检测, 请勿操作.')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// this.channelList.sort(function (x, y) { return (x.name === i.name && x.url === i.url) ? -1 : (y.name === i.name && y.url === i.url) ? 1 : 0 })
|
// this.channelList.sort(function (x, y) { return (x.name === i.name && x.url === i.url) ? -1 : (y.name === i.name && y.url === i.url) ? 1 : 0 })
|
||||||
if (row.id > this.iptvList.length) {
|
if (row.id > this.iptvList.length) {
|
||||||
this.channelList.splice(row.id - 1, 1)
|
this.channelList.splice(row.id - this.iptvList.length - 1, 1)
|
||||||
this.channelList.unshift(row)
|
this.channelList.unshift(row)
|
||||||
this.updateDatabase()
|
this.updateDatabase()
|
||||||
}
|
}
|
||||||
@@ -463,23 +489,25 @@ export default {
|
|||||||
this.getIptvList()
|
this.getIptvList()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateDatabase () { // 数据库保存时有点问题
|
updateDatabase () {
|
||||||
this.syncTableData()
|
this.syncTableData()
|
||||||
channelList.clear().then(res => {
|
channelList.clear().then(res => {
|
||||||
this.resetId(this.channelList)
|
this.resetId(this.channelList)
|
||||||
channelList.bulkAdd(this.channelList)
|
channelList.bulkAdd(this.channelList)
|
||||||
iptv.clear().then(iptv.bulkAdd(this.iptvList))
|
iptv.clear().then(iptv.bulkAdd(this.iptvList))
|
||||||
|
this.getChannelList()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
resetId (channelList) {
|
resetId (channelList) {
|
||||||
|
this.getIptvList()
|
||||||
var id = this.iptvList.length + 1
|
var id = this.iptvList.length + 1
|
||||||
channelList.forEach(ele => {
|
channelList.forEach(ele => {
|
||||||
ele.id = id
|
ele.id = id
|
||||||
id += 1
|
id += 1
|
||||||
ele.channels.forEach(e => { e.channelId = ele.id })
|
ele.channels.forEach(e => { e.channelID = ele.id })
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
rowDrop () { // 如何避免children被拖出来?
|
rowDrop () {
|
||||||
if (this.checkAllChannelsLoading) {
|
if (this.checkAllChannelsLoading) {
|
||||||
this.$message.info('正在检测, 请勿操作.')
|
this.$message.info('正在检测, 请勿操作.')
|
||||||
return false
|
return false
|
||||||
@@ -487,6 +515,7 @@ export default {
|
|||||||
const tbody = document.getElementById('iptv-table').querySelector('.el-table__body-wrapper tbody')
|
const tbody = document.getElementById('iptv-table').querySelector('.el-table__body-wrapper tbody')
|
||||||
const _this = this
|
const _this = this
|
||||||
Sortable.create(tbody, {
|
Sortable.create(tbody, {
|
||||||
|
filter: '.el-table__row--level-1', // 禁止children拖动
|
||||||
onEnd ({ newIndex, oldIndex }) {
|
onEnd ({ newIndex, oldIndex }) {
|
||||||
const currRow = _this.channelList.splice(oldIndex, 1)[0]
|
const currRow = _this.channelList.splice(oldIndex, 1)[0]
|
||||||
_this.channelList.splice(newIndex, 0, currRow)
|
_this.channelList.splice(newIndex, 0, currRow)
|
||||||
@@ -498,8 +527,10 @@ export default {
|
|||||||
if (row.id <= this.iptvList.length) {
|
if (row.id <= this.iptvList.length) {
|
||||||
iptv.remove(row.id)
|
iptv.remove(row.id)
|
||||||
iptv.add(row)
|
iptv.add(row)
|
||||||
const parent = this.channelList[row.channelID - this.iptvList.length - 1] // 用index还是通过id来反查
|
const parent = this.channelList.find(e => e.id === row.channelID)
|
||||||
parent.isActive = parent.channels.some(e => e.isActive)
|
parent.isActive = parent.channels.some(e => e.isActive)
|
||||||
|
channelList.remove(row.channelID)
|
||||||
|
channelList.add(parent)
|
||||||
} else {
|
} else {
|
||||||
channelList.remove(row.id)
|
channelList.remove(row.id)
|
||||||
channelList.add(row)
|
channelList.add(row)
|
||||||
@@ -510,21 +541,22 @@ export default {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async checkAllChannels () { // 检测部分需要增加channelList状态提示,还是全部展开
|
async checkAllChannels () {
|
||||||
this.checkAllChannelsLoading = true
|
this.checkAllChannelsLoading = true
|
||||||
this.stopFlag = false
|
this.stopFlag = false
|
||||||
this.checkProgress = 0
|
this.checkProgress = 0
|
||||||
|
this.channelList.forEach(e => { e.status = ' '; e.hasCheckedNum = 0 })
|
||||||
const uncheckedList = this.iptvList.filter(e => e.status === undefined || e.status === ' ') // 未检测过的优先
|
const uncheckedList = this.iptvList.filter(e => e.status === undefined || e.status === ' ') // 未检测过的优先
|
||||||
const other = this.iptvList.filter(e => !uncheckedList.includes(e))
|
const other = this.iptvList.filter(e => !uncheckedList.includes(e))
|
||||||
await this.checkChannelListBySite(uncheckedList)
|
await this.checkChannelsBySite(uncheckedList)
|
||||||
await this.checkChannelListBySite(other).then(res => {
|
await this.checkChannelsBySite(other).then(res => {
|
||||||
this.checkAllChannelsLoading = false
|
this.checkAllChannelsLoading = false
|
||||||
this.updateChannelList()
|
this.updateChannelList()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
async checkChannelListBySite (channelList) {
|
async checkChannelsBySite (channels) {
|
||||||
var siteList = {}
|
var siteList = {}
|
||||||
channelList.forEach(channel => {
|
channels.forEach(channel => {
|
||||||
const site = channel.url.split('/')[2]
|
const site = channel.url.split('/')[2]
|
||||||
if (siteList[site]) {
|
if (siteList[site]) {
|
||||||
siteList[site].push(channel)
|
siteList[site].push(channel)
|
||||||
@@ -540,23 +572,40 @@ export default {
|
|||||||
await this.checkSingleChannel(c)
|
await this.checkSingleChannel(c)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async checkSingleChannel (row) {
|
async checkSingleChannel (channel) {
|
||||||
row.status = ' '
|
channel.status = ' '
|
||||||
|
const parent = this.channelList.find(e => e.id === channel.channelID)
|
||||||
if (this.stopFlag) {
|
if (this.stopFlag) {
|
||||||
this.checkProgress += 1
|
this.checkProgress += 1
|
||||||
return row.status
|
return channel.status
|
||||||
}
|
}
|
||||||
const flag = await zy.checkChannel(row.url)
|
const flag = await zy.checkChannel(channel.url)
|
||||||
this.checkProgress += 1
|
this.checkProgress += 1
|
||||||
|
parent.hasCheckedNum++
|
||||||
if (flag) {
|
if (flag) {
|
||||||
row.status = '可用'
|
channel.status = '可用'
|
||||||
} else {
|
} else {
|
||||||
row.status = '失效'
|
channel.status = '失效'
|
||||||
row.isActive = false
|
channel.isActive = false
|
||||||
|
}
|
||||||
|
if (parent.hasCheckedNum === parent.channels.length) {
|
||||||
|
parent.status = parent.channels.some(channel => channel.status === '可用') ? '可用' : '失效'
|
||||||
|
if (parent.status === '失效') parent.isActive = false
|
||||||
|
channelList.remove(channel.channelID)
|
||||||
|
channelList.add(parent)
|
||||||
|
}
|
||||||
|
iptv.remove(channel.id)
|
||||||
|
iptv.add(channel)
|
||||||
|
return channel.status
|
||||||
|
},
|
||||||
|
async checkChannel (row) {
|
||||||
|
if (row.id > this.iptvList.length) {
|
||||||
|
row.status = ' '
|
||||||
|
row.hasCheckedNum = 0
|
||||||
|
row.channels.forEach(e => this.checkSingleChannel(e))
|
||||||
|
} else {
|
||||||
|
this.checkSingleChannel(row)
|
||||||
}
|
}
|
||||||
iptv.remove(row.id)
|
|
||||||
iptv.add(row)
|
|
||||||
return row.status
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
|
|||||||
Reference in New Issue
Block a user