* Fixed black hook requiring Py3.6 to installed locally. Will now assume Py3.6+ in installed. * Added isort traceback in pre-commit flake8 hook fails * Updated versions of Black, Prettier and isort * Keep Flake8 at 3.7.9 due to E402 issue: https://gitlab.com/pycqa/flake8/-/issues/638 * New pyproject config for isort v5 with fixes for Python 2 imports. * Fixed travis config to run Python 3.6 for lint run. Replaced the virtualenv with_system_site_packages config with Travis specific Python config value so lint run doesn't attempt to append with_system_site_packages to Python 3.6 command.
472 lines
16 KiB
JavaScript
472 lines
16 KiB
JavaScript
/**
|
|
* Script: autoadd.js
|
|
* The client-side javascript code for the AutoAdd plugin.
|
|
*
|
|
* Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com>
|
|
*
|
|
* This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
|
|
* the additional special exception to link portions of this program with the OpenSSL library.
|
|
* See LICENSE for more details.
|
|
*/
|
|
|
|
Ext.ns('Deluge.ux.AutoAdd');
|
|
|
|
/**
|
|
* @class Deluge.ux.AutoAdd.AutoAddWindowBase
|
|
* @extends Ext.Window
|
|
*/
|
|
Deluge.ux.AutoAdd.AutoAddWindowBase = Ext.extend(Ext.Window, {
|
|
width: 350,
|
|
autoHeight: true,
|
|
closeAction: 'hide',
|
|
|
|
spin_ids: ['max_download_speed', 'max_upload_speed', 'stop_ratio'],
|
|
spin_int_ids: ['max_upload_slots', 'max_connections'],
|
|
chk_ids: [
|
|
'stop_at_ratio',
|
|
'remove_at_ratio',
|
|
'move_completed',
|
|
'add_paused',
|
|
'auto_managed',
|
|
'queue_to_top',
|
|
],
|
|
toggle_ids: [
|
|
'append_extension_toggle',
|
|
'download_location_toggle',
|
|
'label_toggle',
|
|
'copy_torrent_toggle',
|
|
'delete_copy_torrent_toggle',
|
|
'seed_mode',
|
|
],
|
|
|
|
accounts: new Ext.data.ArrayStore({
|
|
storeId: 'accountStore',
|
|
id: 0,
|
|
fields: [
|
|
{
|
|
name: 'displayText',
|
|
type: 'string',
|
|
},
|
|
],
|
|
}),
|
|
labels: new Ext.data.ArrayStore({
|
|
storeId: 'labelStore',
|
|
id: 0,
|
|
fields: [
|
|
{
|
|
name: 'displayText',
|
|
type: 'string',
|
|
},
|
|
],
|
|
}),
|
|
|
|
initComponent: function () {
|
|
Deluge.ux.AutoAdd.AutoAddWindowBase.superclass.initComponent.call(this);
|
|
this.addButton(_('Cancel'), this.onCancelClick, this);
|
|
|
|
this.MainTab = new Deluge.ux.AutoAdd.AutoAddMainPanel();
|
|
this.OptionsTab = new Deluge.ux.AutoAdd.AutoAddOptionsPanel();
|
|
|
|
this.form = this.add({
|
|
xtype: 'form',
|
|
baseCls: 'x-plain',
|
|
bodyStyle: 'padding: 5px',
|
|
items: [
|
|
{
|
|
xtype: 'tabpanel',
|
|
activeTab: 0,
|
|
items: [this.MainTab, this.OptionsTab],
|
|
},
|
|
],
|
|
});
|
|
},
|
|
|
|
onCancelClick: function () {
|
|
this.hide();
|
|
},
|
|
|
|
getOptions: function () {
|
|
var options = {};
|
|
|
|
options['enabled'] = Ext.getCmp('enabled').getValue();
|
|
options['path'] = Ext.getCmp('path').getValue();
|
|
options['download_location'] = Ext.getCmp(
|
|
'download_location'
|
|
).getValue();
|
|
options['move_completed_path'] = Ext.getCmp(
|
|
'move_completed_path'
|
|
).getValue();
|
|
options['copy_torrent'] = Ext.getCmp('copy_torrent').getValue();
|
|
|
|
options['label'] = Ext.getCmp('label').getValue();
|
|
options['append_extension'] = Ext.getCmp('append_extension').getValue();
|
|
options['owner'] = Ext.getCmp('owner').getValue();
|
|
|
|
this.toggle_ids.forEach(function (toggle_id) {
|
|
options[toggle_id] = Ext.getCmp(toggle_id).getValue();
|
|
});
|
|
this.spin_ids.forEach(function (spin_id) {
|
|
options[spin_id] = Ext.getCmp(spin_id).getValue();
|
|
options[spin_id + '_toggle'] = Ext.getCmp(
|
|
spin_id + '_toggle'
|
|
).getValue();
|
|
});
|
|
this.spin_int_ids.forEach(function (spin_int_id) {
|
|
options[spin_int_id] = Ext.getCmp(spin_int_id).getValue();
|
|
options[spin_int_id + '_toggle'] = Ext.getCmp(
|
|
spin_int_id + '_toggle'
|
|
).getValue();
|
|
});
|
|
this.chk_ids.forEach(function (chk_id) {
|
|
options[chk_id] = Ext.getCmp(chk_id).getValue();
|
|
options[chk_id + '_toggle'] = Ext.getCmp(
|
|
chk_id + '_toggle'
|
|
).getValue();
|
|
});
|
|
|
|
if (
|
|
options['copy_torrent_toggle'] &&
|
|
options['path'] === options['copy_torrent']
|
|
) {
|
|
throw _(
|
|
'"Watch Folder" directory and "Copy of .torrent' +
|
|
' files to" directory cannot be the same!'
|
|
);
|
|
}
|
|
|
|
return options;
|
|
},
|
|
|
|
loadOptions: function (options) {
|
|
/*
|
|
* Populate all available options data to the UI
|
|
*/
|
|
var value;
|
|
|
|
if (options === undefined) {
|
|
options = {};
|
|
}
|
|
Ext.getCmp('enabled').setValue(
|
|
options['enabled'] !== undefined ? options['enabled'] : true
|
|
);
|
|
Ext.getCmp('isnt_append_extension').setValue(true);
|
|
Ext.getCmp('append_extension_toggle').setValue(
|
|
options['append_extension_toggle'] !== undefined
|
|
? options['append_extension_toggle']
|
|
: false
|
|
);
|
|
Ext.getCmp('append_extension').setValue(
|
|
options['append_extension'] !== undefined
|
|
? options['append_extension']
|
|
: '.added'
|
|
);
|
|
Ext.getCmp('download_location_toggle').setValue(
|
|
options['download_location_toggle'] !== undefined
|
|
? options['download_location_toggle']
|
|
: false
|
|
);
|
|
Ext.getCmp('copy_torrent_toggle').setValue(
|
|
options['copy_torrent_toggle'] !== undefined
|
|
? options['copy_torrent_toggle']
|
|
: false
|
|
);
|
|
Ext.getCmp('delete_copy_torrent_toggle').setValue(
|
|
options['delete_copy_torrent_toggle'] !== undefined
|
|
? options['delete_copy_torrent_toggle']
|
|
: false
|
|
);
|
|
|
|
value =
|
|
options['seed_mode'] !== undefined ? options['seed_mode'] : false;
|
|
Ext.getCmp('seed_mode').setValue(value);
|
|
|
|
this.accounts.removeAll(true);
|
|
this.labels.removeAll(true);
|
|
Ext.getCmp('owner').store = this.accounts;
|
|
Ext.getCmp('label').store = this.labels;
|
|
Ext.getCmp('label').setValue(
|
|
options['label'] !== undefined ? options['label'] : ''
|
|
);
|
|
Ext.getCmp('label_toggle').setValue(
|
|
options['label_toggle'] !== undefined
|
|
? options['label_toggle']
|
|
: false
|
|
);
|
|
|
|
this.spin_ids.forEach(function (spin_id) {
|
|
Ext.getCmp(spin_id).setValue(
|
|
options[spin_id] !== undefined ? options[spin_id] : 0
|
|
);
|
|
Ext.getCmp(spin_id + '_toggle').setValue(
|
|
options[spin_id + '_toggle'] !== undefined
|
|
? options[spin_id + '_toggle']
|
|
: false
|
|
);
|
|
});
|
|
this.chk_ids.forEach(function (chk_id) {
|
|
Ext.getCmp(chk_id).setValue(
|
|
options[chk_id] !== undefined ? options[chk_id] : true
|
|
);
|
|
Ext.getCmp(chk_id + '_toggle').setValue(
|
|
options[chk_id + '_toggle'] !== undefined
|
|
? options[chk_id + '_toggle']
|
|
: false
|
|
);
|
|
});
|
|
value =
|
|
options['add_paused'] !== undefined ? options['add_paused'] : true;
|
|
if (!value) {
|
|
Ext.getCmp('not_add_paused').setValue(true);
|
|
}
|
|
value =
|
|
options['queue_to_top'] !== undefined
|
|
? options['queue_to_top']
|
|
: true;
|
|
if (!value) {
|
|
Ext.getCmp('not_queue_to_top').setValue(true);
|
|
}
|
|
value =
|
|
options['auto_managed'] !== undefined
|
|
? options['auto_managed']
|
|
: true;
|
|
if (!value) {
|
|
Ext.getCmp('not_auto_managed').setValue(true);
|
|
}
|
|
[
|
|
'move_completed_path',
|
|
'path',
|
|
'download_location',
|
|
'copy_torrent',
|
|
].forEach(function (field) {
|
|
value = options[field] !== undefined ? options[field] : '';
|
|
Ext.getCmp(field).setValue(value);
|
|
});
|
|
|
|
if (Object.keys(options).length === 0) {
|
|
deluge.client.core.get_config({
|
|
success: function (config) {
|
|
var value;
|
|
Ext.getCmp('download_location').setValue(
|
|
options['download_location'] !== undefined
|
|
? options['download_location']
|
|
: config['download_location']
|
|
);
|
|
value =
|
|
options['move_completed_toggle'] !== undefined
|
|
? options['move_completed_toggle']
|
|
: config['move_completed'];
|
|
if (value) {
|
|
Ext.getCmp('move_completed_toggle').setValue(
|
|
options['move_completed_toggle'] !== undefined
|
|
? options['move_completed_toggle']
|
|
: false
|
|
);
|
|
Ext.getCmp('move_completed_path').setValue(
|
|
options['move_completed_path'] !== undefined
|
|
? options['move_completed_path']
|
|
: config['move_completed_path']
|
|
);
|
|
}
|
|
value =
|
|
options['copy_torrent_toggle'] !== undefined
|
|
? options['copy_torrent_toggle']
|
|
: config['copy_torrent_file'];
|
|
if (value) {
|
|
Ext.getCmp('copy_torrent_toggle').setValue(true);
|
|
Ext.getCmp('copy_torrent').setValue(
|
|
options['copy_torrent'] !== undefined
|
|
? options['copy_torrent']
|
|
: config['torrentfiles_location']
|
|
);
|
|
}
|
|
value =
|
|
options['delete_copy_torrent_toggle'] !== undefined
|
|
? options['copy_torrent_toggle']
|
|
: config['del_copy_torrent_file'];
|
|
if (value) {
|
|
Ext.getCmp('delete_copy_torrent_toggle').setValue(true);
|
|
}
|
|
},
|
|
});
|
|
}
|
|
|
|
deluge.client.core.get_enabled_plugins({
|
|
success: function (plugins) {
|
|
if (plugins !== undefined && plugins.indexOf('Label') > -1) {
|
|
this.MainTab.LabelFset.setVisible(true);
|
|
deluge.client.label.get_labels({
|
|
success: function (labels) {
|
|
for (
|
|
var index = 0;
|
|
index < labels.length;
|
|
index++
|
|
) {
|
|
labels[index] = [labels[index]];
|
|
}
|
|
this.labels.loadData(labels, false);
|
|
},
|
|
failure: function (failure) {
|
|
console.error(failure);
|
|
},
|
|
scope: this,
|
|
});
|
|
} else {
|
|
this.MainTab.LabelFset.setVisible(false);
|
|
}
|
|
},
|
|
scope: this,
|
|
});
|
|
|
|
var me = this;
|
|
|
|
function on_accounts(accounts, owner) {
|
|
for (var index = 0; index < accounts.length; index++) {
|
|
accounts[index] = [accounts[index]['username']];
|
|
}
|
|
me.accounts.loadData(accounts, false);
|
|
Ext.getCmp('owner').setValue(owner).enable();
|
|
}
|
|
|
|
function on_accounts_failure(failure) {
|
|
deluge.client.autoadd.get_auth_user({
|
|
success: function (user) {
|
|
me.accounts.loadData([[user]], false);
|
|
Ext.getCmp('owner').setValue(user).disable(true);
|
|
},
|
|
scope: this,
|
|
});
|
|
}
|
|
|
|
deluge.client.autoadd.is_admin_level({
|
|
success: function (is_admin) {
|
|
if (is_admin) {
|
|
deluge.client.core.get_known_accounts({
|
|
success: function (accounts) {
|
|
deluge.client.autoadd.get_auth_user({
|
|
success: function (user) {
|
|
on_accounts(
|
|
accounts,
|
|
options['owner'] !== undefined
|
|
? options['owner']
|
|
: user
|
|
);
|
|
},
|
|
scope: this,
|
|
});
|
|
},
|
|
failure: on_accounts_failure,
|
|
scope: this,
|
|
});
|
|
} else {
|
|
on_accounts_failure(null);
|
|
}
|
|
},
|
|
scope: this,
|
|
});
|
|
},
|
|
});
|
|
|
|
/**
|
|
* @class Deluge.ux.AutoAdd.EditAutoAddCommandWindow
|
|
* @extends Deluge.ux.AutoAdd.AutoAddWindowBase
|
|
*/
|
|
Deluge.ux.AutoAdd.EditAutoAddCommandWindow = Ext.extend(
|
|
Deluge.ux.AutoAdd.AutoAddWindowBase,
|
|
{
|
|
title: _('Edit Watch Folder'),
|
|
|
|
initComponent: function () {
|
|
Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.initComponent.call(
|
|
this
|
|
);
|
|
this.addButton(_('Save'), this.onSaveClick, this);
|
|
this.addEvents({
|
|
watchdiredit: true,
|
|
});
|
|
},
|
|
|
|
show: function (watchdir_id, options) {
|
|
Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.show.call(
|
|
this
|
|
);
|
|
this.watchdir_id = watchdir_id;
|
|
this.loadOptions(options);
|
|
},
|
|
|
|
onSaveClick: function () {
|
|
try {
|
|
var options = this.getOptions();
|
|
deluge.client.autoadd.set_options(this.watchdir_id, options, {
|
|
success: function () {
|
|
this.fireEvent('watchdiredit', this, options);
|
|
},
|
|
scope: this,
|
|
});
|
|
} catch (err) {
|
|
Ext.Msg.show({
|
|
title: _('Incompatible Option'),
|
|
msg: err,
|
|
buttons: Ext.Msg.OK,
|
|
scope: this,
|
|
});
|
|
}
|
|
|
|
this.hide();
|
|
},
|
|
}
|
|
);
|
|
|
|
/**
|
|
* @class Deluge.ux.AutoAdd.AddAutoAddCommandWindow
|
|
* @extends Deluge.ux.AutoAdd.AutoAddWindowBase
|
|
*/
|
|
Deluge.ux.AutoAdd.AddAutoAddCommandWindow = Ext.extend(
|
|
Deluge.ux.AutoAdd.AutoAddWindowBase,
|
|
{
|
|
title: _('Add Watch Folder'),
|
|
|
|
initComponent: function () {
|
|
Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.initComponent.call(
|
|
this
|
|
);
|
|
this.addButton(_('Add'), this.onAddClick, this);
|
|
this.addEvents({
|
|
watchdiradd: true,
|
|
});
|
|
},
|
|
|
|
show: function () {
|
|
Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.show.call(
|
|
this
|
|
);
|
|
this.loadOptions();
|
|
},
|
|
|
|
onAddClick: function () {
|
|
var options = this.getOptions();
|
|
deluge.client.autoadd.add(options, {
|
|
success: function () {
|
|
this.fireEvent('watchdiradd', this, options);
|
|
this.hide();
|
|
},
|
|
failure: function (err) {
|
|
const regex = /: (.*\n)\n?\]/m;
|
|
var error;
|
|
if ((error = regex.exec(err.error.message)) !== null) {
|
|
error = error[1];
|
|
} else {
|
|
error = err.error.message;
|
|
}
|
|
Ext.Msg.show({
|
|
title: _('Incompatible Option'),
|
|
msg: error,
|
|
buttons: Ext.Msg.OK,
|
|
scope: this,
|
|
});
|
|
},
|
|
scope: this,
|
|
});
|
|
},
|
|
}
|
|
);
|