uview开发音乐播放器

准备工作:1,在电脑下载了qq音乐客户端,然后下载了歌曲源文件,并转换格式为mp3格式(可自行百度线上转化即可),2,从控制台拿到歌曲的base64歌词,转码后变成带时间轴的歌词。
收藏列表:

<template>
	<view class="my-collection">
		<u-tabs :activeStyle="{
        color: '#31c27c',
        fontWeight: 'bold',
        transform: 'scale(1.05)'
    }" :scrollable='false' :list="collectionList" @click="click"></u-tabs>
		<view class="song-con">
			<view class='song-list'>
				<view class="play-btn">
					<u-button class="play-btn" type="primary" color="#fff" text='播放全部' icon="play-circle-fill">
					</u-button>
				</view>
				<view class='song-btn'>
					<u-button type="primary" color="#fff" icon="list-dot"></u-button>
					<u-button type="primary" color="#fff" icon="arrow-downward"></u-button>
					<u-button type="primary" color="#fff" icon="share-square"></u-button>
				</view>
			</view>
			<view class='song-list' v-for="song in songList" :key='song._id'>
				<view class="play-btn">
					<u-button type="primary" color="#fff" :text='song.title' @click='handleSongClick(song._id)'>
					</u-button>
				</view>
				<view class='song-btn'>
					<u-button type="primary" color="#fff" icon="eye"></u-button>
					<u-button type="primary" color="#fff" icon="download"></u-button>
					<u-button type="primary" color="#fff" icon="more-dot-fill"></u-button>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				collectionList: [{
					name: '歌曲83',
				}, {
					name: '专辑4',
				}, {
					name: '歌单21'
				}, {
					name: '视频3'
				}, ],
				songList: [],
				loading: false
			}
		},
		methods: {
			list(e) {
				this.loading = true
				uni.showLoading({
					title: '加载中'
				});
				uniCloud
					.callFunction({
						name: 'list',
						data: {
							limit: 300,
							offset: 0,
							keyWord: e ? e.detail.value : ''
						}
					})
					.then(res => {
						console.log(res.result.data, 0)

						this.songList = res.result.data
						uni.hideLoading()
						this.loading = false
					})
			},
			handleSongClick(id) {
				uni.navigateTo({
					url: `/pages/song/song?id=${id}`
				})
			}
		},
		created() {
			this.list()
		}
	}
</script>

<style lang="scss" scoped>
	.my-collection {
		.u-tabs {
			background: #fff;

			::v-deep .u-tabs__wrapper__nav__line {
				background: #31c27c !important;
			}
		}
	
	.song-con {
			padding: 10px;
			background: #fff;
			margin-top: 10px;

			.song-list {
				display: flex;
				justify-content: space-between;

				.play-btn {
					justify-content: left;
				}

				::v-deep .u-icon__icon {
					color: gray !important;
				}

				::v-deep .u-button__text {
					color: gray;
				}

				.song-btn {
					display: flex;
					width: 40%;
				}
			}

		}
	}
</style>

播放页面:

