class TransmissionRSS::Client

Class for communication with transmission utilizing the RPC web interface.

Public Class Methods

new(server = {}, login = nil, options = {}) click to toggle source
# File lib/transmission-rss/client.rb, line 13
def initialize(server = {}, login = nil, options = {})
  @host     = server[:host] || 'localhost'
  @port     = server[:port] || 9091
  @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, options = {}) click to toggle source

POST json packed torrent add command.

# File lib/transmission-rss/client.rb, line 24
def add_torrent(file, type, options = {})
  hash = {
    'method' => 'torrent-add',
    'arguments' => {
      'paused' => options[:paused],
      'download-dir' => options[:download_path]
    }
  }

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

  sid = get_session_id
  raise Unauthorized unless sid

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

  auth(post)

  post.body = hash.to_json

  response = request(post)

  result = JSON.parse(response.body).result

  @log.debug('add_torrent result: ' + result)
end
get_session_id() click to toggle source

Get transmission session id.

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

  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

Private Instance Methods

auth(request) click to toggle source
# File lib/transmission-rss/client.rb, line 85
def auth(request)
  unless @login.nil?
    request.basic_auth(@login['username'], @login['password'])
  end
end
http_get(data) click to toggle source
# File lib/transmission-rss/client.rb, line 112
def http_get(data)
  Net::HTTP.new(@host, @port).start do |http|
    http.request(data)
  end
end
request(data) click to toggle source
# File lib/transmission-rss/client.rb, line 91
def request(data)
  c ||= 0

  Timeout.timeout(@timeout) do
    @log.debug("request #@host:#@port")
    http_get(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