完善评论功能

This commit is contained in:
lyswhut
2020-10-24 02:08:31 +08:00
parent aa948b0149
commit 8d8cabd5b3
22 changed files with 753 additions and 127 deletions
+33
View File
@@ -20,6 +20,39 @@ export const sizeFormate = size => {
return `${(size / Math.pow(1024, Math.floor(number))).toFixed(2)} ${units[number]}`
}
/**
* 日期格式化
* @param {*} date 时间
* @param {String} format 时间格式,默认YYYY-MM-DD hh:mm:ss
*/
export const dateFormat = (date = new Date(), format = 'YYYY-MM-DD hh:mm:ss') => {
if (typeof date != 'object') date = new Date(date)
const munFix = (n) => n < 10 ? ('0' + n) : n
return format
.replace('YYYY', date.getFullYear())
.replace('MM', munFix(date.getMonth() + 1))
.replace('DD', munFix(date.getDate()))
.replace('hh', munFix(date.getHours()))
.replace('mm', munFix(date.getMinutes()))
.replace('ss', munFix(date.getSeconds()))
}
/**
* 时间格式化
*/
export const dateFormat2 = time => {
let differ = parseInt((Date.now() - time) / 1000)
if (differ < 60) {
return differ + '秒前'
} else if (differ < 3600) {
return parseInt(differ / 60) + '分钟前'
} else if (differ < 86400) {
return parseInt(differ / 3600) + '小时前'
} else {
return dateFormat(time)
}
}
export const formatPlayTime = time => {
let m = parseInt(time / 60)
let s = parseInt(time % 60)
+75
View File
@@ -0,0 +1,75 @@
import { httpFetch } from '../../request'
import { dateFormat2 } from '../../'
export default {
_requestObj: null,
_requestObj2: null,
async getComment({ hash }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = httpFetch(`http://comment.service.kugou.com/index.php?r=commentsv2/getCommentWithLike&code=fc4be23b4e972707f36b8a828a93ba8a&extdata=${hash}&p=${page}&pagesize=${limit}&ver=1.01&clientver=8373&appid=1001&kugouid=687373022`, {
headers: {
'User-Agent': 'Android712-AndroidPhone-8983-18-0-COMMENT-wifi',
},
})
const { body, statusCode } = await _requestObj.promise
// console.log(body)
if (statusCode != 200 || body.err_code !== 0) throw new Error('获取评论失败')
return { source: 'kg', comments: this.filterComment(body.list), total: body.count, page, limit, maxPage: Math.ceil(body.count / limit) || 1 }
},
async getHotComment({ hash, songmid }, page = 1, limit = 100) {
console.log(songmid)
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch(`http://comment.service.kugou.com/index.php?r=commentsv2/getCommentWithLike&code=fc4be23b4e972707f36b8a828a93ba8a&extdata=${hash}&p=${page}&pagesize=${limit}&ver=1.01&clientver=8373&appid=1001&kugouid=687373022`, {
headers: {
'User-Agent': 'Android712-AndroidPhone-8983-18-0-COMMENT-wifi',
},
})
const { body, statusCode } = await _requestObj2.promise
// console.log(body)
if (statusCode != 200 || body.err_code !== 0) throw new Error('获取热门评论失败')
return { source: 'kg', comments: this.filterComment(body.weightList) }
},
async getReplyComment({ songmid }, replyId, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch(`http://comment.service.kugou.com/index.php?r=commentsv2/getReplyWithLike&code=fc4be23b4e972707f36b8a828a93ba8a&p=${page}&pagesize=${limit}&ver=1.01&clientver=8373&kugouid=687373022&appid=1001&childrenid=${songmid}&tid=${replyId}`, {
headers: {
'User-Agent': 'Android712-AndroidPhone-8983-18-0-COMMENT-wifi',
},
})
const { body, statusCode } = await _requestObj2.promise
// console.log(body)
if (statusCode != 200 || body.err_code !== 0) throw new Error('获取回复评论失败')
return { source: 'kg', comments: this.filterComment(body.list) }
},
filterComment(rawList) {
return rawList.map(item => {
let data = {
id: item.id,
text: item.content.split('\n'),
time: item.addtime,
timeStr: dateFormat2(new Date(item.addtime).getTime()),
userName: item.user_name,
avatar: item.user_pic,
userId: item.user_id,
likedCount: item.like.likenum,
replyNum: item.reply_num,
reply: [],
}
return item.pcontent ? {
id: item.id,
text: item.pcontent.split('\n'),
time: null,
userName: item.puser,
avatar: null,
userId: item.puser_id,
likedCount: null,
replyNum: null,
reply: [data],
} : data
})
},
}
+2
View File
@@ -5,12 +5,14 @@ import musicSearch from './musicSearch'
import pic from './pic'
import lyric from './lyric'
import hotSearch from './hotSearch'
import comment from './comment'
const kg = {
leaderboard,
songList,
musicSearch,
hotSearch,
comment,
getMusicUrl(songInfo, type) {
return apis('kg').getMusicUrl(songInfo, type)
},
+60
View File
@@ -0,0 +1,60 @@
import { httpFetch } from '../../request'
import { dateFormat2 } from '../../'
export default {
_requestObj: null,
_requestObj2: null,
async getComment({ songmid }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = httpFetch(`http://comment.kuwo.cn/com.s?type=get_comment&uid=0&digest=15&sid=${songmid}&page=${page}&rows=${limit}&f=web&prod=MUSIC_8.7.7.0_BCS37&devid=28556413`, {
headers: {
'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9;)',
},
})
const { body, statusCode } = await _requestObj.promise
if (statusCode != 200 || body.result !== 'ok') throw new Error('获取评论失败')
console.log(body)
return { source: 'kw', comments: this.filterComment(body.rows), total: body.total, page, limit, maxPage: Math.ceil(body.total / limit) || 1 }
},
async getHotComment({ songmid }, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch(`http://comment.kuwo.cn/com.s?type=get_rec_comment&uid=0&digest=15&sid=${songmid}&page=${page}&rows=${limit}&f=web&prod=MUSIC_8.7.7.0_BCS37&devid=28556413`, {
headers: {
'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9;)',
},
})
const { body, statusCode } = await _requestObj2.promise
if (statusCode != 200 || body.result !== 'ok') throw new Error('获取热门评论失败')
// console.log(body)
return { source: 'kw', comments: this.filterComment(body.rows) }
},
filterComment(rawList) {
return rawList.map(item => {
let data = {
id: item.id,
text: item.msg.split('\n'),
time: item.time,
timeStr: dateFormat2(new Date(item.time).getTime()),
userName: decodeURIComponent(item.u_name),
avatar: item.u_pic,
userId: item.u_id,
likedCount: item.like_num,
reply: [],
}
return item.reply ? {
id: item.id,
rootId: item.reply.id,
text: item.reply.msg.split('\n'),
time: item.reply.time,
timeStr: dateFormat2(new Date(item.reply.time).getTime()),
userName: decodeURIComponent(item.reply.u_name),
avatar: item.reply.u_pic,
userId: item.reply.u_id,
likedCount: item.reply.like_num,
reply: [data],
} : data
})
},
}
+2
View File
@@ -8,6 +8,7 @@ import pic from './pic'
import { apis } from '../api-source'
import songList from './songList'
import hotSearch from './hotSearch'
import comment from './comment'
const kw = {
_musicInfoRequestObj: null,
@@ -36,6 +37,7 @@ const kw = {
leaderboard,
songList,
hotSearch,
comment,
getLyric(songInfo, isGetLyricx) {
// let singer = songInfo.singer.indexOf('、') > -1 ? songInfo.singer.split('、')[0] : songInfo.singer
return lyric.getLyric(songInfo.songmid, isGetLyricx)
+30
View File
@@ -0,0 +1,30 @@
import { httpFetch } from '../../request'
export default {
getAlbum(songInfo, tryNum = 0) {
let requestObj = httpFetch(`http://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/queryAlbumSong?albumId=${songInfo.albumId}&pageNo=1`, {
headers: {
sign: '46DB65104950B98FE451AD41047CC6C4',
timestamp: 1603451430776,
appId: 'yyapp2',
mode: 'android',
ua: 'Android_migu',
version: '6.9.4',
osVersion: 'android 7.0',
'User-Agent': 'okhttp/3.9.1',
channel: '0146832',
},
})
requestObj.promise = requestObj.promise.then(({ body }) => {
if (body.code !== '000000') {
if (tryNum > 5) return Promise.reject('获取专辑失败')
let tryRequestObj = this.getAlbum(songInfo, ++tryNum)
requestObj.cancelHttp = tryRequestObj.cancelHttp.bind(tryRequestObj)
return tryRequestObj.promise
}
console.log(body)
return body.songList
})
return requestObj
},
}
+95
View File
@@ -0,0 +1,95 @@
import { httpFetch } from '../../request'
import album from './album'
import { dateFormat2 } from '../../'
export default {
_requestObj: null,
_requestObj2: null,
_requestObj3: null,
async getSongId(musicInfo) {
if (this._requestObj3) this._requestObj3.cancelHttp()
this.requestObj3 = album.getAlbum(musicInfo)
const list = await this.requestObj3.promise
const copyrightId = musicInfo.copyrightId
let info = list.find(s => s.copyrightId == copyrightId)
const songmid = musicInfo.songmid
if (!info) info = list.find(s => s.songId == songmid)
return info ? info.songId : null
},
async getComment(musicInfo, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
if (!musicInfo.songId) {
let id = await this.getSongId(musicInfo)
if (!id) throw new Error('获取评论失败')
musicInfo.songId = id
}
const _requestObj = httpFetch(`https://music.migu.cn/v3/api/comment/listComments?targetId=${musicInfo.songId}&pageSize=${limit}&pageNo=${page}`, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4195.1 Safari/537.36',
Referer: 'https://music.migu.cn',
},
})
const { body, statusCode } = await _requestObj.promise
console.log(body)
if (statusCode != 200 || body.returnCode !== '000000') throw new Error('获取评论失败')
return { source: 'mg', comments: this.filterComment(body.data.items), total: body.data.itemTotal, page, limit, maxPage: Math.ceil(body.data.itemTotal / limit) || 1 }
},
async getHotComment(musicInfo, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
if (!musicInfo.songId) {
let id = await this.getSongId(musicInfo)
if (!id) throw new Error('获取评论失败')
musicInfo.songId = id
}
const _requestObj2 = httpFetch(`https://music.migu.cn/v3/api/comment/listTopComments?targetId=${musicInfo.songId}&pageSize=${limit}&pageNo=${page}`, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4195.1 Safari/537.36',
Referer: 'https://music.migu.cn',
},
})
const { body, statusCode } = await _requestObj2.promise
// console.log(body)
if (statusCode != 200 || body.returnCode !== '000000') throw new Error('获取热门评论失败')
return { source: 'mg', comments: this.filterComment(body.data.items) }
},
async getReplyComment(musicInfo, replyId, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch(`https://music.migu.cn/v3/api/comment/listCommentsById?commentId=${replyId}&pageSize=${limit}&pageNo=${page}`, {
headers: {
'User-Agent': 'Android712-AndroidPhone-8983-18-0-COMMENT-wifi',
},
})
const { body, statusCode } = await _requestObj2.promise
// console.log(body)
if (statusCode != 200 || body.returnCode !== '000000') throw new Error('获取回复评论失败')
return { source: 'mg', comments: this.filterComment(body.data.items) }
},
filterComment(rawList) {
return rawList.map(item => ({
id: item.commentId,
text: item.body.split('\n'),
time: item.createTime,
timeStr: dateFormat2(new Date(item.createTime).getTime()),
userName: item.author.name,
avatar: item.author.avatar,
userId: item.author.id,
likedCount: item.praiseCount,
replyNum: item.replyTotal,
reply: item.replyCommentList.map(c => ({
id: c.commentId,
text: c.body.split('\n'),
time: c.createTime,
timeStr: dateFormat2(new Date(c.createTime).getTime()),
userName: c.author.name,
avatar: c.author.avatar,
userId: c.author.id,
likedCount: c.praiseCount,
replyNum: c.replyTotal,
})),
}))
},
}
+2
View File
@@ -5,12 +5,14 @@ import musicSearch from './musicSearch'
import pic from './pic'
import lyric from './lyric'
import hotSearch from './hotSearch'
import comment from './comment'
const mg = {
songList,
musicSearch,
leaderboard,
hotSearch,
comment,
getMusicUrl(songInfo, type) {
return apis('mg').getMusicUrl(songInfo, type)
},
+2 -1
View File
@@ -137,6 +137,7 @@ export default {
albumName: item.album,
albumId: item.albumId,
songmid: item.copyrightId,
songId: item.songId,
copyrightId: item.copyrightId,
source: 'mg',
interval: null,
@@ -195,7 +196,7 @@ 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)
return {
+2 -1
View File
@@ -36,7 +36,7 @@ export default {
return arr.join('、')
},
handleResult(rawData) {
// console.log(rawData)
console.log(rawData)
let ids = new Set()
const list = []
rawData.forEach(item => {
@@ -82,6 +82,7 @@ export default {
albumName: albumNInfo.name,
albumId: albumNInfo.id,
songmid: item.id,
songId: item.songId,
copyrightId: item.copyrightId,
source: 'mg',
interval: null,
+10 -10
View File
@@ -24,25 +24,25 @@ export default {
list: /<li><div class="thumb">.+?<\/li>/g,
listInfo: /.+data-original="(.+?)".*data-id="(\d+)".*<div class="song-list-name"><a\s.*?>(.+?)<\/a>.+<i class="iconfont cf-bofangliang"><\/i>(.+?)<\/div>/,
// http://music.migu.cn/v3/music/playlist/161044573?page=1
// 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',
getSongListUrl(sortId, tagId, page) {
// if (tagId == null) {
// return sortId == 'recommend'
// ? `http://music.migu.cn/v3/music/playlist?page=${page}&from=migu`
// : `http://music.migu.cn/v3/music/playlist?sort=${sortId}&page=${page}&from=migu`
// ? `https://music.migu.cn/v3/music/playlist?page=${page}&from=migu`
// : `https://music.migu.cn/v3/music/playlist?sort=${sortId}&page=${page}&from=migu`
// }
// return `http://music.migu.cn/v3/music/playlist?tagId=${tagId}&page=${page}&from=migu`
// return `https://music.migu.cn/v3/music/playlist?tagId=${tagId}&page=${page}&from=migu`
if (tagId == null) {
// return `http://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?count=${this.limit_list}&start=${page}&templateVersion=5&type=1`
// return `https://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?count=${this.limit_list}&start=${page}&templateVersion=5&type=1`
// return `https://c.musicapp.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?count=${this.limit_list}&start=${page}&templateVersion=5&type=${sortId}`
// http://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?count=50&start=2&templateVersion=5&type=1
return `http://m.music.migu.cn/migu/remoting/playlist_bycolumnid_tag?playListType=2&type=1&columnId=${sortId}&startIndex=${(page - 1) * 10}`
// https://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?count=50&start=2&templateVersion=5&type=1
return `https://m.music.migu.cn/migu/remoting/playlist_bycolumnid_tag?playListType=2&type=1&columnId=${sortId}&startIndex=${(page - 1) * 10}`
}
// return `https://app.c.nf.migu.cn/MIGUM2.0/v2.0/content/getMusicData.do?area=2&count=${this.limit_list}&start=${page}&tags=${tagId}&templateVersion=5&type=3`
return `http://m.music.migu.cn/migu/remoting/playlist_bycolumnid_tag?playListType=2&type=1&tagId=${tagId}&startIndex=${(page - 1) * 10}`
return `https://m.music.migu.cn/migu/remoting/playlist_bycolumnid_tag?playListType=2&type=1&tagId=${tagId}&startIndex=${(page - 1) * 10}`
},
getSongListDetailUrl(id, page) {
return `https://app.c.nf.migu.cn/MIGUM2.0/v1.0/user/queryMusicListSongs.do?musicListId=${id}&pageNo=${page}&pageSize=${this.limit_song}`
@@ -74,7 +74,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,
@@ -135,6 +135,7 @@ export default {
albumId: item.albumId,
songmid: item.copyrightId,
copyrightId: item.copyrightId,
songId: item.songId,
source: 'mg',
interval: null,
img: item.albumImgs && item.albumImgs.length ? item.albumImgs[0].img : null,
@@ -185,7 +186,6 @@ export default {
// })
return this._requestObj_list.promise.then(({ body }) => {
if (body.retCode !== '100000' || body.retMsg.code !== this.successCode) return this.getList(sortId, tagId, page, ++tryNum)
// console.log(body)
return {
list: this.filterList(body.retMsg.playlist),
total: parseInt(body.retMsg.countSize),
+187
View File
@@ -0,0 +1,187 @@
import { httpFetch } from '../../request'
import { dateFormat2 } from '../../'
const emojis = {
e400846: '😘',
e400874: '😴',
e400825: '😃',
e400847: '😙',
e400835: '😍',
e400873: '😳',
e400836: '😎',
e400867: '😭',
e400832: '😊',
e400837: '😏',
e400875: '😫',
e400831: '😉',
e400855: '😡',
e400823: '😄',
e400862: '😨',
e400844: '😖',
e400841: '😓',
e400830: '😈',
e400828: '😆',
e400833: '😋',
e400822: '😀',
e400843: '😕',
e400829: '😇',
e400824: '😂',
e400834: '😌',
e400877: '😷',
e400132: '🍉',
e400181: '🍺',
e401067: '☕️',
e400186: '🥧',
e400343: '🐷',
e400116: '🌹',
e400126: '🍃',
e400613: '💋',
e401236: '❤️',
e400622: '💔',
e400637: '💣',
e400643: '💩',
e400773: '🔪',
e400102: '🌛',
e401328: '🌞',
e400420: '👏',
e400914: '🙌',
e400408: '👍',
e400414: '👎',
e401121: '✋',
e400396: '👋',
e400384: '👉',
e401115: '✊',
e400402: '👌',
e400905: '🙈',
e400906: '🙉',
e400907: '🙊',
e400562: '👻',
e400932: '🙏',
e400644: '💪',
e400611: '💉',
e400185: '🎁',
e400655: '💰',
e400325: '🐥',
e400612: '💊',
e400198: '🎉',
e401685: '⚡️',
e400631: '💝',
e400768: '🔥',
e400432: '👑',
}
export default {
_requestObj: null,
_requestObj2: null,
async getComment({ songId }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = httpFetch('http://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', {
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
},
form: {
uin: '0',
format: 'json',
cid: '205360772',
reqtype: '2',
biztype: '1',
topid: songId,
cmd: '8',
needmusiccrit: '1',
pagenum: page - 1,
pagesize: limit,
},
})
const { body, statusCode } = await _requestObj.promise
if (statusCode != 200 || body.code !== 0) throw new Error('获取评论失败')
// console.log(body, statusCode)
const comment = body.comment
return {
source: 'tx',
comments: this.filterComment(comment.commentlist),
total: comment.commenttotal,
page,
limit,
maxPage: Math.ceil(comment.commenttotal / limit) || 1,
}
},
async getHotComment({ songId }, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch('http://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', {
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
},
form: {
uin: '0',
format: 'json',
cid: '205360772',
reqtype: '2',
biztype: '1',
topid: songId,
cmd: '9',
needmusiccrit: '1',
pagenum: page - 1,
pagesize: limit,
},
})
const { body, statusCode } = await _requestObj2.promise
if (statusCode != 200 || body.code !== 0) throw new Error('获取热门评论失败')
// console.log(body, statusCode)
const comment = body.comment
return {
source: 'tx',
comments: this.filterComment(comment.commentlist),
total: comment.commenttotal,
}
},
replaceEmoji(msg) {
let rxp = /^\[em\](e\d+)\[\/em\]$/
let result = msg.match(/\[em\]e\d+\[\/em\]/g)
if (!result) return msg
result = Array.from(new Set(result))
for (let item of result) {
let code = item.replace(rxp, '$1')
msg = msg.replace(new RegExp(item.replace('[em]', '\\[em\\]').replace('[/em]', '\\[\\/em\\]'), 'g'), emojis[code] || '')
}
return msg
},
filterComment(rawList) {
return rawList.map(item => {
let time = item.rootcommentid ? parseInt(item.rootcommentid.substring(item.rootcommentid.lastIndexOf('_') + 1) + '000') : null
if (item.middlecommentcontent) {
let firstItem = item.middlecommentcontent[0]
firstItem.avatarurl = item.avatarurl
firstItem.praisenum = item.praisenum
item.avatarurl = null
item.praisenum = null
item.middlecommentcontent.reverse()
}
return {
id: item.subcommentid,
rootId: item.rootcommentid,
text: item.rootcommentcontent ? this.replaceEmoji(item.rootcommentcontent).split('\n') : [],
time,
timeStr: time ? dateFormat2(time) : null,
userName: item.rootcommentnick ? item.rootcommentnick.substring(1) : '',
avatar: item.avatarurl,
userId: item.encrypt_rootcommentuin,
likedCount: item.praisenum,
reply: item.middlecommentcontent ? item.middlecommentcontent.map(c => {
let index = c.subcommentid.lastIndexOf('_')
return {
id: c.subcommentid,
text: this.replaceEmoji(c.subcommentcontent).split('\n'),
time: parseInt(c.subcommentid.substring(index + 1) + '000'),
timeStr: dateFormat2(parseInt(c.subcommentid.substring(index + 1) + '000')),
userName: c.replynick.substring(1),
avatar: c.avatarurl,
userId: c.encrypt_replyuin,
likedCount: c.praisenum,
}
}) : [],
}
})
},
}
+2
View File
@@ -4,12 +4,14 @@ import songList from './songList'
import musicSearch from './musicSearch'
import { apis } from '../api-source'
import hotSearch from './hotSearch'
import comment from './comment'
const tx = {
leaderboard,
songList,
musicSearch,
hotSearch,
comment,
getMusicUrl(songInfo, type) {
return apis('tx').getMusicUrl(songInfo, type)
+78
View File
@@ -0,0 +1,78 @@
import { httpFetch } from '../../request'
import { weapi } from './utils/crypto'
import { dateFormat2 } from '../../'
export default {
_requestObj: null,
_requestObj2: null,
async getComment({ songmid }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = httpFetch(`https://music.163.com/api/v1/resource/comments/R_SO_4_${songmid}`, {
method: 'post',
headers: {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
origin: 'https://music.163.com',
},
form: weapi({
rid: songmid,
limit: limit,
offset: (page - 1) * limit,
beforeTime: 0,
}),
})
const { body, statusCode } = await _requestObj.promise
if (statusCode != 200 || body.code !== 200) throw new Error('获取评论失败')
console.log(body)
return { source: 'wy', comments: this.filterComment(body.comments), total: body.total, page, limit, maxPage: Math.ceil(body.total / limit) || 1 }
},
async getHotComment({ songmid }, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
const _requestObj2 = httpFetch(`https://music.163.com/api/v1/resource/comments/R_SO_4_${songmid}`, {
method: 'post',
headers: {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
origin: 'https://music.163.com',
},
form: weapi({
rid: songmid,
limit: limit,
offset: (page - 1) * limit,
beforeTime: 0,
}),
})
const { body, statusCode } = await _requestObj2.promise
if (statusCode != 200 || body.code !== 200) throw new Error('获取热门评论失败')
// console.log(body)
return { source: 'wy', comments: this.filterComment(body.hotComments) }
},
filterComment(rawList) {
return rawList.map(item => {
let data = {
id: item.commentId,
text: item.content ? item.content.split('\n') : '',
time: item.time ? item.time : '',
timeStr: item.time ? dateFormat2(item.time) : '',
userName: item.user.nickname,
avatar: item.user.avatarUrl,
userId: item.user.userId,
likedCount: item.likedCount,
reply: [],
}
let replyData = item.beReplied[0]
return replyData ? {
id: item.commentId,
rootId: replyData.beRepliedCommentId,
text: replyData.content ? replyData.content.split('\n') : '',
time: null,
timeStr: null,
userName: replyData.user.nickname,
avatar: replyData.user.avatarUrl,
userId: replyData.user.userId,
likedCount: null,
reply: [data],
} : data
})
},
}
+2
View File
@@ -5,12 +5,14 @@ import getMusicInfo from './musicInfo'
import musicSearch from './musicSearch'
import songList from './songList'
import hotSearch from './hotSearch'
import comment from './comment'
const wy = {
leaderboard,
musicSearch,
songList,
hotSearch,
comment,
getMusicUrl(songInfo, type) {
return apis('wy').getMusicUrl(songInfo, type)
},
+47
View File
@@ -0,0 +1,47 @@
import { xmRequest } from './util'
import { dateFormat2 } from '../../'
export default {
_requestObj: null,
_requestObj2: null,
async getComment({ songmid }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = xmRequest('/api/comment/getCommentList', { objectId: songmid, objectType: 'song', pagingVO: { page, pageSize: limit } })
const { body, statusCode } = await _requestObj.promise
// console.log(body)
if (statusCode != 200 || body.code !== 'SUCCESS') throw new Error('获取评论失败')
return { source: 'xm', comments: this.filterComment(body.result.data.commentList), total: body.result.data.pagingVO.count, page, limit, maxPage: Math.ceil(body.result.data.pagingVO.count / limit) || 1 }
},
async getHotComment({ songmid }, page = 1, limit = 100) {
if (this._requestObj2) this._requestObj2.cancelHttp()
if (!songmid) throw new Error('获取失败')
const _requestObj2 = xmRequest('/api/comment/getHotCommentList', { objectId: songmid, objectType: 'song', pagingVO: { page, pageSize: limit } })
const { body, statusCode } = await _requestObj2.promise
// console.log(body)
if (statusCode != 200 || body.code !== 'SUCCESS') throw new Error('获取热门评论失败')
return { source: 'xm', comments: this.filterComment(body.result.data.hotList) }
},
filterComment(rawList) {
return rawList.map(item => ({
id: item.commentId,
text: item.message.split('\n').filter(t => !!t),
time: item.gmtCreate,
timeStr: dateFormat2(item.gmtCreate),
userName: item.nickName,
avatar: item.avatar,
userId: item.userId,
likedCount: item.likes,
reply: item.replyData ? item.replyData.map(c => ({
id: c.commentId,
text: c.message.split('\n').filter(t => !!t),
time: c.gmtCreate,
timeStr: dateFormat2(c.gmtCreate),
userName: c.nickName,
avatar: c.avatar,
userId: c.userId,
likedCount: c.likes,
})) : [],
}))
},
}
+9 -1
View File
@@ -5,6 +5,8 @@ import musicSearch from './musicSearch'
// import pic from './pic'
import lyric from './lyric'
import hotSearch from './hotSearch'
import comment from './comment'
import musicInfo from './musicInfo'
import { closeVerifyModal } from './util'
const xm = {
@@ -13,6 +15,7 @@ const xm = {
leaderboard,
hotSearch,
closeVerifyModal,
comment,
getMusicUrl(songInfo, type) {
return apis('xm').getMusicUrl(songInfo, type)
},
@@ -24,7 +27,12 @@ const xm = {
// return pic.getPic(songInfo)
},
getMusicDetailPageUrl(songInfo) {
return songInfo.songStringId ? `https://www.xiami.com/song/${songInfo.songStringId}` : null
if (songInfo.songStringId) return `https://www.xiami.com/song/${songInfo.songStringId}`
musicInfo.getMusicInfo(songInfo).then(({ data }) => {
songInfo.songStringId = data.songStringId
})
return `https://www.xiami.com/song/${songInfo.songmid}`
},
// init() {
// getToken()
+14
View File
@@ -0,0 +1,14 @@
import { xmRequest } from './util'
export default {
_requestObj: null,
async getMusicInfo({ songmid }, page = 1, limit = 20) {
if (this._requestObj) this._requestObj.cancelHttp()
const _requestObj = xmRequest('/api/song/initialize', { songId: songmid })
const { body, statusCode } = await _requestObj.promise
// console.log(body)
if (statusCode != 200 || body.code !== 'SUCCESS') throw new Error('获取歌曲信息失败')
return { source: 'xm', data: body.result.data.songDetail }
},
}