<template>
	<view class='song-con' :style="{height: screenHeight + 'px' }">
		<view class="image-con">
			<u--image id='img' class='image-shape' src="https://cdn.uviewui.com/uview/album/1.jpg"></u--image>
		</view>
		<view class="song-center">
			<view class="song-left">
				<u--text class='song-name' :text='song.name'></u--text>
				<view class="song-info">
					<u--text :text='song.author'></u--text>
					<u--text class='follew' :text="song.follow ? '已关注' : '关注'"></u--text>
					<u--text :text='song.quality'></u--text>
				</view>
				<view class='lyric' ref='lyric'>
					<u--text :class="{each:true, choose: (index==lyricIndex)}"
						v-for='(item,key,index) in currentMUsicLyric' :text='item' :key='key'></u--text>
				</view>
			</view>
			<view class="song-right">
				<u-button :icon="song.isCollection ? 'heart' : 'heart-fill' "></u-button>
			</view>
		</view>
		<view class='song-foot'>
			<view class='slide-con'>
				<view> {{current == 0 ? '00:00' : format(current)}}</view>
				<u-slider @moving="moveing" @end="endMove" v-model="slideWidth" @start="startMove" :unidirectionalDatatTransfer="true">
				</u-slider>
				<view>{{format(duration)}}</view>
			</view>
			<view class='song-tool'>
				<u-button icon='reload' @click='playMusic(songId)'></u-button>
				<u-button icon='rewind-left-fill' @click='prev()'></u-button>
				<u-button :icon="paused ?   'play-circle-fill':'pause-circle-fill' "
					@click="audio.paused ? play() : audio.pause()"></u-button>
				<u-button icon='rewind-right-fill' @click='next()'></u-button>
				<u-button icon='list' @click='openList()'></u-button>
			</view>
		</view>
		<u-popup :show="ifShowList" mode="bottom">
			<view class="song-length">播放列表({{songList.length}}首)</view>
			<view v-for="item in songList" :key='item._id' class="song-list">
				<div class='song-header' @click='playClick(item._id)'>
					<view class="song-title">{{item.title}}</view>
					<view class='song-author'>- {{item.author}}</view>
				</div>
				<u-button icon='close'></u-button>
			</view>
			<view class='song-close' @click='ifShowList = false'>关闭</view>
		</u-popup>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				song: {},
				screenHeight: '',
				audio: uni.createInnerAudioContext(),
				slideWidth: '',
				paused: true, //是否处于暂停状态
				current: 0, //当前进度(s)
				duration: 0, //总时长(s),
				currentMUsicLyric: {},
				lyricIndex: 0,
				rotateval: 0,
				seek: false, //是否处于拖动状态
				Interval: null, // 定时器
				loadding: false,
				ifShowList: false,
				songList: [],
				songId: ''
			}
		},
		onLoad(option) {
			this.songId = option.id
			this.read(option.id || '5f64c4cca2a89f21dbd4fd66')
		},
		methods: {
			endMove() {
				const pr = (this.slideWidth / 100) * this.duration
				this.audio.seek(pr)
				this.play()
			},
			moveing() {
				console.log(this.seek)
				this.play()
				this.seek = true
				const pr = (this.slideWidth / 100) * this.duration
				this.current = pr
				console.log(this.seek)
			},
			startMove(){
			 console.log("move")
			},
			//返回prev事件
			prev() {
				// 找歌曲
				let targetIndex = this.songList.findIndex((item) =>
					item._id == this.songId
				)
				console.log('targetIndex', targetIndex)
				if (targetIndex == 0) {
					// 第一首的时候播放最后一首,循环
					this.songId = this.songList[this.songList.length - 1]._id

				} else {
					this.songId = this.songList[targetIndex - 1]._id

				}
				this.playMusic(this.songId)
				
			},
			//返回next事件
			next() {
				// 找歌曲
				let targetIndex = this.songList.findIndex((item) =>
					item._id == this.songId
				)
				console.log('targetIndex', targetIndex)
				if (targetIndex == this.songList.length - 1) {
					// 已经是最后一首播放第一首,循环
					this.songId = this.songList[0]._id

				} else {
					this.songId = this.songList[targetIndex + 1]._id

				}
				this.playMusic(this.songId)
			},

			play() {
				this.audio.play()
				this.audio.autoplay = true
				
			},
			//格式化时长
			format(num) {
				if (num) {
					return '0'.repeat(2 - String(Math.floor(num / 60)).length) + Math.floor(Number(num) / 60) +
						':' + '0'
						.repeat(2 - String(Math.floor(num % 60)).length) + Math.floor(num % 60)

				}
			},
			getLyric(encodedlyric) {
				let lyric = decodeURIComponent(escape(atob(encodedlyric)))

				// 处理歌词,转化成key为时间,value为歌词的对象
				let lyricArr = lyric.split('[').slice(1); // 先以[进行分割
				let lrcObj = {};
				lyricArr.forEach(item => {
					let arr = item.split(']'); // 再分割右括号
					// 时间换算成秒
					let m = parseInt(arr[0].split(':')[0])
					let s = parseInt(arr[0].split(':')[1])
					arr[0] = m * 60 + s;
					if (arr[1] != '\n') { // 去除歌词中的换行符
						lrcObj[arr[0]] = arr[1];
					}
				})
				// 存储数据
				this.currentMUsicLyric = lrcObj;
			},
			rotate() {
				let that = this
				if (!that.paused) {
					that.Interval = setInterval(function() {
						var img = document.getElementById('img');
						that.rotateval++;
						img.style.transform = 'rotate(' + that.rotateval + 'deg)'
						img.style.transition = '0.1s linear'
					}, 100)
				} else {
					clearInterval(that.Interval)
					that.Interval = null
				}
			},
			read(id) {
				this.loading = true

				uni.showLoading({
					title: '加载中'
				});
				uniCloud
					.callFunction({
						name: 'read',
						data: {
							id
						}
					})
					.then(res => {
						this.song = res.result.data[0] || {}
						console.log("this.song", this.song)
						this.getLyric(this.song.lyric)
						// this.src = 
						this.audio.src = this.song.src
						uni.setNavigationBarTitle({
							title: `${this.song.title} - ${this.song.author}`
						})
						this.loading = false
						uni.hideLoading();
					})
			},
			list(e) {
				this.loading = true
				uni.showLoading({
					title: '加载中'
				});
				uniCloud
					.callFunction({
						name: 'list',
						data: {
							limit: 300,
							offset: 0,
							keyWord: e ? e.detail.value : ''
						}
					})
					.then(res => {
						console.log(res.result.data, 0)

						this.songList = res.result.data
						uni.hideLoading()
						this.loading = false
					})
			},
			openList() {
				console.log('open')
				this.ifShowList = true
			},
			
			playMusic(id){
				this.currentMUsicLyric = {}
				this.read(id)
				// 进度条清0
				this.play()
				// 歌词到最上面
				this.lyricIndex = 0
				// 图片旋转
				this.rotateval = 0
				clearInterval(this.Interval)
				this.Interval = null
			},
			playClick(id){
				this.playMusic(id)
				this.ifShowList = false
			}
		},

		mounted() {
			// 获取歌曲列表
			this.list()
			this.screenHeight = uni.getSystemInfoSync().windowHeight
			this.audio.onCanplay(() => {
				this.current = this.audio.currentTime
				this.duration = this.audio.duration
				this.play()
				
				console.log('音频能够播放了', this.current)
				
			})
			//音频进度更新事件
			this.audio.onTimeUpdate(() => {
				// console.log('音频进度条发生更新')
				if (!this.seek) {
					// console.log('重新更新')
					this.current = this.audio.currentTime
				}
				if (!this.duration) {
					this.duration = this.audio.duration
				}
			})
			//音频播放事件
			this.audio.onPlay(() => {
				console.log('音频播放')
				this.paused = false
				this.rotate()
			})
			// 音频暂停事件
			this.audio.onPause(() => {
				console.log('音频暂停播放')
				this.paused = true
				this.rotate()
			})
			//音频完成更改进度事件
			this.audio.onSeeked(() => {
				// console.log('音频进度条完成')
				this.seek = false
				this.$forceUpdate()
			})

		},
		watch: {
			current(value) {
				if (this.duration > 0) {
					if (this.current === this.duration) {
						this.slideWidth = 100
						return
					}
					this.slideWidth = Number(((value / this.duration) * 100).toFixed(4))
					let i = 0
					// 循环歌词对象
					for (let key in this.currentMUsicLyric) {
						// key表示歌词对象中的时间,如果key等于歌曲进度value,改变当前歌词进度		lyricIndex
						// console.log("value",key,parseInt(value))
						if (+key == parseInt(value)) {
							this.lyricIndex = i;
							// 当歌词进度大于5,即播放到了第5句歌词,开始滚动
							if (i > 3) {
								this.$refs.lyric.$el.scrollTop = this.lyricIndex * 30;
							}
						}
						i++;
					}
				}
			},
		}
	}
