lampa-plugins/qbit-simple.js

157 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function () {
'use strict';
var PLUGIN_ID = 'lampa_qbit_simple';
function ready(fn) {
if (window.Lampa && Lampa.Storage) fn();
else setInterval(function () { if (window.Lampa && Lampa.Storage) { clearInterval(arguments.callee); fn(); } }, 500);
}
function storage(name, fallback) {
var v = Lampa.Storage.field(name);
return (v === undefined || v === null) ? fallback : v;
}
function notify(text) {
if (Lampa.Noty && Lampa.Noty.show) Lampa.Noty.show(text);
}
function requestForm(url, formData, onSuccess, onError) {
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) return;
if (xhr.status >= 200 && xhr.status < 300) onSuccess(xhr.responseText);
else onError(new Error('HTTP ' + xhr.status + ': ' + xhr.responseText));
};
xhr.send(formData);
}
function loginDirect(baseUrl, done, fail) {
var username = storage('qbit_simple_username', 'admin');
var password = storage('qbit_simple_password', '');
if (!username && !password) return done();
var form = new URLSearchParams();
form.set('username', username);
form.set('password', password);
requestForm(baseUrl + '/api/v2/auth/login', form, function (text) {
// qBittorrent v5.x: "Ok." или пустой ответ с 204
var t = String(text).trim();
if (t === '' || t === 'Ok.' || t === 'True.') done();
else fail(new Error('qBittorrent auth: ' + t));
}, fail);
}
function download(element) {
var baseUrl = (storage('qbit_simple_url', 'http://127.0.0.1:8080')).replace(/\/+$/, '');
var magnet = element.MagnetUri || element.magnet || element.downloadUrl || '';
if (!magnet) {
notify('Нет magnet-ссылки');
return;
}
var category = storage('qbit_simple_category', 'lampa');
var sequential = storage('qbit_simple_sequential', true);
var firstLast = storage('qbit_simple_first_last', true);
loginDirect(baseUrl, function () {
var form = new URLSearchParams();
form.set('urls', magnet);
if (category) form.set('category', category);
if (sequential) form.set('sequentialDownload', 'true');
if (firstLast) form.set('firstLastPiecePrio', 'true');
requestForm(baseUrl + '/api/v2/torrents/add', form, function () {
notify('✓ Отправлено в qBittorrent: ' + (element.Title || element.title || 'torrent'));
}, function (err) {
notify('Ошибка: ' + err.message);
});
}, function (err) {
notify('Auth ошибка: ' + err.message);
});
}
function patchSelect() {
var original = Lampa.Select.show;
Lampa.Select.show = function (params) {
if (params && params.items) {
var modified = false;
params.items.forEach(function (item) {
if (item && (item.element && (item.element.MagnetUri || item.element.magnet))) {
if (!item.__qbit_added) {
item.__qbit_added = true;
modified = true;
}
}
});
// Добавляем пункт "Скачать в qBittorrent" в конец
var hasMagnet = params.items.some(function (item) {
return item && item.element && (item.element.MagnetUri || item.element.magnet);
});
if (hasMagnet) {
var origOnSelect = params.onSelect;
params.onSelect = function (item) {
if (item && item.__qbit_download) {
var el = params.items.find(function (i) { return i.element && (i.element.MagnetUri || i.element.magnet); });
if (el) download(el.element);
return;
}
if (origOnSelect) origOnSelect.apply(this, arguments);
};
params.items.push({
__qbit_download: true,
name: '⬇ Скачать в qBittorrent',
icon: 'download'
});
}
}
return original.call(this, params);
};
}
function setupSettings() {
Lampa.SettingsApi.addComponent({
component: 'qbit_simple',
name: 'qBittorrent',
icon: '<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 3a9 9 0 1 0 9 9h-2a7 7 0 1 1-7-7V3Zm1 0v8.59l3.3-3.3 1.4 1.42-5.7 5.7-5.7-5.7 1.4-1.42 3.3 3.3V3h2Z"/></svg>'
});
var fields = [
['qbit_simple_url', 'input', 'Адрес qBittorrent', 'http://127.0.0.1:8080'],
['qbit_simple_username', 'input', 'Логин', 'admin'],
['qbit_simple_password', 'input', 'Пароль', ''],
['qbit_simple_category', 'input', 'Категория', 'lampa'],
['qbit_simple_sequential', 'trigger', 'Sequential download', true],
['qbit_simple_first_last', 'trigger', 'Первый/последний блок', true]
];
fields.forEach(function (row) {
Lampa.SettingsApi.addParam({
component: 'qbit_simple',
param: {
name: row[0],
type: row[1],
default: row[3]
},
field: {
name: row[2]
}
});
});
}
ready(function () {
setupSettings();
patchSelect();
console.log('[qbit-simple] Plugin loaded');
});
})();