diff --git a/CHANGELOG.md b/CHANGELOG.md
index aecc18a9..cdb7a356 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,17 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
Commit convention is based on [Conventional Commits](http://conventionalcommits.org).
Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
+## [0.2.0](https://github.com/lyswhut/lx-music-desktop/compare/v0.1.6...v0.2.0) - 2019-08-20
+
+### 新增
+
+- 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
+- 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
+
+### 修复
+
+- 修复更新弹窗历史版本描述多余的换行问题
+
## [0.1.6](https://github.com/lyswhut/lx-music-desktop/compare/v0.1.5...v0.1.6) - 2019-08-19
### 修复
diff --git a/package.json b/package.json
index 37c62dff..fa9c8d43 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
- "version": "0.1.6",
+ "version": "0.2.0",
"description": "一个免费的音乐下载助手",
"main": "./dist/electron/main.js",
"scripts": {
diff --git a/publish/changeLog.md b/publish/changeLog.md
index 3eb86c66..5e1302d0 100644
--- a/publish/changeLog.md
+++ b/publish/changeLog.md
@@ -1,3 +1,8 @@
+### 新增
+
+- 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
+- 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
+
### 修复
- 修复更新弹窗历史版本描述多余的换行问题
diff --git a/publish/index.js b/publish/index.js
index 15da4437..e1c26cf8 100644
--- a/publish/index.js
+++ b/publish/index.js
@@ -7,11 +7,12 @@ const clearAssets = require('./utils/clearAssets')
const updateVersionFile = require('./utils/updateChangeLog')
// const copyFile = require('./utils/copyFile')
// const githubRelease = require('./utils/githubRelease')
-const { parseArgv } = require('./utils')
+// const { parseArgv } = require('./utils')
const run = async() => {
- const params = parseArgv(process.argv.slice(2))
- const bak = await updateVersionFile(params.ver)
+ // const params = parseArgv(process.argv.slice(2))
+ // const bak = await updateVersionFile(params.ver)
+ const bak = await updateVersionFile(process.argv.slice(2)[0])
try {
console.log(chalk.blue('Clearing assets...'))
diff --git a/publish/version.json b/publish/version.json
index 240a4636..c3989a5e 100644
--- a/publish/version.json
+++ b/publish/version.json
@@ -1,7 +1,11 @@
{
- "version": "0.1.6",
- "desc": "
修复
\n\n",
+ "version": "0.2.0",
+ "desc": "新增
\n\n- 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
\n- 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
\n
\n修复
\n\n",
"history": [
+ {
+ "version": "0.1.6",
+ "desc": "修复
\n\n"
+ },
{
"version": "0.1.5",
"desc": "新增
\n\n- 新增搜索列表批量试听与下载功能
\n- 新增排行榜列表批量试听与下载功能
\n- 新增试听列表批量移除与下载功能
\n- 新增下载列表批量开始、暂停与移除功能
\n
\n优化
\n\n"
diff --git a/src/renderer/components/material/Btn.vue b/src/renderer/components/material/Btn.vue
index be8a7193..45811c1a 100644
--- a/src/renderer/components/material/Btn.vue
+++ b/src/renderer/components/material/Btn.vue
@@ -1,5 +1,5 @@
- button(:class="[$style.btn, min ? $style.min : '']" @click="$emit('click', $event)")
+ button(:class="[$style.btn, min ? $style.min : '']" :disabled="disabled" @click="$emit('click', $event)")
slot
@@ -9,6 +9,10 @@ export default {
min: {
type: Boolean,
},
+ disabled: {
+ type: Boolean,
+ default: false,
+ },
},
}
@@ -27,6 +31,9 @@ export default {
outline: none;
transition: background-color 0.2s ease;
background-color: @color-btn-background;
+ &[disabled] {
+ opacity: .4;
+ }
&:hover {
background-color: @color-theme_2-hover;
diff --git a/src/renderer/components/material/DownloadModal.vue b/src/renderer/components/material/DownloadModal.vue
index 239e75b8..a4ae5cdf 100644
--- a/src/renderer/components/material/DownloadModal.vue
+++ b/src/renderer/components/material/DownloadModal.vue
@@ -5,7 +5,7 @@ material-modal(:show="show" :bg-close="bgClose" @close="handleClose")
| {{ info.name }}
br
| {{ info.singer }}
- material-btn(:class="$style.btn" :key="type.type" @click="handleClick(type.type)" v-for="type in info.types") {{getTypeName(type.type)}} {{ type.type.toUpperCase() }}{{ type.size && ` - ${type.size.toUpperCase()}` }}
+ material-btn(:class="$style.btn" :title="!checkSource(type.type) && '目前酷狗、网易云音源仅支持下载128k音质'" :disabled="!checkSource(type.type)" :key="type.type" @click="handleClick(type.type)" v-for="type in info.types") {{getTypeName(type.type)}} {{ type.type.toUpperCase() }}{{ type.size && ` - ${type.size.toUpperCase()}` }}
@@ -49,6 +49,16 @@ export default {
return '普通音质'
}
},
+ checkSource(type) {
+ switch (this.musicInfo.source) {
+ case 'wy':
+ case 'kg':
+ return type == '128k'
+
+ default:
+ return true
+ }
+ },
},
}
diff --git a/src/renderer/components/material/DownloadMultipleModal.vue b/src/renderer/components/material/DownloadMultipleModal.vue
index 874fba15..705793c4 100644
--- a/src/renderer/components/material/DownloadMultipleModal.vue
+++ b/src/renderer/components/material/DownloadMultipleModal.vue
@@ -37,18 +37,6 @@ export default {
handleClose() {
this.$emit('close')
},
- getTypeName(type) {
- switch (type) {
- case 'flac':
- case 'ape':
- return '无损音质'
- case '320k':
- return '高品音质'
- case '192k':
- case '128k':
- return '普通音质'
- }
- },
},
}
diff --git a/src/renderer/store/modules/download.js b/src/renderer/store/modules/download.js
index b20070d5..2e614a01 100644
--- a/src/renderer/store/modules/download.js
+++ b/src/renderer/store/modules/download.js
@@ -55,7 +55,7 @@ const checkList = (list, musicInfo, type) => list.some(s => s.musicInfo.songmid
const getStartTask = (list, downloadStatus, maxDownloadNum) => {
let downloadCount = 0
const waitList = list.filter(item => item.status == downloadStatus.WAITING ? true : (item.status === downloadStatus.RUN && ++downloadCount && false))
- console.log(downloadCount, waitList)
+ // console.log(downloadCount, waitList)
return downloadCount < maxDownloadNum && waitList.length > 0 && waitList.shift()
}
@@ -168,7 +168,9 @@ const actions = {
console.log(err)
_this.dispatch('download/startTask')
})
+ return
}
+ _this.dispatch('download/startTask')
},
// onStateChanged(state) {
// console.log(state)
@@ -191,20 +193,22 @@ const actions = {
}
let p = options.url ? Promise.resolve() : refreshUrl(downloadInfo).then(result => {
commit('updateUrl', { downloadInfo, url: result.url })
+ if (!result.url) return Promise.reject(new Error('获取URL失败'))
options.url = result.url
- }).catch(err => {
- commit('onError', downloadInfo)
- commit('setStatusText', { downloadInfo, text: err.message })
- return Promise.reject(err)
})
p.then(() => {
tryNum[downloadInfo.key] = 0
dls[downloadInfo.key] = download(options)
+ }).catch(err => {
+ // console.log(err.message)
+ commit('onError', downloadInfo)
+ commit('setStatusText', { downloadInfo, text: err.message })
+ this.dispatch('download/startTask')
})
},
- startTaskMultiple({ state, rootState }, list) {
+ // startTaskMultiple({ state, rootState }, list) {
- },
+ // },
removeTask({ commit, state }, index) {
let info = state.list[index]
if (state.list[index].status == state.downloadStatus.RUN) {
diff --git a/src/renderer/utils/music/api-source.js b/src/renderer/utils/music/api-source.js
index 4fa59fdc..adeb2d2a 100644
--- a/src/renderer/utils/music/api-source.js
+++ b/src/renderer/utils/music/api-source.js
@@ -1,10 +1,14 @@
import kw_api_messoer from './kw/api-messoer'
import kw_api_temp from './kw/api-temp'
import tx_api_messoer from './tx/api-messoer'
+import kg_api_messoer from './kg/api-messoer'
+import wy_api_messoer from './wy/api-messoer'
const apis = {
kw_api_messoer,
tx_api_messoer,
+ kg_api_messoer,
+ wy_api_messoer,
kw_api_temp,
}
@@ -22,6 +26,10 @@ export default source => {
switch (source) {
case 'tx':
return getAPI('tx')
+ case 'kg':
+ return getAPI('kg')
+ case 'wy':
+ return getAPI('wy')
default:
return getAPI('kw')
}
diff --git a/src/renderer/utils/music/kg/api-messoer.js b/src/renderer/utils/music/kg/api-messoer.js
new file mode 100644
index 00000000..017959af
--- /dev/null
+++ b/src/renderer/utils/music/kg/api-messoer.js
@@ -0,0 +1,37 @@
+import { httpFatch } from '../../request'
+import { requestMsg } from '../../message'
+
+const api_messoer = {
+ getMusicUrl(songInfo, type) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/kugou/url?id=${songInfo._types[type].hash}&quality=${type.replace(/k$/, '')}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body.code === 200 ? Promise.resolve({ type, url: body.data }) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+ getPic(songInfo) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/kugou/pic?id=${songInfo.hash}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body.code === 200 ? Promise.resolve(body.data) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+ getLyric(songInfo) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/kugou/lrc?id=${songInfo.hash}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body ? Promise.resolve(body) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+}
+
+export default api_messoer
diff --git a/src/renderer/utils/music/kg/index.js b/src/renderer/utils/music/kg/index.js
index ac9a269a..4e83935a 100644
--- a/src/renderer/utils/music/kg/index.js
+++ b/src/renderer/utils/music/kg/index.js
@@ -1,7 +1,18 @@
import leaderboard from './leaderboard'
+import api_source from '../api-source'
+
const kg = {
leaderboard,
+ getMusicUrl(songInfo, type) {
+ return api_source('kg').getMusicUrl(songInfo, type)
+ },
+ getLyric(songInfo) {
+ return api_source('kg').getLyric(songInfo)
+ },
+ getPic(songInfo) {
+ return api_source('kg').getPic(songInfo)
+ },
}
export default kg
diff --git a/src/renderer/utils/music/kg/leaderboard.js b/src/renderer/utils/music/kg/leaderboard.js
index 2913b5d4..1e8c4eb9 100644
--- a/src/renderer/utils/music/kg/leaderboard.js
+++ b/src/renderer/utils/music/kg/leaderboard.js
@@ -1,5 +1,5 @@
import { httpGet, cancelHttp } from '../../request'
-import { formatPlayTime } from '../../index'
+import { formatPlayTime, sizeFormate } from '../../index'
export default {
list: [
@@ -89,18 +89,58 @@ export default {
})
},
filterData(rawList) {
- return rawList.map(item => ({
- singer: item.singername,
- name: item.songname,
- albumName: item.album_name,
- albumId: item.album_id,
- songmid: item.audio_id,
- source: 'kg',
- interval: formatPlayTime(item.duration / 1000),
- img: null,
- lrc: null,
- typeUrl: {},
- }))
+ // console.log(rawList)
+ return rawList.map(item => {
+ const types = []
+ const _types = {}
+ if (item.filesize !== 0) {
+ let size = sizeFormate(item.filesize)
+ types.push({ type: '128k', size, hash: item.hash })
+ _types['128k'] = {
+ size,
+ hash: item.hash,
+ }
+ }
+ if (item.filesize_320 !== 0) {
+ let size = sizeFormate(item.filesize_320)
+ types.push({ type: '320k', size, hash: item.hash_320 })
+ _types['320k'] = {
+ size,
+ hash: item.hash_320,
+ }
+ }
+ if (item.filesize_ape !== 0) {
+ let size = sizeFormate(item.filesize_ape)
+ types.push({ type: 'ape', size, hash: item.hash_ape })
+ _types.ape = {
+ size,
+ hash: item.hash_ape,
+ }
+ }
+ if (item.filesize_flac !== 0) {
+ let size = sizeFormate(item.filesize_flac)
+ types.push({ type: 'flac', size, hash: item.hash_flac })
+ _types.flac = {
+ size,
+ hash: item.hash_flac,
+ }
+ }
+ return {
+ singer: item.singername,
+ name: item.songname,
+ albumName: item.album_name,
+ albumId: item.album_id,
+ songmid: item.audio_id,
+ source: 'kg',
+ interval: formatPlayTime(item.duration / 1000),
+ img: null,
+ lrc: null,
+ hash: item.HASH,
+ types,
+ _types,
+ typeUrl: {},
+ }
+ })
},
getList(id, page) {
let type = this.list.find(s => s.id === id)
diff --git a/src/renderer/utils/music/utils.js b/src/renderer/utils/music/utils.js
index 14f0e1c6..94cd3b5f 100644
--- a/src/renderer/utils/music/utils.js
+++ b/src/renderer/utils/music/utils.js
@@ -3,8 +3,14 @@
* @param {*} info
* @param {*} type
*/
+
const types = ['flac', 'ape', '320k', '192k', '128k']
export const getMusicType = (info, type) => {
+ switch (window.globalObj.apiSource) {
+ case 'kg':
+ case 'wy':
+ return '128k'
+ }
const rangeType = types.slice(types.indexOf(type))
for (const type of rangeType) {
if (info._types[type]) return type
diff --git a/src/renderer/utils/music/wy/api-messoer.js b/src/renderer/utils/music/wy/api-messoer.js
new file mode 100644
index 00000000..2d8db5f0
--- /dev/null
+++ b/src/renderer/utils/music/wy/api-messoer.js
@@ -0,0 +1,37 @@
+import { httpFatch } from '../../request'
+import { requestMsg } from '../../message'
+
+const api_messoer = {
+ getMusicUrl(songInfo, type) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/netease/url?id=${songInfo.songmid}&quality=${type.replace(/k$/, '')}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body.code === 200 ? Promise.resolve({ type, url: body.data }) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+ getPic(songInfo) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/netease/pic?id=${songInfo.songmid}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body.code === 200 ? Promise.resolve(body.data) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+ getLyric(songInfo) {
+ const requestObj = httpFatch(`https://v1.itooi.cn/netease/lrc?id=${songInfo.songmid}&isRedirect=0`, {
+ method: 'get',
+ timeout: 5000,
+ })
+ requestObj.promise = requestObj.promise.then(({ body }) => {
+ return body ? Promise.resolve(body) : Promise.reject(new Error(requestMsg.fail))
+ })
+ return requestObj
+ },
+}
+
+export default api_messoer
diff --git a/src/renderer/utils/music/wy/index.js b/src/renderer/utils/music/wy/index.js
index 3dcb8fa2..accfa0d2 100644
--- a/src/renderer/utils/music/wy/index.js
+++ b/src/renderer/utils/music/wy/index.js
@@ -1,7 +1,18 @@
import leaderboard from './leaderboard'
+import api_source from '../api-source'
const wy = {
leaderboard,
+ getMusicUrl(songInfo, type) {
+ return api_source('wy').getMusicUrl(songInfo, type)
+ },
+ getLyric(songInfo) {
+ console.log(api_source('wy'))
+ return api_source('wy').getLyric(songInfo)
+ },
+ getPic(songInfo) {
+ return api_source('wy').getPic(songInfo)
+ },
}
export default wy
diff --git a/src/renderer/utils/music/wy/leaderboard.js b/src/renderer/utils/music/wy/leaderboard.js
index 1f005b8f..e6167aaf 100644
--- a/src/renderer/utils/music/wy/leaderboard.js
+++ b/src/renderer/utils/music/wy/leaderboard.js
@@ -91,6 +91,42 @@ export default {
filterData(rawList) {
// console.log(rawList)
return rawList.map(item => {
+ const types = []
+ const _types = {}
+ let size
+ switch (item.privilege.maxbr) {
+ case 999000:
+ size = null
+ types.push({ type: 'flac', size })
+ _types['flac'] = {
+ size,
+ }
+ case 320000:
+ size = null
+ types.push({ type: '320k', size })
+ _types['320k'] = {
+ size,
+ }
+ case 192000:
+ case 190000:
+ size = null
+ types.push({ type: '192k', size })
+ _types['192k'] = {
+ size,
+ }
+ // case '160000':
+
+ default:
+ size = null
+ types.push({ type: '128k', size })
+ _types['128k'] = {
+ size,
+ }
+ break
+ }
+
+ types.reverse()
+
return {
singer: this.getSinger(item.artists),
name: item.name,
@@ -101,6 +137,8 @@ export default {
songmid: item.id,
img: item.album.picUrl,
lrc: null,
+ types,
+ _types,
typeUrl: {},
}
})
diff --git a/src/renderer/views/Leaderboard.vue b/src/renderer/views/Leaderboard.vue
index 17d32d69..ecb1ea86 100644
--- a/src/renderer/views/Leaderboard.vue
+++ b/src/renderer/views/Leaderboard.vue
@@ -30,7 +30,7 @@
td.break(style="width: 20%;") {{item.singer}}
td.break(style="width: 22%;") {{item.albumName}}
td(style="width: 18%;")
- material-list-buttons(:index="index" :search-btn="true" :play-btn="item.source == 'kw' || (!isAPITemp && item.source == 'tx')" :download-btn="item.source == 'kw' || (!isAPITemp && item.source == 'tx')" :remove-btn="false" @btn-click="handleListBtnClick")
+ material-list-buttons(:index="index" :search-btn="true" :play-btn="item.source == 'kw' || !isAPITemp" :download-btn="item.source == 'kw' || !isAPITemp" :remove-btn="false" @btn-click="handleListBtnClick")
//- 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-success(type='button' v-if="(item._types['128k'] || item._types['192k'] || item._types['320k']) && userInfo" @click.stop='showListModal(index)') +
@@ -39,7 +39,7 @@
material-pagination(:count="info.total" :limit="info.limit" :page="info.page" @btn-click="handleTogglePage")
material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false")
material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false")
- material-flow-btn(:show="isShowEditBtn && (source == 'kw' || (!isAPITemp && source == 'tx'))" :remove-btn="false" @btn-click="handleFlowBtnClick")
+ material-flow-btn(:show="isShowEditBtn && (source == 'kw' || !isAPITemp)" :remove-btn="false" @btn-click="handleFlowBtnClick")