</script>

<style lang="scss" scoped>
	.song-con {
		background-color: #fff;
		padding: 10px 20px;
		display: flex;
		flex-direction: column;

		.image-con {
			display: flex;
			flex: 0 0 auto;
			justify-content: center;
			align-items: center;
			background: url('../../static/bg.jpeg');
			background-position: center;
			background-size: 100%;
			width: 100%;
			height: 250px;
			border-radius: 15px;

			::v-deep .u-image {
				width: 150px !important;
				height: 150px !important;

				.u-image__image {
					width: 150px !important;
					height: 150px !important;
					border-radius: 50% !important;
				}
			}
		}

		.song-center {
			display: flex;
			flex: 1 0 auto;
			justify-content: space-between;
			padding: 10px 5px;

			.song-left {
				.song-name {
					::v-deep .u-text__value {
						font-size: 20px !important;
						white-space: nowrap;
						font-weight: 600 !important;
						padding: 10px 0;
					}
				}

				.song-info {
					display: flex;
					padding: 10px 0;

					::v-deep .u-text__value {
						font-size: 13px !important;
						white-space: nowrap;
					}

					.follew {
						::v-deep .u-text__value {
							padding: 2px 4px;
							margin: 0 5px;
							border: 1px solid gray !important;
							border-radius: 10px !important;
							font-size: 12px !important;
						}
					}
				}

				.lyric {
					// width: 400px;
					height: 110px;
					// position: absolute;
					// top: 360px;
					// left: 20px;
					background-color: #fff;
					// 滚动条
					overflow: auto;
					color: #ddd;
					font-size: 10px;
					font-weight: normal;
					padding: 5px 10px;

					.each {
						height: 30px;
						// border: 1px solid #000;
						line-height: 30px;
						text-align: center;

					}

					.choose ::v-deep .u-text__value {
						height: 30px;
						line-height: 30px;
						font-size: 20px;
						color: #31c27c !important;
					}
				}
			}

			.song-right {
				padding: 10px;

				.u-button {
					border: none;
				}
			}
		}

		.song-foot {
			padding: 30px 0;

			.slide-con {
				display: flex;
				justify-content: center;

				.u-slider {
					width: 80%;
				}

				::v-deep .uni-slider-track {
					background: #31c27c !important;
				}
			}

			.song-tool {
				display: flex;

				.u-button {
					border: none;
				}
			}
		}

		/deep/.u-popup__content {
			display: flex;
			background-color: #2e2c2c !important;
			opacity: 0.8;
			padding: 15px 0 0 15px;

			.song-length {
				color: #fff;

			}

			.song-list {
				display: flex;

				border-bottom: 1px solid #3c3a3a;

				.song-header {
					display: flex;
					align-items: center;
					width: 90%;

					.song-title {
						font-size: 12px;
						color: #fff;
						padding-right: 10px;
					}

					.song-author {
						color: #898686;
						font-size: 8px;
					}
				}

				.u-button {
					width: 10%;
					background-color: #2e2c2c;
					opacity: 0.8;
					border: none;

					.uicon-close {
						color: #898686 !important;
					}
				}
			}

			.song-close {
				padding: 20px;
				text-align: center;
				color: #fff
			}
		}
	}
