From bac9439f8e319ad8ad124e6b6496a5cbaafb4be2 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 30 Sep 2019 14:49:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=96=B0=E5=A2=9EQQ=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E6=BA=90=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/utils/music/tx/index.js | 2 + src/renderer/utils/music/tx/musicSearch.js | 106 +++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/renderer/utils/music/tx/musicSearch.js diff --git a/publish/changeLog.md b/publish/changeLog.md index cd08086a..502b86f3 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,6 +1,7 @@ #### 新增 - 新增QQ音乐源歌单 +- 新增QQ音乐源搜索 #### 修复 diff --git a/src/renderer/utils/music/tx/index.js b/src/renderer/utils/music/tx/index.js index 88bce30a..6fe76998 100644 --- a/src/renderer/utils/music/tx/index.js +++ b/src/renderer/utils/music/tx/index.js @@ -1,11 +1,13 @@ import leaderboard from './leaderboard' import lyric from './lyric' import songList from './songList' +import musicSearch from './musicSearch' import api_source from '../api-source' const tx = { leaderboard, songList, + musicSearch, getMusicUrl(songInfo, type) { return api_source('tx').getMusicUrl(songInfo, type) diff --git a/src/renderer/utils/music/tx/musicSearch.js b/src/renderer/utils/music/tx/musicSearch.js new file mode 100644 index 00000000..50c97bcc --- /dev/null +++ b/src/renderer/utils/music/tx/musicSearch.js @@ -0,0 +1,106 @@ +// import '../../polyfill/array.find' +// import jshtmlencode from 'js-htmlencode' +import { httpFetch } from '../../request' +import { formatPlayTime, sizeFormate } from '../../index' +// import { debug } from '../../utils/env' +// import { formatSinger } from './util' + +let searchRequest +export default { + limit: 30, + total: 0, + page: 0, + allPage: 1, + successCode: 0, + musicSearch(str, page, retryNum = 0) { + if (searchRequest && searchRequest.cancelHttp) searchRequest.cancelHttp() + if (retryNum > 5) return Promise.reject(new Error('搜索失败')) + searchRequest = httpFetch(`https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.song_next&searchid=49252838123499591&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=${page}&n=${this.limit}&w=${encodeURIComponent(str)}&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0`) + // searchRequest = httpFetch(`http://ioscdn.kugou.com/api/v3/search/song?keyword=${encodeURIComponent(str)}&page=${page}&pagesize=${this.limit}&showtype=10&plat=2&version=7910&tag=1&correct=1&privilege=1&sver=5`) + return searchRequest.promise.then(({ body }) => { + if (body.code !== this.successCode) return this.musicSearch(str, page, ++retryNum) + return body.data + }) + }, + getSinger(singers) { + let arr = [] + singers.forEach(singer => { + arr.push(singer.name) + }) + return arr.join('、') + }, + handleResult(rawList) { + // console.log(rawData) + return rawList.map(item => { + let types = [] + let _types = {} + if (item.file.size_128mp3 !== 0) { + let size = sizeFormate(item.file.size_128mp3) + types.push({ type: '128k', size }) + _types['128k'] = { + size, + } + } + if (item.file.size_320mp3 !== 0) { + let size = sizeFormate(item.file.size_320mp3) + types.push({ type: '320k', size }) + _types['320k'] = { + size, + } + } + if (item.file.size_ape !== 0) { + let size = sizeFormate(item.file.size_ape) + types.push({ type: 'ape', size }) + _types.ape = { + size, + } + } + if (item.file.size_flac !== 0) { + let size = sizeFormate(item.file.size_flac) + types.push({ type: 'flac', size }) + _types.flac = { + size, + } + } + // types.reverse() + return { + singer: this.getSinger(item.singer), + name: item.title, + albumName: item.album.title, + albumId: item.album.mid, + source: 'tx', + interval: formatPlayTime(item.interval), + songId: item.id, + albumMid: item.album.mid, + strMediaMid: item.file.media_mid, + songmid: item.mid, + img: (item.album.name === '' || item.album.name === '空') + ? `https://y.gtimg.cn/music/photo_new/T001R500x500M000${item.singer[0].mid}.jpg` + : `https://y.gtimg.cn/music/photo_new/T002R500x500M000${item.album.mid}.jpg`, + lrc: null, + types, + _types, + typeUrl: {}, + } + }) + }, + search(str, page = 1, { limit } = {}) { + if (limit != null) this.limit = limit + // http://newlyric.kuwo.cn/newlyric.lrc?62355680 + return this.musicSearch(str, page).then(({ song }) => { + let list = this.handleResult(song.list) + + this.total = song.totalnum + this.page = page + this.allPage = Math.ceil(this.total / this.limit) + + return Promise.resolve({ + list, + allPage: this.allPage, + limit: this.limit, + total: this.total, + source: 'tx', + }) + }) + }, +} From 6d7be78b70a9403027da23c061f4b4904dd95576 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 30 Sep 2019 15:24:00 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=BC=80=E6=94=BE=E8=85=BE=E8=AE=AF?= =?UTF-8?q?=E6=BA=90128k=E9=9F=B3=E6=BA=90=E7=9B=B4=E6=8E=A5=E6=92=AD?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/components/material/DownloadModal.vue | 3 ++- src/renderer/components/material/SongList.vue | 4 ++-- src/renderer/utils/music/api-source.js | 4 ++-- src/renderer/utils/music/tx/api-test.js | 4 ++-- src/renderer/utils/music/utils.js | 1 + src/renderer/views/List.vue | 8 ++++---- src/renderer/views/Search.vue | 8 ++++---- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/renderer/components/material/DownloadModal.vue b/src/renderer/components/material/DownloadModal.vue index ff64047d..aeda90f5 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" :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()}` }} + 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()}` }} @@ -53,6 +53,7 @@ export default { switch (this.musicInfo.source) { case 'wy': case 'kg': + case 'tx': return type == '128k' default: diff --git a/src/renderer/components/material/SongList.vue b/src/renderer/components/material/SongList.vue index 83117389..d9df4e68 100644 --- a/src/renderer/components/material/SongList.vue +++ b/src/renderer/components/material/SongList.vue @@ -27,7 +27,7 @@ div(:class="$style.songList") 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' && item.source != 'wy')" :download-btn="item.source == 'kw' || (!isAPITemp && item.source != 'tx' && item.source != 'wy')" :remove-btn="false" @btn-click="handleListBtnClick") + material-list-buttons(:index="index" :search-btn="true" :play-btn="item.source == 'kw' || (!isAPITemp && item.source != 'wy')" :download-btn="item.source == 'kw' || (!isAPITemp && item.source != 'wy')" :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)') + @@ -136,7 +136,7 @@ export default { this.clickIndex = index return } - this.emitEvent((this.source == 'kw' || (!this.isAPITemp && this.list[index].source != 'tx' && this.list[index].source != 'wy')) ? 'testPlay' : 'search', index) + this.emitEvent((this.source == 'kw' || (!this.isAPITemp && this.list[index].source != 'wy')) ? 'testPlay' : 'search', index) this.clickTime = 0 this.clickIndex = -1 }, diff --git a/src/renderer/utils/music/api-source.js b/src/renderer/utils/music/api-source.js index 3b323b9a..bcf67b7d 100644 --- a/src/renderer/utils/music/api-source.js +++ b/src/renderer/utils/music/api-source.js @@ -1,6 +1,6 @@ import kw_api_temp from './kw/api-temp' import kw_api_test from './kw/api-test' -// import tx_api_messoer from './tx/api-messoer' +import tx_api_test from './tx/api-test' import kg_api_test from './kg/api-test' import wy_api_test from './wy/api-test' import bd_api_test from './bd/api-test' @@ -12,7 +12,7 @@ import bd_api_test from './bd/api-test' const apis = { kw_api_test, - // tx_api_messoer, + tx_api_test, kg_api_test, wy_api_test, bd_api_test, diff --git a/src/renderer/utils/music/tx/api-test.js b/src/renderer/utils/music/tx/api-test.js index de8fac74..ce4738bc 100644 --- a/src/renderer/utils/music/tx/api-test.js +++ b/src/renderer/utils/music/tx/api-test.js @@ -1,10 +1,10 @@ import { httpFetch } from '../../request' import { requestMsg } from '../../message' -import { headers, timeout } from '../messoer' +import { headers, timeout } from '../options' const api_messoer = { getMusicUrl(songInfo, type) { - const requestObj = httpFetch(`https://v1.itooi.cn/tencent/url?id=${songInfo.strMediaMid}&quality=${type.replace(/k$/, '')}`, { + const requestObj = httpFetch(`http://ts.tempmusic.tk/url/tx/${songInfo.strMediaMid}/${type}`, { method: 'get', timeout, headers, diff --git a/src/renderer/utils/music/utils.js b/src/renderer/utils/music/utils.js index 9783dd64..d937fd3d 100644 --- a/src/renderer/utils/music/utils.js +++ b/src/renderer/utils/music/utils.js @@ -9,6 +9,7 @@ export const getMusicType = (info, type) => { switch (window.globalObj.apiSource) { case 'kg': case 'wy': + case 'tx': return '128k' } const rangeType = types.slice(types.indexOf(type)) diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index 2fa1a398..b9a65df1 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -18,7 +18,7 @@ table tbody tr(v-for='(item, index) in list' :key='item.songmid' - @click="handleDoubleClick(index)" :class="[isPlayList && playIndex === index ? $style.active : '', (isAPITemp && item.source != 'kw') || item.source == 'tx' || item.source == 'wy' ? $style.disabled : '']") + @click="handleDoubleClick(index)" :class="[isPlayList && playIndex === index ? $style.active : '', (isAPITemp && item.source != 'kw') || item.source == 'wy' ? $style.disabled : '']") td.nobreak.center(style="width: 37px;" @click.stop) material-checkbox(:id="index.toString()" v-model="selectdData" :value="item") td.break(style="width: 25%;") {{item.name}} @@ -167,7 +167,7 @@ export default { this.clickIndex = -1 }, testPlay(index) { - if ((this.isAPITemp && this.list[index].source != 'kw') || this.list[index].source == 'tx' || this.list[index].source == 'wy') return + if ((this.isAPITemp && this.list[index].source != 'kw') || this.list[index].source == 'wy') return this.setList({ list: this.list, listId: 'test', index }) }, handleRemove(index) { @@ -177,7 +177,7 @@ export default { switch (info.action) { case 'download': { const minfo = this.list[info.index] - if ((this.isAPITemp && minfo.source != 'kw') || minfo.source == 'tx' || minfo.source == 'wy') return + if ((this.isAPITemp && minfo.source != 'kw') || minfo.source == 'wy') return this.musicInfo = minfo this.$nextTick(() => { this.isShowDownload = true @@ -204,7 +204,7 @@ export default { this.selectdData = [] }, handleAddDownloadMultiple(type) { - const list = this.setting.apiSource == 'temp' ? this.selectdData.filter(s => s.source == 'kw') : this.selectdData.filter(s => s.source != 'tx' && s.source != 'wy') + const list = this.setting.apiSource == 'temp' ? this.selectdData.filter(s => s.source == 'kw') : this.selectdData.filter(s => s.source != 'wy') this.createDownloadMultiple({ list, type }) this.resetSelect() this.isShowDownloadMultiple = false diff --git a/src/renderer/views/Search.vue b/src/renderer/views/Search.vue index 2648e49f..fbd1d432 100644 --- a/src/renderer/views/Search.vue +++ b/src/renderer/views/Search.vue @@ -30,8 +30,8 @@ td.break(style="width: 25%;") {{item.albumName}} td(style="width: 15%;") material-list-buttons(:index="index" :remove-btn="false" :class="$style.listBtn" - :play-btn="item.source == 'kw' || (!isAPITemp && item.source != 'tx' && item.source != 'wy')" - :download-btn="item.source == 'kw' || (!isAPITemp && item.source != 'tx' && item.source != 'wy')" + :play-btn="item.source == 'kw' || (!isAPITemp && item.source != 'wy')" + :download-btn="item.source == 'kw' || (!isAPITemp && item.source != 'wy')" @btn-click="handleListBtnClick") td(style="width: 10%;") {{item.interval}} div(:class="$style.pagination") @@ -174,7 +174,7 @@ export default { targetSong = this.selectdData[0] this.defaultListAddMultiple(this.filterList(this.selectdData)) } else { - if ((this.isAPITemp && this.listInfo.list[index].source != 'kw') || this.listInfo.list[index].source == 'tx' || this.listInfo.list[index].source == 'wy') return + if ((this.isAPITemp && this.listInfo.list[index].source != 'kw') || this.listInfo.list[index].source == 'wy') return targetSong = this.listInfo.list[index] this.defaultListAdd(targetSong) } @@ -224,7 +224,7 @@ export default { } }, filterList(list) { - return this.setting.apiSource == 'temp' ? list.filter(s => s.source == 'kw') : list.filter(s => s.source != 'tx' && s.source != 'wy') + return this.setting.apiSource == 'temp' ? list.filter(s => s.source == 'kw') : list.filter(s => s.source != 'wy') }, }, } From 52b063825875c56a036c0b6e7f35e596dee85ad1 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 5 Oct 2019 16:10:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8DstrMediaMid=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/utils/music/tx/musicSearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/utils/music/tx/musicSearch.js b/src/renderer/utils/music/tx/musicSearch.js index 50c97bcc..188943f7 100644 --- a/src/renderer/utils/music/tx/musicSearch.js +++ b/src/renderer/utils/music/tx/musicSearch.js @@ -72,7 +72,7 @@ export default { interval: formatPlayTime(item.interval), songId: item.id, albumMid: item.album.mid, - strMediaMid: item.file.media_mid, + strMediaMid: item.file.strMediaMid, songmid: item.mid, img: (item.album.name === '' || item.album.name === '空') ? `https://y.gtimg.cn/music/photo_new/T001R500x500M000${item.singer[0].mid}.jpg`