From a250317a289cfde0cc45a66de8c05d10f901427c Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 9 Sep 2021 16:45:10 +0800 Subject: [PATCH 01/75] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmg=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E6=97=A0=E6=B3=95=E5=8A=A0=E8=BD=BD=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 17 +----- src/renderer/utils/music/mg/index.js | 2 +- src/renderer/utils/music/mg/leaderboard.js | 32 +++++------ src/renderer/utils/music/mg/musicSearch.js | 2 +- src/renderer/utils/music/mg/songList.js | 67 ++++++++++++++-------- 5 files changed, 63 insertions(+), 57 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index ed934bb5..259b4235 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,18 +1,3 @@ -如果你喜欢并经常使用洛雪音乐,并想要第一时间尝鲜洛雪的新功能,可以加入测试企鹅群768786588, -注意:测试版的功可能会不稳定,打算潜水的勿加。 - -### 新增 - -- 歌曲搜索框新增清理按钮,点击此按钮可以清理搜索框并返回初始搜索界面 -- 新增“下载的歌词文件编码格式”设置,默认下载的歌词编码仍是`UTF-8`,对于某些在设备(如车机)上出现歌词中文乱码的用户可以尝试选择以`GBK`编码格式保存歌词文件 -- 新增设置-桌面歌词-歌词字体设置,此设置可用于设置桌面歌词的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行**尝试**看常见解决) - -### 优化 - -- 支持网易源“我喜欢”歌单以注入token的方式打开。由于网易源的“我喜欢”歌单需要登录才能打开(若你看不懂后半句就去阅读 常见问题-无法打开外部歌单),现若想要打开此类歌单,需要在歌单链接后面拼上 `###` 再加上有效的token,拼接格式:`[id|url]###token`,例子(最后面的xxxxxx替换成你的token):`https://music.163.com/#/playlist?id=123456&userid=123456###xxxxxx` -- 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序 - ### 修复 -- 修复某些情况下同步功能会导致切歌混乱的问题 -- 修复从电脑浏览器复制的企鹅歌单链接无法打开的问题 +- 修复mg排行榜无法加载的问题 diff --git a/src/renderer/utils/music/mg/index.js b/src/renderer/utils/music/mg/index.js index d6fede76..72ccde6a 100644 --- a/src/renderer/utils/music/mg/index.js +++ b/src/renderer/utils/music/mg/index.js @@ -1,5 +1,5 @@ import { apis } from '../api-source' -import leaderboard from './leaderboard2' +import leaderboard from './leaderboard' import songList from './songList' import musicSearch from './musicSearch' import pic from './pic' diff --git a/src/renderer/utils/music/mg/leaderboard.js b/src/renderer/utils/music/mg/leaderboard.js index 3315b8e2..195098c3 100644 --- a/src/renderer/utils/music/mg/leaderboard.js +++ b/src/renderer/utils/music/mg/leaderboard.js @@ -2,7 +2,9 @@ import { httpFetch } from '../../request' import { sizeFormate } from '../../index' -const boardList = [{ id: 'mg__27553319', name: '咪咕尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '咪咕尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '咪咕尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '咪咕港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '咪咕内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '咪咕欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '咪咕日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '咪咕彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: '咪咕KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '咪咕网络榜', bangid: '15140034' }, { id: 'mg__23217754', name: 'MV榜', bangid: '23217754' }, { id: 'mg__23218151', name: '新专辑榜', bangid: '23218151' }, { id: 'mg__21958042', name: 'iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: 'billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272904', name: '中国TOP排行榜', bangid: '22272904' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }] +// const boardList = [{ id: 'mg__27553319', name: '咪咕尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '咪咕尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '咪咕尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '咪咕港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '咪咕内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '咪咕欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '咪咕日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '咪咕彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: '咪咕KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '咪咕网络榜', bangid: '15140034' }, { id: 'mg__23217754', name: 'MV榜', bangid: '23217754' }, { id: 'mg__23218151', name: '新专辑榜', bangid: '23218151' }, { id: 'mg__21958042', name: 'iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: 'billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272904', name: '中国TOP排行榜', bangid: '22272904' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }] + +const boardList = [{ id: 'mg__27553319', name: '尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: 'KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '网络榜', bangid: '15140034' }, { id: 'mg__21958042', name: '美国iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: '美国billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }] export default { limit: 200, @@ -59,7 +61,7 @@ export default { }, ], getUrl(id, page) { - return `https://app.c.nf.migu.cn/MIGUM3.0/v1.0/template/rank-detail/release?columnId=${id}` + return `https://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/querycontentbyId.do?columnId=${id}&needAll=0` // return `http://m.music.migu.cn/migu/remoting/cms_list_tag?nid=${id}&pageSize=${this.limit}&pageNo=${page - 1}` }, successCode: '000000', @@ -67,16 +69,12 @@ export default { requestObj: null, getBoardsData() { if (this.requestBoardsObj) this._requestBoardsObj.cancelHttp() - this.requestBoardsObj = httpFetch('https://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/indexrank.do?templateVersion=8', { + this.requestBoardsObj = httpFetch('https://app.c.nf.migu.cn/MIGUM3.0/v1.0/template/rank-list/release', { + // this.requestBoardsObj = httpFetch('https://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/indexrank.do?templateVersion=8', { headers: { - sign: 'c3b7ae985e2206e97f1b2de8f88691e2', - timestamp: 1578225871982, - appId: 'yyapp2', - mode: 'android', - ua: 'Android_migu', - version: '6.9.4', - osVersion: 'android 7.0', - 'User-Agent': 'okhttp/3.9.1', + Referer: 'https://app.c.nf.migu.cn/', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', + channel: '0146921', }, }) return this.requestBoardsObj.promise @@ -98,13 +96,13 @@ export default { // console.log(rawData) let ids = new Set() const list = [] - rawData.forEach(item => { + rawData.forEach(({ objectInfo: item }) => { if (ids.has(item.copyrightId)) return ids.add(item.copyrightId) const types = [] const _types = {} - item.rateFormats && item.rateFormats.forEach(type => { + item.newRateFormats && item.newRateFormats.forEach(type => { let size switch (type.formatType) { case 'PQ': @@ -131,6 +129,8 @@ export default { } }) + const intervalTest = /(\d\d:\d\d)$/.test(item.length) + list.push({ singer: this.getSinger(item.artists), name: item.songName, @@ -140,7 +140,7 @@ export default { songId: item.songId, copyrightId: item.copyrightId, source: 'mg', - interval: null, + interval: intervalTest ? RegExp.$1 : null, img: item.albumImgs && item.albumImgs.length ? item.albumImgs[0].img : null, lrc: null, lrcUrl: item.lrcUrl, @@ -197,9 +197,9 @@ export default { getList(bangid, page, retryNum = 0) { if (++retryNum > 3) return Promise.reject(new Error('try max num')) return this.getData(this.getUrl(bangid, page)).then(({ statusCode, body }) => { - console.log(body) + // console.log(body) if (statusCode !== 200 || body.code !== this.successCode) return this.getList(bangid, page, retryNum) - const list = this.filterData(body.data.columnInfo.dataList) + const list = this.filterData(body.columnInfo.contents) return { total: list.length, list, diff --git a/src/renderer/utils/music/mg/musicSearch.js b/src/renderer/utils/music/mg/musicSearch.js index 64e548ab..ce6632c1 100644 --- a/src/renderer/utils/music/mg/musicSearch.js +++ b/src/renderer/utils/music/mg/musicSearch.js @@ -45,7 +45,7 @@ export default { ids.add(item.id) const types = [] const _types = {} - item.rateFormats && item.rateFormats.forEach(type => { + item.newRateFormats && item.newRateFormats.forEach(type => { let size switch (type.formatType) { case 'PQ': diff --git a/src/renderer/utils/music/mg/songList.js b/src/renderer/utils/music/mg/songList.js index 368e3592..3f775d19 100644 --- a/src/renderer/utils/music/mg/songList.js +++ b/src/renderer/utils/music/mg/songList.js @@ -1,7 +1,7 @@ import { httpFetch } from '../../request' import { sizeFormate } from '../../index' -const tagData = { code: '000000', info: 'SUCCESS', columnInfo: { columnTitle: '分类', columnId: '15244430', columnPid: '15031270', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 6, columnStatus: 1, columnCreateTime: '2016-11-10 10:53:05.077', columntype: 2011, contents: [{ contentId: '18464615', relationType: 2011, objectInfo: { columnTitle: '热门', columnId: '18464615', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 8, columnStatus: 1, columnCreateTime: '2017-02-20 16:09:13.400', columntype: 2011, contents: [{ contentId: '1000001672', relationType: 4034, objectInfo: { tagId: '1000001672', tagName: '流行', resourceType: '2034' }, relationSort: 9 }, { contentId: '1003449727', relationType: 4034, objectInfo: { tagId: '1003449727', tagName: '厂牌', resourceType: '2034' }, relationSort: 8 }, { contentId: '1000001795', relationType: 4034, objectInfo: { tagId: '1000001795', tagName: '伤感', resourceType: '2034' }, relationSort: 7 }, { contentId: '1001076080', relationType: 4034, objectInfo: { tagId: '1001076080', tagName: '电影', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001675', relationType: 4034, objectInfo: { tagId: '1000001675', tagName: '中国风', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001635', relationType: 4034, objectInfo: { tagId: '1000001635', tagName: '经典老歌', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001831', relationType: 4034, objectInfo: { tagId: '1000001831', tagName: '翻唱', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001762', relationType: 4034, objectInfo: { tagId: '1000001762', tagName: '国语', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266029', customizedPicUrls: [] }, relationSort: 6 }, { contentId: '15244503', relationType: 2011, objectInfo: { columnTitle: '主题', columnId: '15244503', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 23, columnStatus: 1, columnCreateTime: '2016-11-10 10:54:10.261', columntype: 2011, contents: [{ contentId: '1003449727', relationType: 4034, objectInfo: { tagId: '1003449727', tagName: '厂牌', resourceType: '2034' }, relationSort: 29 }, { contentId: '1001076080', relationType: 4034, objectInfo: { tagId: '1001076080', tagName: '电影', resourceType: '2034' }, relationSort: 28 }, { contentId: '1001076078', relationType: 4034, objectInfo: { tagId: '1001076078', tagName: '电视剧', resourceType: '2034' }, relationSort: 27 }, { contentId: '1001076083', relationType: 4034, objectInfo: { tagId: '1001076083', tagName: '综艺', resourceType: '2034' }, relationSort: 26 }, { contentId: '1000001827', relationType: 4034, objectInfo: { tagId: '1000001827', tagName: 'KTV', resourceType: '2034' }, relationSort: 23 }, { contentId: '1000001698', relationType: 4034, objectInfo: { tagId: '1000001698', tagName: '爱情', resourceType: '2034' }, relationSort: 22 }, { contentId: '1000001635', relationType: 4034, objectInfo: { tagId: '1000001635', tagName: '经典老歌', resourceType: '2034' }, relationSort: 21 }, { contentId: '1001076096', relationType: 4034, objectInfo: { tagId: '1001076096', tagName: '网络热歌', resourceType: '2034' }, relationSort: 20 }, { contentId: '1000001780', relationType: 4034, objectInfo: { tagId: '1000001780', tagName: '儿童歌曲', resourceType: '2034' }, relationSort: 19 }, { contentId: '1000587702', relationType: 4034, objectInfo: { tagId: '1000587702', tagName: '广场舞', resourceType: '2034' }, relationSort: 18 }, { contentId: '1000587717', relationType: 4034, objectInfo: { tagId: '1000587717', tagName: '70后', resourceType: '2034' }, relationSort: 17 }, { contentId: '1000587718', relationType: 4034, objectInfo: { tagId: '1000587718', tagName: '80后', resourceType: '2034' }, relationSort: 16 }, { contentId: '1000587726', relationType: 4034, objectInfo: { tagId: '1000587726', tagName: '90后', resourceType: '2034' }, relationSort: 15 }, { contentId: '1000001670', relationType: 4034, objectInfo: { tagId: '1000001670', tagName: '红歌', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000587698', relationType: 4034, objectInfo: { tagId: '1000587698', tagName: '游戏', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587706', relationType: 4034, objectInfo: { tagId: '1000587706', tagName: '动漫', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001675', relationType: 4034, objectInfo: { tagId: '1000001675', tagName: '中国风', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000587712', relationType: 4034, objectInfo: { tagId: '1000587712', tagName: '青春校园', resourceType: '2034' }, relationSort: 10 }, { contentId: '1000587673', relationType: 4034, objectInfo: { tagId: '1000587673', tagName: '小清新', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000093902', relationType: 4034, objectInfo: { tagId: '1000093902', tagName: 'DJ舞曲', resourceType: '2034' }, relationSort: 7 }, { contentId: '1000093963', relationType: 4034, objectInfo: { tagId: '1000093963', tagName: '广告', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001831', relationType: 4034, objectInfo: { tagId: '1000001831', tagName: '翻唱', resourceType: '2034' }, relationSort: 2 }, { contentId: '1003449726', relationType: 4034, objectInfo: { tagId: '1003449726', tagName: '读书', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266055', customizedPicUrls: [] }, relationSort: 5 }, { contentId: '15244509', relationType: 2011, objectInfo: { columnTitle: '风格', columnId: '15244509', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 12, columnStatus: 1, columnCreateTime: '2016-11-10 10:54:57.257', columntype: 2011, contents: [{ contentId: '1000001672', relationType: 4034, objectInfo: { tagId: '1000001672', tagName: '流行', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000001808', relationType: 4034, objectInfo: { tagId: '1000001808', tagName: 'R&B', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000001809', relationType: 4034, objectInfo: { tagId: '1000001809', tagName: '嘻哈', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001674', relationType: 4034, objectInfo: { tagId: '1000001674', tagName: '摇滚', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000001682', relationType: 4034, objectInfo: { tagId: '1000001682', tagName: '电子', resourceType: '2034' }, relationSort: 10 }, { contentId: '1000001852', relationType: 4034, objectInfo: { tagId: '1000001852', tagName: '电子舞曲', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000001681', relationType: 4034, objectInfo: { tagId: '1000001681', tagName: '爵士', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001683', relationType: 4034, objectInfo: { tagId: '1000001683', tagName: '乡村', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001851', relationType: 4034, objectInfo: { tagId: '1000001851', tagName: '蓝调', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001775', relationType: 4034, objectInfo: { tagId: '1000001775', tagName: '民谣', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001807', relationType: 4034, objectInfo: { tagId: '1000001807', tagName: '纯音乐', resourceType: '2034' }, relationSort: 2 }, { contentId: '1000001783', relationType: 4034, objectInfo: { tagId: '1000001783', tagName: '古典', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266033', customizedPicUrls: [] }, relationSort: 4 }, { contentId: '18464665', relationType: 2011, objectInfo: { columnTitle: '语种', columnId: '18464665', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 6, columnStatus: 1, columnCreateTime: '2017-02-20 16:07:16.566', columntype: 2011, contents: [{ contentId: '1000001762', relationType: 4034, objectInfo: { tagId: '1000001762', tagName: '国语', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001763', relationType: 4034, objectInfo: { tagId: '1000001763', tagName: '粤语', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001766', relationType: 4034, objectInfo: { tagId: '1000001766', tagName: '英语', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001599', relationType: 4034, objectInfo: { tagId: '1000001599', tagName: '韩语', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001767', relationType: 4034, objectInfo: { tagId: '1000001767', tagName: '日语', resourceType: '2034' }, relationSort: 2 }, { contentId: '1003449724', relationType: 4034, objectInfo: { tagId: '1003449724', tagName: '小语种', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266036', customizedPicUrls: [] }, relationSort: 3 }, { contentId: '18464583', relationType: 2011, objectInfo: { columnTitle: '心情', columnId: '18464583', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 13, columnStatus: 1, columnCreateTime: '2017-02-20 15:59:03.412', columntype: 2011, contents: [{ contentId: '1000587677', relationType: 4034, objectInfo: { tagId: '1000587677', tagName: '幸福', resourceType: '2034' }, relationSort: 15 }, { contentId: '1000587710', relationType: 4034, objectInfo: { tagId: '1000587710', tagName: '治愈', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000001703', relationType: 4034, objectInfo: { tagId: '1000001703', tagName: '思念', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587667', relationType: 4034, objectInfo: { tagId: '1000587667', tagName: '期待', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001700', relationType: 4034, objectInfo: { tagId: '1000001700', tagName: '励志', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000001694', relationType: 4034, objectInfo: { tagId: '1000001694', tagName: '欢快', resourceType: '2034' }, relationSort: 10 }, { contentId: '1002600588', relationType: 4034, objectInfo: { tagId: '1002600588', tagName: '叛逆', resourceType: '2034' }, relationSort: 9 }, { contentId: '1002600585', relationType: 4034, objectInfo: { tagId: '1002600585', tagName: '宣泄', resourceType: '2034' }, relationSort: 8 }, { contentId: '1000001696', relationType: 4034, objectInfo: { tagId: '1000001696', tagName: '怀旧', resourceType: '2034' }, relationSort: 7 }, { contentId: '1000587679', relationType: 4034, objectInfo: { tagId: '1000587679', tagName: '减压', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001699', relationType: 4034, objectInfo: { tagId: '1000001699', tagName: '寂寞', resourceType: '2034' }, relationSort: 5 }, { contentId: '1002600579', relationType: 4034, objectInfo: { tagId: '1002600579', tagName: '忧郁', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001795', relationType: 4034, objectInfo: { tagId: '1000001795', tagName: '伤感', resourceType: '2034' }, relationSort: 3 }], dataVersion: '1620410266187', customizedPicUrls: [] }, relationSort: 2 }, { contentId: '18464638', relationType: 2011, objectInfo: { columnTitle: '场景', columnId: '18464638', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 13, columnStatus: 1, columnCreateTime: '2017-02-20 16:02:59.711', columntype: 2011, contents: [{ contentId: '1000587689', relationType: 4034, objectInfo: { tagId: '1000587689', tagName: '清晨', resourceType: '2034' }, relationSort: 21 }, { contentId: '1000587690', relationType: 4034, objectInfo: { tagId: '1000587690', tagName: '夜晚', resourceType: '2034' }, relationSort: 20 }, { contentId: '1000587688', relationType: 4034, objectInfo: { tagId: '1000587688', tagName: '睡前安眠', resourceType: '2034' }, relationSort: 19 }, { contentId: '1003449726', relationType: 4034, objectInfo: { tagId: '1003449726', tagName: '读书', resourceType: '2034' }, relationSort: 18 }, { contentId: '1003449723', relationType: 4034, objectInfo: { tagId: '1003449723', tagName: '下午·茶', resourceType: '2034' }, relationSort: 16 }, { contentId: '1000093923', relationType: 4034, objectInfo: { tagId: '1000093923', tagName: '驾车', resourceType: '2034' }, relationSort: 15 }, { contentId: '1003449615', relationType: 4034, objectInfo: { tagId: '1003449615', tagName: '运动', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587694', relationType: 4034, objectInfo: { tagId: '1000587694', tagName: '散步', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001749', relationType: 4034, objectInfo: { tagId: '1000001749', tagName: '旅行', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000587686', relationType: 4034, objectInfo: { tagId: '1000587686', tagName: '夜店', resourceType: '2034' }, relationSort: 10 }, { contentId: '1002600606', relationType: 4034, objectInfo: { tagId: '1002600606', tagName: '派对', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000001634', relationType: 4034, objectInfo: { tagId: '1000001634', tagName: '咖啡馆', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000587692', relationType: 4034, objectInfo: { tagId: '1000587692', tagName: '瑜伽', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620846028994', customizedPicUrls: [] }, relationSort: 1 }], dataVersion: '1620846028941', customizedPicUrls: [] } } +// const tagData = { code: '000000', info: 'SUCCESS', columnInfo: { columnTitle: '分类', columnId: '15244430', columnPid: '15031270', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 6, columnStatus: 1, columnCreateTime: '2016-11-10 10:53:05.077', columntype: 2011, contents: [{ contentId: '18464615', relationType: 2011, objectInfo: { columnTitle: '热门', columnId: '18464615', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 8, columnStatus: 1, columnCreateTime: '2017-02-20 16:09:13.400', columntype: 2011, contents: [{ contentId: '1000001672', relationType: 4034, objectInfo: { tagId: '1000001672', tagName: '流行', resourceType: '2034' }, relationSort: 9 }, { contentId: '1003449727', relationType: 4034, objectInfo: { tagId: '1003449727', tagName: '厂牌', resourceType: '2034' }, relationSort: 8 }, { contentId: '1000001795', relationType: 4034, objectInfo: { tagId: '1000001795', tagName: '伤感', resourceType: '2034' }, relationSort: 7 }, { contentId: '1001076080', relationType: 4034, objectInfo: { tagId: '1001076080', tagName: '电影', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001675', relationType: 4034, objectInfo: { tagId: '1000001675', tagName: '中国风', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001635', relationType: 4034, objectInfo: { tagId: '1000001635', tagName: '经典老歌', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001831', relationType: 4034, objectInfo: { tagId: '1000001831', tagName: '翻唱', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001762', relationType: 4034, objectInfo: { tagId: '1000001762', tagName: '国语', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266029', customizedPicUrls: [] }, relationSort: 6 }, { contentId: '15244503', relationType: 2011, objectInfo: { columnTitle: '主题', columnId: '15244503', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 23, columnStatus: 1, columnCreateTime: '2016-11-10 10:54:10.261', columntype: 2011, contents: [{ contentId: '1003449727', relationType: 4034, objectInfo: { tagId: '1003449727', tagName: '厂牌', resourceType: '2034' }, relationSort: 29 }, { contentId: '1001076080', relationType: 4034, objectInfo: { tagId: '1001076080', tagName: '电影', resourceType: '2034' }, relationSort: 28 }, { contentId: '1001076078', relationType: 4034, objectInfo: { tagId: '1001076078', tagName: '电视剧', resourceType: '2034' }, relationSort: 27 }, { contentId: '1001076083', relationType: 4034, objectInfo: { tagId: '1001076083', tagName: '综艺', resourceType: '2034' }, relationSort: 26 }, { contentId: '1000001827', relationType: 4034, objectInfo: { tagId: '1000001827', tagName: 'KTV', resourceType: '2034' }, relationSort: 23 }, { contentId: '1000001698', relationType: 4034, objectInfo: { tagId: '1000001698', tagName: '爱情', resourceType: '2034' }, relationSort: 22 }, { contentId: '1000001635', relationType: 4034, objectInfo: { tagId: '1000001635', tagName: '经典老歌', resourceType: '2034' }, relationSort: 21 }, { contentId: '1001076096', relationType: 4034, objectInfo: { tagId: '1001076096', tagName: '网络热歌', resourceType: '2034' }, relationSort: 20 }, { contentId: '1000001780', relationType: 4034, objectInfo: { tagId: '1000001780', tagName: '儿童歌曲', resourceType: '2034' }, relationSort: 19 }, { contentId: '1000587702', relationType: 4034, objectInfo: { tagId: '1000587702', tagName: '广场舞', resourceType: '2034' }, relationSort: 18 }, { contentId: '1000587717', relationType: 4034, objectInfo: { tagId: '1000587717', tagName: '70后', resourceType: '2034' }, relationSort: 17 }, { contentId: '1000587718', relationType: 4034, objectInfo: { tagId: '1000587718', tagName: '80后', resourceType: '2034' }, relationSort: 16 }, { contentId: '1000587726', relationType: 4034, objectInfo: { tagId: '1000587726', tagName: '90后', resourceType: '2034' }, relationSort: 15 }, { contentId: '1000001670', relationType: 4034, objectInfo: { tagId: '1000001670', tagName: '红歌', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000587698', relationType: 4034, objectInfo: { tagId: '1000587698', tagName: '游戏', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587706', relationType: 4034, objectInfo: { tagId: '1000587706', tagName: '动漫', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001675', relationType: 4034, objectInfo: { tagId: '1000001675', tagName: '中国风', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000587712', relationType: 4034, objectInfo: { tagId: '1000587712', tagName: '青春校园', resourceType: '2034' }, relationSort: 10 }, { contentId: '1000587673', relationType: 4034, objectInfo: { tagId: '1000587673', tagName: '小清新', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000093902', relationType: 4034, objectInfo: { tagId: '1000093902', tagName: 'DJ舞曲', resourceType: '2034' }, relationSort: 7 }, { contentId: '1000093963', relationType: 4034, objectInfo: { tagId: '1000093963', tagName: '广告', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001831', relationType: 4034, objectInfo: { tagId: '1000001831', tagName: '翻唱', resourceType: '2034' }, relationSort: 2 }, { contentId: '1003449726', relationType: 4034, objectInfo: { tagId: '1003449726', tagName: '读书', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266055', customizedPicUrls: [] }, relationSort: 5 }, { contentId: '15244509', relationType: 2011, objectInfo: { columnTitle: '风格', columnId: '15244509', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 12, columnStatus: 1, columnCreateTime: '2016-11-10 10:54:57.257', columntype: 2011, contents: [{ contentId: '1000001672', relationType: 4034, objectInfo: { tagId: '1000001672', tagName: '流行', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000001808', relationType: 4034, objectInfo: { tagId: '1000001808', tagName: 'R&B', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000001809', relationType: 4034, objectInfo: { tagId: '1000001809', tagName: '嘻哈', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001674', relationType: 4034, objectInfo: { tagId: '1000001674', tagName: '摇滚', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000001682', relationType: 4034, objectInfo: { tagId: '1000001682', tagName: '电子', resourceType: '2034' }, relationSort: 10 }, { contentId: '1000001852', relationType: 4034, objectInfo: { tagId: '1000001852', tagName: '电子舞曲', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000001681', relationType: 4034, objectInfo: { tagId: '1000001681', tagName: '爵士', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001683', relationType: 4034, objectInfo: { tagId: '1000001683', tagName: '乡村', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001851', relationType: 4034, objectInfo: { tagId: '1000001851', tagName: '蓝调', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001775', relationType: 4034, objectInfo: { tagId: '1000001775', tagName: '民谣', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001807', relationType: 4034, objectInfo: { tagId: '1000001807', tagName: '纯音乐', resourceType: '2034' }, relationSort: 2 }, { contentId: '1000001783', relationType: 4034, objectInfo: { tagId: '1000001783', tagName: '古典', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266033', customizedPicUrls: [] }, relationSort: 4 }, { contentId: '18464665', relationType: 2011, objectInfo: { columnTitle: '语种', columnId: '18464665', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 6, columnStatus: 1, columnCreateTime: '2017-02-20 16:07:16.566', columntype: 2011, contents: [{ contentId: '1000001762', relationType: 4034, objectInfo: { tagId: '1000001762', tagName: '国语', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001763', relationType: 4034, objectInfo: { tagId: '1000001763', tagName: '粤语', resourceType: '2034' }, relationSort: 5 }, { contentId: '1000001766', relationType: 4034, objectInfo: { tagId: '1000001766', tagName: '英语', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001599', relationType: 4034, objectInfo: { tagId: '1000001599', tagName: '韩语', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000001767', relationType: 4034, objectInfo: { tagId: '1000001767', tagName: '日语', resourceType: '2034' }, relationSort: 2 }, { contentId: '1003449724', relationType: 4034, objectInfo: { tagId: '1003449724', tagName: '小语种', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620410266036', customizedPicUrls: [] }, relationSort: 3 }, { contentId: '18464583', relationType: 2011, objectInfo: { columnTitle: '心情', columnId: '18464583', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 13, columnStatus: 1, columnCreateTime: '2017-02-20 15:59:03.412', columntype: 2011, contents: [{ contentId: '1000587677', relationType: 4034, objectInfo: { tagId: '1000587677', tagName: '幸福', resourceType: '2034' }, relationSort: 15 }, { contentId: '1000587710', relationType: 4034, objectInfo: { tagId: '1000587710', tagName: '治愈', resourceType: '2034' }, relationSort: 14 }, { contentId: '1000001703', relationType: 4034, objectInfo: { tagId: '1000001703', tagName: '思念', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587667', relationType: 4034, objectInfo: { tagId: '1000587667', tagName: '期待', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001700', relationType: 4034, objectInfo: { tagId: '1000001700', tagName: '励志', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000001694', relationType: 4034, objectInfo: { tagId: '1000001694', tagName: '欢快', resourceType: '2034' }, relationSort: 10 }, { contentId: '1002600588', relationType: 4034, objectInfo: { tagId: '1002600588', tagName: '叛逆', resourceType: '2034' }, relationSort: 9 }, { contentId: '1002600585', relationType: 4034, objectInfo: { tagId: '1002600585', tagName: '宣泄', resourceType: '2034' }, relationSort: 8 }, { contentId: '1000001696', relationType: 4034, objectInfo: { tagId: '1000001696', tagName: '怀旧', resourceType: '2034' }, relationSort: 7 }, { contentId: '1000587679', relationType: 4034, objectInfo: { tagId: '1000587679', tagName: '减压', resourceType: '2034' }, relationSort: 6 }, { contentId: '1000001699', relationType: 4034, objectInfo: { tagId: '1000001699', tagName: '寂寞', resourceType: '2034' }, relationSort: 5 }, { contentId: '1002600579', relationType: 4034, objectInfo: { tagId: '1002600579', tagName: '忧郁', resourceType: '2034' }, relationSort: 4 }, { contentId: '1000001795', relationType: 4034, objectInfo: { tagId: '1000001795', tagName: '伤感', resourceType: '2034' }, relationSort: 3 }], dataVersion: '1620410266187', customizedPicUrls: [] }, relationSort: 2 }, { contentId: '18464638', relationType: 2011, objectInfo: { columnTitle: '场景', columnId: '18464638', columnPid: '15244430', opNumItem: { playNum: 0, playNumDesc: '0', keepNum: 0, keepNumDesc: '0', commentNum: 0, commentNumDesc: '0', shareNum: 0, shareNumDesc: '0', orderNumByWeek: 0, orderNumByWeekDesc: '0', orderNumByTotal: 0, orderNumByTotalDesc: '0', thumbNum: 0, thumbNumDesc: '0', followNum: 0, followNumDesc: '0', subscribeNum: 0, subscribeNumDesc: '0', livePlayNum: 0, livePlayNumDesc: '0', popularNum: 0, popularNumDesc: '0', bookingNum: 0, bookingNumDesc: '0' }, contentsCount: 13, columnStatus: 1, columnCreateTime: '2017-02-20 16:02:59.711', columntype: 2011, contents: [{ contentId: '1000587689', relationType: 4034, objectInfo: { tagId: '1000587689', tagName: '清晨', resourceType: '2034' }, relationSort: 21 }, { contentId: '1000587690', relationType: 4034, objectInfo: { tagId: '1000587690', tagName: '夜晚', resourceType: '2034' }, relationSort: 20 }, { contentId: '1000587688', relationType: 4034, objectInfo: { tagId: '1000587688', tagName: '睡前安眠', resourceType: '2034' }, relationSort: 19 }, { contentId: '1003449726', relationType: 4034, objectInfo: { tagId: '1003449726', tagName: '读书', resourceType: '2034' }, relationSort: 18 }, { contentId: '1003449723', relationType: 4034, objectInfo: { tagId: '1003449723', tagName: '下午·茶', resourceType: '2034' }, relationSort: 16 }, { contentId: '1000093923', relationType: 4034, objectInfo: { tagId: '1000093923', tagName: '驾车', resourceType: '2034' }, relationSort: 15 }, { contentId: '1003449615', relationType: 4034, objectInfo: { tagId: '1003449615', tagName: '运动', resourceType: '2034' }, relationSort: 13 }, { contentId: '1000587694', relationType: 4034, objectInfo: { tagId: '1000587694', tagName: '散步', resourceType: '2034' }, relationSort: 12 }, { contentId: '1000001749', relationType: 4034, objectInfo: { tagId: '1000001749', tagName: '旅行', resourceType: '2034' }, relationSort: 11 }, { contentId: '1000587686', relationType: 4034, objectInfo: { tagId: '1000587686', tagName: '夜店', resourceType: '2034' }, relationSort: 10 }, { contentId: '1002600606', relationType: 4034, objectInfo: { tagId: '1002600606', tagName: '派对', resourceType: '2034' }, relationSort: 9 }, { contentId: '1000001634', relationType: 4034, objectInfo: { tagId: '1000001634', tagName: '咖啡馆', resourceType: '2034' }, relationSort: 3 }, { contentId: '1000587692', relationType: 4034, objectInfo: { tagId: '1000587692', tagName: '瑜伽', resourceType: '2034' }, relationSort: 1 }], dataVersion: '1620846028994', customizedPicUrls: [] }, relationSort: 1 }], dataVersion: '1620846028941', customizedPicUrls: [] } } export default { _requestObj_tags: null, @@ -33,7 +33,8 @@ export default { // https://music.migu.cn/v3/music/playlist/161044573?page=1 listDetailLink: /^.+\/playlist\/(\d+)(?:\?.*|&.*$|#.*$|$)/, }, - tagsUrl: 'https://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/indexTagPage.do?needAll=0', + tagsUrl: 'https://app.c.nf.migu.cn/MIGUM3.0/v1.0/template/musiclistplaza-taglist/release', + // tagsUrl: 'https://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/indexTagPage.do?needAll=0', getSongListUrl(sortId, tagId, page) { // if (tagId == null) { // return sortId == 'recommend' @@ -85,7 +86,7 @@ export default { return this._requestObj_listDetail.promise.then(({ body }) => { if (body.code !== this.successCode) return this.getListDetail(id, page, ++tryNum) // console.log(JSON.stringify(body)) - console.log(body) + // console.log(body) return { list: this.filterListDetail(body.list), page, @@ -169,7 +170,7 @@ export default { ids.add(item.songId) const types = [] const _types = {} - item.rateFormats && item.rateFormats.forEach(type => { + item.newRateFormats && item.newRateFormats.forEach(type => { let size switch (type.formatType) { case 'PQ': @@ -196,6 +197,7 @@ export default { } }) + const intervalTest = /(\d\d:\d\d)$/.test(item.length) list.push({ singer: item.singer, @@ -206,7 +208,7 @@ export default { copyrightId: item.copyrightId, songId: item.songId, source: 'mg', - interval: null, + interval: intervalTest ? RegExp.$1 : null, img: item.albumImgs && item.albumImgs.length ? item.albumImgs[0].img : null, lrc: null, lrcUrl: item.lrcUrl, @@ -295,34 +297,53 @@ export default { // 获取标签 getTag(tryNum = 0) { - // if (this._requestObj_tags) this._requestObj_tags.cancelHttp() - // if (tryNum > 2) return Promise.reject(new Error('try max num')) - // this._requestObj_tags = httpFetch(this.tagsUrl, { headers: this.defaultHeaders }) - // return this._requestObj_tags.promise.then(({ body }) => { - // if (body.code !== this.successCode) return this.getTag(++tryNum) - // return this.filterTagInfo(body.columnInfo.contents) - // }) - return Promise.resolve(this.filterTagInfo(tagData.columnInfo.contents)) + if (this._requestObj_tags) this._requestObj_tags.cancelHttp() + if (tryNum > 2) return Promise.reject(new Error('try max num')) + this._requestObj_tags = httpFetch(this.tagsUrl, { headers: this.defaultHeaders }) + return this._requestObj_tags.promise.then(({ body }) => { + if (body.code !== this.successCode) return this.getTag(++tryNum) + // console.log(body) + return this.filterTagInfo(body.data) + }) + // return Promise.resolve(this.filterTagInfo(tagData.columnInfo.contents)) }, filterTagInfo(rawList) { return { - hotTag: rawList[0].objectInfo.contents.map(item => ({ - id: item.objectInfo.tagId, - name: item.objectInfo.tagName, + hotTag: rawList[0].content.map(({ texts: [name, id] }) => ({ + id, + name, source: 'mg', })), - tags: rawList.slice(1).map(({ objectInfo }) => ({ - name: objectInfo.columnTitle, - list: objectInfo.contents.map(item => ({ - parent_id: objectInfo.columnId, - parent_name: objectInfo.columnTitle, - id: item.objectInfo.tagId, - name: item.objectInfo.tagName, + tags: rawList.slice(1).map(({ header, content }) => ({ + name: header.title, + list: content.map(({ texts: [name, id] }) => ({ + // parent_id: objectInfo.columnId, + // parent_name: objectInfo.columnTitle, + id, + name, source: 'mg', })), })), source: 'mg', } + // return { + // hotTag: rawList[0].objectInfo.contents.map(item => ({ + // id: item.objectInfo.tagId, + // name: item.objectInfo.tagName, + // source: 'mg', + // })), + // tags: rawList.slice(1).map(({ objectInfo }) => ({ + // name: objectInfo.columnTitle, + // list: objectInfo.contents.map(item => ({ + // parent_id: objectInfo.columnId, + // parent_name: objectInfo.columnTitle, + // id: item.objectInfo.tagId, + // name: item.objectInfo.tagName, + // source: 'mg', + // })), + // })), + // source: 'mg', + // } }, getTags() { return this.getTag() From 4b5dae477992575977e124ca65ff1824c7072d70 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 10 Sep 2021 14:31:07 +0800 Subject: [PATCH 02/75] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E8=AF=A6=E6=83=85=E9=A1=B5=E7=9A=84=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=9D=A1=E8=B7=B3=E8=BF=9B=E5=BA=A6=E6=97=B6=E4=BC=9A?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=81=8F=E7=A7=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/components/core/Player.vue | 2 +- src/renderer/components/core/PlayerDetail.vue | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 259b4235..58b5babb 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,3 +1,4 @@ ### 修复 - 修复mg排行榜无法加载的问题 +- 修复点击播放详情页的进度条跳进度时会出现偏移的问题 diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index 81503bdf..954300e1 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -849,7 +849,7 @@ export default { this.playNext() break case 'progress': - this.handleSetProgress(data) + this.setProgress(data * this.maxPlayTime) break case 'volume': break diff --git a/src/renderer/components/core/PlayerDetail.vue b/src/renderer/components/core/PlayerDetail.vue index 7cd02a0c..3ed3442b 100644 --- a/src/renderer/components/core/PlayerDetail.vue +++ b/src/renderer/components/core/PlayerDetail.vue @@ -282,7 +282,7 @@ export default { setProgress(event) { this.$emit('action', { type: 'progress', - data: event, + data: event.offsetX / this.pregessWidth, }) }, setProgressWidth() { From b6cea110a7b951cd71cb41403d9a23bea1b5ff6b Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 11 Sep 2021 15:39:02 +0800 Subject: [PATCH 03/75] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E6=9C=89?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E7=9A=84=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E9=95=BF=E6=8C=89=E9=BC=A0=E6=A0=87=E6=8C=89=E9=94=AE=E6=97=B6?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E4=BC=9A=E9=97=AA=E7=83=81?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/plugins/Tips/index.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/publish/changeLog.md b/publish/changeLog.md index 58b5babb..1e38cb17 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,3 +2,4 @@ - 修复mg排行榜无法加载的问题 - 修复点击播放详情页的进度条跳进度时会出现偏移的问题 +- 修复在有提示信息的地方长按鼠标按键时提示信息会闪烁的问题 diff --git a/src/renderer/plugins/Tips/index.js b/src/renderer/plugins/Tips/index.js index 203f5794..0584eb97 100644 --- a/src/renderer/plugins/Tips/index.js +++ b/src/renderer/plugins/Tips/index.js @@ -3,6 +3,8 @@ import { debounce } from '../../utils' let instance let prevTips +let prevX = 0 +let prevY = 0 const getTips = el => el @@ -53,6 +55,9 @@ const updateTips = event => { } document.body.addEventListener('mousemove', event => { + if (event.x == prevX && event.y == prevY) return + prevX = event.x + prevY = event.y hideTips() showTips(event) }) From 271d9ac13e4c6fc34369d94a89a8157ef5bc4be0 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 15 Sep 2021 17:08:38 +0800 Subject: [PATCH 04/75] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 353 +++++++++++++++++++++++++--------------------- package.json | 20 +-- 2 files changed, 204 insertions(+), 169 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d47776d..563f78a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.13.0-beta4", + "version": "1.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -312,9 +312,9 @@ "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -615,9 +615,9 @@ "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -926,9 +926,9 @@ "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -1115,9 +1115,9 @@ "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -1235,9 +1235,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -1269,9 +1269,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -1666,9 +1666,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -1700,9 +1700,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -1831,18 +1831,30 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" + "@babel/plugin-transform-parameters": "^7.15.4" }, "dependencies": { + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", @@ -2053,9 +2065,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -2087,9 +2099,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -2507,9 +2519,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -2541,9 +2553,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -2730,9 +2742,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -2747,9 +2759,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -2980,9 +2992,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -3014,9 +3026,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -3195,9 +3207,9 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/template": { @@ -3229,9 +3241,9 @@ } }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -3535,9 +3547,9 @@ } }, "@babel/preset-env": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.4.tgz", - "integrity": "sha512-4f2nLw+q6ht8gl3sHCmNhmA5W6b1ItLzbH3UrKuJxACHr2eCpk96jwjrAfCAaXaaVwTQGnyUYHY2EWXJGt7TUQ==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", "dev": true, "requires": { "@babel/compat-data": "^7.15.0", @@ -3554,7 +3566,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@babel/plugin-proposal-private-methods": "^7.14.5", @@ -3607,7 +3619,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.14.5", "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "babel-plugin-polyfill-corejs2": "^0.2.2", "babel-plugin-polyfill-corejs3": "^0.2.2", "babel-plugin-polyfill-regenerator": "^0.2.2", @@ -3640,9 +3652,9 @@ "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -5616,28 +5628,28 @@ } }, "browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001251", + "caniuse-lite": "^1.0.30001254", "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", + "electron-to-chromium": "^1.3.830", "escalade": "^3.1.1", "node-releases": "^1.1.75" }, "dependencies": { "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", + "version": "1.0.30001257", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz", + "integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==", "dev": true }, "colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true } } @@ -6802,9 +6814,9 @@ } }, "core-js": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.2.tgz", - "integrity": "sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", + "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==", "dev": true }, "core-js-compat": { @@ -7592,9 +7604,9 @@ } }, "electron": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.3.0.tgz", - "integrity": "sha512-d/BvOLDjI4i7yf9tqCuLL2fFGA2TrM/D9PyRpua+rJolG0qrwp/FohP02L0m+44kmPpofIo4l3NPwLmzyKKimA==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.4.0.tgz", + "integrity": "sha512-KJGWS2qa0xZXIMPMDUNkRVO8/JxRd4+M0ejYYOzu2LIQ5ijecPzNuNR9nvDkml9XyyRBzu975FkhJcwD17ietQ==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -7603,9 +7615,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz", - "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==", + "version": "14.17.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.16.tgz", + "integrity": "sha512-WiFf2izl01P1CpeY8WqFAeKWwByMueBEkND38EcN8N68qb0aDG3oIS1P5MhAX5kUdr469qRyqsY/MjanLjsFbQ==", "dev": true } } @@ -7837,9 +7849,9 @@ } }, "electron-to-chromium": { - "version": "1.3.830", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz", - "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==", + "version": "1.3.839", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.839.tgz", + "integrity": "sha512-0O7uPs9LJNjQ/U5mW78qW8gXv9H6Ba3DHZ5/yt8aBsvomOWDkV3MddT7enUYvLQEUVOURjWmgJJWVZ3K98tIwQ==", "dev": true }, "electron-updater": { @@ -9959,9 +9971,9 @@ "dev": true }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, "html-minifier-terser": { @@ -11651,9 +11663,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.2.tgz", - "integrity": "sha512-eUjQ/q1rQIeHWgIx7ny/DNgXHcMXHdBwgrZQK7Ev8dbR+HxhroFM2Cb6kMiswOYaq05IRJhPuQqXWUABIjjA3g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", + "integrity": "sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==", "dev": true, "requires": { "schema-utils": "^3.1.0" @@ -13652,12 +13664,12 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { @@ -13702,17 +13714,17 @@ "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "registry-auth-token": { @@ -13740,9 +13752,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -14574,9 +14586,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -15149,9 +15161,9 @@ } }, "terser-webpack-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", - "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { "jest-worker": "^27.0.6", @@ -15199,9 +15211,9 @@ "dev": true }, "jest-worker": { - "version": "27.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", - "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "requires": { "@types/node": "*", @@ -15245,14 +15257,14 @@ } }, "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.8.0.tgz", + "integrity": "sha512-f0JH+6yMpneYcRJN314lZrSwu9eKkUFEHLN/kNy8ceh8gaRiLgFPJqrB9HsXjhEGdv4e/ekjTOFxIlL6xlma8A==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { @@ -15522,31 +15534,31 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "union-value": { @@ -15916,9 +15928,9 @@ "dev": true }, "vue-i18n": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.25.0.tgz", - "integrity": "sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ==" + "version": "8.25.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.25.1.tgz", + "integrity": "sha512-UgvN6LxcANSG2O/i8draincxY3E/2bppMNN0szVinN7tuzSJdNFQdB9VDVaQcR1i8BprK9ISUAgZVZacsl+Zbw==" }, "vue-loader": { "version": "15.9.8", @@ -15994,9 +16006,9 @@ } }, "webpack": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.1.tgz", + "integrity": "sha512-wkGb0hLfrS7ML3n2xIKfUIwHbjB6gxwQHyLmVHoAqEQBw+nWo+G6LoHL098FEXqahqximsntjBLuewStrnJk0g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -16032,9 +16044,9 @@ "dev": true }, "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "ajv": { @@ -16487,15 +16499,38 @@ } }, "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", + "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", "dev": true, "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "webpack-log": { @@ -16527,9 +16562,9 @@ } }, "webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", "dev": true }, "websocket-driver": { diff --git a/package.json b/package.json index f4221aee..5cdd29ce 100644 --- a/package.json +++ b/package.json @@ -172,25 +172,25 @@ "@babel/plugin-transform-modules-umd": "^7.14.5", "@babel/plugin-transform-runtime": "^7.15.0", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.15.4", + "@babel/preset-env": "^7.15.6", "babel-eslint": "^10.1.0", "babel-loader": "^8.2.2", "babel-preset-minify": "^0.5.1", - "browserslist": "^4.16.8", + "browserslist": "^4.17.0", "cfonts": "^2.9.3", "chalk": "^4.1.2", "changelog-parser": "^2.8.0", "copy-webpack-plugin": "^9.0.1", - "core-js": "^3.17.2", + "core-js": "^3.17.3", "cross-env": "^7.0.3", "css-loader": "^6.2.0", "css-minimizer-webpack-plugin": "^3.0.2", "del": "^6.0.0", - "electron": "^13.3.0", + "electron": "^13.4.0", "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.3.830", + "electron-to-chromium": "^1.3.839", "eslint": "^7.32.0", "eslint-config-standard": "^16.0.3", "eslint-formatter-friendly": "^7.0.0", @@ -207,7 +207,7 @@ "less-loader": "^10.0.1", "less-plugin-clean-css": "^1.5.1", "markdown-it": "^12.2.0", - "mini-css-extract-plugin": "^2.2.2", + "mini-css-extract-plugin": "^2.3.0", "node-loader": "^2.0.0", "postcss": "^8.3.6", "postcss-loader": "^6.1.1", @@ -218,14 +218,14 @@ "raw-loader": "^4.0.2", "rimraf": "^3.0.2", "spinnies": "^0.5.1", - "terser-webpack-plugin": "^5.2.3", + "terser-webpack-plugin": "^5.2.4", "url-loader": "^4.1.1", "vue-loader": "^15.9.8", "vue-template-compiler": "^2.6.14", - "webpack": "^5.52.0", + "webpack": "^5.52.1", "webpack-cli": "^4.8.0", "webpack-dev-server": "^3.11.2", - "webpack-hot-middleware": "^2.25.0", + "webpack-hot-middleware": "^2.25.1", "webpack-merge": "^5.8.0" }, "dependencies": { @@ -247,7 +247,7 @@ "socket.io": "^4.2.0", "utf-8-validate": "^5.0.5", "vue": "^2.6.14", - "vue-i18n": "^8.25.0", + "vue-i18n": "^8.25.1", "vue-router": "^3.5.2", "vuex": "^3.6.2", "vuex-router-sync": "^5.0.0" From 97fdcaac5191054ad3f08a77b212ac357eb28869 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 18 Sep 2021 17:30:46 +0800 Subject: [PATCH 05/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=AD=8C=E8=AF=8D?= =?UTF-8?q?=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87=E8=BD=AC=E7=B9=81=E4=BD=93?= =?UTF-8?q?=E4=B8=AD=E6=96=87=EF=BC=8C=E5=BD=93=E8=BD=AF=E4=BB=B6=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A2=AB=E8=AE=BE=E7=BD=AE=E4=B8=BA=E7=B9=81=E4=BD=93?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=90=8E=EF=BC=8C=E6=92=AD=E6=94=BE=E6=AD=8C?= =?UTF-8?q?=E6=9B=B2=E7=9A=84=E6=AD=8C=E8=AF=8D=E4=B9=9F=E5=B0=86=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BD=AC=E6=88=90=E7=B9=81=E4=BD=93=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 5 ++ src/common/ipcNames.js | 3 + src/main/rendererEvents/index.js | 2 + src/main/rendererEvents/s2t.js | 9 +++ .../utils/simplify-chinese-main/.gitignore | 18 ++++++ .../utils/simplify-chinese-main/LICENSE.md | 22 +++++++ .../utils/simplify-chinese-main/README.md | 10 +++ .../utils/simplify-chinese-main/chinese.js | 2 + .../utils/simplify-chinese-main/index.d.ts | 2 + src/main/utils/simplify-chinese-main/index.js | 30 +++++++++ .../utils/simplify-chinese-main/package.json | 10 +++ src/renderer/components/core/Player.vue | 27 ++++++-- src/renderer/store/modules/download.js | 63 ++++++++++--------- 13 files changed, 170 insertions(+), 33 deletions(-) create mode 100644 src/main/rendererEvents/s2t.js create mode 100644 src/main/utils/simplify-chinese-main/.gitignore create mode 100644 src/main/utils/simplify-chinese-main/LICENSE.md create mode 100644 src/main/utils/simplify-chinese-main/README.md create mode 100644 src/main/utils/simplify-chinese-main/chinese.js create mode 100644 src/main/utils/simplify-chinese-main/index.d.ts create mode 100644 src/main/utils/simplify-chinese-main/index.js create mode 100644 src/main/utils/simplify-chinese-main/package.json diff --git a/publish/changeLog.md b/publish/changeLog.md index 1e38cb17..2306f326 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,5 +1,10 @@ +### 新增 + +- 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示 + ### 修复 - 修复mg排行榜无法加载的问题 - 修复点击播放详情页的进度条跳进度时会出现偏移的问题 - 修复在有提示信息的地方长按鼠标按键时提示信息会闪烁的问题 +- 修复下载歌曲时的歌词下载不尝试获取缓存歌词的问题 diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js index 9f866878..f811652d 100644 --- a/src/common/ipcNames.js +++ b/src/common/ipcNames.js @@ -33,6 +33,8 @@ const names = { restart_window: 'restart_window', + lang_s2t: 'lang_s2t', + handle_kw_decode_lyric: 'handle_kw_decode_lyric', get_lyric_info: 'get_lyric_info', set_lyric_info: 'set_lyric_info', @@ -74,6 +76,7 @@ const names = { sync_generate_code: 'sync_generate_code', sync_action_list: 'sync_action_list', sync_list: 'sync_list', + }, winLyric: { close: 'close', diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js index 99d0257d..21f34f41 100644 --- a/src/main/rendererEvents/index.js +++ b/src/main/rendererEvents/index.js @@ -25,3 +25,5 @@ require('./kw_decodeLyric') require('./userApi') require('./sync') +require('./s2t') + diff --git a/src/main/rendererEvents/s2t.js b/src/main/rendererEvents/s2t.js new file mode 100644 index 00000000..b13124ad --- /dev/null +++ b/src/main/rendererEvents/s2t.js @@ -0,0 +1,9 @@ +const { mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') +const { tranditionalize } = require('../utils/simplify-chinese-main') + + +mainHandle(ipcMainWindowNames.lang_s2t, async(event, textBase64) => { + if (!global.modules.mainWindow) throw new Error('mainWindow is undefined') + const text = tranditionalize(Buffer.from(textBase64, 'base64').toString()) + return Buffer.from(text).toString('base64') +}) diff --git a/src/main/utils/simplify-chinese-main/.gitignore b/src/main/utils/simplify-chinese-main/.gitignore new file mode 100644 index 00000000..771f1208 --- /dev/null +++ b/src/main/utils/simplify-chinese-main/.gitignore @@ -0,0 +1,18 @@ +todo.md +node_modules/ +npm-debug.log +yarn-debug.log +yarn-error.log +package-lock.json +tsconfig.tsbuildinfo +report.*.json + +.eslintcache +.DS_Store +.idea +.vscode +.yarn +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/src/main/utils/simplify-chinese-main/LICENSE.md b/src/main/utils/simplify-chinese-main/LICENSE.md new file mode 100644 index 00000000..bb67b760 --- /dev/null +++ b/src/main/utils/simplify-chinese-main/LICENSE.md @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2021 Shigma + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/main/utils/simplify-chinese-main/README.md b/src/main/utils/simplify-chinese-main/README.md new file mode 100644 index 00000000..2e4738e2 --- /dev/null +++ b/src/main/utils/simplify-chinese-main/README.md @@ -0,0 +1,10 @@ +# simplify-chinese + +Convert chinese characters between simplified form and tranditional form / 汉字简繁体转换工具。 + +```js +const { simplify, tranditionalize } = require('simplify-chinese') + +console.log(simplify('窩窩頭')) // 窝窝头 +console.log(tranditionalize('窝窝头')) // 窩窩頭 +``` diff --git a/src/main/utils/simplify-chinese-main/chinese.js b/src/main/utils/simplify-chinese-main/chinese.js new file mode 100644 index 00000000..762171b7 --- /dev/null +++ b/src/main/utils/simplify-chinese-main/chinese.js @@ -0,0 +1,2 @@ +exports.simplified = '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤呼啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲尽脏拼' +exports.traditional = '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚唿嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒儘臟拚' diff --git a/src/main/utils/simplify-chinese-main/index.d.ts b/src/main/utils/simplify-chinese-main/index.d.ts new file mode 100644 index 00000000..5c9b041f --- /dev/null +++ b/src/main/utils/simplify-chinese-main/index.d.ts @@ -0,0 +1,2 @@ +export function simplify(source: string): string +export function tranditionalize(source: string): string diff --git a/src/main/utils/simplify-chinese-main/index.js b/src/main/utils/simplify-chinese-main/index.js new file mode 100644 index 00000000..c239704b --- /dev/null +++ b/src/main/utils/simplify-chinese-main/index.js @@ -0,0 +1,30 @@ +const { simplified, traditional } = require('./chinese') + +const stMap = new Map() +const tsMap = new Map() + +simplified.split('').forEach((char, index) => { + stMap.set(char, traditional[index]) + tsMap.set(traditional[index], char) +}) + +function simplify(source) { + let result = [] + for (const char of source) { + result.push(tsMap.get(char) || char) + } + return result.join('') +} + +function tranditionalize(source) { + let result = [] + for (const char of source) { + result.push(stMap.get(char) || char) + } + return result.join('') +} + +module.exports = { + simplify, + tranditionalize, +} diff --git a/src/main/utils/simplify-chinese-main/package.json b/src/main/utils/simplify-chinese-main/package.json new file mode 100644 index 00000000..6c67d23e --- /dev/null +++ b/src/main/utils/simplify-chinese-main/package.json @@ -0,0 +1,10 @@ +{ + "name": "simplify-chinese", + "description": "Convert chinese characters between simplified form and tranditional form 汉字简繁体转换工具", + "version": "1.1.0", + "main": "index.js", + "typings": "index.d.ts", + "repository": "https://github.com/koishijs/simplify-chinese.git", + "author": "Shigma <1700011071@pku.edu.cn>", + "license": "MIT" +} diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index 954300e1..541d1f5a 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -87,7 +87,7 @@ div(:class="$style.player") + + diff --git a/src/renderer/plugins/Dialog/index.js b/src/renderer/plugins/Dialog/index.js new file mode 100644 index 00000000..d470596a --- /dev/null +++ b/src/renderer/plugins/Dialog/index.js @@ -0,0 +1,50 @@ +import Dialog from './Dialog' +import i18n from '../i18n' +import store from '@renderer/store' +import Vue from 'vue' + +const defaultOptions = { + message: '', + showCancel: false, + cancelButtonText: '', + confirmButtonText: '', +} + +const dialog = { + install(Vue, options) { + const DialogConstructor = Vue.extend(Dialog) + + const dialog = function Dialog(options) { + const { message, showCancel, cancelButtonText, confirmButtonText } = + Object.assign({}, defaultOptions, typeof options == 'string' ? { message: options } : options || {}) + return new Promise((resolve, reject) => { + let instance = new DialogConstructor({ i18n, store }).$mount(document.createElement('div')) + + // 属性设置 + instance.visible = true + instance.message = message + instance.showCancel = showCancel + instance.cancelButtonText = cancelButtonText + instance.confirmButtonText = confirmButtonText + + // 挂载 + document.getElementById('container').appendChild(instance.$el) + + instance.handleCancel = () => { + instance.visible = false + resolve(false) + } + + instance.handleComfirm = () => { + instance.visible = false + resolve(true) + } + }) + } + dialog.confirm = options => dialog({ ...options, showCancel: true }) + + Vue.prototype.$dialog = dialog + }, +} + +Vue.use(dialog) diff --git a/src/renderer/plugins/index.js b/src/renderer/plugins/index.js index e94f9bdc..c62c44ae 100644 --- a/src/renderer/plugins/index.js +++ b/src/renderer/plugins/index.js @@ -1,2 +1,3 @@ // import './axios' +import './Dialog' import './Tips' diff --git a/src/renderer/store/modules/download.js b/src/renderer/store/modules/download.js index 3108b81f..2ebe539d 100644 --- a/src/renderer/store/modules/download.js +++ b/src/renderer/store/modules/download.js @@ -11,6 +11,7 @@ import { getMusicUrl as getMusicUrlFormStorage, setMusicUrl, assertApiSupport, + filterFileName, } from '../../utils' import { NAMES, rendererInvoke } from '@common/ipc' @@ -33,7 +34,6 @@ const dls = {} const tryNum = {} let isRuningActionTask = false -const filterFileName = /[\\/:*?#"<>|]/g // getters const getters = { @@ -378,9 +378,9 @@ const actions = { statusText: '待下载', url: null, // songmid: musicInfo.songmid, - fileName: `${rootState.setting.download.fileName + fileName: filterFileName(`${rootState.setting.download.fileName .replace('歌名', musicInfo.name) - .replace('歌手', musicInfo.singer)}.${ext}`.replace(filterFileName, ''), + .replace('歌手', musicInfo.singer)}.${ext}`), progress: { downloaded: 0, total: 0, diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index 82f712c9..8fd2c3fe 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -293,11 +293,11 @@ const mutations = { const targetMusicInfo = targetList.list.find(item => item.songmid == id) if (targetMusicInfo) Object.assign(targetMusicInfo, data) }, - createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId, isSync }) { + createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId, position, isSync }) { if (!isSync) { window.eventHub.$emit(eventSyncName.send_action_list, { action: 'create_user_list', - data: { name, id, list, source, sourceListId }, + data: { name, id, list, source, sourceListId, position }, }) } @@ -311,7 +311,11 @@ const mutations = { source, sourceListId, } - state.userList.push(newList) + if (position == null) { + state.userList.push(newList) + } else { + state.userList.splice(position + 1, 0, newList) + } allListUpdate(newList) } this.commit('list/listAddMultiple', { id, list, isSync: true }) diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index fd507f7a..374603b4 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -4,6 +4,7 @@ import { shell, clipboard } from 'electron' import crypto from 'crypto' import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc' import iconv from 'iconv-lite' +import { gzip, gunzip } from 'zlib' /** * 获取两个数之间的随机整数,大于等于min,小于max @@ -433,3 +434,39 @@ export const setMusicUrl = (musicInfo, type, url) => rendererSend(NAMES.mainWind url, }) export const clearMusicUrl = () => rendererSend(NAMES.mainWindow.clear_music_url) + +export const gzipData = str => { + return new Promise((resolve, reject) => { + gzip(str, (err, result) => { + if (err) return reject(err) + resolve(result) + }) + }) +} +export const gunzipData = buf => { + return new Promise((resolve, reject) => { + gunzip(buf, (err, result) => { + if (err) return reject(err) + resolve(result.toString()) + }) + }) +} + +export const saveLxConfigFile = async(path, data) => { + if (!path.endsWith('.lxmc')) path += '.lxmc' + fs.writeFile(path, await gzipData(JSON.stringify(data)), 'binary', err => { + console.log(err) + }) +} + +export const readLxConfigFile = async path => { + let isJSON = path.endsWith('.json') + let data = await fs.promises.readFile(path, isJSON ? 'utf8' : 'binary') + if (!data || isJSON) return data + data = await gunzipData(Buffer.from(data, 'binary')) + return data.toString('utf8') +} + + +const fileNameRxp = /[\\/:*?#"<>|]/g +export const filterFileName = name => name.replace(fileNameRxp, '') diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index e9022860..bd5df148 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -7,9 +7,13 @@ svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='70%' viewBox='0 0 24 24' space='preserve') use(xlink:href='#icon-list-add') ul.scroll(:class="$style.listsContent" ref="dom_lists_list") - li(:class="[$style.listsItem, defaultList.id == listId ? $style.active : null]" :tips="defaultList.name" @click="handleListToggle(defaultList.id)") + li(:class="[$style.listsItem, defaultList.id == listId ? $style.active : null]" :tips="defaultList.name" + @contextmenu="handleListsItemRigthClick($event, -2)" + @click="handleListToggle(defaultList.id)") span(:class="$style.listsLabel") {{defaultList.name}} - li(:class="[$style.listsItem, loveList.id == listId ? $style.active : null]" :tips="loveList.name" @click="handleListToggle(loveList.id)") + li(:class="[$style.listsItem, loveList.id == listId ? $style.active : null]" :tips="loveList.name" + @contextmenu="handleListsItemRigthClick($event, -1)" + @click="handleListToggle(loveList.id)") span(:class="$style.listsLabel") {{loveList.name}} li.user-list( :class="[$style.listsItem, item.id == listId ? $style.active : null, listsData.rightClickItemIndex == index ? $style.clicked : null, fetchingListStatus[item.id] ? $style.fetching : null]" @@ -74,7 +78,7 @@ diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index da70527a..9d5cc8a7 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -329,16 +329,16 @@ import { setWindowSize, getSetting, saveSetting, + saveLxConfigFile, + readLxConfigFile, } from '../utils' import { rendererSend, rendererInvoke, rendererOn, NAMES, rendererOff } from '@common/ipc' import { mergeSetting, isMac } from '../../common/utils' import apiSourceInfo from '../utils/music/api-source-info' -import fs from 'fs' import languageList from '@renderer/lang/languages.json' import { base as eventBaseName } from '../event/names' import * as hotKeys from '../../common/hotKey' import { mainWindow as eventsNameMainWindow, winLyric as eventsNameWinLyric } from '../../main/events/_name' -import { gzip, gunzip } from 'zlib' import music from '../utils/music' let hotKeyTargetInput @@ -815,7 +815,7 @@ export default { async importSetting(path) { let settingData try { - settingData = JSON.parse(await this.handleReadFile(path)) + settingData = JSON.parse(await readLxConfigFile(path)) } catch (error) { return } @@ -830,12 +830,12 @@ export default { type: 'setting', data: Object.assign({ version: this.settingVersion }, this.setting), } - this.handleSaveFile(path, JSON.stringify(data)) + saveLxConfigFile(path, JSON.stringify(data)) }, async importPlayList(path) { let listData try { - listData = JSON.parse(await this.handleReadFile(path)) + listData = JSON.parse(await readLxConfigFile(path)) } catch (error) { return } @@ -867,12 +867,12 @@ export default { if (item.otherSource) delete item.otherSource } } - this.handleSaveFile(path, JSON.stringify(data)) + saveLxConfigFile(path, JSON.stringify(data)) }, async importAllData(path) { let allData try { - allData = JSON.parse(await this.handleReadFile(path)) + allData = JSON.parse(await readLxConfigFile(path)) } catch (error) { return } @@ -906,7 +906,7 @@ export default { if (item.otherSource) delete item.otherSource } } - this.handleSaveFile(path, JSON.stringify(allData)) + saveLxConfigFile(path, JSON.stringify(allData)) }, handleImportAllData() { selectDir({ @@ -1198,35 +1198,6 @@ export default { handleTrayShowChange(isShow) { this.current_setting.tray.isToTray = isShow }, - async handleSaveFile(path, data) { - if (!path.endsWith('.lxmc')) path += '.lxmc' - fs.writeFile(path, await this.gzip(data), 'binary', err => { - console.log(err) - }) - }, - async handleReadFile(path) { - let isJSON = path.endsWith('.json') - let data = await fs.promises.readFile(path, isJSON ? 'utf8' : 'binary') - if (!data || isJSON) return data - data = await this.gunzip(Buffer.from(data, 'binary')) - return data.toString('utf8') - }, - gzip(str) { - return new Promise((resolve, reject) => { - gzip(str, (err, result) => { - if (err) return reject(err) - resolve(result) - }) - }) - }, - gunzip(buf) { - return new Promise((resolve, reject) => { - gunzip(buf, (err, result) => { - if (err) return reject(err) - resolve(result.toString()) - }) - }) - }, getApiStatus() { let status if (window.globalObj.userApi.status) status = this.$t('view.setting.basic_source_status_success') From b1918e8b1586505fe788c80c72f900d31b66cbd4 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 30 Sep 2021 14:45:14 +0800 Subject: [PATCH 11/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=89=8D=E7=9A=84=E7=A1=AE=E8=AE=A4=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/lang/en-us/view/list.json | 2 ++ src/renderer/lang/zh-cn/view/list.json | 2 ++ src/renderer/lang/zh-tw/view/list.json | 2 ++ src/renderer/plugins/Dialog/Dialog.vue | 3 ++- src/renderer/plugins/Dialog/index.js | 6 +++++- src/renderer/views/List.vue | 8 +++++++- 7 files changed, 21 insertions(+), 3 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 80f8988d..a5f13772 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,6 +2,7 @@ - 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示 - 为方便分享歌曲列表,新增单个列表导入/导出功能,可在右击“我的列表”里的列表名后弹出的菜单中使用 +- 为防止误删列表,新增删除列表前的确认弹窗 ### 修复 diff --git a/src/renderer/lang/en-us/view/list.json b/src/renderer/lang/en-us/view/list.json index 29c4a70d..b6ca422f 100644 --- a/src/renderer/lang/en-us/view/list.json +++ b/src/renderer/lang/en-us/view/list.json @@ -24,6 +24,8 @@ "lists_new_list_btn": "Create list", "lists_new_list_input": "New list...", "lists_remove": "Remove", + "lists_remove_tip": "Do you really want to remove {name}?", + "lists_remove_tip_button": "Yes, that's right", "lists_rename": "Rename", "lists_sync": "Update", "loding_list": "Loading...", diff --git a/src/renderer/lang/zh-cn/view/list.json b/src/renderer/lang/zh-cn/view/list.json index 835e51b4..59dd1ffa 100644 --- a/src/renderer/lang/zh-cn/view/list.json +++ b/src/renderer/lang/zh-cn/view/list.json @@ -24,6 +24,8 @@ "lists_new_list_btn": "新建列表", "lists_new_list_input": "新列表...", "lists_remove": "删除", + "lists_remove_tip": "你真的想要移除 {name} 吗?", + "lists_remove_tip_button": "是的 没错", "lists_rename": "重命名", "lists_sync": "更新", "loding_list": "加载中...", diff --git a/src/renderer/lang/zh-tw/view/list.json b/src/renderer/lang/zh-tw/view/list.json index 55cb5b36..47c8986e 100644 --- a/src/renderer/lang/zh-tw/view/list.json +++ b/src/renderer/lang/zh-tw/view/list.json @@ -24,6 +24,8 @@ "lists_new_list_btn": "新建列表", "lists_new_list_input": "新列表...", "lists_remove": "刪除", + "lists_remove_tip": "你真的想要移除 {name} 嗎?", + "lists_remove_tip_button": "是的 沒錯", "lists_rename": "重命名", "lists_sync": "更新", "loding_list": "加載中...", diff --git a/src/renderer/plugins/Dialog/Dialog.vue b/src/renderer/plugins/Dialog/Dialog.vue index 561b9e7e..1d061d44 100644 --- a/src/renderer/plugins/Dialog/Dialog.vue +++ b/src/renderer/plugins/Dialog/Dialog.vue @@ -55,10 +55,11 @@ export default { .main { flex: auto; - min-height: 50px; + min-height: 40px; padding: 15px; font-size: 14px; max-width: 320px; + min-width: 220px; line-height: 1.5; } diff --git a/src/renderer/plugins/Dialog/index.js b/src/renderer/plugins/Dialog/index.js index d470596a..49dabfeb 100644 --- a/src/renderer/plugins/Dialog/index.js +++ b/src/renderer/plugins/Dialog/index.js @@ -41,7 +41,11 @@ const dialog = { } }) } - dialog.confirm = options => dialog({ ...options, showCancel: true }) + dialog.confirm = options => dialog( + typeof options == 'string' + ? { message: options, showCancel: true } + : { ...options, showCancel: true }, + ) Vue.prototype.$dialog = dialog }, diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index bd5df148..4f115766 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -818,7 +818,13 @@ export default { this.movedownUserList({ id: this.userList[index].id }) break case 'remove': - this.removeUserList({ id: this.userList[index].id }) + this.$dialog.confirm({ + message: this.$t('view.list.lists_remove_tip', { name: this.userList[index].name }), + confirmButtonText: this.$t('view.list.lists_remove_tip_button'), + }).then(isRemove => { + if (!isRemove) return + this.removeUserList({ id: this.userList[index].id }) + }) break } }, From ae61d2c62907e2e64b3f6267687d2e6df78e3eb8 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 30 Sep 2021 14:56:24 +0800 Subject: [PATCH 12/75] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/views/List.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index 4f115766..cbe0b54f 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -196,6 +196,11 @@ export default { action: 'rename', disabled: !this.listsData.itemMenuControl.rename, }, + { + name: this.$t('view.list.lists_sync'), + action: 'sync', + disabled: !this.listsData.itemMenuControl.sync, + }, { name: this.$t('view.list.lists_import'), action: 'import', @@ -206,11 +211,6 @@ export default { action: 'export', disabled: !this.listsData.itemMenuControl.export, }, - { - name: this.$t('view.list.lists_sync'), - action: 'sync', - disabled: !this.listsData.itemMenuControl.sync, - }, { name: this.$t('view.list.lists_moveup'), action: 'moveup', From f8f13fd32ca6a1766803c11fad41aa1487d96ee5 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 30 Sep 2021 14:56:35 +0800 Subject: [PATCH 13/75] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=AD=8C=E8=AF=8D?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/utils/lyric-font-player/line-player.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/utils/lyric-font-player/line-player.js b/src/renderer/utils/lyric-font-player/line-player.js index 78f4893c..8cf6594a 100644 --- a/src/renderer/utils/lyric-font-player/line-player.js +++ b/src/renderer/utils/lyric-font-player/line-player.js @@ -48,7 +48,7 @@ module.exports = class LinePlayer { _initLines() { this.lines = [] this.translationLines = [] - const lines = this.lyric.split('\n') + const lines = this.lyric.split(/\r\n|\r|\n/) const linesMap = {} // const translationLines = this.translationLyric.split('\n') for (let i = 0; i < lines.length; i++) { From 3ae8a899615b353e1319b07710cbd9dab5f24487 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 30 Sep 2021 16:44:32 +0800 Subject: [PATCH 14/75] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41969f64..5960d8e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5569,9 +5569,9 @@ "dev": true }, "boolean": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz", - "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", + "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", "dev": true, "optional": true }, @@ -7601,9 +7601,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.16.tgz", - "integrity": "sha512-WiFf2izl01P1CpeY8WqFAeKWwByMueBEkND38EcN8N68qb0aDG3oIS1P5MhAX5kUdr469qRyqsY/MjanLjsFbQ==", + "version": "14.17.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.20.tgz", + "integrity": "sha512-gI5Sl30tmhXsqkNvopFydP7ASc4c2cLfGNQrVKN3X90ADFWFsPEsotm/8JHSUJQKTHbwowAHtcJPeyVhtKv0TQ==", "dev": true } } @@ -11456,9 +11456,9 @@ "dev": true }, "lrc-file-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.2.tgz", - "integrity": "sha512-AUzLhGkriwf0P0bQzLvLYFDXPcfBpwPb124MYySuvdyL9M3QPEPro9jEXD75qxM3MHbRdq2B1bbfKETUqJPPxg==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.3.tgz", + "integrity": "sha512-ma43TcABPJjT/X8br2ps7YDAx3z4VZE7OiRiy5O/qy8xCJihP2QIsriixu/Srn4sLQ3yEjrvsjURlnXVO4K0PA==" }, "lru-cache": { "version": "6.0.0", diff --git a/package.json b/package.json index e090b585..4dab2a6a 100644 --- a/package.json +++ b/package.json @@ -240,7 +240,7 @@ "image-size": "^1.0.0", "koa": "^2.13.3", "long": "^4.0.0", - "lrc-file-parser": "^1.1.2", + "lrc-file-parser": "^1.1.3", "needle": "^3.0.0", "node-id3": "^0.2.3", "request": "^2.88.2", From 96804ae2e238cd47647dd32e1369370f66e4fe64 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 30 Sep 2021 16:45:20 +0800 Subject: [PATCH 15/75] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4dab2a6a..29ef6d7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.14.0-beta", + "version": "1.14.0-beta2", "description": "一个免费的音乐查找助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", From 91279922f10f626c126067bc9617e8e71905ed93 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 1 Oct 2021 12:30:07 +0800 Subject: [PATCH 16/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=AD=8C=E8=AF=8D?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E9=80=89=E6=8B=A9=E5=A4=8D=E5=88=B6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/components/core/Icons.vue | 5 ++ src/renderer/components/core/PlayerDetail.vue | 84 ++++++++++++++++--- src/renderer/lang/en-us/core/player.json | 74 ++++++++-------- src/renderer/lang/zh-cn/core/player.json | 74 ++++++++-------- src/renderer/lang/zh-tw/core/player.json | 74 ++++++++-------- src/renderer/utils/lyric-font-player/index.js | 1 + 7 files changed, 190 insertions(+), 123 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index a5f13772..6a98a636 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -3,6 +3,7 @@ - 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示 - 为方便分享歌曲列表,新增单个列表导入/导出功能,可在右击“我的列表”里的列表名后弹出的菜单中使用 - 为防止误删列表,新增删除列表前的确认弹窗 +- 新增歌词文本选择复制功能,可在详情页进度条上方的歌词文本选择按钮进入歌词文本选择模式,选择完成后可鼠标右击或者使用系统快捷键复制 ### 修复 diff --git a/src/renderer/components/core/Icons.vue b/src/renderer/components/core/Icons.vue index bd1d1b63..10d610b3 100644 --- a/src/renderer/components/core/Icons.vue +++ b/src/renderer/components/core/Icons.vue @@ -217,5 +217,10 @@ svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/19 g#icon-comment(fill='currentColor') // 0 0 24 24 path(d='M16 11H8V9H16V11M22 4V16C22 17.11 21.11 18 20 18H13.9L10.2 21.71C10 21.9 9.75 22 9.5 22H9C8.45 22 8 21.55 8 21V18H4C2.9 18 2 17.11 2 16V4C2 2.89 2.9 2 4 2H20C21.11 2 22 2.9 22 4M20 4H4V16H10V19.08L13.08 16H20V4') + + g#icon-text(fill='currentColor') + // 0 0 24 24 + path(fill='currentColor', d='M21,6V8H3V6H21M3,18H12V16H3V18M3,13H21V11H3V13Z') + diff --git a/src/renderer/components/core/PlayerDetail.vue b/src/renderer/components/core/PlayerDetail.vue index 3ed3442b..e1881d27 100644 --- a/src/renderer/components/core/PlayerDetail.vue +++ b/src/renderer/components/core/PlayerDetail.vue @@ -27,17 +27,28 @@ p(v-if="musicInfo.album") {{$t('core.player.album')}}{{musicInfo.album}} div(:class="$style.right") - div(:class="[$style.lyric, lyricEvent.isMsDown ? $style.draging : null]" @wheel="handleWheel" @mousedown="handleLyricMouseDown" ref="dom_lyric") + div(:class="[$style.lyric, { [$style.draging]: lyricEvent.isMsDown }]" @wheel="handleWheel" @mousedown="handleLyricMouseDown" ref="dom_lyric") div(:class="$style.lyricSpace") div(:class="[$style.lyricText]" ref="dom_lyric_text") //- p(v-for="(info, index) in lyricLines" :key="index" :class="lyric.line == index ? $style.lrcActive : null") {{info.text}} div(:class="$style.lyricSpace") + transition(enter-active-class="animated fadeIn" leave-active-class="animated fadeOut") + div(:class="[$style.lyricSelectContent, 'select', 'scroll']" v-if="isShowLrcSelectContent" @contextmenu="handleCopySelectText") + //- div(:class="$style.lyricSpace") + div(v-for="(info, index) in lyricLines" :key="index" :class="[$style.lyricSelectline, { [$style.lrcActive]: lyric.line == index }]") + span {{info.text}} + br(v-if="info.translation") + span(:class="$style.lyricSelectlineTransition") {{info.translation}} + //- div(:class="$style.lyricSpace") material-music-comment(:class="$style.comment" :titleFormat="this.setting.download.fileName" :musicInfo="musicInfo" v-model="isShowComment") div(:class="$style.footer") div(:class="$style.footerLeft") div(:class="$style.footerLeftControlBtns") + div(:class="[$style.footerLeftControlBtn, { [$style.active]: isShowLrcSelectContent }]" @click="isShowLrcSelectContent = !isShowLrcSelectContent" :tips="$t('core.player.lyric_select')") + svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='95%' viewBox='0 0 24 24' space='preserve') + use(xlink:href='#icon-text') div(:class="[$style.footerLeftControlBtn, isShowComment ? $style.active : null]" @click="isShowComment = !isShowComment" :tips="$t('core.player.comment_show')") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='95%' viewBox='0 0 24 24' space='preserve') use(xlink:href='#icon-comment') @@ -87,7 +98,7 @@ @@ -635,14 +661,41 @@ export default { // transition: @transition-theme !important; // transition-property: color, font-size; // } + // .lrc-active { + // color: @color-theme; + // font-size: 1.2em; + // } } +.lyricSelectContent { + position: absolute; + left: 0; + top: 0; + // text-align: center; + height: 100%; + width: 100%; + font-size: 16px; + background-color: @color-theme_2-background_1; + z-index: 10; + color: @color-player-detail-lyric; + + .lyricSelectline { + padding: 8px 0; + overflow-wrap: break-word; + transition: @transition-theme !important; + transition-property: color, font-size; + line-height: 1.3; + } + .lyricSelectlineTransition { + font-size: 14px; + } + .lrc-active { + color: @color-theme; + } +} + .lyric-space { height: 70%; } -.lrc-active { - color: @color-theme; - font-size: 1.2em; -} .comment { flex: 0 0 0; @@ -853,6 +906,13 @@ each(@themes, { // .lrc-active { // color: ~'@{color-@{value}-theme}'; // } + .lyricSelectContent { + background-color: ~'@{color-@{value}-theme_2-background_1}'; + color: ~'@{color-@{value}-player-detail-lyric}'; + .lrc-active { + color: ~'@{color-@{value}-theme}'; + } + } .footerLeftControlBtns { color: ~'@{color-@{value}-theme_2-font}'; } diff --git a/src/renderer/lang/en-us/core/player.json b/src/renderer/lang/en-us/core/player.json index 413629cc..5823f168 100644 --- a/src/renderer/lang/en-us/core/player.json +++ b/src/renderer/lang/en-us/core/player.json @@ -1,43 +1,43 @@ { - "copy_title": " (Click to copy)", - "volume": "Volume: ", - "pause": "Pause", - "play": "Play", - "prev": "Prev", - "next": "Next", - "playing": "Now playing...", - "stop": "Paused", - "end": "Stopped", - "refresh_url": "Music URL expired, refreshing...", - "error": "Error loading music. Switch to next song after 5 seconds", - "loading": "Music loading...", - "buffering": "Buffering...", - "geting_url": "Getting music link...", - "lyric_error": "Failed to get lyrics", - "hide_detail": "Hide detail page (Right-click in the view to quickly hide the details page)", - "name": "Name: ", - "singer": "Artist: ", - "album": "Album: ", "add_music_to": "Add the current song to...", - "desktop_lyric_on": "Open Desktop Lyrics", - "desktop_lyric_off": "Close Desktop Lyrics", - "desktop_lyric_lock": "Right click to lock lyrics", - "desktop_lyric_unlock": "Right click to unlock lyrics", - "play_toggle_mode_list_loop": "List Loop", - "play_toggle_mode_random": "List Random", - "play_toggle_mode_list": "Play in order", - "play_toggle_mode_single_loop": "Single Loop", - "play_toggle_mode_off": "Disable", - "pic_tip": "Right click to locate the currently playing song in \"My List\"", - - "comment_show": "Song comments", - "comment_hot_loading": "Hot comments are loading", - "comment_new_loading": "Latest comments are loading", + "album": "Album: ", + "buffering": "Buffering...", "comment_hot_load_error": "Hot comments failed to load, click to try to reload", - "comment_new_load_error": "The latest comment failed to load, click to try to reload", - "comment_refresh": "Refresh comments", - "comment_no_content": "No comments yet", + "comment_hot_loading": "Hot comments are loading", "comment_hot_title": "Hot Comment", + "comment_new_load_error": "The latest comment failed to load, click to try to reload", + "comment_new_loading": "Latest comments are loading", "comment_new_title": "Latest comment", - "comment_title": "{name} comment" + "comment_no_content": "No comments yet", + "comment_refresh": "Refresh comments", + "comment_show": "Song comments", + "comment_title": "{name} comment", + "copy_title": " (Click to copy)", + "desktop_lyric_lock": "Right click to lock lyrics", + "desktop_lyric_off": "Close Desktop Lyrics", + "desktop_lyric_on": "Open Desktop Lyrics", + "desktop_lyric_unlock": "Right click to unlock lyrics", + "end": "Stopped", + "error": "Error loading music. Switch to next song after 5 seconds", + "geting_url": "Getting music link...", + "hide_detail": "Hide detail page (Right-click in the view to quickly hide the details page)", + "loading": "Music loading...", + "lyric_error": "Failed to get lyrics", + "lyric_select": "Lyric text selection", + "name": "Name: ", + "next": "Next", + "pause": "Pause", + "pic_tip": "Right click to locate the currently playing song in \"My List\"", + "play": "Play", + "play_toggle_mode_list": "Play in order", + "play_toggle_mode_list_loop": "List Loop", + "play_toggle_mode_off": "Disable", + "play_toggle_mode_random": "List Random", + "play_toggle_mode_single_loop": "Single Loop", + "playing": "Now playing...", + "prev": "Prev", + "refresh_url": "Music URL expired, refreshing...", + "singer": "Artist: ", + "stop": "Paused", + "volume": "Volume: " } diff --git a/src/renderer/lang/zh-cn/core/player.json b/src/renderer/lang/zh-cn/core/player.json index b58529d5..14d46fcc 100644 --- a/src/renderer/lang/zh-cn/core/player.json +++ b/src/renderer/lang/zh-cn/core/player.json @@ -1,43 +1,43 @@ { - "copy_title": "(点击复制)", - "volume": "当前音量:", - "pause": "暂停", - "play": "播放", - "prev": "上一首", - "next": "下一首", - "playing": "播放中...", - "stop": "暂停播放", - "end": "播放完毕", - "refresh_url": "URL过期,正在刷新URL...", - "error": "音频加载出错,5 秒后切换下一首", - "loading": "音乐加载中...", - "buffering": "缓冲中...", - "geting_url": "歌曲链接获取中...", - "lyric_error": "歌词获取失败", - "hide_detail": "隐藏详情页(界面内右键双击可快速隐藏详情页)", - "name": "歌曲名:", - "singer": "艺术家:", - "album": "专辑名:", "add_music_to": "添加当前歌曲到...", - "desktop_lyric_on": "开启桌面歌词", - "desktop_lyric_off": "关闭桌面歌词", - "desktop_lyric_lock": "右击锁定歌词", - "desktop_lyric_unlock": "右击解锁歌词", - "play_toggle_mode_list_loop": "列表循环", - "play_toggle_mode_random": "列表随机", - "play_toggle_mode_list": "顺序播放", - "play_toggle_mode_single_loop": "单曲循环", - "play_toggle_mode_off": "禁用", - "pic_tip": "右击在“我的列表”定位当前播放的歌曲", - - "comment_show": "歌曲评论", - "comment_hot_loading": "热门评论加载中", - "comment_new_loading": "最新评论加载中", + "album": "专辑名:", + "buffering": "缓冲中...", "comment_hot_load_error": "热门评论加载失败,点击尝试重新加载", - "comment_new_load_error": "最新评论加载失败,点击尝试重新加载", - "comment_refresh": "刷新评论", - "comment_no_content": "暂无评论", + "comment_hot_loading": "热门评论加载中", "comment_hot_title": "热门评论", + "comment_new_load_error": "最新评论加载失败,点击尝试重新加载", + "comment_new_loading": "最新评论加载中", "comment_new_title": "最新评论", - "comment_title": "{name} 的评论" + "comment_no_content": "暂无评论", + "comment_refresh": "刷新评论", + "comment_show": "歌曲评论", + "comment_title": "{name} 的评论", + "copy_title": "(点击复制)", + "desktop_lyric_lock": "右击锁定歌词", + "desktop_lyric_off": "关闭桌面歌词", + "desktop_lyric_on": "开启桌面歌词", + "desktop_lyric_unlock": "右击解锁歌词", + "end": "播放完毕", + "error": "音频加载出错,5 秒后切换下一首", + "geting_url": "歌曲链接获取中...", + "hide_detail": "隐藏详情页(界面内右键双击可快速隐藏详情页)", + "loading": "音乐加载中...", + "lyric_error": "歌词获取失败", + "lyric_select": "歌词文本选择", + "name": "歌曲名:", + "next": "下一首", + "pause": "暂停", + "pic_tip": "右击在“我的列表”定位当前播放的歌曲", + "play": "播放", + "play_toggle_mode_list": "顺序播放", + "play_toggle_mode_list_loop": "列表循环", + "play_toggle_mode_off": "禁用", + "play_toggle_mode_random": "列表随机", + "play_toggle_mode_single_loop": "单曲循环", + "playing": "播放中...", + "prev": "上一首", + "refresh_url": "URL过期,正在刷新URL...", + "singer": "艺术家:", + "stop": "暂停播放", + "volume": "当前音量:" } diff --git a/src/renderer/lang/zh-tw/core/player.json b/src/renderer/lang/zh-tw/core/player.json index ad774f8b..f0395b37 100644 --- a/src/renderer/lang/zh-tw/core/player.json +++ b/src/renderer/lang/zh-tw/core/player.json @@ -1,43 +1,43 @@ { - "copy_title": "(點擊複製)", - "volume": "當前音量:", - "pause": "暫停", - "play": "播放", - "prev": "上一首", - "next": "下一首", - "playing": "播放中...", - "stop": "暫停播放", - "end": "播放完畢", - "refresh_url": "URL過期,正在刷新URL...", - "error": "音頻加載出錯,5 秒後切換下一首", - "loading": "音樂加載中...", - "buffering": "緩衝中...", - "geting_url": "歌曲鏈接獲取中...", - "lyric_error": "歌詞獲取失敗", - "hide_detail": "隱藏詳情頁(界面內右鍵雙擊可快速隱藏詳情頁)", - "name": "歌曲名:", - "singer": "藝術家:", - "album": "專輯名:", "add_music_to": "添加當前歌曲到...", - "desktop_lyric_on": "開啟桌面歌詞", - "desktop_lyric_off": "關閉桌面歌詞", - "desktop_lyric_lock": "右擊鎖定歌詞", - "desktop_lyric_unlock": "右擊解鎖歌詞", - "play_toggle_mode_list_loop": "列表循環", - "play_toggle_mode_random": "列表隨機", - "play_toggle_mode_list": "順序播放", - "play_toggle_mode_single_loop": "單曲循環", - "play_toggle_mode_off": "禁用", - "pic_tip": "右擊在“我的列表”定位當前播放的歌曲", - - "comment_show": "歌曲評論", - "comment_hot_loading": "熱門評論加載中", - "comment_new_loading": "最新評論加載中", + "album": "專輯名:", + "buffering": "緩衝中...", "comment_hot_load_error": "熱門評論加載失敗,點擊嘗試重新加載", - "comment_new_load_error": "最新評論加載失敗,點擊嘗試重新加載", - "comment_refresh": "刷新評論", - "comment_no_content": "暫無評論", + "comment_hot_loading": "熱門評論加載中", "comment_hot_title": "熱門評論", + "comment_new_load_error": "最新評論加載失敗,點擊嘗試重新加載", + "comment_new_loading": "最新評論加載中", "comment_new_title": "最新評論", - "comment_title": "{name} 的評論" + "comment_no_content": "暫無評論", + "comment_refresh": "刷新評論", + "comment_show": "歌曲評論", + "comment_title": "{name} 的評論", + "copy_title": "(點擊複製)", + "desktop_lyric_lock": "右擊鎖定歌詞", + "desktop_lyric_off": "關閉桌面歌詞", + "desktop_lyric_on": "開啟桌面歌詞", + "desktop_lyric_unlock": "右擊解鎖歌詞", + "end": "播放完畢", + "error": "音頻加載出錯,5 秒後切換下一首", + "geting_url": "歌曲鏈接獲取中...", + "hide_detail": "隱藏詳情頁(界面內右鍵雙擊可快速隱藏詳情頁)", + "loading": "音樂加載中...", + "lyric_error": "歌詞獲取失敗", + "lyric_select": "歌詞文本選擇", + "name": "歌曲名:", + "next": "下一首", + "pause": "暫停", + "pic_tip": "右擊在“我的列表”定位當前播放的歌曲", + "play": "播放", + "play_toggle_mode_list": "順序播放", + "play_toggle_mode_list_loop": "列表循環", + "play_toggle_mode_off": "禁用", + "play_toggle_mode_random": "列表隨機", + "play_toggle_mode_single_loop": "單曲循環", + "playing": "播放中...", + "prev": "上一首", + "refresh_url": "URL過期,正在刷新URL...", + "singer": "藝術家:", + "stop": "暫停播放", + "volume": "當前音量:" } diff --git a/src/renderer/utils/lyric-font-player/index.js b/src/renderer/utils/lyric-font-player/index.js index d542b640..a8cd5d9d 100644 --- a/src/renderer/utils/lyric-font-player/index.js +++ b/src/renderer/utils/lyric-font-player/index.js @@ -120,6 +120,7 @@ module.exports = class Lyric { return { text: line.text, time: line.time, + translation: line.translation, dom_line: fontPlayer.lineContent, } }) From 0a31d195616c3cbdcf57447dde3803dfc37997de Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 1 Oct 2021 22:15:45 +0800 Subject: [PATCH 17/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 5 +- .../material/DuplicateMusicModal.vue | 256 ++++++++++++++++++ .../components/material/SearchList.vue | 1 + src/renderer/lang/en-us/view/list.json | 1 + src/renderer/lang/zh-cn/view/list.json | 1 + src/renderer/lang/zh-tw/view/list.json | 1 + src/renderer/views/List.vue | 33 ++- 7 files changed, 282 insertions(+), 16 deletions(-) create mode 100644 src/renderer/components/material/DuplicateMusicModal.vue diff --git a/publish/changeLog.md b/publish/changeLog.md index 6a98a636..1d1baed3 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,9 +1,10 @@ ### 新增 - 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示 -- 为方便分享歌曲列表,新增单个列表导入/导出功能,可在右击“我的列表”里的列表名后弹出的菜单中使用 -- 为防止误删列表,新增删除列表前的确认弹窗 +- 新增单个列表导入/导出功能,可以方便分享歌曲列表,可在右击“我的列表”里的列表名后弹出的菜单中使用 +- 新增删除列表前的确认弹窗,防止误删列表 - 新增歌词文本选择复制功能,可在详情页进度条上方的歌词文本选择按钮进入歌词文本选择模式,选择完成后可鼠标右击或者使用系统快捷键复制 +- 新增重复歌曲列表,可以方便移除我的列表中的重复歌曲,此列表会列出目标列表里歌曲名相同的歌曲,可在右击“我的列表”里的列表名后弹出的菜单中使用 ### 修复 diff --git a/src/renderer/components/material/DuplicateMusicModal.vue b/src/renderer/components/material/DuplicateMusicModal.vue new file mode 100644 index 00000000..7336e06f --- /dev/null +++ b/src/renderer/components/material/DuplicateMusicModal.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/src/renderer/components/material/SearchList.vue b/src/renderer/components/material/SearchList.vue index a070478f..f83a26af 100644 --- a/src/renderer/components/material/SearchList.vue +++ b/src/renderer/components/material/SearchList.vue @@ -374,6 +374,7 @@ export default { .albumName { font-size: 12px; opacity: 0.6; + .mixin-ellipsis-1; } .source { flex: none; diff --git a/src/renderer/lang/en-us/view/list.json b/src/renderer/lang/en-us/view/list.json index b6ca422f..167cd50d 100644 --- a/src/renderer/lang/en-us/view/list.json +++ b/src/renderer/lang/en-us/view/list.json @@ -12,6 +12,7 @@ "list_search": "Search", "list_sort": "Adjust position", "list_source_detail": "Song Page", + "lists_duplicate": "Duplicate song", "lists_export": "Export", "lists_export_part_desc": "Choose where to save the list file", "lists_import": "Import", diff --git a/src/renderer/lang/zh-cn/view/list.json b/src/renderer/lang/zh-cn/view/list.json index 59dd1ffa..18650f0c 100644 --- a/src/renderer/lang/zh-cn/view/list.json +++ b/src/renderer/lang/zh-cn/view/list.json @@ -12,6 +12,7 @@ "list_search": "搜索", "list_sort": "调整位置", "list_source_detail": "歌曲详情页", + "lists_duplicate": "重复歌曲", "lists_export": "导出", "lists_export_part_desc": "选择列表文件保存位置", "lists_import": "导入", diff --git a/src/renderer/lang/zh-tw/view/list.json b/src/renderer/lang/zh-tw/view/list.json index 47c8986e..07a2aee5 100644 --- a/src/renderer/lang/zh-tw/view/list.json +++ b/src/renderer/lang/zh-tw/view/list.json @@ -12,6 +12,7 @@ "list_search": "搜索", "list_sort": "調整位置", "list_source_detail": "歌曲詳情頁", + "lists_duplicate": "重複歌曲", "lists_export": "導出", "lists_export_part_desc": "選擇列表文件保存位置", "lists_import": "導入", diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index cbe0b54f..b423dd0d 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -74,6 +74,7 @@ material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick") material-search-list(:list="list" @action="handleMusicSearchAction" :visible="isVisibleMusicSearch") material-list-sort-modal(:show="isShowListSortModal" :music-info="musicInfo" :selected-num="selectdListDetailData.length" @close="isShowListSortModal = false" @confirm="handleSortMusicInfo") + material-duplicate-music-modal(:visible.sync="isShowDuplicateMusicModal" :list-info="selectedListInfo") diff --git a/src/renderer/main.js b/src/renderer/main.js index 2ad40edb..8ef83b07 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -1,5 +1,5 @@ import Vue from 'vue' -import { sync } from 'vuex-router-sync' +// import { sync } from 'vuex-router-sync' import './event' @@ -20,7 +20,7 @@ import { getSetting } from './utils' import languageList from '@renderer/lang/languages.json' import { rendererSend, NAMES } from '../common/ipc' -sync(store, router) +// sync(store, router) Vue.config.productionTip = false Vue.config.devtools = process.env.NODE_ENV === 'development' diff --git a/src/renderer/store/modules/leaderboard.js b/src/renderer/store/modules/leaderboard.js index d5985c29..1d4bc698 100644 --- a/src/renderer/store/modules/leaderboard.js +++ b/src/renderer/store/modules/leaderboard.js @@ -9,9 +9,7 @@ for (const source of music.sources) { sources.push(source) } -// state -const state = { - boards: sourceList, +const listInfo = { list: [], total: 0, page: 1, @@ -19,6 +17,11 @@ const state = { key: null, } +// state +const state = { + boards: sourceList, +} + // getters const getters = { sources(state, getters, rootState, { sourceNames }) { @@ -27,16 +30,6 @@ const getters = { boards(state) { return state.boards }, - list(state) { - return state.list - }, - info(state) { - return { - total: state.total, - limit: state.limit, - page: state.page, - } - }, } // actions @@ -47,7 +40,6 @@ const actions = { // let tabId = rootState.setting.leaderboard.tabId // let key = `${source}${tabId}${page}` // if (state.list.length && state.key == key) return true - // commit('clearList') if (state.boards[source].length) return return music[source].leaderboard.getBoards().then(result => commit('setBoardsList', { boards: result, source })) }, @@ -56,14 +48,22 @@ const actions = { let tabId = rootState.setting.leaderboard.tabId let [source, bangId] = tabId.split('__') let key = `${source}${tabId}${page}` - if (state.list.length && state.key == key) return Promise.resolve() - commit('clearList') + if (listInfo.list.length && listInfo.key == key) return Promise.resolve(listInfo) + // commit('clearList') // return ( // cache.has(key) // ? Promise.resolve(cache.get(key)) // : music[source].leaderboard.getList(bangId, page) // ).then(result => commit('setList', { result, key })) - return music[source].leaderboard.getList(bangId, page).then(result => commit('setList', { result, key })) + return music[source].leaderboard.getList(bangId, page).then(result => { + cache.set(key, result) + listInfo.list = result.list + listInfo.total = result.total + listInfo.limit = result.limit + listInfo.page = result.page + listInfo.key = key + return listInfo + }) }, getListAll({ state, rootState }, id) { // console.log(source, id) @@ -96,18 +96,6 @@ const mutations = { setBoardsList(state, { boards, source }) { state.boards[source] = boards.list }, - setList(state, { result, key }) { - state.list = result.list - state.total = result.total - state.limit = result.limit - state.page = result.page - state.key = key - cache.set(key, result) - }, - clearList(state) { - state.list = [] - state.total = 0 - }, } export default { diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index 12c124f2..0e570b76 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -1,6 +1,7 @@ import musicSdk from '../../utils/music' import { clearLyric, clearMusicUrl } from '../../utils' import { sync as eventSyncName } from '@renderer/event/names' +import { removeListPosition, setListPrevSelectId } from '@renderer/utils/data' let allList = {} window.allList = allList @@ -340,6 +341,7 @@ const mutations = { if (index < 0) return let list = state.userList.splice(index, 1)[0] allListRemove(list) + removeListPosition(id) }, setUserListName(state, { id, name, isSync }) { if (!isSync) { @@ -380,9 +382,6 @@ const mutations = { state.userList.splice(index, 1) state.userList.splice(index + 1, 0, targetList) }, - setListScroll(state, { id, location }) { - if (allList[id]) allList[id].location = location - }, setMusicPosition(state, { id, position, list, isSync }) { if (!isSync) { window.eventHub.$emit(eventSyncName.send_action_list, { @@ -418,6 +417,9 @@ const mutations = { setOtherSource(state, { musicInfo, otherSource }) { musicInfo.otherSource = otherSource }, + setPrevSelectListId(state, val) { + setListPrevSelectId(val) + }, } export default { diff --git a/src/renderer/store/mutations.js b/src/renderer/store/mutations.js index 5cd60e33..9b02b7f7 100644 --- a/src/renderer/store/mutations.js +++ b/src/renderer/store/mutations.js @@ -61,9 +61,6 @@ export default { setMediaDeviceId(state, val) { state.setting.player.mediaDeviceId = val }, - setPrevSelectListId(state, val) { - state.setting.list.prevSelectListId = val - }, setDesktopLyricConfig(state, config) { state.setting.desktopLyric = Object.assign(state.setting.desktopLyric, config) }, diff --git a/src/renderer/utils/data.js b/src/renderer/utils/data.js new file mode 100644 index 00000000..8637ca7a --- /dev/null +++ b/src/renderer/utils/data.js @@ -0,0 +1,45 @@ +import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc' +import { throttle } from './index' + +let listPosition = {} +let listPrevSelectId + +const saveListPosition = throttle(() => { + rendererSend(NAMES.mainWindow.save_data, { + path: 'listPosition', + data: listPosition, + }) +}, 1000) + +export const initListPosition = () => { + return rendererInvoke(NAMES.mainWindow.get_data, 'listPosition').then(data => { + if (!data) data = {} + listPosition = data + }) +} +export const getListPosition = id => listPosition[id] || 0 +export const setListPosition = (id, position) => { + listPosition[id] = position || 0 + saveListPosition() +} +export const removeListPosition = id => { + delete listPosition[id] + saveListPosition() +} + +const saveListPrevSelectId = throttle(() => { + rendererSend(NAMES.mainWindow.save_data, { + path: 'listPrevSelectId', + data: listPrevSelectId, + }) +}, 200) +export const initListPrevSelectId = () => { + return rendererInvoke(NAMES.mainWindow.get_data, 'listPrevSelectId').then(id => { + listPrevSelectId = id + }) +} +export const getListPrevSelectId = () => listPrevSelectId +export const setListPrevSelectId = id => { + listPrevSelectId = id + saveListPrevSelectId() +} diff --git a/src/renderer/views/Download.vue b/src/renderer/views/Download.vue index d530c150..bbff13d4 100644 --- a/src/renderer/views/Download.vue +++ b/src/renderer/views/Download.vue @@ -14,21 +14,22 @@ div(:class="$style.download") th.nobreak(style="width: 22%;") {{$t('view.download.status')}} th.nobreak(style="width: 10%;") {{$t('view.download.quality')}} th.nobreak(style="width: 13%;") {{$t('view.download.action')}} - div.scroll(v-if="list.length" :class="$style.tbody" ref="dom_scrollContent") - table - tbody(ref="dom_tbody") - tr(v-for='(item, index) in showList' :key='item.key' @contextmenu="handleListItemRigthClick($event, index)" @click="handleDoubleClick($event, index)" :class="playListIndex === index ? $style.active : ''") - td.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" @click.stop) {{index + 1}} - td.break - span.select {{item.musicInfo.name}} - {{item.musicInfo.singer}} - td.break(style="width: 20%;") {{item.progress.progress}}% - td.break(style="width: 22%;") {{item.statusText}} - td.break(style="width: 10%;") {{item.type && item.type.toUpperCase()}} - td(style="width: 13%; padding-left: 0; padding-right: 0;") - material-list-buttons(:index="index" :download-btn="false" :file-btn="item.status != downloadStatus.ERROR" remove-btn - :start-btn="!item.isComplate && item.status != downloadStatus.WAITING && (item.status != downloadStatus.RUN)" - :pause-btn="!item.isComplate && (item.status == downloadStatus.RUN || item.status == downloadStatus.WAITING)" :list-add-btn="false" - :play-btn="item.status == downloadStatus.COMPLETED" :search-btn="item.status == downloadStatus.ERROR" @btn-click="handleListBtnClick") + div(v-if="list.length" :class="$style.content" ref="dom_listContent") + material-virtualized-list(:list="showList" key-name="key" ref="list" :item-height="37" #default="{ item, index }" + containerClass="scroll" contentClass="list") + div.list-item(@click="handleDoubleClick($event, index)" @contextmenu="handleListItemRigthClick($event, index)" + :class="[{[$style.active]: playListIndex == index }, { selected: selectedIndex == index }, { active: selectedData.includes(item) }]") + div.list-item-cell.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" @click.stop) {{index + 1}} + div.list-item-cell.auto + span.select {{item.musicInfo.name}} - {{item.musicInfo.singer}} + div.list-item-cell(style="width: 20%;") {{item.progress.progress}}% + div.list-item-cell(style="width: 22%;") {{item.statusText}} + div.list-item-cell(style="width: 10%;") {{item.type && item.type.toUpperCase()}} + div.list-item-cell(style="width: 13%; padding-left: 0; padding-right: 0;") + material-list-buttons(:index="index" :download-btn="false" :file-btn="item.status != downloadStatus.ERROR" remove-btn + :start-btn="!item.isComplate && item.status != downloadStatus.WAITING && (item.status != downloadStatus.RUN)" + :pause-btn="!item.isComplate && (item.status == downloadStatus.RUN || item.status == downloadStatus.WAITING)" :list-add-btn="false" + :play-btn="item.status == downloadStatus.COMPLETED" :search-btn="item.status == downloadStatus.ERROR" @btn-click="handleListBtnClick") material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick") div(:class="$style.noItem" v-else) @@ -52,8 +53,10 @@ export default { isShiftDown: false, isModDown: false, }, + selectedIndex: -1, lastSelectIndex: 0, listMenu: { + rightClickItemIndex: -1, isShowItemMenu: false, itemMenuControl: { play: true, @@ -217,7 +220,7 @@ export default { this.handleSelectAllData() }, handleDoubleClick(event, index) { - if (event.target.classList.contains('select')) return + if (this.listMenu.rightClickItemIndex > -1) return this.handleSelectData(event, index) @@ -248,14 +251,8 @@ export default { } this.selectedData = this.showList.slice(lastSelectIndex, clickIndex + 1) if (isNeedReverse) this.selectedData.reverse() - let nodes = this.$refs.dom_tbody.childNodes - do { - nodes[lastSelectIndex].classList.add('active') - lastSelectIndex++ - } while (lastSelectIndex <= clickIndex) } } else { - event.currentTarget.classList.add('active') this.selectedData.push(this.showList[clickIndex]) this.lastSelectIndex = clickIndex } @@ -265,21 +262,13 @@ export default { let index = this.selectedData.indexOf(item) if (index < 0) { this.selectedData.push(item) - event.currentTarget.classList.add('active') } else { this.selectedData.splice(index, 1) - event.currentTarget.classList.remove('active') } } else if (this.selectedData.length) this.removeAllSelect() }, removeAllSelect() { this.selectedData = [] - let dom_tbody = this.$refs.dom_tbody - if (!dom_tbody) return - let nodes = dom_tbody.querySelectorAll('.active') - for (const node of nodes) { - if (node.parentNode == dom_tbody) node.classList.remove('active') - } }, handleClick(index) { const key = this.showList[index].key @@ -323,11 +312,6 @@ export default { handleSelectAllData() { this.removeAllSelect() this.selectedData = [...this.showList] - - let nodes = this.$refs.dom_tbody.childNodes - for (const node of nodes) { - node.classList.add('active') - } }, // async handleFlowBtnClick(action) { // let selectedData = [...this.selectedData] @@ -363,13 +347,19 @@ export default { }, handleListItemRigthClick(event, index) { this.listMenu.itemMenuControl.sourceDetail = !!musicSdk[this.showList[index].musicInfo.source].getMusicDetailPageUrl - let dom_selected = this.$refs.dom_tbody.querySelector('tr.selected') - if (dom_selected) dom_selected.classList.remove('selected') - this.$refs.dom_tbody.querySelectorAll('tr')[index].classList.add('selected') - let dom_td = event.target.closest('td') + let dom_container = event.target.closest('.' + this.$style.download) + const getOffsetValue = (target, x = 0, y = 0) => { + if (target === dom_container) return { x, y } + if (!target) return { x: 0, y: 0 } + x += target.offsetLeft + y += target.offsetTop + return getOffsetValue(target.offsetParent, x, y) + } this.listMenu.rightClickItemIndex = index - this.listMenu.menuLocation.x = dom_td.offsetLeft + event.offsetX - this.listMenu.menuLocation.y = dom_td.offsetTop + event.offsetY - this.$refs.dom_scrollContent.scrollTop + this.selectedIndex = index + let { x, y } = getOffsetValue(event.target) + this.listMenu.menuLocation.x = x + event.offsetX + this.listMenu.menuLocation.y = y + event.offsetY - this.$refs.list.getScrollTop() let item = this.showList[index] if (item.isComplate) { @@ -397,8 +387,7 @@ export default { }) }, hideListMenu() { - let dom_selected = this.$refs.dom_tbody && this.$refs.dom_tbody.querySelector('tr.selected') - if (dom_selected) dom_selected.classList.remove('selected') + this.selectedIndex = -1 this.listMenu.isShowItemMenu = false this.listMenu.rightClickItemIndex = -1 }, @@ -524,18 +513,18 @@ export default { // padding-left: 10px; } } -.tbody { +:global(.list) { flex: auto; overflow-y: auto; - td { - font-size: 12px; + :global(.list-item-cell) { + font-size: 12px !important; &:first-child { // padding-left: 10px; - font-size: 11px; - color: @color-theme_2-font-label; + font-size: 11px !important; + color: @color-theme_2-font-label !important; } } - tr { + :global(.list-item) { &.active { color: @color-btn; } @@ -544,17 +533,17 @@ export default { each(@themes, { :global(#container.@{value}) { - .tbody { - tr { - &.active { - color: ~'@{color-@{value}-btn}'; - } - } - td { + :global(.list) { + :global(.list-item-cell) { &:first-child { color: ~'@{color-@{value}-theme_2-font-label}'; } } + :global(.list-item) { + &.active { + color: ~'@{color-@{value}-btn}' !important; + } + } } } }) diff --git a/src/renderer/views/Leaderboard.vue b/src/renderer/views/Leaderboard.vue index 425a4345..6b5350dd 100644 --- a/src/renderer/views/Leaderboard.vue +++ b/src/renderer/views/Leaderboard.vue @@ -16,7 +16,7 @@ @contextmenu="handleListsItemRigthClick($event, index)") span(:class="$style.listsLabel") {{item.name}} div(:class="$style.list") - material-song-list(v-model="selectedData" ref="songList" :hideListsMenu="hideListsMenu" :rowWidth="{r1: '5%', r2: 'auto', r3: '22%', r4: '22%', r5: '9%', r6: '15%'}" @action="handleSongListAction" :source="source" :page="page" :limit="info.limit" :total="info.total" :noItem="$t('material.song_list.loding_list')" :list="list") + material-song-list(v-model="selectedData" ref="songList" :hideListsMenu="hideListsMenu" :rowWidth="{r1: '5%', r2: 'auto', r3: '22%', r4: '22%', r5: '9%', r6: '15%'}" @action="handleSongListAction" :source="source" :page="page" :limit="listInfo.limit" :total="listInfo.total" :noItem="$t('material.song_list.loding_list')" :list="list") material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false") material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectedData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false") material-list-add-modal(:show="isShowListAdd" :musicInfo="musicInfo" @close="isShowListAdd = false") @@ -56,11 +56,18 @@ export default { y: 0, }, }, + listInfo: { + list: [], + total: 0, + page: 1, + limit: 30, + key: null, + }, } }, computed: { ...mapGetters(['setting']), - ...mapGetters('leaderboard', ['sources', 'boards', 'list', 'info']), + ...mapGetters('leaderboard', ['sources', 'boards', 'info']), ...mapGetters('list', ['defaultList']), boardList() { return this.source && this.boards[this.source] ? this.boards[this.source] : [] @@ -79,13 +86,22 @@ export default { }, ] }, + list() { + return this.listInfo.list + }, }, watch: { tabId(n, o) { this.setLeaderboard({ tabId: n }) if (!n || (!o && this.page !== 1)) return - this.getList(1).then(() => { - this.page = this.info.page + this.listInfo.list = [] + this.getList(1).then(listInfo => { + this.listInfo.list = listInfo.list + this.listInfo.total = listInfo.total + this.listInfo.limit = listInfo.limit + this.listInfo.page = listInfo.page + this.listInfo.key = listInfo.key + this.page = listInfo.page }) }, source(n, o) { @@ -102,7 +118,7 @@ export default { mounted() { this.source = this.setting.leaderboard.source this.tabId = this.setting.leaderboard.tabId - this.page = this.info.page + this.page = this.listInfo.page }, methods: { ...mapMutations(['setLeaderboard']), @@ -206,8 +222,14 @@ export default { }) }, handleTogglePage(page) { - this.getList(page).then(() => { - this.page = this.info.page + this.listInfo.list = [] + this.getList(page).then(listInfo => { + this.listInfo.list = listInfo.list + this.listInfo.total = listInfo.total + this.listInfo.limit = listInfo.limit + this.listInfo.page = listInfo.page + this.listInfo.key = listInfo.key + this.page = listInfo.page }) }, handleAddDownload(type) { @@ -381,7 +403,7 @@ export default { transition: opacity .3s ease; } - :global(.list) { + :global(.selection-list) { max-height: 500px; box-shadow: 0 1px 8px 0 rgba(0,0,0,.2); li { @@ -465,7 +487,7 @@ each(@themes, { :global(.label) { color: ~'@{color-@{value}-theme_2-font}' !important; } - :global(.list) { + :global(.selection-list) { li { background-color: ~'@{color-@{value}-theme_2-background_2}'; &:hover { diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index 25ab684e..dc07029f 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -36,35 +36,26 @@ th.nobreak(style="width: 22%;") {{$t('view.list.album')}} th.nobreak(style="width: 9%;") {{$t('view.list.time')}} th.nobreak(style="width: 15%;") {{$t('view.list.action')}} - div(v-if="delayShow && list.length" :class="$style.content") - div.scroll(:class="$style.tbody" @scroll="handleScroll" ref="dom_scrollContent") - table - tbody(@contextmenu.capture="handleContextMenu" ref="dom_tbody") - tr(v-for='(item, index) in list' :key='item.songmid' :id="'mid_' + item.songmid" @contextmenu="handleListItemRigthClick($event, index)" - @click="handleDoubleClick($event, index)" :class="[isPlayList && playInfo.playIndex === index ? $style.active : '', assertApiSupport(item.source) ? null : $style.disabled]") - td.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" :class="$style.noSelect" @click.stop) {{index + 1}} - td.break - span.select {{item.name}} - span(:class="[$style.labelSource, $style.noSelect]" v-if="isShowSource") {{item.source}} - //- span.badge.badge-light(v-if="item._types['128k']") 128K - //- span.badge.badge-light(v-if="item._types['192k']") 192K - //- span.badge.badge-secondary(v-if="item._types['320k']") 320K - //- span.badge.badge-theme-info(v-if="item._types.ape") APE - //- span.badge.badge-theme-success(v-if="item._types.flac") FLAC - td.break(style="width: 22%;") - span.select {{item.singer}} - td.break(style="width: 22%;") - span.select {{item.albumName}} - td(style="width: 9%;") - span(:class="[$style.time, $style.noSelect]") {{item.interval || '--/--'}} - td(style="width: 15%; padding-left: 0; padding-right: 0;") - material-list-buttons(:index="index" @btn-click="handleListBtnClick" :download-btn="assertApiSupport(item.source)") - //- button.btn-info(type='button' v-if="item._types['128k'] || item._types['192k'] || item._types['320k'] || item._types.flac" @click.stop='openDownloadModal(index)') 下载 - //- button.btn-secondary(type='button' v-if="item._types['128k'] || item._types['192k'] || item._types['320k']" @click.stop='testPlay(index)') 试听 - //- button.btn-secondary(type='button' @click.stop='handleRemove(index)') 删除 - //- button.btn-success(type='button' v-if="(item._types['128k'] || item._types['192k'] || item._types['320k']) && userInfo" @click.stop='showListModal(index)') + + div(v-if="list.length" :class="$style.content" ref="dom_listContent") + material-virtualized-list(:list="list" key-name="songmid" ref="list" #default="{ item, index }" :item-height="37" + @scroll="handleScroll" containerClass="scroll" contentClass="list" @contextmenu.native.capture="handleContextMenu") + div.list-item(@click="handleDoubleClick($event, index)" + :class="[{ [$style.active]: isPlayList && playInfo.playIndex === index }, { selected: selectedIndex == index }, { active: selectdListDetailData.includes(item) }, { [$style.disabled]: !assertApiSupport(item.source) }]" + @contextmenu="handleListItemRigthClick($event, index)") + div.list-item-cell.nobreak.center(style="flex: 0 0 5%; padding-left: 3px; padding-right: 3px;" :class="$style.noSelect" @click.stop) {{index + 1}} + div.list-item-cell.auto.break(:tips="item.name") + span.select {{item.name}} + span(:class="[$style.labelSource, $style.noSelect]" v-if="isShowSource") {{item.source}} + div.list-item-cell.break(style="flex: 0 0 22%;") + span.select {{item.singer}} + div.list-item-cell.break(style="flex: 0 0 22%;") + span.select {{item.albumName}} + div.list-item-cell(style="flex: 0 0 9%;") + span(:class="[$style.time, $style.noSelect]") {{item.interval || '--/--'}} + div.list-item-cell(style="flex: 0 0 15%; padding-left: 0; padding-right: 0;") + material-list-buttons(:index="index" @btn-click="handleListBtnClick" :download-btn="assertApiSupport(item.source)") div(:class="$style.noItem" v-else) - p(v-text="list.length ? $t('view.list.loding_list') : $t('view.list.no_item')") + p(v-text="$t('view.list.no_item')") material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false") material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdListDetailData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false") //- material-flow-btn(:show="isShowEditBtn" :play-btn="false" @btn-click="handleFlowBtnClick") @@ -79,8 +70,11 @@ diff --git a/src/renderer-lyric/components/core/Lyric.vue b/src/renderer-lyric/components/core/Lyric.vue index f2597ea3..e55e9f41 100644 --- a/src/renderer-lyric/components/core/Lyric.vue +++ b/src/renderer-lyric/components/core/Lyric.vue @@ -1,5 +1,6 @@