@ -13,15 +13,10 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
string GetVersion ( RTorrentSettings settings ) ;
List < RTorrentTorrent > GetTorrents ( RTorrentSettings settings ) ;
void AddTorrentFromUrl ( string torrentUrl , RTorrentSettings settings ) ;
void AddTorrentFromFile ( string fileName , byte [ ] fileContent , RTorrentSettings settings ) ;
void AddTorrentFromUrl ( string torrentUrl , string label , RTorrentPriority priority , string directory , RTorrentSettings settings ) ;
void AddTorrentFromFile ( string fileName , byte [ ] fileContent , string label , RTorrentPriority priority , string directory , RTorrentSettings settings ) ;
void RemoveTorrent ( string hash , RTorrentSettings settings ) ;
void SetTorrentPriority ( string hash , RTorrentPriority priority , RTorrentSettings settings ) ;
void SetTorrentLabel ( string hash , string label , RTorrentSettings settings ) ;
void SetTorrentDownloadDirectory ( string hash , string directory , RTorrentSettings settings ) ;
bool HasHashTorrent ( string hash , RTorrentSettings settings ) ;
void StartTorrent ( string hash , RTorrentSettings settings ) ;
void SetDeferredMagnetProperties ( string hash , string category , string directory , RTorrentPriority priority , RTorrentSettings settings ) ;
}
public interface IRTorrent : IXmlRpcProxy
@ -29,35 +24,20 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
[XmlRpcMethod("d.multicall2")]
object [ ] TorrentMulticall ( params string [ ] parameters ) ;
[XmlRpcMethod("load. normal ")]
int Load Url ( string target , string data ) ;
[XmlRpcMethod("load. start ")]
int Load Start ( string target , string data , params string [ ] commands ) ;
[XmlRpcMethod("load.raw ")]
int Load Binary ( string target , byte [ ] data ) ;
[XmlRpcMethod("load.raw _start ")]
int Load RawStart ( string target , byte [ ] data , params string [ ] commands ) ;
[XmlRpcMethod("d.erase")]
int Remove ( string hash ) ;
[XmlRpcMethod("d.custom1.set")]
string SetLabel ( string hash , string label ) ;
[XmlRpcMethod("d.priority.set")]
int SetPriority ( string hash , long priority ) ;
[XmlRpcMethod("d.directory.set")]
int SetDirectory ( string hash , string directory ) ;
[XmlRpcMethod("method.set_key")]
int SetKey ( string target , string key , string cmd_key , string value ) ;
[XmlRpcMethod("d.name")]
string GetName ( string hash ) ;
[XmlRpcMethod("system.client_version")]
string GetVersion ( ) ;
[XmlRpcMethod("system.multicall")]
object [ ] SystemMulticall ( object [ ] parameters ) ;
}
public class RTorrentProxy : IRTorrentProxy
@ -122,26 +102,26 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
return items ;
}
public void AddTorrentFromUrl ( string torrentUrl , RTorrentSettings settings )
public void AddTorrentFromUrl ( string torrentUrl , string label , RTorrentPriority priority , string directory , RTorrentSettings settings )
{
_logger . Debug ( "Executing remote method: load.normal" ) ;
var client = BuildClient ( settings ) ;
var response = client . Load Url ( "" , torrentUrl ) ;
var response = client . Load Start ( "" , torrentUrl , GetCommands ( label , priority , directory ) ) ;
if ( response ! = 0 )
{
throw new DownloadClientException ( "Could not add torrent: {0}." , torrentUrl ) ;
}
}
public void AddTorrentFromFile ( string fileName , byte [ ] fileContent , RTorrentSettings settings )
public void AddTorrentFromFile ( string fileName , byte [ ] fileContent , string label , RTorrentPriority priority , string directory , RTorrentSettings settings )
{
_logger . Debug ( "Executing remote method: load.raw" ) ;
var client = BuildClient ( settings ) ;
var response = client . Load Binary ( "" , fileContent ) ;
var response = client . Load RawStart ( "" , fileContent , GetCommands ( label , priority , directory ) ) ;
if ( response ! = 0 )
{
throw new DownloadClientException ( "Could not add torrent: {0}." , fileName ) ;
@ -161,94 +141,26 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
}
}
public void SetTorrentPriority ( string hash , RTorrentPriority priority , RTorrentSettings settings )
{
_logger . Debug ( "Executing remote method: d.priority.set" ) ;
var client = BuildClient ( settings ) ;
var response = client . SetPriority ( hash , ( long ) priority ) ;
if ( response ! = 0 )
{
throw new DownloadClientException ( "Could not set priority on torrent: {0}." , hash ) ;
}
}
public void SetTorrentLabel ( string hash , string label , RTorrentSettings settings )
{
_logger . Debug ( "Executing remote method: d.custom1.set" ) ;
var labelEncoded = System . Web . HttpUtility . UrlEncode ( label ) ;
var client = BuildClient ( settings ) ;
var setLabel = client . SetLabel ( hash , labelEncoded ) ;
if ( setLabel ! = labelEncoded )
{
throw new DownloadClientException ( "Could set label on torrent: {0}." , hash ) ;
}
}
public void SetTorrentDownloadDirectory ( string hash , string directory , RTorrentSettings settings )
private string [ ] GetCommands ( string label , RTorrentPriority priority , string directory )
{
_logger . Debug ( "Executing remote method: d.directory.set" ) ;
var result = new List < string > ( ) ;
var client = BuildClient ( settings ) ;
var response = client . SetDirectory ( hash , directory ) ;
if ( response ! = 0 )
if ( label . IsNotNullOrWhiteSpace ( ) )
{
throw new DownloadClientException ( "Could not set directory for torrent: {0}." , hash ) ;
}
result . Add ( "d.custom1.set=" + label ) ;
}
public void SetDeferredMagnetProperties ( string hash , string category , string directory , RTorrentPriority priority , RTorrentSettings settings )
{
var commands = new List < string > ( ) ;
if ( category . IsNotNullOrWhiteSpace ( ) )
if ( priority ! = RTorrentPriority . Normal )
{
commands. Add ( "d.custom1.set=" + categor y) ;
result . Add ( "d.priority.set=" + ( int ) priority ) ;
}
if ( directory . IsNotNullOrWhiteSpace ( ) )
{
commands. Add ( "d.directory.set=" + directory ) ;
result . Add ( "d.directory.set=" + label ) ;
}
if ( priority ! = RTorrentPriority . Normal )
{
commands . Add ( "d.priority.set=" + ( long ) priority ) ;
}
// Ensure it gets started if the user doesn't have schedule=...,start_tied=
commands . Add ( "d.open=" ) ;
commands . Add ( "d.start=" ) ;
if ( commands . Any ( ) )
{
var key = "event.download.inserted_new" ;
var cmd_key = "sonarr_deferred_" + hash ;
commands . Add ( string . Format ( "print=\"Applying deferred properties to {0}\"" , hash ) ) ;
// Remove event handler once triggered.
commands . Add ( string . Format ( "\"method.set_key={0},{1}\"" , key , cmd_key ) ) ;
var setKeyValue = string . Format ( "branch=\"equal=d.hash=,cat={0}\",{{{1}}}" , hash , string . Join ( "," , commands ) ) ;
_logger . Debug ( "Executing remote method: method.set_key = {0},{1},{2}" , key , cmd_key , setKeyValue ) ;
var client = BuildClient ( settings ) ;
// Commands need a target, in this case the target is an empty string
// See: https://github.com/rakshasa/rtorrent/issues/227
var response = client . SetKey ( "" , key , cmd_key , setKeyValue ) ;
if ( response ! = 0 )
{
throw new DownloadClientException ( "Could set properties for torrent: {0}." , hash ) ;
}
}
return result . ToArray ( ) ;
}
public bool HasHashTorrent ( string hash , RTorrentSettings settings )
@ -270,32 +182,6 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
}
}
public void StartTorrent ( string hash , RTorrentSettings settings )
{
_logger . Debug ( "Executing remote methods: d.open and d.start" ) ;
var client = BuildClient ( settings ) ;
var multicallResponse = client . SystemMulticall ( new [ ]
{
new
{
methodName = "d.open" ,
@params = new [ ] { hash }
} ,
new
{
methodName = "d.start" ,
@params = new [ ] { hash }
} ,
} ) . SelectMany ( c = > ( ( IEnumerable < int > ) c ) ) ;
if ( multicallResponse . Any ( r = > r ! = 0 ) )
{
throw new DownloadClientException ( "Could not start torrent: {0}." , hash ) ;
}
}
private IRTorrent BuildClient ( RTorrentSettings settings )
{
var client = XmlRpcProxyGen . Create < IRTorrent > ( ) ;