class Addic7ed::Episode
Attributes
untagged[R]
video_file[R]
Public Class Methods
new(filename, untagged = false)
click to toggle source
# File lib/addic7ed/episode.rb, line 9 def initialize(filename, untagged = false) @video_file = Addic7ed::VideoFile.new(filename) @untagged = untagged end
Public Instance Methods
best_subtitle(lang = 'fr', no_hi = false)
click to toggle source
# File lib/addic7ed/episode.rb, line 26 def best_subtitle(lang = 'fr', no_hi = false) check_language_availability(lang) find_best_subtitle(lang, no_hi) unless @best_subtitle and @best_subtitle[lang] return @best_subtitle[lang] end
download_best_subtitle!(lang, no_hi = false, http_redirect_limit = 8)
click to toggle source
# File lib/addic7ed/episode.rb, line 32 def download_best_subtitle!(lang, no_hi = false, http_redirect_limit = 8) raise HTTPError.new('Too many HTTP redirects') unless http_redirect_limit > 0 uri = URI(best_subtitle(lang, no_hi).url) response = get_http_response(uri, url(lang)) if response.kind_of?(Net::HTTPRedirection) follow_redirection(lang, no_hi, response['location'], http_redirect_limit) else save_subtitle(response.body, lang) end end
subtitles(lang = 'fr')
click to toggle source
# File lib/addic7ed/episode.rb, line 20 def subtitles(lang = 'fr') check_language_availability(lang) find_subtitles(lang) unless @subtitles and @subtitles[lang] return @subtitles[lang] end
url(lang = 'fr')
click to toggle source
# File lib/addic7ed/episode.rb, line 14 def url(lang = 'fr') check_language_availability(lang) @localized_urls ||= {} @localized_urls[lang] ||= "http://www.addic7ed.com/serie/#{ShowList.url_segment_for(video_file.showname)}/#{video_file.season}/#{video_file.episode}/#{LANGUAGES[lang][:id]}" end
Protected Instance Methods
check_language_availability(lang)
click to toggle source
# File lib/addic7ed/episode.rb, line 59 def check_language_availability(lang) raise LanguageNotSupported unless LANGUAGES[lang] end
find_best_subtitle(lang, no_hi = false)
click to toggle source
# File lib/addic7ed/episode.rb, line 51 def find_best_subtitle(lang, no_hi = false) @best_subtitle ||= {} subtitles(lang).each do |sub| @best_subtitle[lang] = sub if sub.works_for?(video_file.group, no_hi) and sub.can_replace? @best_subtitle[lang] end raise NoSubtitleFound unless @best_subtitle[lang] end
find_subtitles(lang)
click to toggle source
# File lib/addic7ed/episode.rb, line 45 def find_subtitles(lang) initialize_language(lang) parser = Addic7ed::Parser.new(self, lang) @subtitles[lang] = parser.extract_subtitles end
follow_redirection(lang, no_hi, new_uri, http_redirect_limit)
click to toggle source
# File lib/addic7ed/episode.rb, line 80 def follow_redirection(lang, no_hi, new_uri, http_redirect_limit) # Addic7ed is serving redirection URL not-encoded, but Ruby does not support it (see http://bugs.ruby-lang.org/issues/7396) best_subtitle(lang).url = URI.escape(new_uri) raise DownloadLimitReached if /^\/downloadexceeded.php/.match best_subtitle(lang).url download_best_subtitle!(lang, no_hi, http_redirect_limit - 1) end
get_http_response(uri, referer)
click to toggle source
# File lib/addic7ed/episode.rb, line 68 def get_http_response(uri, referer) Net::HTTP.start(uri.hostname, uri.port) do |http| request = Net::HTTP::Get.new(uri.request_uri) # Addic7ed needs the Referer to be correct. User-agent is just here to fake a real browser request. request['Referer'] = referer request['User-Agent'] = USER_AGENTS.sample http.request(request) end rescue raise DownloadError end
initialize_language(lang)
click to toggle source
# File lib/addic7ed/episode.rb, line 63 def initialize_language(lang) @subtitles ||= {} @subtitles[lang] ||= [] end
save_subtitle(content, lang)
click to toggle source
# File lib/addic7ed/episode.rb, line 87 def save_subtitle(content, lang) Kernel.open "#{video_file}".gsub(/\.\w{3}$/, untagged ? ".srt" : ".#{lang}.srt"), 'w' do |f| f << content end rescue raise SubtitleCannotBeSaved end