addic7ed 3.0.0 → 4.0.0.pre.beta.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/addic7ed.rb +5 -10
- data/lib/addic7ed/common.rb +13 -1285
- data/lib/addic7ed/config.json +1417 -0
- data/lib/addic7ed/errors.rb +8 -7
- data/lib/addic7ed/models/episode.rb +112 -0
- data/lib/addic7ed/models/search.rb +90 -0
- data/lib/addic7ed/models/subtitle.rb +109 -0
- data/lib/addic7ed/models/subtitles_collection.rb +63 -0
- data/lib/addic7ed/models/video_file.rb +147 -0
- data/lib/addic7ed/service.rb +13 -0
- data/lib/addic7ed/services/check_compatibility.rb +44 -0
- data/lib/addic7ed/services/download_subtitle.rb +53 -0
- data/lib/addic7ed/services/get_shows_list.rb +29 -0
- data/lib/addic7ed/services/{addic7ed_comment_normalizer.rb → normalize_comment.rb} +4 -8
- data/lib/addic7ed/services/normalize_version.rb +22 -0
- data/lib/addic7ed/services/parse_page.rb +43 -0
- data/lib/addic7ed/services/parse_subtitle.rb +79 -0
- data/lib/addic7ed/services/url_encode_show_name.rb +46 -0
- data/lib/addic7ed/version.rb +1 -1
- metadata +63 -50
- data/bin/addic7ed +0 -144
- data/lib/addic7ed/episode.rb +0 -95
- data/lib/addic7ed/parser.rb +0 -105
- data/lib/addic7ed/services/addic7ed_version_normalizer.rb +0 -24
- data/lib/addic7ed/show_list.rb +0 -61
- data/lib/addic7ed/subtitle.rb +0 -72
- data/lib/addic7ed/video_file.rb +0 -41
- data/spec/lib/addic7ed/common_spec.rb +0 -21
- data/spec/lib/addic7ed/episode_spec.rb +0 -165
- data/spec/lib/addic7ed/services/addic7ed_comment_normalizer_spec.rb +0 -12
- data/spec/lib/addic7ed/services/addic7ed_version_normalizer_spec.rb +0 -73
- data/spec/lib/addic7ed/show_list_spec.rb +0 -42
- data/spec/lib/addic7ed/subtitle_spec.rb +0 -182
- data/spec/lib/addic7ed/video_file_spec.rb +0 -159
- data/spec/responses/basic_redirection.http +0 -13
- data/spec/responses/homepage.http +0 -921
- data/spec/responses/redirection_loop.http +0 -12
- data/spec/responses/walking-dead-3-2-1.http +0 -770
- data/spec/responses/walking-dead-3-2-48.http +0 -2117
- data/spec/responses/walking-dead-3-2-7.http +0 -659
- data/spec/responses/walking-dead-3-2-8.http +0 -815
- data/spec/responses/walking-dead-3-2-8_best_subtitle.http +0 -1928
- data/spec/responses/walking-dead-3-4-8.http +0 -732
- data/spec/responses/walking-dead-3-42-8.http +0 -13
- data/spec/spec_helper.rb +0 -26
data/lib/addic7ed/video_file.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Addic7ed
|
2
|
-
class VideoFile
|
3
|
-
|
4
|
-
TVSHOW_REGEX = /\A(?<showname>.*\w)[\[\. ]+S?(?<season>\d{1,2})[-\. ]?[EX]?(?<episode>\d{2})([-\. ]?[EX]?\d{2})*[\]\. ]+(?<tags>.*)-(?<group>\w*)\[?(?<distribution>\w*)\]?(\.\w{3})?\z/i
|
5
|
-
|
6
|
-
attr_reader :filename, :showname, :season, :episode, :tags, :group, :distribution
|
7
|
-
|
8
|
-
def initialize(filename)
|
9
|
-
@filename = filename
|
10
|
-
if match = TVSHOW_REGEX.match(basename)
|
11
|
-
@showname = match[:showname]
|
12
|
-
@season = match[:season].to_i
|
13
|
-
@episode = match[:episode].to_i
|
14
|
-
@tags = match[:tags].upcase.split(/[\. ]/)
|
15
|
-
@group = match[:group].upcase
|
16
|
-
@distribution = match[:distribution].upcase
|
17
|
-
else
|
18
|
-
raise InvalidFilename
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def basename
|
23
|
-
@basename ||= ::File.basename(@filename)
|
24
|
-
end
|
25
|
-
|
26
|
-
def to_s
|
27
|
-
@filename
|
28
|
-
end
|
29
|
-
|
30
|
-
def inspect
|
31
|
-
"Guesses for #{@filename}:
|
32
|
-
show: #{@showname}
|
33
|
-
season: #{@season}
|
34
|
-
episode: #{@episode}
|
35
|
-
tags: #{@tags}
|
36
|
-
group: #{@group}
|
37
|
-
distribution: #{@distribution}"
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require './lib/addic7ed'
|
3
|
-
|
4
|
-
describe Addic7ed do
|
5
|
-
it 'defines SHOWS_URL' do
|
6
|
-
expect(Addic7ed::SHOWS_URL).to_not be_nil
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'defines EPISODES_URL' do
|
10
|
-
expect(Addic7ed::EPISODES_URL).to_not be_nil
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'defines EPISODE_REDIRECT_URL' do
|
14
|
-
expect(Addic7ed::EPISODE_REDIRECT_URL).to_not be_nil
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'defines LANGUAGES' do
|
18
|
-
expect(Addic7ed::LANGUAGES).to_not be_nil
|
19
|
-
expect(Addic7ed::LANGUAGES).to include 'fr' => {name: 'French', id: 8}
|
20
|
-
end
|
21
|
-
end
|
@@ -1,165 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require './lib/addic7ed'
|
3
|
-
|
4
|
-
describe Addic7ed::Episode do
|
5
|
-
before :all do
|
6
|
-
@filename = 'The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.mkv'
|
7
|
-
@filename_show_not_found = 'Show.Not.Found.S03E02.720p.HDTV.x264-EVOLVE.mkv'
|
8
|
-
@filename_episode_not_found = 'The.Walking.Dead.S03E42.720p.HDTV.x264-EVOLVE.mkv'
|
9
|
-
@filename_compatible_group = 'The.Walking.Dead.S03E04.HDTV.XviD-ASAP.mkv'
|
10
|
-
@filename_no_hi = 'The.Walking.Dead.S03E02.720p.HDTV.x264-KILLERS.mkv'
|
11
|
-
@episode = Addic7ed::Episode.new(@filename)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should create valid instance given valid argument' do
|
15
|
-
expect{ Addic7ed::Episode.new(@filename) }.to_not raise_error
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#url' do
|
19
|
-
it 'returns a show localized URL given existing episode' do
|
20
|
-
expect(@episode.url('fr')).to eq 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/8'
|
21
|
-
expect(@episode.url('es')).to eq 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/4'
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'uses French as default language' do
|
25
|
-
expect(@episode.url).to eq @episode.url('fr')
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'raises LanguageNotSupported given an unsupported language code' do
|
29
|
-
expect{ @episode.url('aa') }.to raise_error Addic7ed::LanguageNotSupported
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#subtitles' do
|
34
|
-
it 'should return an array of Addic7ed::Subtitle given valid episode and language' do
|
35
|
-
%w{fr en it}.each do |lang|
|
36
|
-
lang_id = Addic7ed::LANGUAGES[lang][:id]
|
37
|
-
stub_request(:get, "http://www.addic7ed.com/serie/The_Walking_Dead/3/2/#{lang_id}")
|
38
|
-
.to_return File.new("spec/responses/walking-dead-3-2-#{lang_id}.http")
|
39
|
-
end
|
40
|
-
expect(@episode.subtitles('fr').size).to eq 4
|
41
|
-
expect(@episode.subtitles('en').size).to eq 3
|
42
|
-
expect(@episode.subtitles('it').size).to eq 1
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'uses French as default language' do
|
46
|
-
expect(@episode.subtitles).to eq @episode.subtitles('fr')
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'raises LanguageNotSupported given an unsupported language code' do
|
50
|
-
expect{ @episode.subtitles('aa') }.to raise_error Addic7ed::LanguageNotSupported
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'raises EpisodeNotFound given not existing episode' do
|
54
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/42/8')
|
55
|
-
.to_return File.new('spec/responses/walking-dead-3-42-8.http')
|
56
|
-
expect{ Addic7ed::Episode.new(@filename_episode_not_found).subtitles }.to raise_error Addic7ed::EpisodeNotFound
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'raises NoSubtitleFound given valid episode which has no subtitle on Addic7ed' do
|
60
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/48')
|
61
|
-
.to_return File.new('spec/responses/walking-dead-3-2-48.http')
|
62
|
-
expect{ @episode.subtitles('az') }.to raise_error Addic7ed::NoSubtitleFound
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'may raise a ParsingError, but I\'m not sure how...'
|
66
|
-
end
|
67
|
-
|
68
|
-
describe '#best_subtitle' do
|
69
|
-
it 'finds the subtitle with status completed and same group name' do
|
70
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/8')
|
71
|
-
.to_return File.new('spec/responses/walking-dead-3-2-8.http')
|
72
|
-
expect(@episode.best_subtitle('fr').url).to eq 'http://www.addic7ed.com/original/68018/4'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'finds the subtitle with status completed, compatible group name and as many downloads as possible' do
|
76
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/4/8')
|
77
|
-
.to_return File.new('spec/responses/walking-dead-3-4-8.http')
|
78
|
-
compatible_episode = Addic7ed::Episode.new(@filename_compatible_group)
|
79
|
-
expect(compatible_episode.best_subtitle('fr').url).to eq 'http://www.addic7ed.com/updated/8/68508/3'
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'finds the subtitle with status completed, same group name and not hearing impaired' do
|
83
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/1')
|
84
|
-
.to_return File.new('spec/responses/walking-dead-3-2-1.http')
|
85
|
-
episode = Addic7ed::Episode.new(@filename_no_hi)
|
86
|
-
expect(episode.best_subtitle('en', true).url).to eq 'http://www.addic7ed.com/updated/1/68018/0'
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'uses French as default language' do
|
90
|
-
expect(@episode.best_subtitle).to eq @episode.best_subtitle('fr')
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'raises LanguageNotSupported given an unsupported language code' do
|
94
|
-
expect{ @episode.best_subtitle('aa') }.to raise_error Addic7ed::LanguageNotSupported
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'raises NoSubtitleFound given valid episode which has no subtitle on Addic7ed' do
|
98
|
-
stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/48')
|
99
|
-
.to_return File.new('spec/responses/walking-dead-3-2-48.http')
|
100
|
-
expect{ @episode.best_subtitle('az') }.to raise_error Addic7ed::NoSubtitleFound
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe '#download_best_subtitle!' do
|
105
|
-
let(:episode) { Addic7ed::Episode.new(@filename) }
|
106
|
-
|
107
|
-
before do
|
108
|
-
WebMock.reset!
|
109
|
-
@page_stub = stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/8')
|
110
|
-
.to_return File.new('spec/responses/walking-dead-3-2-8.http')
|
111
|
-
@sub_stub = stub_request(:get, 'http://www.addic7ed.com/original/68018/4')
|
112
|
-
.to_return File.new('spec/responses/walking-dead-3-2-8_best_subtitle.http')
|
113
|
-
# Prevent actual disk writing
|
114
|
-
allow(Kernel).to receive(:open)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'gets the best subtitle candidate with a network request' do
|
118
|
-
expect(episode).to receive(:best_subtitle).once.and_call_original
|
119
|
-
episode.download_best_subtitle!('fr')
|
120
|
-
expect(@page_stub).to have_been_requested
|
121
|
-
expect(@sub_stub).to have_been_requested
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'raises DownloadError when a network error happens' do
|
125
|
-
stub_request(:get, 'http://www.addic7ed.com/original/68018/4').to_timeout
|
126
|
-
expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::DownloadError
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'is called recursively' do
|
130
|
-
stub_request(:get, 'http://www.addic7ed.com/original/68018/4').to_return File.new('spec/responses/basic_redirection.http')
|
131
|
-
stub_request(:get, 'http://www.addic7ed.com/original/68018/4.redirected').to_return File.new('spec/responses/walking-dead-3-2-8_best_subtitle.http')
|
132
|
-
expect(episode).to receive(:download_best_subtitle!).twice.and_call_original
|
133
|
-
episode.download_best_subtitle!('fr')
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'raises HTTPError when stuck in a HTTP redirections loop' do
|
137
|
-
stub_request(:get, 'http://www.addic7ed.com/original/68018/4')
|
138
|
-
.to_return File.new('spec/responses/redirection_loop.http')
|
139
|
-
expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::HTTPError
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'creates a new file on disk' do
|
143
|
-
file = double('file')
|
144
|
-
expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.fr.srt', 'w').and_yield(file)
|
145
|
-
expect(file).to receive(:<<)
|
146
|
-
episode.download_best_subtitle!('fr')
|
147
|
-
end
|
148
|
-
|
149
|
-
context "when untagged option is set" do
|
150
|
-
let(:episode) { Addic7ed::Episode.new(@filename, true) }
|
151
|
-
|
152
|
-
it "does not include language code in subtitle filename" do
|
153
|
-
file = double('file')
|
154
|
-
expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.srt', 'w').and_yield(file)
|
155
|
-
expect(file).to receive(:<<)
|
156
|
-
episode.download_best_subtitle!('fr')
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'raises SubtitleCannotBeSaved when a disk error happens' do
|
161
|
-
expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.fr.srt', 'w').and_raise('Persmission denied')
|
162
|
-
expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::SubtitleCannotBeSaved
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "./lib/addic7ed"
|
3
|
-
|
4
|
-
describe Addic7ed::Addic7edCommentNormalizer do
|
5
|
-
def normalized_comment(comment)
|
6
|
-
described_class.call(comment)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "downcases everything" do
|
10
|
-
expect(normalized_comment("DiMENSiON")).to eq "dimension"
|
11
|
-
end
|
12
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "./lib/addic7ed"
|
3
|
-
|
4
|
-
describe Addic7ed::Addic7edVersionNormalizer do
|
5
|
-
def normalized_version(version)
|
6
|
-
described_class.call(version)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "upcases everything" do
|
10
|
-
expect(normalized_version("DiMENSiON")).to eq "DIMENSION"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "removes white spaces and line breaks and non-breaking spaces" do
|
14
|
-
expect(normalized_version(" \n DIMENSION \u00a0 ")).to eq "DIMENSION"
|
15
|
-
end
|
16
|
-
|
17
|
-
it "removes the filesize" do
|
18
|
-
expect(normalized_version("DIMENSION, 0.00 MBs")).to eq "DIMENSION"
|
19
|
-
end
|
20
|
-
|
21
|
-
it "removes heading or trailing dots" do
|
22
|
-
expect(normalized_version(".DIMENSION.")).to eq "DIMENSION"
|
23
|
-
end
|
24
|
-
|
25
|
-
it "removes heading or trailing whitespaces" do
|
26
|
-
expect(normalized_version(" DIMENSION ")).to eq "DIMENSION"
|
27
|
-
end
|
28
|
-
|
29
|
-
it "removes heading or trailing dashes" do
|
30
|
-
expect(normalized_version("-DIMENSION-")).to eq "DIMENSION"
|
31
|
-
end
|
32
|
-
|
33
|
-
it "removes '720p' tag" do
|
34
|
-
expect(normalized_version("720P DIMENSION")).to eq "DIMENSION"
|
35
|
-
end
|
36
|
-
|
37
|
-
it "removes '1080p' tag" do
|
38
|
-
expect(normalized_version("1080P DIMENSION")).to eq "DIMENSION"
|
39
|
-
end
|
40
|
-
|
41
|
-
it "removes 'HDTV' tag" do
|
42
|
-
expect(normalized_version("HDTV DIMENSION")).to eq "DIMENSION"
|
43
|
-
end
|
44
|
-
|
45
|
-
it "removes 'x264' tag" do
|
46
|
-
expect(normalized_version("X264 DIMENSION")).to eq "DIMENSION"
|
47
|
-
expect(normalized_version("X.264 DIMENSION")).to eq "DIMENSION"
|
48
|
-
end
|
49
|
-
|
50
|
-
it "removes 'PROPER' tag" do
|
51
|
-
expect(normalized_version("PROPER DIMENSION")).to eq "DIMENSION"
|
52
|
-
end
|
53
|
-
|
54
|
-
it "removes 'RERIP' tag" do
|
55
|
-
expect(normalized_version("RERIP DIMENSION")).to eq "DIMENSION"
|
56
|
-
end
|
57
|
-
|
58
|
-
it "removes 'INTERNAL' tag" do
|
59
|
-
expect(normalized_version("INTERNAL DIMENSION")).to eq "DIMENSION"
|
60
|
-
end
|
61
|
-
|
62
|
-
it "removes the 'Version' prefix" do
|
63
|
-
expect(normalized_version("Version DIMENSION")).to eq "DIMENSION"
|
64
|
-
end
|
65
|
-
|
66
|
-
it "removes combined tags" do
|
67
|
-
expect(normalized_version("Version 720P PROPER X264 HDTV DIMENSION")).to eq "DIMENSION"
|
68
|
-
end
|
69
|
-
|
70
|
-
it "supports multiple concatenated versions" do
|
71
|
-
expect(normalized_version("-TLA, -FoV")).to eq "TLA,FOV"
|
72
|
-
end
|
73
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "./lib/addic7ed"
|
3
|
-
|
4
|
-
describe Addic7ed::ShowList, ".url_segment_for" do
|
5
|
-
it "changes all spaces to underscores" do
|
6
|
-
expect(Addic7ed::ShowList.url_segment_for("The.Walking.Dead")).to eq "The_Walking_Dead"
|
7
|
-
end
|
8
|
-
|
9
|
-
it "wraps country code with parenthesis" do
|
10
|
-
expect(Addic7ed::ShowList.url_segment_for("Shameless.US")).to eq "Shameless_(US)"
|
11
|
-
expect(Addic7ed::ShowList.url_segment_for("Vikings.UK")).to eq "Vikings_(UK)"
|
12
|
-
end
|
13
|
-
|
14
|
-
it "is case-insensitive" do
|
15
|
-
expect(Addic7ed::ShowList.url_segment_for("shameless.us")).to eq "Shameless_(US)"
|
16
|
-
end
|
17
|
-
|
18
|
-
it "wraps production year with parenthesis" do
|
19
|
-
expect(Addic7ed::ShowList.url_segment_for("Vikings.2013")).to eq "Vikings_(2013)"
|
20
|
-
end
|
21
|
-
|
22
|
-
it "returns last show when production year is unspecified" do
|
23
|
-
expect(Addic7ed::ShowList.url_segment_for("Empire")).to eq "Empire_(2015)"
|
24
|
-
expect(Addic7ed::ShowList.url_segment_for("American.Crime")).to eq "American_Crime_(2015)"
|
25
|
-
end
|
26
|
-
|
27
|
-
it "handles when both country code and production year are present" do
|
28
|
-
expect(Addic7ed::ShowList.url_segment_for("Legacy.2013.UK")).to eq "Legacy_(2013)_(UK)"
|
29
|
-
end
|
30
|
-
|
31
|
-
it "handles when show name contains a quote" do
|
32
|
-
expect(Addic7ed::ShowList.url_segment_for("Greys.Anatomy")).to eq "Grey's_Anatomy"
|
33
|
-
end
|
34
|
-
|
35
|
-
it "handles when a show name contains dots" do
|
36
|
-
expect(Addic7ed::ShowList.url_segment_for("The.O.C.")).to eq "The_O.C."
|
37
|
-
end
|
38
|
-
|
39
|
-
it "raises a ShowNotFound error when no matching show is found" do
|
40
|
-
expect{Addic7ed::ShowList.url_segment_for("Not.an.existing.show")}.to raise_error Addic7ed::ShowNotFound
|
41
|
-
end
|
42
|
-
end
|
@@ -1,182 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "./lib/addic7ed"
|
3
|
-
|
4
|
-
describe Addic7ed::Subtitle, "#initialize" do
|
5
|
-
let(:version) { "Version DIMENSiON" }
|
6
|
-
let(:comment) { "Works for LOL" }
|
7
|
-
|
8
|
-
subject { described_class.new(version: version, comment: comment) }
|
9
|
-
|
10
|
-
it "normalizes Addic7ed version" do
|
11
|
-
expect(Addic7ed::Addic7edVersionNormalizer).to receive(:call).with(version)
|
12
|
-
subject
|
13
|
-
end
|
14
|
-
|
15
|
-
it "normalizes Addic7ed comment" do
|
16
|
-
expect(Addic7ed::Addic7edCommentNormalizer).to receive(:call).with(comment)
|
17
|
-
subject
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe Addic7ed::Subtitle, "#to_s" do
|
22
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION", language: "fr", status: "Completed", url: "http://some.fancy.url", via: "http://addic7ed.com", downloads: "42") }
|
23
|
-
|
24
|
-
it "prints a human readable version" do
|
25
|
-
expect(subtitle.to_s).to eq "http://some.fancy.url\t->\tDIMENSION (fr, Completed) [42 downloads] (via http://addic7ed.com)"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe Addic7ed::Subtitle, "#works_for?" do
|
30
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION") }
|
31
|
-
|
32
|
-
context "when it is incomplete" do
|
33
|
-
before { allow(subtitle).to receive(:is_completed?).and_return(false) }
|
34
|
-
|
35
|
-
it "returns false" do
|
36
|
-
expect(subtitle.works_for? "DIMENSION").to be false
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context "when it is completed" do
|
41
|
-
before { allow(subtitle).to receive(:is_completed?).and_return(true) }
|
42
|
-
|
43
|
-
it "returns true given the exact same version" do
|
44
|
-
expect(subtitle.works_for? "DIMENSION").to be true
|
45
|
-
end
|
46
|
-
|
47
|
-
it "returns true given a compatible version" do
|
48
|
-
expect(subtitle.works_for? "LOL").to be true
|
49
|
-
end
|
50
|
-
|
51
|
-
it "returns false given an incompatible version" do
|
52
|
-
expect(subtitle.works_for? "EVOLVE").to be false
|
53
|
-
end
|
54
|
-
|
55
|
-
context "when is has a compatibility comment" do
|
56
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION", comment: "Works with IMMERSE") }
|
57
|
-
|
58
|
-
it "returns true given the same version as comment" do
|
59
|
-
expect(subtitle.works_for? "IMMERSE").to be true
|
60
|
-
end
|
61
|
-
|
62
|
-
it "returns true given a compatible version as comment" do
|
63
|
-
expect(subtitle.works_for? "ASAP").to be true
|
64
|
-
end
|
65
|
-
|
66
|
-
it "returns false given an incompatible version as comment" do
|
67
|
-
expect(subtitle.works_for? "KILLERS").to be false
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context "when is has an incompatibility comment" do
|
72
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION", comment: "Doesn't work with IMMERSE") }
|
73
|
-
|
74
|
-
it "returns false" do
|
75
|
-
expect(subtitle.works_for? "IMMERSE").to be false
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "when is has an ambiguous comment" do
|
80
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION", comment: "Resync from IMMERSE") }
|
81
|
-
|
82
|
-
it "returns false" do
|
83
|
-
expect(subtitle.works_for? "IMMERSE").to be false
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context "when it has multiple versions" do
|
88
|
-
let(:subtitle) { Addic7ed::Subtitle.new(version: "FOV,TLA") }
|
89
|
-
|
90
|
-
it "returns true if it works for one of them" do
|
91
|
-
expect(subtitle.works_for? "TLA").to be true
|
92
|
-
expect(subtitle.works_for? "FOV").to be true
|
93
|
-
end
|
94
|
-
|
95
|
-
it "returns false when none of them work" do
|
96
|
-
expect(subtitle.works_for? "LOL").to be false
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
describe Addic7ed::Subtitle, "#can_replace?" do
|
103
|
-
let(:defaults) { {version: "DIMENSION", language: "fr", status: "Completed", downloads: "10"} }
|
104
|
-
let(:subtitle) { Addic7ed::Subtitle.new(defaults) }
|
105
|
-
let(:other_subtitle) { Addic7ed::Subtitle.new(defaults) }
|
106
|
-
|
107
|
-
context "when it is incomplete" do
|
108
|
-
before { allow(subtitle).to receive(:is_completed?).and_return(false) }
|
109
|
-
|
110
|
-
it "returns false" do
|
111
|
-
expect(subtitle.can_replace? other_subtitle).to be false
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context "when it is completed" do
|
116
|
-
before { allow(subtitle).to receive(:is_completed?).and_return(true) }
|
117
|
-
|
118
|
-
it "returns true given no other_subtitle" do
|
119
|
-
expect(subtitle.can_replace? nil).to be true
|
120
|
-
end
|
121
|
-
|
122
|
-
context "when other_subtitle has a different language" do
|
123
|
-
before { allow(other_subtitle).to receive(:language).and_return("en") }
|
124
|
-
|
125
|
-
it "returns false" do
|
126
|
-
expect(subtitle.can_replace? other_subtitle).to be false
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
context "when other_subtitle has an incompatible version" do
|
131
|
-
before { allow(subtitle).to receive(:is_compatible_with?).with(other_subtitle.version).and_return(false) }
|
132
|
-
|
133
|
-
it "returns false" do
|
134
|
-
expect(subtitle.can_replace? other_subtitle).to be false
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context "when other_subtitle is featured by Addic7ed" do
|
139
|
-
before { allow(other_subtitle).to receive(:is_featured?).and_return(true) }
|
140
|
-
|
141
|
-
it "returns false" do
|
142
|
-
expect(subtitle.can_replace? other_subtitle).to be false
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context "when other_subtitle has more downloads" do
|
147
|
-
before { allow(other_subtitle).to receive(:downloads).and_return(subtitle.downloads + 1) }
|
148
|
-
|
149
|
-
it "returns false" do
|
150
|
-
expect(subtitle.can_replace? other_subtitle).to be false
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
context "when other_subtitle has less downloads" do
|
155
|
-
before { allow(other_subtitle).to receive(:downloads).and_return(subtitle.downloads - 1) }
|
156
|
-
|
157
|
-
it "returns true" do
|
158
|
-
expect(subtitle.can_replace? other_subtitle).to be true
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
describe Addic7ed::Subtitle, "#is_featured?" do
|
165
|
-
it "returns true when 'via' is 'http://addic7ed.com'" do
|
166
|
-
expect(Addic7ed::Subtitle.new(via: 'http://addic7ed.com').is_featured?).to be true
|
167
|
-
end
|
168
|
-
|
169
|
-
it "returns false otherwise" do
|
170
|
-
expect(Addic7ed::Subtitle.new(via: 'anything else').is_featured?).to be false
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
describe Addic7ed::Subtitle, "#is_completed?" do
|
175
|
-
it "returns true when 'status' is 'Completed'" do
|
176
|
-
expect(Addic7ed::Subtitle.new(status: 'Completed').is_completed?).to be true
|
177
|
-
end
|
178
|
-
|
179
|
-
it "returns false otherwise" do
|
180
|
-
expect(Addic7ed::Subtitle.new(status: '80%').is_completed?).to be false
|
181
|
-
end
|
182
|
-
end
|