Разработчикам
Отправляйте загрузки в Download Manager Plus с любого сайта, ссылкой или через JavaScript.
Универсальная ссылка
Ссылка на /add с адресом файла. Если у пользователя есть расширение, его просят подтвердить загрузку; если нет, он может установить его или скачать файл напрямую.
<a href="https://download.extension.lat/add?name=manual.pdf&url=https%3A%2F%2Fexample.com%2Ffiles%2Fmanual.pdf" rel="nofollow">
Скачать с Download Manager Plus
</a>| Имя | Описание |
|---|---|
| url | Адрес файла http(s). Обязательно. |
| name | Предлагаемое имя файла. Необязательно; очищается перед сохранением. |
Кнопка «Добавить в Download Manager Plus»
Ссылка, оформленная как кнопка. Работает без JavaScript; со вспомогательным скриптом использует мост, когда он доступен.
Предпросмотр
Добавить в Download Manager Plus<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.
<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 использовали мост. Не делайте этого на страницах, где показаны ссылки, написанные вашими пользователями: на доверенном сайте мост скачивает без вопроса.
// Использует мост, если он доступен на вашем сайте; иначе открывает универсальную ссылку.
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. |
// Без вспомогательного скрипта: тот же протокол через 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 запросов в минуту и получает только статус загрузок, которые запросил сам. Публичный сайт не может запрашивать файлы из локальной сети пользователя.