feat: add an option to run a script when a torrent is added (#1896)

Co-authored-by: cfpp2p <cfpp2p>
This commit is contained in:
Charles Kerr 2021-10-12 16:32:32 -05:00 committed by GitHub
parent 4daaea9ff1
commit ba6513ed4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 97 additions and 4 deletions

View File

@ -21,7 +21,7 @@
namespace
{
auto constexpr my_static = std::array<std::string_view, 388>{ "",
auto constexpr my_static = std::array<std::string_view, 390>{ "",
"activeTorrentCount",
"activity-date",
"activityDate",
@ -308,6 +308,8 @@ auto constexpr my_static = std::array<std::string_view, 388>{ "",
"scrape",
"scrape-paused-torrents-enabled",
"scrapeState",
"script-torrent-added-enabled",
"script-torrent-added-filename",
"script-torrent-done-enabled",
"script-torrent-done-filename",
"seconds-active",

View File

@ -309,6 +309,8 @@ enum
TR_KEY_scrape,
TR_KEY_scrape_paused_torrents_enabled,
TR_KEY_scrapeState,
TR_KEY_script_torrent_added_enabled,
TR_KEY_script_torrent_added_filename,
TR_KEY_script_torrent_done_enabled,
TR_KEY_script_torrent_done_filename,
TR_KEY_seconds_active,

View File

@ -2213,6 +2213,16 @@ static char const* sessionSet(
tr_sessionSetQueueSize(session, TR_UP, (int)i);
}
if (tr_variantDictFindStr(args_in, TR_KEY_script_torrent_added_filename, &str, nullptr))
{
tr_sessionSetTorrentAddedScript(session, str);
}
if (tr_variantDictFindBool(args_in, TR_KEY_script_torrent_added_enabled, &boolVal))
{
tr_sessionSetTorrentAddedScriptEnabled(session, boolVal);
}
if (tr_variantDictFindStr(args_in, TR_KEY_script_torrent_done_filename, &str, nullptr))
{
tr_sessionSetTorrentDoneScript(session, str);
@ -2492,6 +2502,14 @@ static void addSessionField(tr_session* s, tr_variant* d, tr_quark key)
tr_variantDictAddBool(d, key, tr_sessionIsSpeedLimited(s, TR_DOWN));
break;
case TR_KEY_script_torrent_added_filename:
tr_variantDictAddStr(d, key, tr_sessionGetTorrentAddedScript(s));
break;
case TR_KEY_script_torrent_added_enabled:
tr_variantDictAddBool(d, key, tr_sessionIsTorrentAddedScriptEnabled(s));
break;
case TR_KEY_script_torrent_done_filename:
tr_variantDictAddStr(d, key, tr_sessionGetTorrentDoneScript(s));
break;

View File

@ -344,7 +344,7 @@ void tr_sessionGetDefaultSettings(tr_variant* d)
{
TR_ASSERT(tr_variantIsDict(d));
tr_variantDictReserve(d, 63);
tr_variantDictReserve(d, 69);
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, false);
tr_variantDictAddStr(d, TR_KEY_blocklist_url, "http://www.example.com/blocklist");
tr_variantDictAddInt(d, TR_KEY_cache_size_mb, DEFAULT_CACHE_SIZE_MB);
@ -391,6 +391,8 @@ void tr_sessionGetDefaultSettings(tr_variant* d)
tr_variantDictAddInt(d, TR_KEY_rpc_port, TR_DEFAULT_RPC_PORT);
tr_variantDictAddStr(d, TR_KEY_rpc_url, TR_DEFAULT_RPC_URL_STR);
tr_variantDictAddBool(d, TR_KEY_scrape_paused_torrents_enabled, true);
tr_variantDictAddStr(d, TR_KEY_script_torrent_added_filename, "");
tr_variantDictAddBool(d, TR_KEY_script_torrent_added_enabled, false);
tr_variantDictAddStr(d, TR_KEY_script_torrent_done_filename, "");
tr_variantDictAddBool(d, TR_KEY_script_torrent_done_enabled, false);
tr_variantDictAddInt(d, TR_KEY_seed_queue_size, 10);
@ -418,7 +420,7 @@ void tr_sessionGetSettings(tr_session* s, tr_variant* d)
{
TR_ASSERT(tr_variantIsDict(d));
tr_variantDictReserve(d, 63);
tr_variantDictReserve(d, 68);
tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled(s));
tr_variantDictAddStr(d, TR_KEY_blocklist_url, tr_blocklistGetURL(s));
tr_variantDictAddInt(d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB(s));
@ -464,6 +466,8 @@ void tr_sessionGetSettings(tr_session* s, tr_variant* d)
tr_variantDictAddStr(d, TR_KEY_rpc_whitelist, tr_sessionGetRPCWhitelist(s));
tr_variantDictAddBool(d, TR_KEY_rpc_whitelist_enabled, tr_sessionGetRPCWhitelistEnabled(s));
tr_variantDictAddBool(d, TR_KEY_scrape_paused_torrents_enabled, s->scrapePausedTorrents);
tr_variantDictAddBool(d, TR_KEY_script_torrent_added_enabled, tr_sessionIsTorrentAddedScriptEnabled(s));
tr_variantDictAddStr(d, TR_KEY_script_torrent_added_filename, tr_sessionGetTorrentAddedScript(s));
tr_variantDictAddBool(d, TR_KEY_script_torrent_done_enabled, tr_sessionIsTorrentDoneScriptEnabled(s));
tr_variantDictAddStr(d, TR_KEY_script_torrent_done_filename, tr_sessionGetTorrentDoneScript(s));
tr_variantDictAddInt(d, TR_KEY_seed_queue_size, tr_sessionGetQueueSize(s, TR_UP));
@ -1131,6 +1135,16 @@ static void sessionSetImpl(void* vdata)
*** Scripts
**/
if (tr_variantDictFindBool(settings, TR_KEY_script_torrent_added_enabled, &boolVal))
{
tr_sessionSetTorrentAddedScriptEnabled(session, boolVal);
}
if (tr_variantDictFindStr(settings, TR_KEY_script_torrent_added_filename, &strVal, NULL))
{
tr_sessionSetTorrentAddedScript(session, strVal);
}
if (tr_variantDictFindBool(settings, TR_KEY_script_torrent_done_enabled, &boolVal))
{
tr_sessionSetTorrentDoneScriptEnabled(session, boolVal);
@ -2111,6 +2125,7 @@ void tr_sessionClose(tr_session* session)
}
tr_device_info_free(session->downloadDir);
tr_free(session->torrentAddedScript);
tr_free(session->torrentDoneScript);
tr_free(session->configDir);
tr_free(session->resumeDir);
@ -2826,6 +2841,38 @@ char const* tr_sessionGetRPCBindAddress(tr_session const* session)
*****
****/
bool tr_sessionIsTorrentAddedScriptEnabled(tr_session const* session)
{
TR_ASSERT(tr_isSession(session));
return session->isTorrentAddedScriptEnabled;
}
void tr_sessionSetTorrentAddedScriptEnabled(tr_session* session, bool isEnabled)
{
TR_ASSERT(tr_isSession(session));
session->isTorrentAddedScriptEnabled = isEnabled;
}
char const* tr_sessionGetTorrentAddedScript(tr_session const* session)
{
TR_ASSERT(tr_isSession(session));
return session->torrentAddedScript;
}
void tr_sessionSetTorrentAddedScript(tr_session* session, char const* scriptFilename)
{
TR_ASSERT(tr_isSession(session));
if (session->torrentAddedScript != scriptFilename)
{
tr_free(session->torrentAddedScript);
session->torrentAddedScript = tr_strdup(scriptFilename);
}
}
bool tr_sessionIsTorrentDoneScriptEnabled(tr_session const* session)
{
TR_ASSERT(tr_isSession(session));

View File

@ -129,6 +129,7 @@ struct tr_session
bool isLPDEnabled;
bool isBlocklistEnabled;
bool isPrefetchEnabled;
bool isTorrentAddedScriptEnabled;
bool isTorrentDoneScriptEnabled;
bool isClosing;
bool isClosed;
@ -205,6 +206,7 @@ struct tr_session
std::map<uint8_t const*, tr_torrent*, CompareHash> torrentsByHash;
std::map<char const*, tr_torrent*, CompareHashString> torrentsByHashString;
char* torrentAddedScript;
char* torrentDoneScript;
char* configDir;

View File

@ -843,6 +843,8 @@ static bool setLocalErrorIfFilesDisappeared(tr_torrent* tor)
return disappeared;
}
static void torrentCallScript(tr_torrent const* tor, char const* script);
static void torrentInit(tr_torrent* tor, tr_ctor const* ctor)
{
tr_session* session = tr_ctorGetSession(ctor);
@ -963,6 +965,11 @@ static void torrentInit(tr_torrent* tor, tr_ctor const* ctor)
if (isNewTorrent)
{
if (tr_torrentHasMetadata(tor) && tr_sessionIsTorrentAddedScriptEnabled(session))
{
torrentCallScript(tor, tr_sessionGetTorrentAddedScript(session));
}
if (!tr_torrentHasMetadata(tor) && !doStart)
{
tor->prefetchMagnetMetadata = true;
@ -1920,6 +1927,11 @@ static void stopTorrent(void* vtor)
tr_logAddTorInfo(tor, "%s", "Magnet Verify");
refreshCurrentDir(tor);
tr_torrentVerify(tor, nullptr, nullptr);
if (tr_sessionIsTorrentAddedScriptEnabled(tor->session))
{
torrentCallScript(tor, tr_sessionGetTorrentAddedScript(tor->session));
}
}
}

View File

@ -699,6 +699,14 @@ tr_torrent** tr_sessionLoadTorrents(tr_session* session, tr_ctor* ctor, int* set
***
**/
bool tr_sessionIsTorrentAddedScriptEnabled(tr_session const*);
void tr_sessionSetTorrentAddedScriptEnabled(tr_session*, bool isEnabled);
char const* tr_sessionGetTorrentAddedScript(tr_session const*);
void tr_sessionSetTorrentAddedScript(tr_session*, char const* scriptFilename);
bool tr_sessionIsTorrentDoneScriptEnabled(tr_session const*);
void tr_sessionSetTorrentDoneScriptEnabled(tr_session*, bool isEnabled);

View File

@ -102,7 +102,7 @@ TEST_F(RpcTest, sessionGet)
EXPECT_TRUE(tr_variantDictFindDict(&response, TR_KEY_arguments, &args));
// what we expected
auto const expected_keys = std::array<tr_quark, 52>{
auto const expected_keys = std::array<tr_quark, 54>{
TR_KEY_alt_speed_down,
TR_KEY_alt_speed_enabled,
TR_KEY_alt_speed_time_begin,
@ -139,6 +139,8 @@ TEST_F(RpcTest, sessionGet)
TR_KEY_rename_partial_files,
TR_KEY_rpc_version,
TR_KEY_rpc_version_minimum,
TR_KEY_script_torrent_added_enabled,
TR_KEY_script_torrent_added_filename,
TR_KEY_script_torrent_done_enabled,
TR_KEY_script_torrent_done_filename,
TR_KEY_seed_queue_enabled,