feat: add an option to run a script when a torrent is added (#1896)
Co-authored-by: cfpp2p <cfpp2p>
This commit is contained in:
parent
4daaea9ff1
commit
ba6513ed4a
|
@ -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",
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue