class Subs::OpenSubtitles

Public Class Methods

new(username = nil, password = nil) { |self| ... } click to toggle source
Calls superclass method
# File lib/subs/providers/open_subtitles.rb, line 10
def initialize(username = nil, password = nil)
  require 'xmlrpc/client'
  super('OpenSubtitles.org', URI('https://api.opensubtitles.org:443/xml-rpc'), 'subs2')
  @client = XMLRPC::Client.new2(@uri)
  Subs.log.debug { "Connected to #{@name.blue} using token '#{@token}'" } if login(username, password)
  if block_given?
    yield self
    logout
  end
end

Public Instance Methods

compute_hash(path) click to toggle source
# File lib/subs/providers/open_subtitles.rb, line 64
def compute_hash(path)
  hash = File.size(path)
  File.open(path, 'rb') do |io|
    hash += io.read(65536).unpack('Q*').sum
    io.seek(-65536, IO::SEEK_END)
    hash += io.read(65536).unpack('Q*').sum
  end
  (hash & 0xFFFFFFFFFFFFFFFF).to_s(16).rjust(16, '0')
end
login(username = nil, password = nil) click to toggle source
# File lib/subs/providers/open_subtitles.rb, line 21
def login(username = nil, password = nil)
  password = Digest::MD5.hexdigest(password) if username && password
  begin
    response = @client.call(:LogIn, username || '', password || '', 'en', @user_agent)
    code = response['code'].to_i
    if code == 501
      Subs.log.error { 'Server is currently under maintenance, try again later,'.yellow }
    elsif code == 401
      Subs.log.warn { "Failed to login to #{@name.blue}" }
    end
    @token = response['token']
    return @token && @token.size > 0
  rescue
    Subs.log.error { "Failed to connect to #{@name.blue}" }
    return false
  end
end
logout() click to toggle source
# File lib/subs/providers/open_subtitles.rb, line 39
def logout
  @client.call(:LogOut, @token) rescue nil
  Subs.log.debug { "Disconnected from #{@name.blue}" }
end
process_result(io, result) click to toggle source
Calls superclass method
# File lib/subs/providers/open_subtitles.rb, line 44
def process_result(io, result)
  return false unless super
  begin
    # Use a string buffer for downloaded data to eliminate need for storing compressed file on disk
    StringIO.open do |buffer|
      open(result.data, "rb") { |src| buffer.write(src.read) }
      buffer.seek(0, IO::SEEK_SET)
      # Read the buffer and copy the decompressed GZIP stream to the output stream
      gz = Zlib::GzipReader.new(buffer)
      io.write(gz.read)
      gz.close
    end
    Subs.log.debug { 'Success'.green }
    return true
  rescue
    Subs.log.debug { 'Failed'.red }
    return false
  end
end