Несмотря на то, что в Интернете есть много проектов Ele.me и xx music, имитирующих Vue, у меня все еще есть наглость, чтобы прийти сюда.В конце концов, я тоже немного нетрадиционный, веб-музыкальный проигрыватель, основанный на стороне ПК и дополненный мобильный терминал, так что я говорю, большие ребята, будьте осторожны, в конце концов, мой плеер только что вернулся из Кореи! ! !
Он имитирует интерфейс веб-версии QQ Music и принимает flexbox и макет позиции; хотя mmPlayer является адаптивным, он в основном используется для ПК, а мобильная сторона только делает соответствующие адаптации (без отображения текста); совместим только с основными браузерами ( для IE Попрощайтесь и сделайте специальные оптимизации, думая о предыдущих проектах, которые должны быть совместимы с IE7, все слезы!!!)
API: с открытым исходным кодомAPI NetEase Cloud Music NodeJS(Есть апи, чтобы была мотивация писать!!!)
Адрес онлайн-демонстрации Сервер хрупкий, с братом и сестренкой нужно обращаться бережно (лучше просматривать на ПК)
Как установить и использовать
mmPlayer
git clone https://github.com/maomao1996/Vue-mmPlayer.git //下载mmPlayer
cd mmPlayer //进入mmPlayer播放器目录
npm install //安装依赖
npm run dev //服务端运行
npm run build //项目打包
внутренний сервер
cd mmPlayer/server //进入后台服务器目录
npm install //安装依赖
node app.js //服务端运行 访问 http://localhost:3000
Не удается получить музыку после запуска mmPlayer. Проверьте, запущен ли фоновый сервер.
URL-адрес музыки в каталоге API должен совпадать с адресом фонового сервера.
стек технологий
- Vue-Cli (инструмент для создания лесов Vue)
- Vue (основной фреймворк)
- Vue-Router (маршрутизация страниц)
- Vuex (управление состоянием)
- ES 6/7 (стандарт следующего поколения для языка JavaScript)
- Меньше (препроцессор CSS)
- Axios (сетевой запрос)
- FastClick (устранение задержки клика в 300 мс на мобильном терминале)
оценка интерфейса
Интерфейс ПК выглядит нормально, но мобильный интерфейс всегда кажется странным, но эстетика ограничена, поэтому я перешел на версию React с высокой имитацией NetEase Cloud (если у младших братьев и сестер красивый интерфейс, добро пожаловать в общение . )
PC
Сейчас играет
Таблица лидеров
поиск
мой плейлист
Я слышал
обзор песни
мобильный
Функции
Проигрыватель, сочетание клавиш, прокрутка текста, воспроизведение в данный момент, список рейтинга, сведения о списке воспроизведения, поиск, история воспроизведения, просмотр комментариев, синхронизация облачного списка воспроизведения NetEase
игрок (основной)
Функция player на самом деле такая же, вызывающаяHTML5 аудиоМетоды, атрибуты и события , и различные статьи в Интернете также представлены плохо, но в обмане должна быть искренность.
Функции, которые я реализовал: предыдущая песня, следующая песня, пауза, воспроизведение, одиночный цикл, цикл списка, воспроизведение в случайном порядке, последовательное воспроизведение, индикатор выполнения, регулировка громкости.
Прежде чем представить эти функции, давайте разберемся с идеями. Вот небольшая демонстрация для ознакомления. В конце концов, кода нет.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Audio</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
<div id="Audio">
<audio ref="mmAudio" :src="src" controls></audio>
<button @click="prev">上一曲</button>
<button @click="play">暂停/播放</button>
<button @click="next">下一曲</button>
</div>
<script>
const vm = new Vue({
el: '#Audio',
data: {
list: [
'https://music.163.com/song/media/outer/url?id=450424527.mp3',
'https://music.163.com/song/media/outer/url?id=557581284.mp3',
'https://music.163.com/song/media/outer/url?id=452986458.mp3'
],//歌曲数组
index: 0,//当前歌曲下标
},
computed: {
src() {
return this.list[this.index] // 当前播放歌曲
}
},
methods: {
prev() {//上一曲
let index = this.index - 1;
if (index < 0) {
index = this.list.length - 1
}
this.index = index;
this.$nextTick(() => this.$refs.mmAudio.play())
},
play() {//暂停/播放
this.$nextTick(() => this.$refs.mmAudio.paused ? this.$refs.mmAudio.play() : this.$refs.mmAudio.pause())
},
next() {//下一曲
let index = this.index + 1;
if (index === this.list.length) {
index = 0
}
this.index = index;
this.$nextTick(() => this.$refs.mmAudio.play())
}
}
})
</script>
</body>
</html>
Логика этого кода очень проста, мы добавимcomputed
динамически генерируемые песниsrc
, когда нажимается пауза/воспроизведение, он будет вызыватьсяplay
метод, измените статус воспроизведения; при нажатии на предыдущую или следующую песню статус воспроизведения текущей песни будет изменен.index
, который затем вызоветcomputed
Исправлятьsrc
тогда позвониplay
способ воспроизведения музыки
После прочтения этой небольшой демонстрации эти функции легко понять.
Предыдущий/Далее: изменить текущую воспроизводимую песню.index
, который затем вызоветcomputed
Исправлятьsrc
, а затем позвонитеplay
способ воспроизведения музыки
Пауза/воспроизведение: через аудиоpaused
Свойство определяет, находится ли звук в состоянии паузы, и если оно возвращает значение true, оно вызывается.play
Воспроизведение музыки, если ответный ложный вызовpaused
Пауза музыки
Одиночный цикл: аудиовызовended
событие, после окончания воспроизведения текущей песниcurrentTime
свойство сбрасывается на 0
Цикл списка: вызов аудиоended
событие, которое вызывает метод следующей песни в обратном вызове
Перемешать: перетасовать массив песен с помощью метода, использовать массив для хранения исходного массива песен перед перемешиванием массива.
Последовательное воспроизведение: вызов аудиоended
событие, чтобы определить, равен ли нижний индекс текущей песни длине массива песен -1, если он равен, метод следующей песни не будет вызываться.
Индикатор выполнения/регулятор громкости: используйте свой собственный инкапсулированныйкомпонент прогрессадля перетаскивания, нажмите, чтобы изменить соответствующий ход воспроизведенияcurrentTime
и объемvolume
Примечание: вprogress
Привязки событий только для мышиmousedown
и коснитесь начала событияtouchstart
привязан к соответствующему узлу DOM, другие движения мышиmousemove
и нажмите, чтобы двигатьсяtouchmove
, отпустить мышьmouseup
и сенсорный выпускtouchend
DOM, привязанный к событию, — это всеdocument
, в противном случае будут различные проблемы сбрасывания цепочки.Например, если в процессе перетаскивания фокус не находится на соответствующем DOM, перетаскивание будет прервано.
Быстрая операция
Предыдущая песня Ctrl + Влево
Пауза воспроизведения Ctrl + пробел
Следующая песня Ctrl + вправо
Переключить режим воспроизведения Ctrl + O
Громкость плюс Ctrl+Вверх
Уменьшить громкость Ctrl + Вниз
Прокрутка текстов песен
Принцип прокрутки текстов песен: по времени воспроизведения текущей музыкиaudio.currentTime
Чтобы сопоставить время текста с данными JSON, совпадающий текст центрируется и выделяется.
Во-первых, давайте сделаем очаровательную нефритовую фотографию текста JSON, чтобы облегчить тягу младших братьев и сестер.
{
lyric: "[by:鱼丸啊鱼丸QAQ] [00:00.00] 作曲 : willen [00:01.00] 作词 : 口袋易百 [00:04.60]伴唱:willen [00:05.10]混音/母带:willen [00:55.37]外婆的话 还记得吗 [00:59.01]慈祥的笑容伴我长大 [01:02.75]每当庭院开满了桂花 [01:06.50]淡淡花香都是爱的牵挂 [01:10.30]外婆的话 还记得吗 [01:14.01]受伤的孩子别忘了回家 [01:17.66]夕阳西下 岁月染白了发 "
}
так какaudio.currentTime
Это в секундах, а формат лирики JSON похож на соус[00:00.00]
Итак, сначала мы наложим немного макияжа на лирику JSON.
// 这是化妆过程,具体流程我就不多说了,毕竟我是厚着脸皮来掘金骗小心心的
function parseLyric(lrc) {
let lyrics = lrc.split("\n");
let lrcObj = [];
for (let i = 0; i < lyrics.length; i++) {
let lyric = decodeURIComponent(lyrics[i]);
let timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;
let timeRegExpArr = lyric.match(timeReg);
if (!timeRegExpArr) continue;
let clause = lyric.replace(timeReg, '');
for (let k = 0, h = timeRegExpArr.length; k < h; k++) {
let t = timeRegExpArr[k];
let min = Number(String(t.match(/\[\d*/i)).slice(1)),
sec = Number(String(t.match(/\:\d*/i)).slice(1));
let time = min * 60 + sec;
if (clause !== '') {
lrcObj.push({time: time, text: clause})
}
}
}
return lrcObj;
}
Я скорее овощ, марсианский текст (обычный) полностью зависит от поисковых систем, этоТексты песен обычный оригинальный адрес, но мой немного изменен.
Когда все это будет сделано, просто отцентрируйте время совпадения и выделите текущий текст! В настоящее время я нахожу первое время лирики, которое длиннее текущего времени воспроизведения, сравнивая размер цикла for, но я всегда чувствую, что это недостаточно элегантно для записи, но я не могу придумать другие методы.
Сейчас играет
Отображение и управление текущим списком воспроизведения, вы можете очистить текущий список игроков, удалить верхнюю песню и изменить статус воспроизведения песни.
Таблица лидеров
Вызовите соответствующий интерфейс API, чтобы получить список списков лидеров NetEase Cloud Music (в настоящее время отложенная загрузка изображений отсутствует)
Детали плейлиста
Передайте идентификатор плейлиста и вызовите соответствующий интерфейс API, чтобы получить все песни в текущем плейлисте. Поскольку он получает все песни, он будет зависать при прокрутке на мобильном терминале. Это будет добавлено позже.Better-Scroll(Плагин, ориентированный на удовлетворение потребностей различных сценариев прокрутки на мобильном терминале)
поиск
На данный момент реализован только поиск песен, а поиск по альбомам/исполнителям/плейлистам/пользователям будет улучшен в будущем Получайте данные поиска и отображайте песни с помощью API запроса ключевых слов поиска. Пейджинг: вызовите событие прокрутки, прокрутите вниз, чтобы загрузить следующую страницу, в настоящее время их 50 на страницу, когда все запросы данных будут выполнены, появится сообщение: песен больше нет!
В последнем споре об авторских правах между Netease Cloud Music и QQ Music все синглы Джея Чоу были GG, а затем я сначала запросил URL-адрес текущей песни в событии воспроизведения. Если нет, он подскажет: Текущая песня не может быть Если вы этого не сделаете, то будет плохо, если вас снова будут ругать, ведь пользователь большой парень, и его нельзя ни спровоцировать, ни избежать.
История игр
перечислитьcanplay
событие, не будет воспроизводить песню с ошибками черезlocalStorage
место хранения
PS: Сначала я прошелplay
Событие, в результате, независимо от того, можете ли вы его воспроизвести или нет, будет добавлено в историю воспроизведения, а затем будет обжаловано.Наконец, различные исследования показали, чтоcanplay
более элегантный
Посмотреть комментарии
Это одна из изюминок музыки Дуаньцзиюнь, надо добавить
через текущую воспроизводимую музыкуid
Вызовите соответствующий интерфейс API для отображения популярных комментариев и последних комментариев соответственно.
Когда я это делал в свое время, интерфейс был тривиальным, но время комментариев просто удручало.
только что / XX минут назад / XX:XX / XX месяц XX / XX год XX месяц XX
На нокаут ушло около получаса, но я не знаю, почему мне всегда кажется, что мой текст недостаточно элегантен, и я надеюсь, что младшие братья и сестры, знающие элегантный метод, могут дать мне несколько советов.
Синхронизировать облачный плейлист NetEase
иди первыйОблачная музыка NetEaseполучить свой собственныйUID
Затем получите список воспроизведения пользователя, вызвав соответствующий интерфейс API, а затем передайте идентификатор списка воспроизведения, чтобы получить сведения о списке воспроизведения.
Когда соответствующееUID
возвращениеplaylist
Подскажите, когда длина массива равна 0未查询找UID为 ${uid} 的用户信息
Вызывается после успешного входаlocalStorage
сохранить текущийUID
, при следующем открытии локально сохраненный UID будет прочитан для операции входа в систему.
Очистить при выходеlocalStorage
, чтобы вы не вошли в систему снова при следующем открытии
следовать за
- Код для повышения скорости повторного использования
- Оптимизируйте мобильный интерфейс и возможности, такие какBetter-Scroll,Ленивая загрузка изображения
- Альбом / Исполнитель / Плейлист / Поиск пользователя
- использоватьkoaРефакторинг фоновых служб
- Улучшить опыт десктопной версии (ведь она слишком простая, я больше не могу)
- ... (у меня не хватает возможностей мозга, поэтому я пока могу думать об этом)
благодарный
Справочное руководство HTML Audio/Video DOM
API NetEase Cloud Music NodeJS
Обновление Vue.js и наступление на пит-ноты
Lodash (служебная библиотека JavaScript)
разное
Персональный тренировочный проект, в основном когда мне было скучно какое-то время, а потом я ходил по магазинамGayhub
Когда я нашел музыкальный API с открытым исходным кодом——API NetEase Cloud Music NodeJSНаконец, пока бессовестная водная группа ищет симпатичный интерфейс, я кстати разберусь с идеями разработки.
Был период времени, когда многие люди спрашивали меня, какую инфраструктуру пользовательского интерфейса я использовал, поэтому я хотел бы еще раз упомянуть, что базовый пользовательский интерфейс этого проекта представляет собой личное сочетание проекта и стиля кода основных фреймворков пользовательского интерфейса, и я порекомендовать курс Vue ——Расширенный практический курс музыкального приложения Vue.js
Есть также босс React, который будет вести меня. В настоящее время я занимаюсь самообучением, и есть много головоломок, на которые нужно найти ответы. Это проект, которым я занимаюсь во время обучения.Мобильная версия React (высокая имитация NetEase Cloud MusicЯ чувствую, что в этом высоком подражании нет ничего плохого.
Наконец, давайте перейдем к теме, приветствую младших братьев и сестер, чтобы дать мне "Звезду" "Вилку" (адрес здесьАдрес исходного кода Vue-mmPlayer), в конце концов, это был первый раз, когда я разместил пост, чтобы обмануть лайки (с легкой улыбкой), мои младшие братья и сестры меня немного подбодрили.
Если у вас есть какие-либо вопросы, пожалуйста, ответьте в этой статье или прямо наIssuesСреднее упоминание, или вы нашли проблему и у вас есть очень хорошее решение, добро пожаловать в PR