Перейти к содержанию

Разработчикам

Отправляйте загрузки в Download Manager Plus с любого сайта, ссылкой или через JavaScript.

Кнопка «Добавить в Download Manager Plus»

Ссылка, оформленная как кнопка. Работает без JavaScript; со вспомогательным скриптом использует мост, когда он доступен.

HTML
<a
  class="dmplus-button"
  href="https://download.extension.lat/add?name=manual.pdf&url=https%3A%2F%2Fexample.com%2Ffiles%2Fmanual.pdf"
  data-dmplus-url="https://example.com/files/manual.pdf"
  data-dmplus-name="manual.pdf"
  rel="nofollow"
>
  Добавить в Download Manager Plus
</a>

<style>
  .dmplus-button {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.625rem 1.25rem;
    border-radius: 999px;
    background: #a3e635;
    color: #1a2e05;
    font: 600 0.875rem/1 system-ui, sans-serif;
    text-decoration: none;
  }
  .dmplus-button:focus-visible {
    outline: 2px solid #1a2e05;
    outline-offset: 2px;
  }
</style>

Вспомогательный скрипт

Небольшой скрипт без зависимостей, который открывает window.DownloadManagerPlus. Типы TypeScript находятся в dmplus.d.ts.

HTML
<script src="https://download.extension.lat/sdk/dmplus.js" defer></script>

<!-- Необязательно: ссылки с data-dmplus-url используют мост. -->
<script src="https://download.extension.lat/sdk/dmplus.js" data-dmplus-auto defer></script>

Добавьте data-dmplus-auto к тегу script, чтобы ссылки с data-dmplus-url использовали мост. Не делайте этого на страницах, где показаны ссылки, написанные вашими пользователями: на доверенном сайте мост скачивает без вопроса.

JavaScript
// Использует мост, если он доступен на вашем сайте; иначе открывает универсальную ссылку.
const result = await window.DownloadManagerPlus.addDownload({
  url: "https://example.com/files/manual.pdf",
  name: "manual.pdf",
});

if ("requestId" in result) {
  const state = await window.DownloadManagerPlus.bridge.status(result.requestId);
  console.log(state.status); // "pending", "downloading", "complete"…
}

Мост JavaScript

Если пользователь разрешает сайтам отправлять ему загрузки (приветствие предлагает это для всех сайтов) или разрешает ваш сайт со значка расширения, страница может запрашивать загрузки и проверять их статус через window.postMessage. Пользователь по-прежнему подтверждает каждую загрузку, если не отметит ваш сайт (https) как доверенный.

Сообщения
ИмяОписание
dmplus:addЗапрашивает загрузку: url, а также необязательные fileName и folder.
dmplus:statusПроверяет статус загрузки, которую запросила ваша страница.
dmplus:resultОтвет расширения с тем же id, который вы отправили.
dmplus:readyРасширение сообщает, что мост на странице активен.
dmplus:pingСпрашивает, активен ли мост; расширение отвечает dmplus:ready.
JavaScript
// Без вспомогательного скрипта: тот же протокол через postMessage.
window.addEventListener("message", (event) => {
  if (event.source !== window) return;
  if (event.data?.source === "dmplus-extension" && event.data.type === "dmplus:result") {
    console.log(event.data.id, event.data.result);
  }
});

window.postMessage(
  {
    id: crypto.randomUUID(),
    request: { url: "https://example.com/files/manual.pdf", fileName: "manual.pdf", v: 1 },
    source: "dmplus",
    type: "dmplus:add",
  },
  location.origin
);

Справочник

Статусы

Статусы
ИмяОписание
pendingОжидание, пока пользователь подтвердит загрузку.
rejectedПользователь отклонил её или закрыл окно.
downloadingЗагрузка идёт.
completeЗагрузка завершена.
failedЗагрузку не удалось завершить.

Коды ошибок

Коды ошибок
ИмяОписание
invalid-requestНеверно сформированное сообщение, адрес не http(s) или адрес локальной сети.
unsupported-versionВаша страница использует более новую версию протокола, чем расширение.
rate-limitedБольше 10 запросов в минуту с вашего сайта.
too-many-pendingЗапросы уже ждут подтверждения.
not-foundТакого ID нет, или его запросила не ваша страница.
internalВнутренняя ошибка; повторите попытку.

Ограничения и конфиденциальность

Принимаются только адреса http(s), без собственных заголовков и cookie. Каждый сайт может сделать до 10 запросов в минуту и получает только статус загрузок, которые запросил сам. Публичный сайт не может запрашивать файлы из локальной сети пользователя.