class TransmissionRSS::Client

Class for communication with transmission utilizing the RPC web interface.

Constants

OPTIONS

Public Class Methods

new(server = {}, login = nil, options = {}) click to toggle source
# File lib/transmission-rss/client.rb, line 15
def initialize(server = {}, login = nil, options = {})
  options ||= {}

  @host     = server.host || 'localhost'
  @port     = server.port || 9091
  @tls      = !!server.tls
  @rpc_path = server.rpc_path || '/transmission/rpc'
  @login    = login

  @timeout  = options.timeout || 5
  @log      = TransmissionRSS::Log.instance
end

Public Instance Methods

add_torrent(file, type = :url, options = {}) click to toggle source

POST json packed torrent add command.

# File lib/transmission-rss/client.rb, line 46
def add_torrent(file, type = :url, options = {})
  arguments = set_arguments_from_options(options)

  case type
    when :url
      file = URI.escape(file) if URI.unescape(file) == file
      arguments.filename = file
    when :file
      arguments.metainfo = Base64.encode64(File.read(file))
    else
      raise ArgumentError.new('type has to be :url or :file.')
  end

  response = rpc('torrent-add', arguments)
  id = get_id_from_response(response)

  log_message = 'torrent-add result: ' + response.result
  log_message << ' (id ' + id.to_s + ')' if id
  @log.debug(log_message)

  if id && options[:seed_ratio_limit]
    set_torrent(id, {
      'seedRatioLimit' => options[:seed_ratio_limit].to_f,
      'seedRatioMode' => 1
    })
  end

  response
end
get_session_id() click to toggle source

Get transmission session id.

# File lib/transmission-rss/client.rb, line 85
def get_session_id
  get = Net::HTTP::Get.new(@rpc_path)

  add_basic_auth(get)

  response = request(get)

  id = response.header['x-transmission-session-id']

  if id.nil?
    @log.debug("could not obtain session id (#{response.code}, " +
      "#{response.class})")
  else
    @log.debug('got session id ' + id)
  end

  id
end
rpc(method, arguments) click to toggle source
# File lib/transmission-rss/client.rb, line 28
def rpc(method, arguments)
  sid = get_session_id
  raise Unauthorized unless sid

  post = Net::HTTP::Post.new \
    @rpc_path,
    {
      'Content-Type' => 'application/json',
      'X-Transmission-Session-Id' => sid
    }

  add_basic_auth(post)
  post.body = {method: method, arguments: arguments}.to_json

  JSON.parse(request(post).body)
end
set_torrent(id, arguments = {}) click to toggle source
# File lib/transmission-rss/client.rb, line 76
def set_torrent(id, arguments = {})
  arguments.ids = [id]
  response = rpc('torrent-set', arguments)
  @log.debug('torrent-set result: ' + response.result)

  response
end

Private Instance Methods

add_basic_auth(request) click to toggle source
# File lib/transmission-rss/client.rb, line 106
def add_basic_auth(request)
  return if @login.nil?
  request.basic_auth(@login['username'], @login['password'])
end
get_id_from_response(response) click to toggle source
# File lib/transmission-rss/client.rb, line 111
def get_id_from_response(response)
  response.arguments.first.last.id
rescue
end
http_request(data) click to toggle source
# File lib/transmission-rss/client.rb, line 116
def http_request(data)
  Net::HTTP.start(@host, @port, use_ssl: @tls) do |http|
    http.request(data)
  end
end
request(data) click to toggle source
# File lib/transmission-rss/client.rb, line 122
def request(data)
  c ||= 0

  Timeout.timeout(@timeout) do
    @log.debug("request #@host:#@port")
    http_request(data)
  end
rescue Errno::ECONNREFUSED
  @log.debug('connection refused')
  raise
rescue Timeout::Error
  s  = 'connection timeout'
  s << " (retry #{c})" if c > 0
  @log.debug(s)

  c += 1
  retry unless c > 2

  raise
end
set_arguments_from_options(options) click to toggle source
# File lib/transmission-rss/client.rb, line 143
def set_arguments_from_options(options)
  arguments = {}

  OPTIONS.each do |o|
    unless options[o].nil?
      arguments[o.to_s.sub('_', '-')] = options[o]
    end
  end

  arguments
end