NeonWave Audio Player для форума - версия UCOZ Edition v1.0
Дата: Суббота, 01.11.2025, 19:01 | Сообщение # 1 |
|
Написал: Начинающий
Автор темы
Мурчанн
не в сети
Сообщений: 101
NeonWave Player v1.0 - Неоновый аудиоплеер для форума UCOZ Иногда хочется добавить на форум немного жизни , чтобы музыка звучала красиво, а не просто стояла ссылкой. Так родился NeonWave Player, неоновый визуальный аудиоплеер, который можно вставить прямо в сообщение на форуме UCOZ, без доступа к HTML. Этот проект я сделал "по-быстрому, но со вкусом", чтобы каждый пользователь мог пользоваться стильным плеером, не залезая в код.И как всегда , если уж что-то создаю, то делюсь с вами, иначе зачем всё это? Как работает NeonWave Player Система построена на всплывающем окне с формой, которая генерирует специальный BB-код: Когда сообщение публикуется, скрипт автоматически распознаёт этот BB-код, раскодирует параметры и превращает их в полноценный плеер с анимацией. Таким образом, плеер работает через шифровку тегов , ведь на UCOZ обычные HTML-теги в постах доступны только администраторам и привилегированным группам.А этот метод позволяет любому пользователю форума вставлять аудиоплеер безопасно, без нарушений политики безопасности. Как использовать Подключаем файлы плеера Вставь в шаблон страницы эти строчки:Код
<link rel="stylesheet" href="https://jordan.moy.su/css/playpink.css"> <script src="https://jordan.moy.su/musik/pink_player2.js"></script>
Это добавит стили и скрипты визуализации. Добавляем кнопку вызова Код
<a class="pink-popup-btn" href="javascript:void(0);" onclick="showPinkPlayerPopup()" title="Открыть плеер"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="#ffffff"> <path d="M9 18V5l12-2v13a4 4 0 1 1-2-3.464V6.157L11 7.5v10.5a4 4 0 1 1-2-3.464z"/> </svg> </a>
Последняя справа. Это та самая фиолетово-неоновая кнопка, которая открывает всплывающее окно добавления трека. Во всплывающем окне заполняем: 1. ссылку на MP3 2. ссылку на обложку 3. название трека 4. имя исполнителяПосле заполнения "скрипт" автоматически составляет карту , находит автоматически картинку. После нажатия "Добавить" BB-код автоматически вставится в поле сообщения. После публикации сообщение автоматически преобразует BB-код в плеер NeonWave, и можно наслаждаться результатомВизуализация и дизайн NeonWave Player -это не просто кнопка "Play". Он включает: 1. Реакцию на частоты музыки через canvas-анализатор 2. Плавную неоновую подсветку и спектральные линии 3. Отображение обложки, названия трека и исполнителя 4. Регулировку громкости через ionRangeSlider 5. Режим loop, mute, pause/play 6. И стильный вертикальный логотип AUDIO PLAYER NeonWaveПлеер адаптируется под размер блока, а его визуализация подсвечивается под цвет трека, создавая эффект живой волны
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Суббота, 01.11.2025, 19:09 | Сообщение # 2 |
|
Написал: Начинающий
Автор темы
Мурчанн
не в сети
Сообщений: 101
Скрипт настолько силен что не могу вставить код через bb код. Вставляем в форму добавления сообщения , туда где хотите видеть кнопку. Ссылка в текстовом варианте Сам плеер вставляем в общий вид страниц форум в самый низ перед закрывающем тегом body.Код
<!-- Подключаем библиотеки --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ion-rangeslider@2.3.1/css/ion.rangeSlider.min.css"> <script src="https://cdn.jsdelivr.net/npm/ion-rangeslider@2.3.1/js/ion.rangeSlider.min.js"></script> <link rel="stylesheet" href="https://jordan.moy.su/css/playpink.css"> <script src="https://jordan.moy.su/musik/pink_player2.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('.pink-player').forEach(el => { const cover = el.dataset.cover; const src = el.dataset.src; const title = el.dataset.title; const artist = el.dataset.artist; // Вставляем HTML плеера с canvas и логотипом el.innerHTML = ` <div class="pink-player-vertical-logo"> <div class="vertical-strip"></div> <div class="vertical-text">AUDIO PLAYER </div> </div> <div class="pink-player-logo"> <div class="logo-strip"></div> <div class="logo-text"> NeonWave</div> </div> <canvas class="visualizer"></canvas> <div class="cover" style="background-image:url('${cover}')"></div> <div class="info"> <div class="title">${title}</div> <div class="artist">${artist}</div> </div> <div class="progress"><div class="progress-bar"></div></div> <div class="controls"> <button class="btn play"><i class="fas fa-play"></i></button> <button class="btn pause" style="display:none;"><i class="fas fa-pause"></i></button> <button class="btn loop"><i class="fas fa-repeat"></i></button> <button class="btn mute"><i class="fas fa-volume-mute"></i></button> </div> <div class="volume-wrapper"> <input type="text" class="volume-slider" value="" /> </div> <audio src="${src}"></audio> `; const canvas = el.querySelector('.visualizer'); const ctx = canvas.getContext('2d'); canvas.width = el.clientWidth; canvas.height = 150; const audio = el.querySelector('audio'); const playBtn = el.querySelector('.play'); const pauseBtn = el.querySelector('.pause'); const loopBtn = el.querySelector('.loop'); const muteBtn = el.querySelector('.mute'); const progress = el.querySelector('.progress'); const bar = el.querySelector('.progress-bar'); // Ion.RangeSlider $(el).find(".volume-slider").ionRangeSlider({ min: 0, max: 1, step: 0.01, from: 1, grid: false, onChange: data => { audio.volume = data.from; } }); let audioCtx, analyser, dataArray, sourceNode; function initVisualizer() { audioCtx = new (window.AudioContext || window.webkitAudioContext)(); analyser = audioCtx.createAnalyser(); sourceNode = audioCtx.createMediaElementSource(audio); sourceNode.connect(analyser); analyser.connect(audioCtx.destination); analyser.fftSize = 128; dataArray = new Uint8Array(analyser.frequencyBinCount); } function draw() { if(!audioCtx) return; requestAnimationFrame(draw); analyser.getByteFrequencyData(dataArray); ctx.clearRect(0, 0, canvas.width, canvas.height); const barWidth = canvas.width / dataArray.length; ctx.lineWidth = 2; for(let i=0;i<dataArray.length;i++){ const barHeight = dataArray[i]; const x = i * barWidth; const y = canvas.height - barHeight; const hue = (i*5 + Date.now()/10) % 360; ctx.strokeStyle = `hsl(${hue}, 100%, 60%)`; ctx.shadowBlur = 15; ctx.shadowColor = `hsl(${hue}, 100%, 60%)`; ctx.beginPath(); ctx.moveTo(x, canvas.height); ctx.lineTo(x, y); ctx.stroke(); } } playBtn.onclick = () => { if(!audioCtx) initVisualizer(); audioCtx.resume(); audio.play(); playBtn.style.display='none'; pauseBtn.style.display='inline-block'; draw(); }; pauseBtn.onclick = () => { audio.pause(); playBtn.style.display='inline-block'; pauseBtn.style.display='none'; }; loopBtn.onclick = () => { audio.loop = !audio.loop; loopBtn.style.opacity = audio.loop?1:0.5; }; muteBtn.onclick = () => { audio.muted = !audio.muted; muteBtn.style.opacity = audio.muted?0.5:1; }; audio.ontimeupdate = () => { bar.style.width = (audio.currentTime/audio.duration)*100 + '%'; }; progress.onclick = e => { audio.currentTime = (e.offsetX/progress.offsetWidth)*audio.duration; }; }); }); </script>
Вот и всё. В самом начале статьи я объясняю, как работает плеер. А там, где даются инструкции по вставке, нужно вставлять код именно туда. В разделе, где я описываю работу, ничего вставлять не нужно.
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Суббота, 01.11.2025, 19:17 | Сообщение # 3 |
|
Написал: Начинающий
Автор темы
Мурчанн
не в сети
Сообщений: 101
{player|cover=https://i.ibb.co/7t8gBDCg/rch-C33-4-FQ.jpg|src=https://jordan.moy.su/musik/001.mp3|title=МакSим - Знаешь ли ты|artist=МакSим}
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Суббота, 01.11.2025, 19:18 | Сообщение # 4 |
|
Написал: Начинающий
Автор темы
Мурчанн
не в сети
Сообщений: 101
{player|cover=https://i.ibb.co/MxBFf0F9/scale-1200.jpg|src=https://jordan.moy.su/musik/001.mp3|title=МакSим - Знаешь ли ты|artist=МакSим}
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.