</style>

云函数:read函数
'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
const collection = db.collection('music') // 获取music的集合对象
console.log('collection : ', collection)
const res = await collection.limit(event.limit).skip(event.offset).where({
title: new RegExp(event.keyWord)
}).get()
//返回数据给客户端
return res
};

list函数

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
const id = event.id
const collection = db.collection('music')
const res=collection.where({
_id:id
}).get()//返回数据给客户端
return res
};

云服务平台数据库数据:music
{
"title": "错乱底线",
"text": "我错乱的底线",
"author": "南铃子",
"dynasty": "中",
"lyric": "W3RpOl0KW2FyOl0KW2FsOl0KW2J5OuaXtumXtOaIs+W3peWFt10KW29mZnNldDowXQpbMDA6MDAuMDBd6ZSZ5Lmx5bqV57q/IC0g5rWG57OK6Z+z5LmQClswMDowMC4zMF3or43vvJrljZfpk4PlrZAKWzAwOjAwLjYwXeabsu+8muWNl+mTg+WtkApbMDA6MDAuOTBd57yW5puy77yacG9sYXJpcwpbMDA6MDEuMjFd5ZCJ5LuW77ya5p2o6ZGr6ZSQClswMDowMS41MV3liLbkvZzkurrvvJrokovokosKWzAwOjAxLjgxXeWSjOWjsO+8mueajuaciApbMDA6MDIuMTJd5b2V6Z+z5biI77ya6aKc5ZiJ6L6wClswMDowMi40Ml3lvZXpn7PlrqTvvJoxODAzIFN0dWRpbwpbMDA6MDIuNzJd5re36Z+z77ya5byg5qCp6LWr77yIRXRoYW7vvIkKWzAwOjAzLjAzXeebkeWItu+8muiSi+i/sApbMDA6MDMuMzNdT1DvvJrplKbonIDooY3lv4YKWzAwOjAzLjY0XeOAjOeJiOadg+aJgOacieacque7j+iuuOWPr+ivt+WLv+S9v+eUqOOAjQpbMDA6MDQuMDVd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMDowNS45MV3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAwOjA3LjIwXQpbMDA6MDguODVd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMDoxMS41NV3ml6Dms5Xlho3ljLrliIYKWzAwOjEyLjY2XQpbMDA6MTMuNTld5LiN5pWi55yL5L2g5Ya35ryg55qE55y8ClswMDoxNS45OV0KWzAwOjE2LjUzXeW8uuaOqeaIkeeahOazqueCuQpbMDA6MTguMzZd5oiR54aE54Gt5omA5pyJ55qE54Gv6K+0552A5YaN6KeBClswMDoyMi4zNV0KWzAwOjIzLjEwXeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDA6MjUuMjBd6K+05LqG5pyA5ZCO5LiA6YGNClswMDoyNy4xNV0KWzAwOjI3LjgxXeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDA6MzAuODRd5oCO5LmI6L+eClswMDozMi41OF3lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzAwOjM1LjI1Xei9u+aYk+eahOWIhui+qApbMDA6MzcuNDFd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswMDo0MC4wOF3orqnmiJHmsonpu5jlr6HoqIAKWzAwOjQzLjU5XeWTree6ouS6huecvOWciApbMDA6NDQuNDld5L2g5rKh5pyJ55yL5oiR5LiA55y8ClswMDo0Ny4wN10KWzAwOjQ3LjcwXeivieivtOedgOaAneW/tQpbMDA6NDkuMjNd5bCG6Ieq5bex6ZSB5Zyo5oi/6Ze0ClswMDo1MS45MF3kvaDliKDpmaTkuobmnIvlj4vlnIjnmoTnm7jniYcKWzAwOjU1Ljc3XQpbMDA6NTYuMzFd5L2g54ix5oiR55qE6K+B5o2u5Lmf55yL5LiN6KeBClswMTowMC4xNV0KWzAxOjAyLjAxXeS9oOivtOedgOaKseatiQpbMDE6MDMuNTFd5Y2055yL5LiN5Ye65pyJ5LqP5qygClswMTowNi4xNV0KWzAxOjA2LjcyXeaDs+e7meeahOS9k+mdogpbMDE6MDguMjVd5Y+q5ZCO5oKU5rS75Zyo5LuO5YmNClswMToxMS41Ml3miJHpgJ7lvLrnmoTmoLflrZDkvaDop4bogIzkuI3op4EKWzAxOjE1LjYzXeWPjei/h+adpeWNtOivtOaIkeWcqOiHquWvvOiHqua8lApbMDE6MjAuMDdd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMToyMS45Nl3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAxOjIzLjg4XQpbMDE6MjQuODdd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMToyNy41N13ml6Dms5Xlho3ljLrliIYKWzAxOjI5LjU4XeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDE6MzIuNTVd5by65o6p5oiR55qE5rOq54K5ClswMTozNC4zOF3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAxOjM4LjYxXQpbMDE6MzkuMTJd5oiR5om/6K6k5oiR5b6I5oOz5L2gClswMTo0MS4yNV3or7TkuobmnIDlkI7kuIDpgY0KWzAxOjQzLjIwXQpbMDE6NDMuODZd5oiR5Lus5aW95YOP5Lik5p2h5bmz6KGM55qE57q/ClswMTo0Ni44OV3mgI7kuYjov54KWzAxOjQ4LjYzXeWQjuadpeS9oOeahOi9rOWPmOaIkeiDvQpbMDE6NTEuMjdd6L275piT55qE5YiG6L6oClswMTo1My40Nl3pgqPlvKDoloTmg4Xlr6HkuYnnmoTohLgKWzAxOjU2LjEwXeiuqeaIkeayiem7mOWvoeiogApbMDI6MDAuNzJdClswMjoxOC4wM13lk63nuqLkuobnnLzlnIgKWzAyOjE5LjUzXeS9oOayoeacieeci+aIkeS4gOecvApbMDI6MjIuMTFdClswMjoyMi43N13or4nor7TnnYDmgJ3lv7UKWzAyOjI0LjI3XeWwhuiHquW3semUgeWcqOaIv+mXtApbMDI6MjYuOTdd5L2g5Yig6Zmk5LqG5pyL5Y+L5ZyI55qE55u454mHClswMjozMC44MV0KWzAyOjMxLjM4XeS9oOeIseaIkeeahOivgeaNruS5n+eci+S4jeingQpbMDI6MzcuMDhd5L2g6K+0552A5oqx5q2JClswMjozOC41NV3ljbTnnIvkuI3lh7rmnInkuo/mrKAKWzAyOjQxLjc2XeaDs+e7meeahOS9k+mdogpbMDI6NDMuMjld5Y+q5ZCO5oKU5rS75Zyo5LuO5YmNClswMjo0Ni41M13miJHpgJ7lvLrnmoTmoLflrZDkvaDop4bogIzkuI3op4EKWzAyOjUwLjY3XeWPjei/h+adpeWNtOivtOaIkeWcqOiHquWvvOiHqua8lApbMDI6NTUuMTFd5oiR6ZSZ5Lmx55qE5bqV57q/ClswMjo1Ny4wM13miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAyOjU4Ljk1XQpbMDI6NTkuOTFd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMzowMi42MV3ml6Dms5Xlho3ljLrliIYKWzAzOjA0LjYyXeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDM6MDcuNTld5by65o6p5oiR55qE5rOq54K5ClswMzowOS40NV3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAzOjE0LjE2XeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDM6MTYuMjld6K+05LqG5pyA5ZCO5LiA6YGNClswMzoxOC4yNF0KWzAzOjE4LjkwXeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDM6MjEuOTNd5oCO5LmI6L+eClswMzoyMy42N13lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzAzOjI2LjM0Xei9u+aYk+eahOWIhui+qApbMDM6MjguNTBd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswMzozMS4xNF3orqnmiJHmsonpu5jlr6HoqIAKWzAzOjM1Ljc2XQpbMDM6MzcuODld5oiR6ZSZ5Lmx55qE5bqV57q/ClswMzozOS43OF3miJDkuLrkvaDpmo/kvr/nmoTmlL7ku7sKWzAzOjQxLjcwXQpbMDM6NDIuNjZd5pio5aSp55qE5rip5p+U5pep56KO5oiQ54mHClswMzo0NS4zOV3ml6Dms5Xlho3ljLrliIYKWzAzOjQ3LjQwXeS4jeaVoueci+S9oOWGt+a8oOeahOecvApbMDM6NTAuMzdd5by65o6p5oiR55qE5rOq54K5ClswMzo1Mi4yMF3miJHnhoTnga3miYDmnInnmoTnga/or7TnnYDlho3op4EKWzAzOjU2Ljk0XeaIkeaJv+iupOaIkeW+iOaDs+S9oApbMDM6NTkuMDdd6K+05LqG5pyA5ZCO5LiA6YGNClswNDowMC45OV0KWzA0OjAxLjY4XeaIkeS7rOWlveWDj+S4pOadoeW5s+ihjOeahOe6vwpbMDQ6MDQuNzFd5oCO5LmI6L+eClswNDowNi40NV3lkI7mnaXkvaDnmoTovazlj5jmiJHog70KWzA0OjA5LjA5Xei9u+aYk+eahOWIhui+qApbMDQ6MTEuMjhd6YKj5byg6JaE5oOF5a+h5LmJ55qE6IS4ClswNDoxMy45Ml3orqnmiJHmsonpu5jlr6HoqIA=",
"songId": "0577b16c-7f02-49ea-943c-ff9311b7af31",
"src": "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-987c710a-fa8a-47f9-b416-7c745367d051/028a932c-11c1-43cc-9da2-8e4363ba7042.mp3"
}

posted @ 2022-07-15 16:51  sinceForever  阅读(459)  评论(0编辑  收藏  举报