Media Session API — это стандартный веб‑интерфейс, который позволяет сайту взаимодействовать с медиа‑уведомлениями на устройстве. С его помощью можно управлять воспроизведением, отображать информацию о треке (название, исполнитель, обложка) и задавать действия для кнопок на заблокированном экране, в гарнитуре или на умных часах.
В частности, для iOS (начиная с версии 12.2) поддерживаются следующие действия:
play / pauseprevioustrack / nexttrackseekbackward / seekforward (перемотка на заданный интервал)По умолчанию браузер Safari на iOS может показывать кнопки перемотки, если вы не задали обработчики для предыдущего/следующего трека. Но даже если вы зададите previoustrack и nexttrack, iOS всё равно может отображать перемотку, если не отключить явно seekbackward и seekforward.
Чтобы на заблокированном экране появились именно кнопки «предыдущий» и «следующий», необходимо:
previoustrack и nexttrack.seekbackward и seekforward.metadata).Вот минимальный код, который решает задачу:
// Проверяем поддержку API if ('mediaSession' in navigator) { // Устанавливаем метаданные (название, исполнитель и т.д.) navigator.mediaSession.metadata = new MediaMetadata({ title: 'Название трека', artist: 'Исполнитель', album: 'Альбом', artwork: [{ src: 'cover.jpg', sizes: '512x512', type: 'image/jpeg' }] }); // Задаём действия для предыдущего и следующего треков navigator.mediaSession.setActionHandler('previoustrack', () => { // Ваш код: переключение на предыдущий трек console.log('Предыдущий трек'); }); navigator.mediaSession.setActionHandler('nexttrack', () => { // Ваш код: переключение на следующий трек console.log('Следующий трек'); }); // ВАЖНО: отключаем обработчики перемотки, чтобы они не отображались navigator.mediaSession.setActionHandler('seekbackward', null); navigator.mediaSession.setActionHandler('seekforward', null); }Почему это работает?
Браузер Safari на iOS анализирует, какие обработчики установлены через Media Session API. Если для
seekbackwardилиseekforwardзадана функция, он показывает кнопки перемотки. Если же эти обработчики отсутствуют (или явно удалены черезnull), но присутствуютprevioustrackиnexttrack, то он отображает соответствующие кнопки. Таким образом, явное удаление ненужных действий гарантирует нужный результат.Полный пример интеграции с плеером
Рассмотрим более полный пример, где у нас есть аудиоэлемент, плейлист и мы хотим, чтобы кнопки на заблокированном экране управляли переключением треков.
<audio id="audio" controls></audio> <button id="prev">⏮</button> <button id="playPause">▶</button> <button id="next">⏭</button><script> const audio = document.getElementById('audio'); const playlist = ['track1.mp3', 'track2.mp3', 'track3.mp3']; let currentIndex = 0; function loadTrack(index) { audio.src = playlist[index]; audio.load(); // Обновляем метаданные медиа-сессии updateMediaSession(playlist[index]); } function updateMediaSession(trackUrl) { if ('mediaSession' in navigator) { // Извлекаем имя файла для отображения const fileName = trackUrl.split('/').pop().replace('.mp3', ''); navigator.mediaSession.metadata = new MediaMetadata({ title: fileName, artist: 'Неизвестный исполнитель', album: 'Мой плейлист' }); } } function play() { audio.play(); } function pause() { audio.pause(); } function prev() { currentIndex = (currentIndex - 1 + playlist.length) % playlist.length; loadTrack(currentIndex); play(); } function next() { currentIndex = (currentIndex + 1) % playlist.length; loadTrack(currentIndex); play(); } // Инициализация первого трека loadTrack(0); // Связываем кнопки на странице document.getElementById('prev').addEventListener('click', prev); document.getElementById('next').addEventListener('click', next); document.getElementById('playPause').addEventListener('click', () => { audio.paused ? play() : pause(); }); // Настраиваем Media Session if ('mediaSession' in navigator) { navigator.mediaSession.setActionHandler('previoustrack', prev); navigator.mediaSession.setActionHandler('nexttrack', next); // Отключаем перемотку navigator.mediaSession.setActionHandler('seekbackward', null); navigator.mediaSession.setActionHandler('seekforward', null); // Также можно добавить обработчики play/pause (они обычно работают автоматически) navigator.mediaSession.setActionHandler('play', play); navigator.mediaSession.setActionHandler('pause', pause); } // Синхронизация состояния воспроизведения с медиа-сессией audio.addEventListener('play', () => { if ('mediaSession' in navigator) { navigator.mediaSession.playbackState = 'playing'; } }); audio.addEventListener('pause', () => { if ('mediaSession' in navigator) { navigator.mediaSession.playbackState = 'paused'; } }); audio.addEventListener('ended', next); </script>Важные нюансы
playbackState. Установка navigator.mediaSession.playbackState = 'playing' или 'paused' помогает правильно отображать состояние кнопки Play/Pause на заблокированном экране.Добавление кнопок «предыдущий трек» и «следующий трек» на заблокированный экран iOS для веб‑плеера сводится к правильному использованию Media Session API. Главный секрет — явно удалить обработчики перемотки (seekbackward и seekforward), установив их в null, и задать обработчики для previoustrack и nexttrack. После этого iOS будет отображать именно те кнопки, которые нужны вашему плееру.
Надеюсь, эта статья помогла вам разобраться. Если остались вопросы — пишите в комментариях!
]]>На вопрос «найди ошибку, код не работает», Grok крутит носом и говорит — код рабочий. При чем я выбрал лучшую его фришную модель «Expert».

