Class: AppleTvConverter::SubtitlesFetcher::Opensubtitles

Inherits:
Object
  • Object
show all
Defined in:
lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(languages) ⇒ Opensubtitles

Returns a new instance of Opensubtitles.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 6

def initialize(languages)
  @languages = languages
  @server = XMLRPC::Client.new(SERVER, PATH, PORT)
  @token = nil

  if block_given?
    begin
      yield self
    rescue
      raise
    ensure
      logout
    end
  end
end

Instance Attribute Details

#languagesObject (readonly)

Returns the value of attribute languages.



4
5
6
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 4

def languages
  @languages
end

#tokenObject (readonly)

Returns the value of attribute token.



4
5
6
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 4

def token
  @token
end

Instance Method Details

#download_subtitles(media, &block) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 60

def download_subtitles(media, &block)
  return unless has_found_subtitles? media

  data = Opensubtitles.subtitles[media]
  media_subtitles = filter_subtitles(data, media)

  # If we have subtitles matched by moviehash, get only the first and ignore the rest
  # otherwise, get all
  media_subtitles = Hash[*media_subtitles.map { |language, subs| [language, [ subs.detect { |s| s['MatchedBy'] } || subs ].flatten ] }.flatten(1) ]

  block.call :search, media_subtitles if block

  # We now have one or many subtitles per language code, so start downloading
  media_subtitles.each do |language_code, subtitles|
    subtitles.each do |subtitle|
      block.call :downloading, subtitle
      download_subtitle(media, subtitle)
      block.call :downloaded, subtitle
    end
  end
end

#has_found_subtitles?(media) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 56

def has_found_subtitles?(media)
  (Opensubtitles.subtitles[media] && Opensubtitles.subtitles[media].any?) == true
end

#logoutObject



22
23
24
25
26
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 22

def logout
  response = make_call("LogOut", get_token)
  parse_response! response
  @token = nil if response[:success]
end

#search_subtitles(media, &block) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 28

def search_subtitles(media, &block)
  language_options = languages.map(&:to_s).join(',') if languages.any?
  options = []

  # Query by movie hash
  options << {
    :moviehash => media.movie_hash.to_s,
    :moviebytesize => media.movie_file_size.to_s
  }
  # Query by movie name
  options << { :query => media.show }
  # and IMDB id if present
  options.last[:imdb_id] = media.imdb_id if media.imdb_id

  # Add common options
  options.each do |query_option|
    query_option[:sublanguageid] = language_options if language_options
    query_option[:season] = media.season if media.is_tv_show_episode?
    query_option[:episode] = media.number if media.is_tv_show_episode?
  end

  response = search_for_subtitles(media, options)
  if response[:success] && response['data']
    Opensubtitles.subtitles[media] = response['data']
    block.call response['data'] if block
  end
end

#statusObject



82
83
84
# File 'lib/apple_tv_converter/subtitles_fetcher/opensubtitles.rb', line 82

def status
  make_call('ServerInfo')
end