From ad40fdcb55d1b42d5529676fc45a910765c10a23 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 26 Aug 2019 14:29:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=85=B7=E7=8B=97=E6=AD=8C?= =?UTF-8?q?=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/utils/music/kg/songList.js | 231 ++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/renderer/utils/music/kg/songList.js diff --git a/src/renderer/utils/music/kg/songList.js b/src/renderer/utils/music/kg/songList.js new file mode 100644 index 00000000..de07342c --- /dev/null +++ b/src/renderer/utils/music/kg/songList.js @@ -0,0 +1,231 @@ +import { httpFatch } from '../../request' +import { formatPlayTime, sizeFormate } from '../../index' + +export default { + _requestObj_tagInfo: null, + _requestObj_songList: null, + _requestObj_songListRecommend: null, + _requestObj_songListDetail: null, + sortList: [ + { + name: '推荐', + id: '5', + }, + { + name: '最热', + id: '6', + }, + { + name: '最新', + id: '7', + }, + { + name: '热藏', + id: '3', + }, + { + name: '飙升', + id: '8', + }, + ], + regExps: { + listData: /global\.data = (\[.+\]);/, + }, + getInfoUrl(tagId) { + return tagId + ? `http://www2.kugou.kugou.com/yueku/v9/special/getSpecial?is_smarty=1&cdn=cdn&t=5&c=${tagId}` + : `http://www2.kugou.kugou.com/yueku/v9/special/getSpecial?is_smarty=1&` + }, + getSongListUrl(sortId, tagId, page) { + return `http://www2.kugou.kugou.com/yueku/v9/special/index/getData/getData.html&cdn=cdn&t=${sortId}&c=${tagId}?is_ajax=1&p=${page}` + }, + getSongListDetailUrl(id) { + return `http://www2.kugou.kugou.com/yueku/v9/special/single/${id}-5-9999.html` + }, + + getTypeInfo(tagId) { + if (this._requestObj_tagInfo) this._requestObj_tagInfo.cancelHttp() + this._requestObj_tagInfo = httpFatch(this.getInfoUrl(tagId)) + return this._requestObj_tagInfo.promise.then(({ body }) => { + if (body.status !== 1) return this.getTypeInfo(tagId) + return { + hotTag: this.filterInfoHotTag(body.data.hotTag), + tags: this.filterTagInfo(), + tagInfo: { + limit: body.data.params.pagesize, + page: body.data.params.p, + total: body.data.params.total, + }, + } + }) + }, + filterInfoHotTag(rawData) { + const result = [] + if (rawData.status !== 1) return result + for (let index = 0; index < Object.keys(rawData.data).lengt; index++) { + let tag = rawData.data[index.toString()] + result.push({ + id: tag.id, + name: tag.special_name, + }) + } + return result + }, + filterTagInfo(rawData) { + const result = [] + for (const type of Object.keys(rawData)) { + result.push({ + type, + list: rawData[type].map(tag => ({ + parent_id: tag.parent_id, + parent_name: tag.pname, + id: tag.id, + name: tag.name, + })), + }) + } + }, + + getSongList(sortId, tagId, page) { + if (this._requestObj_songList) this._requestObj_songList.cancelHttp() + this._requestObj_songList = httpFatch( + this.getSongListUrl(sortId, tagId, page) + ) + return this._requestObj_songList.promise.then(({ body }) => { + if (body.status !== 1) return this.getSongList(sortId, tagId, page) + return this.filterSongList(body.data) + }) + }, + getSongListRecommend() { + if (this._requestObj_songListRecommend) this._requestObj_songListRecommend.cancelHttp() + this._requestObj_songListRecommendRecommend = httpFatch( + 'http://everydayrec.service.kugou.com/guess_special_recommend', + { + method: 'post', + headers: { + 'User-Agent': 'KuGou2012-8275-web_browser_event_handler', + }, + body: { + appid: 1001, + clienttime: 1566798337219, + clientver: 8275, + key: 'f1f93580115bb106680d2375f8032d96', + mid: '21511157a05844bd085308bc76ef3343', + platform: 'pc', + userid: '262643156', + return_min: 6, + return_max: 15, + }, + } + ) + return this._requestObj_songListRecommend.promise.then(({ body }) => { + if (body.status !== 1) return this.getSongListRecommend() + return this.filterSongList(body.data) + }) + }, + filterSongList(rawData) { + return rawData.map(item => ({ + play_count: item.play_count, + total_play_count: item.total_play_count, + id: item.specialid, + author: item.nickname, + name: item.specialname, + time: item.publish_time, + img: item.img, + grade: item.grade, + desc: item.intro, + })) + }, + + getSongListDetail(id) { // 获取歌曲列表内的音乐 + if (this._requestObj_songListDetail) this._requestObj_songListDetail.cancelHttp() + this._requestObj_songListDetail = httpFatch(this.getSongListDetailUrl(id)) + return this._requestObj_songListDetail.promise.then(({ body }) => { + let listData = body.match(this.regExps.listData) + if (listData) listData = this.filterData(JSON.parse(RegExp.$1)) + return listData + }) + }, + filterData(rawList) { + // 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: {}, + } + }) + }, + + getListInfo(tagId) { // 获取列表信息 + return this.getTypeInfo(tagId).then(info => { + return { + limit: info.tagInfo.limit, + page: info.tagInfo.page, + total: info.tagInfo.total, + } + }) + }, + + getList(sortId, tagId, page) { // 获取列表数据 + let tasks = [this.getSongList(sortId, tagId, page)] + if (!tagId) tasks.push(this.getSongListRecommend()) + Promise.all(tasks).then(([list, recommendList]) => { + if (recommendList) list.unshift(...recommendList) + return list + }) + }, + + getTags() { // 获取标签 + return this.getTypeInfo().then(info => { + return { + hotTag: info.hotTag, + tags: info.tags, + } + }) + }, +}