subtitulos_downloader 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in subtitulos_downloader.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'ruby-debug19'
8
+ end
9
+
10
+ group :test do
11
+
12
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Hector Sanchez-Pajares
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ Subtitulos Downloader
2
+ =====================
3
+ Subtitulos Downloader is a gem to download subtitles focused in spanish language.
4
+
5
+ Description
6
+ -----------
7
+ Subtitles Downloader can use different subtitles providers to fetch the files from different webs.
8
+ It allows to download subtitles for multiple languages supported by the provider used.
9
+
10
+ It also supports TVdb to fetch the episode name and the real name for the show given a season and an episode number.
11
+
12
+ It saves the file(s) to a given path.Right now, only supported format name is:
13
+ <code>Show Name/Season #/Show Name - SxEE - Episode Name-Language.srt</code>
14
+
15
+
16
+ ### Providers
17
+ The providers currently developed are:
18
+ * [subtitulos.es](http://www.subtitulos.es)
19
+
20
+
21
+ Installation
22
+ ------------
23
+ To install the gem
24
+ <pre>
25
+ gem install subtitulos_downloader
26
+ </pre>
27
+
28
+ Usage
29
+ -----
30
+ For using this gem all you have to do is
31
+ <pre>
32
+ require 'subtitulos_downloader'
33
+ sub_downloader = SubtitulosDownloader::SubtitulosDownloader({
34
+ :provider = SubtitulosDownloader::SubtitlosEs,
35
+ :tvdb_api_key = 'XXXXXXXXXXXXX'
36
+ })
37
+
38
+ # Fetching spanish subtitles given a show name, season and episode
39
+ episode = sub_downloader.fetch('Fringe', 4, 7, %w[ es ])
40
+
41
+ # Fetching english subtitles given a file name
42
+ episode = sub_downloader.fetch_by_file_name('Fringe.S04E07.HDTV.XviD-LOL.avi.avi', %w[ en ])
43
+
44
+ # Fetching english and spanish subtitles given an episode object
45
+ episode = SubtitulosDownloader::ShowEpisode.new_from_file_name('Fringe.S04E07.HDTV.XviD-LOL.avi.avi', {:tvdb_api_key = 'XXXXXXX'})
46
+ sub_downloader.fetch_by_show_episode(episode, %w[ es en ])
47
+
48
+ # To save the subtitles
49
+ # Ex: /path_to_save/Fringe/Season 4/Fringe - 4x07 - Wallflower-English.srt
50
+ sub_downloader.save_subs_to_path(episode, '/path_to_save')
51
+
52
+ # Episode Object
53
+ episode =
54
+ subs = episode.subtitles # Array containing all subtitles for the episode
55
+ name = episode.full_name # Ex: Fringe - 4x07 - Wallflower
56
+ ep_name = episode.episode_name # Ex: Wallflower
57
+ season = episode.season # Ex: 4
58
+ episode = episode.episode # Ex: 7
59
+ show = episode.show_name # Ex: Fringe
60
+
61
+ # Subtitle Object
62
+ subtitles = episode.subtitles.first
63
+ subtitles.language # Language of subtitles
64
+ subtitles.subtitles # String containing the subtitles
65
+ </pre>
66
+
67
+ Contact
68
+ ------
69
+ Héctor Sánchez-Pajares
70
+ [hector@aerstudio.com](mailto:hector@aerstudio.com)
71
+
72
+
73
+
74
+
75
+
76
+
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require "bundler/gem_tasks"
2
+ require 'bundler/setup'
3
+ require 'rspec/core/rake_task'
4
+
5
+ Bundler.setup(:default, :development)
6
+
7
+
8
+ desc "Run all RSpec tests"
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ desc "Build the gem"
12
+ task :gem do
13
+ sh 'gem build *.gemspec'
14
+ end
15
+
16
+ task :default => :spec
@@ -0,0 +1,67 @@
1
+ require "subtitulos_downloader/version"
2
+ require "subtitulos_downloader/subtitle"
3
+ require "subtitulos_downloader/show_episode"
4
+ require "subtitulos_downloader/exception"
5
+ require "subtitulos_downloader/provider/provider"
6
+ Dir["#{File.dirname(__FILE__)}/subtitulos_downloader/provider/*.rb"].each {|f| require f}
7
+
8
+
9
+ module SubtitulosDownloader
10
+
11
+ class SubtitulosDownloader
12
+ def initialize(opts = {})
13
+ options = {
14
+ :provider => SubtitulosEs
15
+ }.merge!(opts)
16
+
17
+ @provider = options[:provider].new(options)
18
+ @options = options
19
+ end
20
+
21
+ def fetch(show_name, season, episode, languages = %w[ es en ])
22
+ languages = [languages] if not languages.respond_to?('each')
23
+ show_episode = ShowEpisode.new(show_name, season, episode, @options)
24
+ languages.each do |language|
25
+ @provider.fetch(show_episode, language)
26
+ end
27
+ show_episode
28
+ end
29
+
30
+ def fetch_by_file_name(file_name, languages = %w[ es en ])
31
+ languages = [languages] if not languages.respond_to?('each')
32
+ show_episode = ShowEpisode.new_from_file_name(file_name, @options)
33
+ languages.each do |language|
34
+ @provider.fetch(show_episode, language)
35
+ end
36
+ show_episode
37
+ end
38
+
39
+ def fetch_by_show_episode(show_episode, languages = %w[ es en ])
40
+ languages = [languages] if not languages.respond_to?('each')
41
+ languages.each do |language|
42
+ @provider.fetch(show_episode, language)
43
+ end
44
+ show_episode
45
+ end
46
+
47
+ def save_subs_to_path(show_episode, path)
48
+ show_episode.subtitles.each do |subtitle|
49
+ check_if_path_exists("#{path}/#{show_episode.show_path}")
50
+ check_if_path_exists("#{path}/#{show_episode.season_path}")
51
+ file = File.new("#{path}/#{subtitle.save_path}", "w")
52
+ file.write(subtitle.subtitles)
53
+ file.close
54
+ end
55
+ end
56
+
57
+
58
+ protected
59
+
60
+ def check_if_path_exists(path)
61
+ if not FileTest::directory?(path)
62
+ Dir::mkdir(path)
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,25 @@
1
+ module SubtitulosDownloader
2
+ class SDException < Exception
3
+ end
4
+
5
+ class Timeout < SDException
6
+ end
7
+
8
+ class ShowNotFound < SDException
9
+ end
10
+
11
+ class MoreThanOneShow < SDException
12
+ end
13
+
14
+ class EpisodeNotFound < SDException
15
+ end
16
+
17
+ class SeasonNotFound < SDException
18
+ end
19
+
20
+ class TranslationNotFinished < SDException
21
+ end
22
+
23
+ class LanguageNotFound < SDException
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ require 'version'
2
+ module SubtitulosDownloader
3
+ class Provider
4
+
5
+ def initialize(options={})
6
+ @options = options
7
+ @user_agent = "SubtitulosDownloader/#{VERSION}"
8
+ init
9
+ end
10
+
11
+ def init(options)
12
+ # to be override
13
+ @base_uri = ""
14
+ @provider_name =''
15
+ end
16
+
17
+ def fetch(show, language)
18
+
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,143 @@
1
+ # encoding: utf-8
2
+ require 'hpricot'
3
+ require "version"
4
+
5
+ module SubtitulosDownloader
6
+
7
+ class SubtitulosEs < Provider
8
+
9
+ def init
10
+ @base_uri = "http://www.subtitulos.es"
11
+ @provider_name = "subtitulos.es"
12
+ end
13
+
14
+
15
+ def fetch(show_episode, language)
16
+
17
+ get_shows_page unless @shows_doc
18
+
19
+ shows = search_show show_episode
20
+
21
+ show_sub = shows.first
22
+
23
+ episode_subs_table = get_episode_table show_episode, show_sub
24
+
25
+ case language
26
+ when 'en'
27
+ lang = 'English'
28
+ when 'es'
29
+ lang = 'España'
30
+ else
31
+ lang = language
32
+ end
33
+
34
+ begin
35
+ subs = get_subtitles(lang, episode_subs_table, show_sub)
36
+ subtitle = Subtitle.new subs, language, show_episode
37
+ rescue SDException => e
38
+ if language == 'es'
39
+ if lang == 'España'
40
+ lang = 'Latinoamérica'
41
+ retry
42
+ elsif lang == 'Latinoamérica'
43
+ lang = 'Español'
44
+ retry
45
+ else
46
+ raise e
47
+ end
48
+ else
49
+ raise e
50
+ end
51
+ end
52
+
53
+ subtitle
54
+
55
+ end
56
+
57
+ protected
58
+
59
+ def get_subtitles(language, episode_table, show_sub)
60
+ (episode_table/"tr/td.language").each do |lang|
61
+ language_sub = lang.inner_html.strip.force_encoding('utf-8')
62
+ if language_sub =~ /#{language}/i
63
+ # puts "Language #{language} found"
64
+ if not lang.next_sibling.inner_html =~ /[0-9]+\.?[0-9]*% Completado/i
65
+ # puts "Translation for language #{language} completed"
66
+ subtitle_a = lang.parent.search("a").at(0)
67
+ subtitle_url = subtitle_a.attributes['href']
68
+ # puts "Fetching #{language} subtitle file"
69
+ open(subtitle_url,
70
+ "User-Agent" => @user_agent,
71
+ "Referer" => "#{@base_uri}/show/#{show_sub[:id_show]}") { |f|
72
+ # Save the response body
73
+ subs= f.read
74
+ return subs
75
+ }
76
+ else
77
+ raise TranslationNotFinished, "[#{@provider_name}] #{language} translation not finished for #{show_sub[:show_episode].full_name}"
78
+ end
79
+ end
80
+ end
81
+ raise LanguageNotFound, "[#{@provider_name}] #{language} not found for #{show_sub[:show_episode].full_name}"
82
+ end
83
+
84
+
85
+ def search_show show_episode
86
+ shows = []
87
+ @shows_doc.search("a").each do |show_subs|
88
+ show_name = show_subs.inner_html.force_encoding('utf-8')
89
+ show_url = show_subs.attributes['href']
90
+ if show_name =~ /#{show_episode.show_name}/i
91
+ shows << { :show_episode => show_episode, :url => show_url, :id_show => show_url.split('/show/')[1].to_i }
92
+ end
93
+ end
94
+ raise ShowNotFound, "[#{@provider_name}] #{show_episode.show_name} not found" if shows.count == 0
95
+ raise MoreThanOneShow, "[#{@provider_name}] Found #{shows.count} for #{show_episode.show_name}" if shows.count > 1
96
+ shows
97
+ end
98
+
99
+ def get_episode_table(show_episode, show_sub)
100
+
101
+ season_url = "#{@base_uri}/ajax_loadShow.php?show=#{show_sub[:id_show]}&season=#{show_episode.season}"
102
+ ep_t = nil
103
+ open(season_url,
104
+ "User-Agent" => @user_agent,
105
+ "Referer" =>"#{@base_uri}" ) { |f|
106
+
107
+ cont = f.read
108
+ raise SeasonNotFound, "[#{@provider_name}] Season for #{show_episode.full_name} not found" if cont == ''
109
+
110
+ season_doc = Hpricot(cont)
111
+
112
+ season_doc.search('table').each do |episode_table|
113
+ title = (episode_table/"tr/td[@colspan='5']/a").inner_html.force_encoding('utf-8')
114
+ episode_str = "%02d" % show_episode.episode
115
+ episode_number = "#{show_episode.season}x#{episode_str}"
116
+ if title =~ /#{episode_number}/i
117
+ ep_t = episode_table
118
+ break
119
+ end
120
+ end
121
+ }
122
+
123
+ if ep_t
124
+ return ep_t
125
+ else
126
+ raise EpisodeNotFound, "[#{@provider_name}] Episode #{show_episode.full_name} not found"
127
+ end
128
+
129
+ end
130
+
131
+
132
+ def get_shows_page
133
+ open(
134
+ "#{@base_uri}/series",
135
+ "User-Agent" => @user_agent,
136
+ "Referer" =>"#{@base_uri}" ) { |f|
137
+ @shows_doc = Hpricot(f.read)
138
+ }
139
+ end
140
+
141
+ end
142
+
143
+ end
@@ -0,0 +1,111 @@
1
+ require 'tvdb'
2
+
3
+ module SubtitulosDownloader
4
+
5
+ class ShowEpisode
6
+
7
+ attr_accessor :show_name, :season, :episode, :episode_name
8
+ attr_accessor :tvdb_episode, :tvdb_show, :subtitles
9
+
10
+ def initialize(show_name, season, episode, options = {})
11
+
12
+ @show_name = show_name
13
+ @season = season.to_i
14
+ @episode = episode.to_i
15
+ @options = options
16
+ @subtitles = []
17
+
18
+ if @options[:tvdb_api_key]
19
+ fetch_data_from_tvdb(@options[:tvdb_api_key])
20
+ end
21
+ end
22
+
23
+ def fetch_data_from_tvdb(key)
24
+ @tvdb = TVdb::Client.new(key)
25
+ tvdb_show = @tvdb.search(@show_name)
26
+ if tvdb_show.count > 0
27
+ tvdb_show = tvdb_show[0]
28
+ @show_name = tvdb_show.seriesname
29
+ tvdb_show.episodes.each do |ep|
30
+ ep_number = ep.episodenumber
31
+ ep_season = ep.combined_season
32
+ if ep_number.to_i == @episode && ep_season.to_i == @season
33
+ @episode_name = ep.episodename
34
+ break
35
+ end
36
+ end
37
+ else
38
+ raise ShowNotFound, "[TVdb] show #{@show_name} not found"
39
+ end
40
+ end
41
+
42
+ def subtitle_language(lang)
43
+ subs = nil
44
+ @subtitles.each do |sub|
45
+ if sub.language == lang
46
+ return sub
47
+ break
48
+ end
49
+ end
50
+ return nil
51
+ end
52
+
53
+ def full_name
54
+ episode_str = "%02d" % @episode
55
+ if @episode_name
56
+ "#{@show_name} - #{@season}x#{episode_str} - #{@episode_name}"
57
+ else
58
+ "#{@show_name} - #{@season}x#{episode_str}"
59
+ end
60
+ end
61
+
62
+ def show_path
63
+ "#{@show_name}"
64
+ end
65
+
66
+ def season_path
67
+ "#{@show_name}/Season #{@season}"
68
+ end
69
+
70
+ def episode_path
71
+ "#{@show_name}/Season #{@season}/#{self.full_name}"
72
+ end
73
+
74
+ def self.new_from_file_name(file_name, options={})
75
+ # House.S04E13.HDTV.XviD-XOR.avi
76
+ # my.name.is.earl.s03e07-e08.hdtv.xvid-xor.[VTV].avi
77
+ # My_Name_Is_Earl.3x17.No_Heads_And_A_Duffel_Bag.HDTV_XviD-FoV.[VTV].avi
78
+ # My Name Is Earl - 3x04.avi
79
+ # MythBusters - S04E01 - Newspaper Crossbow.avi
80
+ # my.name.is.earl.305.hdtv-lol.[VTV].avi
81
+
82
+ # TODO look up the regex used in XBMC to get data from TV episodes
83
+ re =
84
+ /^(.*?)(?:\s?[-\.]\s?)?\s*\[?s?(?:
85
+ (?:
86
+ (\d{1,2})
87
+ \s?\.?\s?[ex-]\s?
88
+ (?:(\d{2})(?:\s?[,-]\s?[ex]?(\d{2}))?)
89
+ )
90
+ |
91
+ (?:
92
+ \.(\d{1})(\d{2})(?!\d)
93
+ )
94
+ )\]?\s?.*$/ix
95
+
96
+ if match = file_name.to_s.match(re)
97
+ series = match[1].gsub(/[\._]/, ' ').strip.gsub(/\b\w/){$&.upcase}
98
+ season = (match[2] || match[5]).to_i
99
+ episode = (match[3] || match[6]).to_i
100
+ episode = (episode)..(match[4].to_i) unless match[4].nil?
101
+
102
+ show_episode = ShowEpisode.new(series, season, episode, options)
103
+ else
104
+ nil
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+
111
+ end
@@ -0,0 +1,29 @@
1
+ module SubtitulosDownloader
2
+
3
+ class Subtitle
4
+
5
+ attr_accessor :subtitles, :language, :show_episode
6
+
7
+ def initialize(subs, language, show_episode)
8
+ @subtitles = subs
9
+ @language = language
10
+ @show_episode = show_episode
11
+ @show_episode.subtitles << self
12
+ end
13
+
14
+
15
+ def save_path
16
+ case @language
17
+ when 'es'
18
+ lang = 'Spanish'
19
+ when 'en'
20
+ lang = 'English'
21
+ else
22
+ lang = @language
23
+ end
24
+ "#{@show_episode.episode_path}-#{lang}.srt"
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,3 @@
1
+ module SubtitulosDownloader
2
+ VERSION = "0.5.1"
3
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe SubtitulosDownloader::ShowEpisode do
5
+
6
+ context "Initializing" do
7
+
8
+ it 'should create a new show episode from show, season and episode' do
9
+ episode = SubtitulosDownloader::ShowEpisode.new('Raising Hope', 2, 4)
10
+ episode.show_name.should == 'Raising Hope'
11
+ episode.season.should == 2
12
+ episode.episode.should == 4
13
+ end
14
+
15
+ it 'should create a new show episode from a file name' do
16
+ ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi")
17
+ ep.show_name.should == 'Fringe'
18
+ ep.season.should == 4
19
+ ep.episode.should == 7
20
+ end
21
+
22
+ it 'should fetch data from TVdb' do
23
+ ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi", {:tvdb_api_key => 'EF41E54C744526F7'})
24
+ ep.episode_name.should == 'Wallflower'
25
+ end
26
+
27
+ it 'should show the episode full name' do
28
+ ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi", {:tvdb_api_key => 'EF41E54C744526F7'})
29
+ ep.full_name.should == 'Fringe - 4x07 - Wallflower'
30
+ episode = SubtitulosDownloader::ShowEpisode.new('Raising Hope', 2, 4)
31
+ episode.full_name.should == 'Raising Hope - 2x04'
32
+ end
33
+
34
+ it 'should show the subtitle given a language' do
35
+ episode = SubtitulosDownloader::ShowEpisode.new('fake show', 3, 3)
36
+ subtitle = SubtitulosDownloader::Subtitle.new('subs', 'es', episode)
37
+ sub = episode.subtitle_language 'es'
38
+ sub.should == subtitle
39
+ sub.subtitles.should =='subs'
40
+
41
+ end
42
+
43
+ end
44
+
45
+ context "Paths" do
46
+ before(:all) do
47
+ @ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi", {:tvdb_api_key => 'EF41E54C744526F7'})
48
+ end
49
+ it 'should show the show path' do
50
+ @ep.show_path.should == 'Fringe'
51
+ end
52
+
53
+ it 'should show the season path' do
54
+ @ep.season_path.should == 'Fringe/Season 4'
55
+ end
56
+
57
+ it 'should show the episode path' do
58
+ @ep.episode_path.should == 'Fringe/Season 4/Fringe - 4x07 - Wallflower'
59
+ end
60
+ end
61
+
62
+ context "Exceptions" do
63
+
64
+ it 'should raise a show not found exception' do
65
+ lambda{ SubtitulosDownloader::ShowEpisode.new('fake show', 4, 5, {:tvdb_api_key => 'EF41E54C744526F7'}) }.should raise_error(SubtitulosDownloader::ShowNotFound)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,7 @@
1
+
2
+ require 'subtitulos_downloader'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.formatter = 'documentation'
7
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe SubtitulosDownloader::Subtitle do
5
+
6
+ context "Initializing" do
7
+ before(:all) do
8
+ @ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi", {:tvdb_api_key => 'EF41E54C744526F7'})
9
+ end
10
+
11
+ it 'should initialize' do
12
+ sub = SubtitulosDownloader::Subtitle.new('subs', 'en', @ep)
13
+ sub.subtitles.should == 'subs'
14
+ sub.language.should == 'en'
15
+ sub.show_episode.should == @ep
16
+ @ep.subtitles.count.should == 1
17
+ @ep.subtitles.first.should == sub
18
+ end
19
+
20
+ it 'should show the path to save' do
21
+ sub = SubtitulosDownloader::Subtitle.new('subs', 'en', @ep)
22
+ sub.save_path.should == 'Fringe/Season 4/Fringe - 4x07 - Wallflower-English.srt'
23
+ sub = SubtitulosDownloader::Subtitle.new('subs', 'es', @ep)
24
+ sub.save_path.should == 'Fringe/Season 4/Fringe - 4x07 - Wallflower-Spanish.srt'
25
+ sub = SubtitulosDownloader::Subtitle.new('subs', 'ca', @ep)
26
+ sub.save_path.should == 'Fringe/Season 4/Fringe - 4x07 - Wallflower-ca.srt'
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+
5
+ describe SubtitulosDownloader::SubtitulosDownloader do
6
+
7
+ context "Fetching" do
8
+ before(:all) do
9
+ @sub_downloader = SubtitulosDownloader::SubtitulosDownloader.new
10
+ end
11
+
12
+ it 'should fetch subtitles given name, season and episode' do
13
+ episode = @sub_downloader.fetch('Fringe', 4, 7, %w[ es ])
14
+ episode.subtitles.count.should == 1
15
+ subs = (episode.subtitles.first.subtitles =~ /Ahora solo tengo que averiguar/) > 1
16
+ subs.should == true
17
+ end
18
+
19
+ it 'should fetch subtitles in english and spanish by default' do
20
+ episode = @sub_downloader.fetch('Fringe', 4, 7)
21
+ episode.subtitles.count.should == 2
22
+ subtitle = episode.subtitle_language 'es'
23
+ subs = (subtitle.subtitles =~ /Ahora solo tengo que averiguar/) > 1
24
+ subs.should == true
25
+ subtitle = episode.subtitle_language 'en'
26
+ subs = (subtitle.subtitles =~ /10-4. Copy location./) > 1
27
+ subs.should == true
28
+ end
29
+
30
+ it 'should fetch subtitles given a file name' do
31
+ episode = @sub_downloader.fetch_by_file_name('Fringe.S04E07.HDTV.XviD-LOL.avi.avi', %w[ es ])
32
+ episode.subtitles.count.should == 1
33
+ subs = (episode.subtitles.first.subtitles =~ /Ahora solo tengo que averiguar/) > 1
34
+ subs.should == true
35
+ end
36
+
37
+ it 'should fetch subtitles given a show episode' do
38
+ episode = SubtitulosDownloader::ShowEpisode.new_from_file_name('Fringe.S04E07.HDTV.XviD-LOL.avi.avi')
39
+ @sub_downloader.fetch_by_show_episode(episode, %w[ es ])
40
+ episode.subtitles.count.should == 1
41
+ subs = (episode.subtitles.first.subtitles =~ /Ahora solo tengo que averiguar/) > 1
42
+ subs.should == true
43
+ end
44
+
45
+ end
46
+
47
+ context "Saving" do
48
+ it 'should save the subtitles to disk' do
49
+ sub_downloader = SubtitulosDownloader::SubtitulosDownloader.new
50
+ episode = sub_downloader.fetch('Fringe', 4, 7)
51
+ sub_downloader.save_subs_to_path(episode, '/tmp')
52
+ episode.subtitles.each do |sub|
53
+ exists = File.exists?('/tmp/' + sub.save_path)
54
+ exists.should == true
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,94 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+
5
+ describe SubtitulosDownloader::SubtitulosEs do
6
+
7
+ context "Fetching subtitles" do
8
+ before(:all) do
9
+ @ep = SubtitulosDownloader::ShowEpisode.new_from_file_name("Fringe.S04E07.HDTV.XviD-LOL.avi.avi")
10
+ @simpsons = SubtitulosDownloader::ShowEpisode.new_from_file_name("The Simpsons - 20x05 - Dangerous Curves")
11
+ @simpsons2 = SubtitulosDownloader::ShowEpisode.new_from_file_name("The Simpsons - 20x07 - Mypods and Boomsticks")
12
+ @provider = SubtitulosDownloader::SubtitulosEs.new()
13
+ end
14
+
15
+ it 'should fetch spanish subtitle' do
16
+ subtitle = @provider.fetch(@ep, 'es')
17
+ subtitle.language.should == 'es'
18
+ subtitle.show_episode.should == @ep
19
+ subs = (subtitle.subtitles =~ /Ahora solo tengo que averiguar/) > 1
20
+ subs.should == true
21
+ end
22
+
23
+ it 'should fetch english subtitle' do
24
+ subtitle = @provider.fetch(@ep, 'en')
25
+ subtitle.language.should == 'en'
26
+ subtitle.show_episode.should == @ep
27
+ subs = (subtitle.subtitles =~ /10-4. Copy location./) > 1
28
+ subs.should == true
29
+ end
30
+
31
+ it 'should fetch latinoamerican instead of spanish subtitles' do
32
+ subtitle = @provider.fetch(@simpsons, 'es')
33
+ subtitle.language.should == 'es'
34
+ subtitle.show_episode.should == @simpsons
35
+ subs = (subtitle.subtitles =~ /Tenemos cubos amarillos, cubos anaranjados/) > 1
36
+ subs.should == true
37
+ end
38
+
39
+ it 'should fetch español instead of spanish subtitles' do
40
+ subtitle = @provider.fetch(@simpsons2, 'es')
41
+ subtitle.language.should == 'es'
42
+ subtitle.show_episode.should == @simpsons2
43
+ subs = (subtitle.subtitles =~ /me gusta la forma de pensar de ustedes los italianos/) > 1
44
+ subs.should == true
45
+ end
46
+
47
+ it 'should fetch italian language' do
48
+ episode = SubtitulosDownloader::ShowEpisode.new('fringe', 3, 7)
49
+ subtitle = @provider.fetch(episode, 'italian')
50
+ subtitle.language.should == 'italian'
51
+ subtitle.show_episode.should == episode
52
+ subs = (subtitle.subtitles =~ /Quello che conta e' che sono nei guai./) > 1
53
+ subs.should == true
54
+ end
55
+ end
56
+
57
+ context "Rasing Exceptions" do
58
+ before(:all) do
59
+ @provider = SubtitulosDownloader::SubtitulosEs.new()
60
+ end
61
+
62
+ it 'should raise a not show found exception' do
63
+ episode = SubtitulosDownloader::ShowEpisode.new('fake show', 2, 4)
64
+ lambda{@provider.fetch(episode, 'es')}.should raise_error(SubtitulosDownloader::ShowNotFound)
65
+ end
66
+
67
+ it 'should raise more than one show exception' do
68
+ episode = SubtitulosDownloader::ShowEpisode.new('the', 3, 4)
69
+ lambda{@provider.fetch(episode, 'es')}.should raise_error(SubtitulosDownloader::MoreThanOneShow)
70
+ end
71
+
72
+ it 'should raise season not found exception' do
73
+ episode = SubtitulosDownloader::ShowEpisode.new('the simpsons', 3, 4)
74
+ lambda{@provider.fetch(episode, 'es')}.should raise_error(SubtitulosDownloader::SeasonNotFound)
75
+ end
76
+
77
+ it 'should raise episode not found exception' do
78
+ episode = SubtitulosDownloader::ShowEpisode.new('the simpsons', 22, 34)
79
+ lambda{@provider.fetch(episode, 'es')}.should raise_error(SubtitulosDownloader::EpisodeNotFound)
80
+ end
81
+
82
+ it 'should raise episode not translated exception' do
83
+ episode = SubtitulosDownloader::ShowEpisode.new('the simpsons', 20, 1)
84
+ lambda{@provider.fetch(episode, 'galego')}.should raise_error(SubtitulosDownloader::TranslationNotFinished)
85
+ end
86
+
87
+ it 'should raise language not found exception' do
88
+ episode = SubtitulosDownloader::ShowEpisode.new('the simpsons', 20, 1)
89
+ lambda{@provider.fetch(episode, 'esperanto')}.should raise_error(SubtitulosDownloader::LanguageNotFound)
90
+ end
91
+
92
+
93
+ end
94
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "subtitulos_downloader/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "subtitulos_downloader"
7
+ s.version = SubtitulosDownloader::VERSION
8
+ s.authors = ["hector spc"]
9
+ s.email = ["hector@aerstudio.com"]
10
+ s.homepage = "https://github.com/hecspc/Subtitulos-Downloader"
11
+ s.summary = "Fetch subtitles focused on spanish language"
12
+ s.description = "Fetch subtitles from different providers and save them to a given path"
13
+
14
+ s.rubyforge_project = "subtitulos_downloader"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rake"
23
+ s.add_development_dependency "rspec", "~>2.0"
24
+ # s.add_runtime_dependency "rest-client"
25
+ s.add_dependency("tvdb", ">= 0.1.0")
26
+ s.add_dependency("hpricot", ">= 0.8.4")
27
+ s.add_dependency("httparty", ">= 0.8.1")
28
+ s.add_dependency("prowler", ">= 1.3.1")
29
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: subtitulos_downloader
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.5.1
6
+ platform: ruby
7
+ authors:
8
+ - hector spc
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-11-20 00:00:00 +01:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rake
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :development
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: "2.0"
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: tvdb
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 0.1.0
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: hpricot
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.8.4
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: httparty
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.8.1
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: prowler
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 1.3.1
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ description: Fetch subtitles from different providers and save them to a given path
83
+ email:
84
+ - hector@aerstudio.com
85
+ executables: []
86
+
87
+ extensions: []
88
+
89
+ extra_rdoc_files: []
90
+
91
+ files:
92
+ - .gitignore
93
+ - .rspec
94
+ - Gemfile
95
+ - LICENSE
96
+ - README.md
97
+ - Rakefile
98
+ - lib/subtitulos_downloader.rb
99
+ - lib/subtitulos_downloader/exception.rb
100
+ - lib/subtitulos_downloader/provider/provider.rb
101
+ - lib/subtitulos_downloader/provider/subtitulos_es.rb
102
+ - lib/subtitulos_downloader/show_episode.rb
103
+ - lib/subtitulos_downloader/subtitle.rb
104
+ - lib/subtitulos_downloader/version.rb
105
+ - spec/show_episode_spec.rb
106
+ - spec/spec_helper.rb
107
+ - spec/subtitle_spec.rb
108
+ - spec/subtitulos_downloader_spec.rb
109
+ - spec/subtitulos_es_spec.rb
110
+ - subtitulos_downloader.gemspec
111
+ has_rdoc: true
112
+ homepage: https://github.com/hecspc/Subtitulos-Downloader
113
+ licenses: []
114
+
115
+ post_install_message:
116
+ rdoc_options: []
117
+
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ hash: -1979499645020437577
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ hash: -1979499645020437577
135
+ segments:
136
+ - 0
137
+ version: "0"
138
+ requirements: []
139
+
140
+ rubyforge_project: subtitulos_downloader
141
+ rubygems_version: 1.6.2
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Fetch subtitles focused on spanish language
145
+ test_files:
146
+ - spec/show_episode_spec.rb
147
+ - spec/spec_helper.rb
148
+ - spec/subtitle_spec.rb
149
+ - spec/subtitulos_downloader_spec.rb
150
+ - spec/subtitulos_es_spec.rb