diff --git a/src/renderer/components/core/Icons.vue b/src/renderer/components/core/Icons.vue index c7e1332d..e765f0c2 100644 --- a/src/renderer/components/core/Icons.vue +++ b/src/renderer/components/core/Icons.vue @@ -206,5 +206,8 @@ svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/19 path(d='M256,170s-62.469-76.808-141-24C44.762,222.824,84.909,325.08,256,415c21.339-8.361,44-17,44-17,19-6.392,28.155,20.742,16,26-27.589,11.935,5.974-4.141-60,28C-35.524,313.85,43.993,149.031,95,117c86.8-65.89,162,10,162,10s58.158-60.523,140-23c104.032,58.528,64,161.9,45,196-9.152,15.154-39.559-4.159-32-16,20.34-37.888,45.522-107.349-25-150C314.919,103.92,256,170,256,170Z') path(d='M383,368c-8.1.01-24.77-.155-40,0-15.713.16-15.282,34.964,0,35,15.1,0.035,40,0,40,0s-0.068,42.8,0,48c0.208,15.961,32.261,15.791,32-1-0.072-4.649,0-47,0-47s38.008-.031,43,0c15.732,0.046,14.947-33.98-1-34-4.884.093-42,0-42,0s-0.053-28.341,0-46c0.046-15.189-32.028-15.512-32,0C383.027,337.74,382.782,365.139,383,368Z') + g#icon-thumbs-up(fill='currentColor') + // 0 0 512 512 + path(d='M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z') diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index 09af86de..4cdb2237 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -63,7 +63,7 @@ div(:class="$style.player") //- transition(enter-active-class="animated lightSpeedIn" transition(enter-active-class="animated lightSpeedIn" leave-active-class="animated slideOutDown") - core-player-detail(v-if="isShowPlayerDetail" :musicInfo="musicInfo" + core-player-detail(v-if="isShowPlayerDetail" :musicInfo="listId == 'download' ? targetSong.musicInfo : targetSong" :lyric="lyric" :list="list" :listId="listId" :playInfo="{ nowPlayTimeStr, maxPlayTimeStr, progress, nowPlayTime, status }" :isPlay="isPlay" @action="handlePlayDetailAction") @@ -767,6 +767,7 @@ export default { }) }, showPlayerDetail() { + if (!this.targetSong) return this.visiblePlayerDetail(true) }, handleTransitionEnd(e) { diff --git a/src/renderer/components/core/PlayerDetail.vue b/src/renderer/components/core/PlayerDetail.vue index d018c9d8..d697ae8e 100644 --- a/src/renderer/components/core/PlayerDetail.vue +++ b/src/renderer/components/core/PlayerDetail.vue @@ -21,7 +21,7 @@ //- div(:class="$style.info") div(:class="$style.info") img(:class="$style.img" :src="musicInfo.img" v-if="musicInfo.img") - div(:class="$style.description" @click="isShowComment = true") + div(:class="$style.description" @click="handleShowComment") p {{$t('core.player.name')}}{{musicInfo.name}} p {{$t('core.player.singer')}}{{musicInfo.singer}} p(v-if="musicInfo.album") {{$t('core.player.album')}}{{musicInfo.album}} @@ -35,15 +35,15 @@ div(:class="$style.comment") div(:class="$style.commentHeader" @click="isShowComment = false") h3 {{title}} - div.scroll(:class="$style.commentMain") - div + div.scroll(:class="$style.commentMain" ref="dom_comment") + div(v-if="comment.page == 1") h2(:class="$style.commentType") 热门评论 material-comment-floor(v-if="comment.hotComments.length" :class="$style.reply_floor" :comments="comment.hotComments") div h2(:class="$style.commentType") 最新评论 material-comment-floor(v-if="comment.comments.length" :class="$style.reply_floor" :comments="comment.comments") div(:class="$style.pagination") - material-pagination(:count="comment.total" :limit="comment.limit" :page="comment.page" @btn-click="handleToggleCommentPage") + material-pagination(:count="comment.total" :btnLength="5" :limit="comment.limit" :page="comment.page" @btn-click="handleToggleCommentPage") div(:class="$style.footer") div(:class="$style.left") @@ -80,6 +80,7 @@ import { mapGetters, mapMutations } from 'vuex' import { base as eventBaseName } from '../../event/names' import { scrollTo } from '../../utils' +import music from '../../utils/music' let cancelScrollFn = null @@ -219,106 +220,45 @@ export default { isSetedLines: false, isShowComment: false, comment: { + musicInfo: { + name: '', + singer: '', + }, page: 1, total: 10, maxPage: 1, - limit: 5, - comments: [{ - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [ - { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - }, - ], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [ - { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - }, - { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - }, - ], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }, { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [], - }], - hotComments: [{ - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - reply: [ - { - text: ['123123hhh'], - userName: 'dsads', - avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', - time: '2020-10-22 22:14:17', - likedCount: 100, - }, - ], - }], + limit: 20, + comments: [ + // { + // text: ['123123hhh'], + // userName: 'dsads', + // avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', + // time: '2020-10-22 22:14:17', + // timeStr: '2020-10-22 22:14:17', + // likedCount: 100, + // reply: [], + // }, + ], + hotComments: [ + // { + // text: ['123123hhh'], + // userName: 'dsads', + // avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', + // time: '2020-10-22 22:14:17', + // timeStr: '2020-10-22 22:14:17', + // likedCount: 100, + // reply: [ + // { + // text: ['123123hhh'], + // userName: 'dsads', + // avatar: 'http://img4.kuwo.cn/star/userhead/39/52/1602393411654_512039239s.jpg', + // time: '2020-10-22 22:14:17', + // timeStr: '2020-10-22 22:14:17', + // likedCount: 100, + // }, + // ], + // }, + ], }, } }, @@ -340,8 +280,8 @@ export default { ...mapGetters(['setting']), ...mapGetters('player', ['isShowPlayerDetail']), title() { - return this.musicInfo.name - ? this.setting.download.fileName.replace('歌名', this.musicInfo.name).replace('歌手', this.musicInfo.singer) + return this.comment.musicInfo.name + ? this.setting.download.fileName.replace('歌名', this.comment.musicInfo.name).replace('歌手', this.comment.musicInfo.singer) : '^-^' }, }, @@ -445,8 +385,40 @@ export default { close() { window.eventHub.$emit(eventBaseName.close) }, + handleShowComment() { + if (!this.musicInfo.songmid || !music[this.musicInfo.source].comment) return + if (this.musicInfo.songmid != this.comment.musicInfo.songmid) { + this.comment.page = 1 + this.comment.total = 0 + this.comment.maxPage = 1 + } + this.isShowComment = true + this.comment.musicInfo = this.musicInfo + music[this.comment.musicInfo.source].comment.getComment(this.comment.musicInfo, this.comment.page, this.comment.limit).then(comment => { + this.comment.comments = comment.comments + this.comment.total = comment.total + this.comment.maxPage = comment.maxPage + this.$nextTick(() => { + scrollTo(this.$refs.dom_comment, 0, 300, () => { + this.comment.comments = comment.comments + }) + }) + }) + music[this.comment.musicInfo.source].comment.getHotComment(this.comment.musicInfo, this.comment.page, this.comment.limit).then(hotComment => { + this.comment.hotComments = hotComment.comments + }) + }, handleToggleCommentPage(page) { - + music[this.comment.musicInfo.source].comment.getComment(this.comment.musicInfo, page, this.comment.limit).then(comment => { + this.comment.page = page + this.comment.total = comment.total + this.comment.maxPage = comment.maxPage + this.$nextTick(() => { + scrollTo(this.$refs.dom_comment, 0, 300, () => { + this.comment.comments = comment.comments + }) + }) + }) }, }, } @@ -596,7 +568,7 @@ export default { } } .left { - flex: auto; + flex: 40%; display: flex; flex-flow: column nowrap; align-items: center; diff --git a/src/renderer/components/material/CommentFloor.vue b/src/renderer/components/material/CommentFloor.vue index 5cda949c..1c6cf26c 100644 --- a/src/renderer/components/material/CommentFloor.vue +++ b/src/renderer/components/material/CommentFloor.vue @@ -7,10 +7,13 @@ img( :class="$style.avatar" :src="item.avatar || commentDefImg" @error="handleUserImg") div(:class="$style.right") div(:class="$style.info") - div(:class="$style.name") {{item.userName}} - time(:class="$style.time") {{timeFormat(item.time)}} - div(:class="$style.likes") {{item.likedCount}} - div(:class="$style.comment_text") + div.select(:class="$style.name") {{item.userName}} + time(:class="$style.time" v-if="item.timeStr") {{timeFormat(item.timeStr)}} + div(:class="$style.likes" v-if="item.likedCount != null") + svg(:class="$style.likesIcon" version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' viewBox='0 0 512 512' space='preserve') + use(xlink:href='#icon-thumbs-up') + | {{item.likedCount}} + div.select(:class="$style.comment_text") p(v-for="text in item.text") {{text}} material-comment-floor(v-if="item.reply && item.reply.length" :class="$style.reply_floor" :comments="item.reply") @@ -84,7 +87,7 @@ export default { min-width: 0; } .name { - flex: auto; + flex: 0 1 auto; min-width: 0; .mixin-ellipsis-1; } @@ -92,21 +95,29 @@ export default { flex: none; color: @color-theme_2-font-label; font-size: 11px; - margin-left: 10px; + margin-left: 5px; } .likes { - flex: none; + flex: 1 0 auto; margin-left: 10px; color: @color-theme_2-font-label; font-size: 11px; align-self: flex-end; + text-align: right; +} +.likesIcon { + width: 12px; + height: 12px; + margin-right: 3px; + color: @color-theme-active; } .comment_text { text-align: justify; font-size: 14px; + padding-top: 8px; p { line-height: 1.5; - margin-top: 8px; + word-break: break-all; } } diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 3b30ed43..ad84275e 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -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) diff --git a/src/renderer/utils/music/kg/comment.js b/src/renderer/utils/music/kg/comment.js new file mode 100644 index 00000000..44f2fb8d --- /dev/null +++ b/src/renderer/utils/music/kg/comment.js @@ -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 + }) + }, +} diff --git a/src/renderer/utils/music/kg/index.js b/src/renderer/utils/music/kg/index.js index 524c5fbd..c0ccfbb2 100644 --- a/src/renderer/utils/music/kg/index.js +++ b/src/renderer/utils/music/kg/index.js @@ -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) }, diff --git a/src/renderer/utils/music/kw/comment.js b/src/renderer/utils/music/kw/comment.js new file mode 100644 index 00000000..ec265945 --- /dev/null +++ b/src/renderer/utils/music/kw/comment.js @@ -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 + }) + }, +} diff --git a/src/renderer/utils/music/kw/index.js b/src/renderer/utils/music/kw/index.js index 19c0c143..1039305e 100644 --- a/src/renderer/utils/music/kw/index.js +++ b/src/renderer/utils/music/kw/index.js @@ -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) diff --git a/src/renderer/utils/music/mg/album.js b/src/renderer/utils/music/mg/album.js new file mode 100644 index 00000000..625fc3ac --- /dev/null +++ b/src/renderer/utils/music/mg/album.js @@ -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 + }, +} diff --git a/src/renderer/utils/music/mg/comment.js b/src/renderer/utils/music/mg/comment.js new file mode 100644 index 00000000..2e9f1621 --- /dev/null +++ b/src/renderer/utils/music/mg/comment.js @@ -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, + })), + })) + }, +} diff --git a/src/renderer/utils/music/mg/index.js b/src/renderer/utils/music/mg/index.js index 3ee240a8..72ccde6a 100644 --- a/src/renderer/utils/music/mg/index.js +++ b/src/renderer/utils/music/mg/index.js @@ -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) }, diff --git a/src/renderer/utils/music/mg/leaderboard.js b/src/renderer/utils/music/mg/leaderboard.js index 32602ffb..37dba46c 100644 --- a/src/renderer/utils/music/mg/leaderboard.js +++ b/src/renderer/utils/music/mg/leaderboard.js @@ -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 { diff --git a/src/renderer/utils/music/mg/musicSearch.js b/src/renderer/utils/music/mg/musicSearch.js index 9433596d..9e370395 100644 --- a/src/renderer/utils/music/mg/musicSearch.js +++ b/src/renderer/utils/music/mg/musicSearch.js @@ -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, diff --git a/src/renderer/utils/music/mg/songList.js b/src/renderer/utils/music/mg/songList.js index 0fa8ec33..2def8cce 100644 --- a/src/renderer/utils/music/mg/songList.js +++ b/src/renderer/utils/music/mg/songList.js @@ -24,25 +24,25 @@ export default { list: /