diff --git a/package.json b/package.json index 5b83475..2cb366e 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "fast-xml-parser": "^3.17.4", "html2canvas": "^1.0.0-rc.5", "iptv-playlist-parser": "^0.5.0", + "m3u": "0.0.2", "modern-normalize": "^0.6.0", "mousetrap": "^1.6.5", "qrcode.vue": "^1.7.0", diff --git a/src/components/IPTV.vue b/src/components/IPTV.vue index 8003390..6b0eb1f 100644 --- a/src/components/IPTV.vue +++ b/src/components/IPTV.vue @@ -2,9 +2,6 @@
-
-
添加
-
导出
@@ -21,31 +18,6 @@
-
-
    -
  • - 频道名 - Url - - - - -
  • -
  • - - - - - - - - 添加 - 关闭 - -
  • -
  • -
-
    @@ -77,12 +49,6 @@ export default { data () { return { iptvList: [], - showAddSite: false, - newSite: - { - name: '', - site: '' - }, searchkeyword: '' } }, @@ -135,30 +101,6 @@ export default { this.$message.warning('删除频道失败, 错误信息: ' + err) }) }, - closeAddSite () { - this.showAddSite = false - }, - openAddSite () { - this.showAddSite = true - }, - addNewSite () { - if (!this.newSite.name || !this.newSite.url) { - this.$message.error('名称和API接口不能为空。') - return - } - var doc = { - name: this.newSite.name, - url: this.newSite.url - } - iptv.add(doc).then(res => { - this.newSite = { - name: '', - url: '' - } - this.$message.success('添加新源成功!') - this.getAllSites() - }) - }, listUpdatedEvent () { iptv.clear().then(res1 => { // 重新排序 @@ -171,19 +113,18 @@ export default { }) }, exportSites () { - this.getAllSites() - const arr = [...this.iptvList] - const str = JSON.stringify(arr, null, 4) const options = { filters: [ - { name: 'JSON file', extensions: ['json'] }, - { name: 'Normal text file', extensions: ['txt'] }, - { name: 'All types', extensions: ['*'] } + { name: 'm3u file', extensions: ['m3u'] } ] } remote.dialog.showSaveDialog(options).then(result => { if (!result.canceled) { - fs.writeFileSync(result.filePath, str) + var writer = require('m3u').extendedWriter() + this.iptvList.forEach(e => { + writer.file(e.url, -1, e.name) + }) + fs.writeFileSync(result.filePath, writer.toString()) this.$message.success('已保存成功') } }).catch(err => { @@ -193,47 +134,35 @@ export default { importSites () { const options = { filters: [ - { name: 'm3u file', extensions: ['m3u'] }, - { name: 'JSON file', extensions: ['json'] } + { name: 'm3u file', extensions: ['m3u'] } ], properties: ['openFile'] } remote.dialog.showOpenDialog(options).then(result => { if (!result.canceled) { result.filePaths.forEach(file => { - if (file.endsWith('json')) { - var str = fs.readFileSync(file) - const json = JSON.parse(str) + const parser = require('iptv-playlist-parser') + const playlist = fs.readFileSync(file, { encoding: 'utf-8' }) + const result = parser.parse(playlist) + var docs = [] + result.items.forEach(ele => { + if (ele.name && ele.url && ele.url.endsWith('m3u8')) { + var doc = { + name: ele.name, + url: ele.url + } + docs.push(doc) + } + }) + if (docs) { iptv.clear().then(res => { - iptv.bulkAdd(json).then(e => { + iptv.bulkAdd(docs).then(e => { this.getAllSites() this.$message.success('导入成功') }) }) - } else if (file.endsWith('m3u')) { - const parser = require('iptv-playlist-parser') - const playlist = fs.readFileSync(file, { encoding: 'utf-8' }) - const result = parser.parse(playlist) - var docs = [] - result.items.forEach(ele => { - if (ele.name && ele.url && ele.url.endsWith('m3u8')) { - var doc = { - name: ele.name, - url: ele.url - } - docs.push(doc) - } - }) - if (docs) { - iptv.clear().then(res => { - iptv.bulkAdd(docs).then(e => { - this.getAllSites() - this.$message.success('导入成功') - }) - }) - } else { - this.$message.error('m3u文件没有读取到可用源数据') - } + } else { + this.$message.error('m3u文件没有读取到可用源数据') } }) } @@ -248,7 +177,7 @@ export default { }, getAllSites () { iptv.all().then(res => { - this.iptvList = res + this.iptvList = [...new Set(res)] }) } },