Ну, думаю, устрою конкурс разным нейронкам, интересно кто и как спраавится с задачей.
«Позвонил» я я в чат GPT и меня он сразу обрадовал находкой.

Ну, думаю, Грок бессовестный! Натворил синтаксических ошибок и молчит. Бегу смотреть этот фрагмент кода и…

Никаких многоточий не замечено.
Я понимаю что GPT совсем с дубу рухнул (сам придумал ошибку и хвастается), и лучше его сегодня не беспокоить.
Иду читать, о чем там несколько минут думал «Глубокое мышление DeepSeek», и о чудо!

Проверяю в файлах сайта — и правда, я создавал новую папку с новой версией плагина и забыл переместить один файл в подпапку. Ответ китайской нейронки меня обрадовал и поразил, возможно он так круто догадался из-за режима «Глубокое мышление». Быстро создаю подпапку и перебрасываю туда файл и параллельно думаю, а откуда ты, хитрец, догадался, что я у себя на сервере какие файлы в какие подпапки не положил.
Задаю этот вопрос ему, и, его гениальнось, как я думал, оказалась ошибкой.

Как же я тебе могу предоставить файл в папке, дурень! Если тебе только файлы можно высылать? :)))
Иду проверять плагин — перемещение файла в подпапку не решила вопрос. Сижу и думаю — собралась команда дураков во главе главного дурака — меня, и мы пытаемся тут крутой плагин написать. Рукалицо.jpg.
, но с нейронками, как показывает практика не стоит преждевременно радоваться, и вот почему.
]]>Теплый виниловый шум, слегка расстроенное пианино, приглушенные барабаны — все эти характерные артефакты лоу-фай превращают неидеальность в достоинство. Они снимают с автора груз ответственности за создание стерильно чистого, безупречного звука. В таком контексте не нужно быть виртуозом или профессиональным звукоинженером с первого такта. Творческая идея становится важнее безупречного исполнения. Кроме того, низкий порог входа дает мгновенное чувство прогресса: простой луп из двух аккордов на атмосферном семпле уже звучит цельно и вдохновляет на развитие.
Лоу-фай-звуки спектрально просты: они часто приглушены в высоких частотах и насыщены в среднем диапазоне. Они не агрессивны и не «режут» слух. Мозгу не приходится тратить значительные ресурсы на обработку ярких, резких, сверхдетализированных тембров, как в современной электронной музыке или плотной оркестровке. Это освобождает внимание. Менее насыщенный звук оставляет «воздух» и пространство для воображения. Внутреннее ухо не перегружено и может само «дорисовывать» недостающее. В итоге музыкант сосредотачивается на самой музыкальной мысли, а не на сложностях звукового оформления.
Лоу-фай тембры сами по себе несут мощный эмоциональный заряд — ностальгию, уют, спокойную сосредоточенность, легкую грусть. Начиная работу с такого звука, автор сразу погружается в определенное настроение, которое легче развить в полноценную композицию. Этот эстетический контекст работает как готовый эмоциональный якорь. Кроме того, лоу-фай заставляет мыслить основами: красивая последовательность аккордов, запоминающаяся мелодия, минималистичный грув. Когда этот мелодико-гармонический скелет готов, его всегда можно аранжировать и другими, более сложными звуками. Таким образом, лоу-фай выступает идеальным, вдохновляющим черновиком.
Лоу-фай глубоко связан с истоками хип-хопа, джаза и соула — жанрами, где основа строится на семпле и простом, но эффектном груве. Это наследие делает его интуитивно понятным инструментом для построения композиции по принципу лупов и наслоений. С технической стороны, легкое искажение, шум и «вуалирование» высоких частот естественным образом маскируют мелкие огрехи в звукоизвлечении или сэмплировании, делая процесс менее стрессовым и более терпимым к экспериментам.
Лоу-фай — это гораздо больше, чем просто набор звуковых эффектов «под винил». Это полноценная творческая методология. Она работает как когнитивный инструмент, который уменьшает психическую нагрузку, снимает психологические барьеры совершенства и позволяет мелодическим и гармоническим идеям выйти на первый план. Подобно художнику, который выбирает уголь и фактурную бумагу вместо ярких красок и белого холста, музыкант в лоу-фай среде получает пространство с уже заданным характером и настроением. Это пространство прощает неточности и концентрирует внимание на главном, делая процесс сочинения более плавным, интуитивным и, в конечном счете, более приятным. Именно поэтому на лоу-фай инструментах не только легче писать — на них хочется это делать.
]]>Большинство современных нейросетей для генерации музыки (как и для изображений) работают по принципу диффузионных моделей или подобных архитектур. Их суть:
Проблема в том, что модель никогда не очищает сигнал на 100%. В конечном аудиотреке остаются микроскопические следы этого шума, которые на слух воспринимаются как:
Да, и прогресс идет большими шагами:
Характерный артефакт современных диффузионных аудиомоделей — остаточный шум, вызванный самой технологией генерации «из хаоса».
Это «цифровой отпечаток» или «watermark» ИИ-музыки текущего поколения. Для многих слушателей он уже почти незаметен, а для тренированного уха (музыканта, звукорежиссера) является маркером происхождения трека.
Но быстрее всего это временное явление. С каждым месяцем модели становятся чище, и скоро эта «толика сатурации» уйдет в историю, как ушел характерный шум первых цифровых синтезаторов или шипение кассет.
]]>Разработчики Telegram (Pavel Durov и команда) часто фокусируются на новых фичах вроде монетизации (Telegram Stars в 2025) и безопасности, но планы по вложенным темам не анонсированы. Возможно, со временем они появятся — учитывая запросы сообщества на Reddit и в блогах (например, обсуждения на r/Telegram о «hierarchical topics»), где пользователи жалуются на отсутствие глубины в организации. Многие надеются на обновление в 2026+, особенно с ростом групп до миллионов участников, где плоская структура Topics уже не справляется.
Пока что админы и пользователи активно ищут альтернативы: на форумах вроде Reddit (r/Telegram) и в гайдах 2025 (InviteMember, Such.chat) обсуждают хэштеги, ботов для меню и даже миграцию в другие apps (типа Slack с threaded channels). 95% торговых групп используют комбо «основные темы + хэштеги + закреплённое меню» — это проверенная схема, которая имитирует подтемы без багов. Ниже — полный пошаговый гайд, чтобы ваша группа стала удобной как маркетплейс.
Рекомендую сделать всего 3–5 главных тем, чтобы не запутать людей:
Внутри каждой темы создаём и закрепляем одно главное сообщение:
Текст закреплённого сообщения:
ДОБРО ПОЖАЛОВАТЬ В РАЗДЕЛ «МЕБЕЛЬ»!
Чтобы быстро найти нужное — используйте хэштеги ниже. Просто нажмите на любой!
=========
ВЫБЕРИТЕ ПОДРАЗДЕЛ:
#Диваны (угловые, прямые, раскладные)
#Кровати и #Матрасы
#Столы и #Стулья
#Шкафы и #Комоды
#Кухни и кухонные гарнитуры
#Детская мебель
#Офисная мебель
#Садовая мебель
#МебельНаЗаказ
ПРАВИЛА РАЗДЕЛА:
• Обязательно ставьте фото + цену + город
• В конце сообщения добавляйте нужные хэштеги
• Пример: «Продам угловой диван 25 000 ₽ #Диваны #Угловой #Серый»
Если хотите ещё удобнее — создайте в закреплённом сообщении ссылки на поиск по хэштегу (работает во всех клиентах Telegram):
Пример текста с кликабельными кнопками (вставьте в описание темы или в отдельное закреплённое сообщение):
#Диваны •
#Столы •
#Шкафы
#Кровати •
#Кухни
Где 123456789 — ID вашей группы, 1000 — ID темы (посмотрите в ссылке на любое сообщение в этой теме)
Эта схема используется в 2025 году в 95 % крупных торговых групп Telegram и работает идеально.
Удачи с организацией! Если нужно — могу прислать готовые тексты под все ваши темы.
]]>Часто просто перегенерировать трек — не вариант. Новая версия может не устроить по аранжировке или мелодии, а у пользователей бесплатного аккаунта лимиты на генерацию строго ограничены.
К счастью, есть рабочие способы «реанимировать» такой трек, используя сторонние инструменты. Мы рассмотрим метод, который позволяет изолировать бас и точечно с ним поработать.
Первое, что нам нужно сделать — это разложить готовый микс на stems (отдельные дорожки инструментов и вокала). Для этого идеально подходит сервис Fadr.com.
Теперь у вас на руках есть изолированная дорожка баса, с которой можно работать.
Импортируйте все дорожки в вашу цифровую аудиостанцию (DAW), такую как FL Studio, Ableton Live, Cubase и т.д. Это позволит нам работать с басом, не теряя общего контекста трека.
Основная причина «шелеста» — избыток высоких частот.
Особенно заметен дефектный бас в моментах, когда он звучит соло, без поддержки других инструментов.
Если эквалайзером проблему решить не удалось, можно пойти дальше.
Это творческий и часто эффективный метод.
Fadr умеет не только разделять аудио, но и извлекать MIDI-данные!
Хрипящий бас в Suno — это не приговор для вашего трека. Комбинируя мощь AI-сервисов для разделения дорожек и классические инструменты продакшна в DAW, вы можете не просто «залатать» дыры, а по-настоящему улучшить и кастомизировать свою музыку. Экспериментируйте, и пусть ваши басовые линии будут глубокими и чистыми!
]]>В видео в фильмах и клипах есть тенденция ухудшения качества за последние 15 лет?
Вопрос о «ухудшении качества» видео в фильмах и клипах — сложный и неоднозначный, но тенденции действительно есть. Разберём основные претензии и причины:
Итог: Качество не столько «ухудшилось», сколько изменились стандарты и цели.
Ранее картина фильма происходила не зависимо от смотрящего зрителя, сейчас же в картинке больше передается как будто смотрит зритель.
Это очень тонкое и точное наблюдение. Действительно, в современном кино и клипах произошёл сдвиг от «объективного» повествования к «субъективному» вовлечению зрителя, и вот как это работает:
Кино больше не нейтральный «рассказчик», а активный манипулятор, который пытается «держать вас за руку». Это не всегда плохо (например, «Джокер» использует субъективность для эмпатии), но теряется магия «независимого» мира.
Когда читаешь книгу…
В книгах, в отличие от современного кино, преобладает «объективный» вариант — текст редко имитирует прямое взаимодействие с читателем, но есть нюансы. Вот как это работает:
— От третьего лица: Большинство книг используют «он/она/они», создавая эффект наблюдения со стороны («Война и мир», «1984»).
— Всезнающий рассказчик: Автор раскрывает мысли многих персонажей, но не апеллирует к читателю напрямую (как у Достоевского).
— Пример:
«Утро было холодным, и Мартин, кутаясь в плащ, шёл по пустой улице» — это «окно в мир», а не диалог с вами.
— От первого лица («Я»-рассказ): Читатель как бы «становится» героем («Лолита», «Убить пересмешника»).
— Обращение к читателю:
— Воображение: Читатель сам «дорисовывает» картинку, поэтому текст не пытается её контролировать.
— Темп: Можно замедлиться или перечитать абзац — нет давления монтажного ритма.
— Традиция: Литература centuries сохраняла дистанцию, но digital-эпоха меняет это (см. «Норма» Сорокина — текст как TikTok).
]]>
Низкочастотные стуки, или «thumps», передаются через корпус микрофона и мешают качеству записи. Эти звуки по спектру могут напоминать перкуссию (например, бас-барабан или томы), что позволяет использовать AI-инструменты для разделения аудио на стемы, где стуки могут быть выделены в отдельную дорожку (Drums или Other). Альтернативно, можно применить шумоподавление с использованием профиля шума.
Эти инструменты используют машинное обучение для удаления шумов, включая стуки, без необходимости выделять сэмпл шума. Они подходят для подкастов и интервью:
Если вы хотите указать фрагмент стука для анализа, эти инструменты позволяют создать профиль шума и удалить его:
Эти AI-инструменты разделяют аудио на голос, барабаны, бас и другие дорожки. Низкочастотные стуки могут быть выделены в Drums или Other stem, что позволяет изолировать голос:
Для достижения лучшего результата следуйте этим шагам:
AI-инструменты для разделения аудио на стемы и шумоподавления позволяют эффективно убрать низкочастотные стуки из записей интервью, сохраняя качество голоса. MVSEP и LALAL.AI — лучшие стартовые точки благодаря балансу качества и доступности. Для сложных случаев используйте профессиональные инструменты вроде iZotope RX или AudioSourceRE. Если стуки редкие, ручная обработка в Audacity может быть проще. Выберите инструмент, соответствующий вашему бюджету и задаче, и начните с тестового фрагмента!
]]>Использование одной формы и одного попапа вместо нескольких даёт ряд преимуществ:
Перед началом убедитесь, что у вас есть:
1. В админ-панели WordPress перейдите в Popup Maker → Все попапы.
2. Создайте новый попап или отредактируйте существующий.
3. Добавьте уникальный CSS-класс для попапа (например, service-popup) в разделе «Popup Settings» → «Display» → «Popup CSS Classes».
4. В содержимом попапа вставьте шорткод формы Contact Form 7, например:
[contact-form-7 id="123" title="Форма заказа"]
5. Сохраните попап и запомните его ID (например, 123).
1. Перейдите в Contact Form 7 → Формы и создайте или отредактируйте форму.
2. Добавьте скрытое поле для хранения информации о выбранной услуге:
[hidden service-type]
3. Настройте письмо, чтобы оно включало значение скрытого поля. В разделе «Письмо» добавьте:
Выбранная услуга: [service-type]
4. Пример структуры формы:
<label> Ваше имя
[text* your-name]
</label>
<label> Ваш email
[email* your-email]
</label>
[hidden service-type]
[submit "Отправить"]
5. Сохраните форму и запомните её ID.
На странице с кнопками добавьте каждой кнопке CSS-класс попапа и атрибут data-service для указания услуги. Пример:
<a href="#" class="popmake-service-popup" data-service="Услуга 1">Услуга 1</a> <a href="#" class="popmake-service-popup" data-service="Услуга 2">Услуга 2</a> <a href="#" class="popmake-service-popup" data-service="Услуга 3">Услуга 3</a>
— Класс popmake-service-popup связывает кнопки с попапом.
— Атрибут data-service указывает название услуги.
Используйте JavaScript, чтобы захватить значение data-service и заполнить им скрытое поле формы. Добавьте следующий код в файл functions.php вашей темы или через плагин для вставки кода (например, Code Snippets):
jQuery(document).ready(function($) {
$('.popmake-service-popup').on('click', function(e) {
e.preventDefault();
var service = $(this).data('service');
$('#popmake-123 input[name="service-type"]').val(service);
PUM.open(123); // Замените 123 на ID вашего попапа
});
});
— Замените 123 на ID вашего попапа.
— Этот скрипт устанавливает значение поля service-type на основе атрибута data-service нажатой кнопки и открывает попап.
1. Откройте страницу с кнопками.
2. Нажмите на кнопку (например, «Услуга 1»). Должно открыться всплывающее окно с формой.
3. Отправьте форму и проверьте полученное письмо. В нём должно быть указано, например: Выбранная услуга: Услуга 1.
4. Протестируйте другие кнопки, чтобы убедиться, что название услуги передаётся корректно.
Если попап или форма не работают:
popmake-service-popup).[hidden] из поля service-type, чтобы проверить, заполняется ли оно.— Динамический заголовок попапа: Отобразите название услуги в заголовке попапа, добавив:
<h2>Заказ: <span id="service-title"></span></h2>
И обновите JavaScript:
$('#service-title').text(service);
— Условная загрузка: Для оптимизации производительности загружайте скрипты Popup Maker и Contact Form 7 только на нужной странице:
add_action('wp_enqueue_scripts', 'conditional_popup_scripts', 100);
function conditional_popup_scripts() {
if (!is_page('services')) { // Замените на slug вашей страницы
wp_dequeue_script('popup-maker-site');
wp_dequeue_style('popup-maker-site');
wp_dequeue_script('contact-form-7');
wp_dequeue_style('contact-form-7');
}
}
— Валидация формы: Добавьте значение по умолчанию для скрытого поля на случай, если услуга не выбрана:
if (service) {
$('#popmake-123 input[name="service-type"]').val(service);
} else {
$('#popmake-123 input[name="service-type"]').val('Не выбрано');
}
Использование одного попапа с одной формой Contact Form 7 для нескольких кнопок позволяет эффективно обрабатывать запросы на WordPress-сайте. Этот подход сокращает количество попапов и форм, упрощает их управление и повышает производительность. С помощью нескольких строк JavaScript и правильной настройки вы можете динамически передавать данные о нажатой кнопке в форму, обеспечивая точную информацию в отправляемых письмах. Тщательно протестируйте и при необходимости оптимизируйте для создания удобного пользовательского опыта.
]]>