Веб-браузер

Что должно произойти прежде, чем веб-страница отдаст тебе свой файл

Ты видишь видео. Оно играет прямо здесь, в веб-браузере. Так почему же нет способа его сохранить? Ответ в том, что веб-страница редко отдаёт файл — она отдаёт инструкции, а файл, который браузер собирает из них, может вообще не существовать как единое целое.

5 мин чтения Обновлено 29 июля 2026 г.

FoxDL

Четыре способа доставки видео страницей, и только один из них — файл

Самый старый и самый простой — это прямой файл: страница указывает на адрес, заканчивающийся на .mp4, и браузер его забирает. Если ты можешь найти этот адрес, файл твой. Так до сих пор работает большинство небольших сайтов, форумов, новостных изданий и файлообменников.

Второй способ — это адаптивный стриминг, HLS или DASH. Страница загружает плейлист, перечисляющий сотни коротких сегментов на нескольких уровнях качества, а плеер сшивает их по ходу дела, переключая качество при изменении твоего соединения. Тут нет единого файла, который можно найти. Сохранить его значит забрать каждый сегмент и заново собрать из них файл.

Третий способ — это blob-адрес. Страница уже забрала данные через JavaScript и передала плееру ссылку на что-то, живущее прямо в памяти браузера. Видимый тебе адрес (blob:https://…) ничего не значит за пределами этой страницы и этой сессии — его нельзя открыть, поделиться им или скачать, и именно на этом спотыкается большинство наивных «искателей видео».

Четвёртый способ — это защищённый контент: зашифрованные сегменты, воспроизводимые через систему DRM, где ключ дешифровки выдаётся браузеру при условиях, прямо запрещающих сохранение копии. Это не препятствие, которое нужно обходить, — это механизм, на котором строится лицензионное соглашение, и ни один легальный инструмент его не обходит.

Как веб-браузер замечает, что есть что сохранить

Встроенный веб-браузер, предлагающий сохранить найденное, выполняет сразу несколько задач. Каждая перекрывает случай, который упускают остальные.

Чтение медиаэлементов страницы
Обход документа в поисках тегов <video>, <audio> и <source> и чтение их адресов. Мгновенно ловит случай прямого файла, упускает всё, что построено через JavaScript уже после загрузки страницы.
Заглядывание внутрь shadow DOM
Современные плееры — это кастомные элементы, чья внутренняя структура намеренно изолирована от страницы. Поиск, останавливающийся на обычном документе, видит пустую коробку там, где на самом деле находится видео.
Отслеживание того, что страница на самом деле запросила
Браузер знает каждый ресурс, который забрала страница. Загруженный медиафайл — независимо от того, какой скрипт его запросил и когда, — появится здесь, даже если ничто на видимой странице на него не указывает.
Определение типа по ответу
Адрес, заканчивающийся на .php, может вернуть видео, а адрес, заканчивающийся на .mp4, может вернуть страницу с ошибкой. О том, что есть что, говорит Content-Type, реально отправленный сервером, — расширение файла всего лишь догадка.

Как выглядит сохранение со страницы, когда всё работает

Порядок имеет значение. Большинство сбоев происходит из-за пропуска второго шага и запуска передачи на четыре гигабайта, которая на самом деле оказывается страницей входа.

  1. Сначала воспроизведи пару секунд медиа

    Многие страницы ничего не загружают, пока не начнётся воспроизведение. Две секунды проигрывания часто оказываются разницей между пустым списком кандидатов и полным.

  2. Проверь, что кандидат представляет собой на самом деле

    Прежде чем действовать, посмотри на заявленный размер и тип. «Фильм» на 14 КБ — это HTML-страница. Тип text/html там, где ты ожидал video/mp4, означает, что у тебя не та ссылка.

  3. Выбери нужное качество

    Поток обычно предлагает несколько вариантов. Самое высокое качество не всегда правильный ответ на телефоне, где разница незаметна, а место на диске — вполне.

  4. Дай сессии перенестись вместе с запросом

    Защищённые ссылки проверяют, кто именно спрашивает: куки твоей авторизованной сессии, страницу, с которой ты перешёл, иногда идентификацию браузера. Загрузка, начатая без всего этого, получит ошибку 403, даже если сама страница воспроизводила видео без проблем.

  5. Проверь, что получилось в итоге

    Открой файл. Файл, который проигрывает две секунды и останавливается, был обрезан — обычно из-за истёкшей ссылки — и его стоит перекачать заново, а не оставлять как есть.

Что встроенный веб-браузер обязан делать правильно

Помимо поиска медиа, вот что решает, действительно ли загрузка завершится успешно.

  • Перенести сессию в загрузку

    Куки, referer и user agent должны передаваться вместе с запросом. Без них защищённая ссылка открывается на странице, но падает в загрузчике.

  • Не сохранять эти учётные данные в хранилище

    Куки сессии не хуже пароля на протяжении всей сессии. Им место в памяти на время передачи и больше нигде — ни в базе данных, ни в логе.

  • Отказываться передавать ссылку другому приложению

    iOS с готовностью откроет нажатую ссылку в другом приложении, если оно заявляет права на этот домен. Веб-браузер, предназначенный для сохранения медиа, должен сам отменять и перезапускать переход, иначе нужная тебе страница исчезнет в чужом приложении.

  • Подрезать страницу перед отрисовкой

    Блокировщик контента здесь не только про рекламу — меньше трекеров и наложений означает меньше ложных кандидатов в списке медиа.

  • Обрабатывать документы наравне с видео

    PDF, ZIP и файлы Office — вторая половина того, что люди сохраняют из интернета, и они должны попадать в ту же библиотеку, что и всё остальное.

Вопросы, которые задают

Почему Safari не может делать это сам?

Safari действительно скачивает файлы — с iOS 13. Чего он не делает, так это не изучает страницу на предмет медиа, которое транслируется, а не дано прямой ссылкой, и не собирает сегментированный поток обратно в файл. Это веб-браузер, и такая работа принадлежит менеджеру загрузок.

Что такое blob-адрес и почему я не могу его скачать?

Это указатель на данные, которые страница уже держит в памяти. Он не существует за пределами этой вкладки, поэтому вставка его куда-либо ничего не даёт. Настоящее медиа было забрано откуда-то реального, и именно этот адрес — а не blob — стоит искать.

Страница играет нормально, но загрузка получает ошибку 403. Почему?

Запрос на загрузку ушёл без того, что было у страницы: куки твоей сессии, страницы-источника перехода, иногда совпадающей идентификации браузера. Серверы отличают зрителя от скрейпера именно по этой комбинации.

Можно ли сохранить абсолютно всё?

Нет, и так задумано. Контент, защищённый DRM, зашифрован ключами, выданными по лицензии, запрещающей сохранение. Некоторые сайты также подписывают каждый сегмент индивидуально короткоживущими токенами. Оба механизма работают именно так, как задумано.

FoxDL

Веб-браузер внутри FoxDL

Это обычный браузер с вкладками, чья задача — доставлять вещи в твою библиотеку, а не быть твоим повседневным браузером.

  • Шесть каналов обнаружения, включая shadow DOM и учёт того, что страница реально запросила, поэтому даже плеер, полностью построенный на JavaScript, остаётся видимым.
  • Настоящий тип определяется по ответу, а не угадывается по расширению, а blob:-кандидаты, которые невозможно забрать, отфильтровываются, вместо того чтобы предлагаться и проваливаться.
  • Куки, referer и user agent переносятся в загрузку, благодаря чему защищённая ссылка открывается, — и ни одно из этого никогда не записывается на диск.
  • Блокировщик контента подрезает страницу перед отрисовкой.
  • PDF, ZIP и документы сохраняются в ту же библиотеку, что и медиа, одним нажатием.
  • Вкладки, закладки и стартовая страница с твоими собственными ярлыками.

FoxDL не предоставляет собственного контента. То, что ты сохраняешь, — это то, что принёс ты сам, и ответственность за право это хранить лежит на тебе.

Частые вопросы

Все вопросы

Читать дальше

Твоя библиотека — наконец в одном месте.

Бесплатная загрузка. Без аккаунта и регистрации — полный набор в бесплатной версии.

Загрузите в App Store