addic7ed 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dbf867829f89e180c8a9ea1ecaba686e5955f364
4
- data.tar.gz: d6584fb960b5ac97fb12f9b7997c542bc74334dd
3
+ metadata.gz: f7ec6d7d5e15148f20ab37ecd8c1fa41de36bbf3
4
+ data.tar.gz: 1f676080c6d49804e7607b952a62cb3a8e412b31
5
5
  SHA512:
6
- metadata.gz: 97bbcc17a3723d49f2cd9b42e7212018c41181aa8f1024dc73540576d0d98f64f3f8b2216e1d0ae3808e10839e1b46af2283da692db041faeeac5c6bd6c9b986
7
- data.tar.gz: d008f13a53e310a43fdc0bc3af5fe3643dfc424d660b587ddb18f911b7a581781c7bbedcff73d133e72ea9057bb5606ced8fdfd2fec9d26e2bf06515ab5f65b2
6
+ metadata.gz: 0d7613da70d67bbca0e9fc10698ce6856b8c5bf121e092614f4308141fdc324014d2d4977ca3dc83786a01eab1adb5088e42bf35bb8ea4ab65aece13cb58ffe6
7
+ data.tar.gz: 0d27c90a45c3d3c5beb71cf3da12e57a01139e14bc893f488b6a2ed589e6fda1d0f80b5f94b811e05f7410614581102be6a1defcb40cc36481343004fe9d8876
@@ -33,6 +33,10 @@ OptionParser.new do |opts|
33
33
  options[:force] = f
34
34
  end
35
35
 
36
+ opts.on("-u", "--untagged", "Do not include language code in subtitle filename") do |u|
37
+ options[:untagged] = u
38
+ end
39
+
36
40
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
37
41
  options[:verbose] = v
38
42
  end
@@ -77,7 +81,7 @@ options[:filenames].each do |filename|
77
81
  end
78
82
 
79
83
  begin
80
- ep = Addic7ed::Episode.new(filename)
84
+ ep = Addic7ed::Episode.new(filename, options[:untagged])
81
85
  puts "Searching subtitles for #{ep.filename.basename}" if options[:verbose]
82
86
  if File.file?(filename.gsub(/\.\w{3}$/, '.srt')) and not options[:force]
83
87
  puts "A subtitle already exists (#{filename.gsub(/\.\w{3}$/, '.srt')}). Skipping.".gsub(/^/, options[:verbose] ? ' ' : '') unless options[:quiet]
@@ -98,7 +102,7 @@ options[:filenames].each do |filename|
98
102
  puts " #{ep.best_subtitle(options[:language])}"
99
103
  end
100
104
  unless options[:nodownload]
101
- ep.download_best_subtitle!(options[:language])
105
+ ep.download_best_subtitle!(options[:language], options[:untagged])
102
106
  puts "New subtitle downloaded for #{filename}.\nEnjoy your show :-)".gsub(/^/, options[:verbose] ? ' ' : '') unless options[:quiet]
103
107
  end
104
108
  rescue Addic7ed::InvalidFilename
@@ -1,7 +1,7 @@
1
1
  require 'addic7ed/version'
2
2
  require 'addic7ed/common'
3
3
  require 'addic7ed/errors'
4
- require 'addic7ed/filename'
4
+ require 'addic7ed/video_file'
5
5
  require 'addic7ed/episode'
6
6
  require 'addic7ed/subtitle'
7
7
  require 'addic7ed/parser'
@@ -4,16 +4,17 @@ require 'open-uri'
4
4
  module Addic7ed
5
5
  class Episode
6
6
 
7
- attr_reader :filename
7
+ attr_reader :file, :untagged
8
8
 
9
- def initialize(filename)
10
- @filename = Addic7ed::Filename.new(filename)
9
+ def initialize(filename, untagged = false)
10
+ @file = Addic7ed::VideoFile.new(filename)
11
+ @untagged = untagged
11
12
  end
12
13
 
13
14
  def url(lang = 'fr')
14
15
  check_language_availability(lang)
15
16
  @localized_urls ||= {}
16
- @localized_urls[lang] ||= "http://www.addic7ed.com/serie/#{@filename.encoded_showname}/#{@filename.season}/#{@filename.episode}/#{LANGUAGES[lang][:id]}"
17
+ @localized_urls[lang] ||= "http://www.addic7ed.com/serie/#{file.encoded_showname}/#{file.season}/#{file.episode}/#{LANGUAGES[lang][:id]}"
17
18
  end
18
19
 
19
20
  def subtitles(lang = 'fr')
@@ -35,11 +36,11 @@ module Addic7ed
35
36
  if response.kind_of?(Net::HTTPRedirection)
36
37
  follow_redirection(lang, response['location'], http_redirect_limit)
37
38
  else
38
- save_subtitle response.body
39
+ save_subtitle(response.body, lang)
39
40
  end
40
41
  end
41
42
 
42
- protected
43
+ protected
43
44
 
44
45
  def find_subtitles(lang)
45
46
  initialize_language(lang)
@@ -50,7 +51,7 @@ module Addic7ed
50
51
  def find_best_subtitle(lang)
51
52
  @best_subtitle ||= {}
52
53
  subtitles(lang).each do |sub|
53
- @best_subtitle[lang] = sub if sub.works_for? @filename.group and sub.can_replace? @best_subtitle[lang]
54
+ @best_subtitle[lang] = sub if sub.works_for? file.group and sub.can_replace? @best_subtitle[lang]
54
55
  end
55
56
  raise NoSubtitleFound unless @best_subtitle[lang]
56
57
  end
@@ -83,8 +84,8 @@ module Addic7ed
83
84
  download_best_subtitle!(lang, http_redirect_limit - 1)
84
85
  end
85
86
 
86
- def save_subtitle(content)
87
- Kernel.open "#{filename}".gsub(/\.\w{3}$/, '.srt'), 'w' do |f|
87
+ def save_subtitle(content, lang)
88
+ Kernel.open "#{file}".gsub(/\.\w{3}$/, untagged ? ".srt" : ".#{lang}.srt"), 'w' do |f|
88
89
  f << content
89
90
  end
90
91
  rescue
@@ -17,7 +17,7 @@ module Addic7ed
17
17
  @subtitles
18
18
  end
19
19
 
20
- protected
20
+ protected
21
21
 
22
22
  def subtitles_page_dom
23
23
  response = Net::HTTP.get_response(URI(@episode.url(@lang)))
@@ -38,13 +38,14 @@ module Addic7ed
38
38
  end
39
39
 
40
40
  def parse_subtitle_node(sub_node)
41
- version = extract_version(sub_node)
42
- language = extract_language(sub_node)
43
- status = extract_status(sub_node)
44
- url = extract_url(sub_node)
45
- source = extract_source(sub_node)
46
- downloads = extract_downloads(sub_node)
47
- Addic7ed::Subtitle.new(version, language, status, url, source, downloads)
41
+ Addic7ed::Subtitle.new(
42
+ version: extract_version(sub_node),
43
+ language: extract_language(sub_node),
44
+ status: extract_status(sub_node),
45
+ url: extract_url(sub_node),
46
+ source: extract_source(sub_node),
47
+ downloads: extract_downloads(sub_node)
48
+ )
48
49
  end
49
50
 
50
51
  def extract_version(sub_node)
@@ -4,60 +4,65 @@ module Addic7ed
4
4
  attr_reader :version, :language, :status, :via, :downloads
5
5
  attr_accessor :url
6
6
 
7
- def initialize(version, language, status, url, via, downloads)
8
- @version = normalized_version(version)
9
- @language = language
10
- @status = status
11
- @url = url
12
- @via = via
13
- @downloads = downloads.to_i
7
+ def initialize(options = {})
8
+ @version = options[:version]
9
+ @language = options[:language]
10
+ @status = options[:status]
11
+ @url = options[:url]
12
+ @via = options[:via]
13
+ @downloads = options[:downloads].to_i || 0
14
+ normalize_version!
14
15
  end
15
16
 
16
17
  def to_s
17
- "#{url}\t->\t#{@version} (#{language}, #{status}) [#{@downloads} downloads]#{" (via #{via})" if @via}"
18
+ "#{url}\t->\t#{version} (#{language}, #{status}) [#{downloads} downloads]#{" (via #{via})" if via}"
18
19
  end
19
20
 
20
21
  def works_for?(version = '')
21
22
  is_completed? and is_compatible_with? version
22
23
  end
23
24
 
24
- def can_replace?(other_sub)
25
+ def can_replace?(other_subtitle)
25
26
  return false unless is_completed?
26
- return true if other_sub.nil?
27
- language == other_sub.language and
28
- is_compatible_with? other_sub.version and
29
- is_more_popular_than? other_sub
27
+ return true if other_subtitle.nil?
28
+ language == other_subtitle.language &&
29
+ is_compatible_with?(other_subtitle.version) &&
30
+ is_more_popular_than?(other_subtitle)
30
31
  end
31
32
 
32
- protected
33
-
34
- def normalized_version(version)
35
- version.
36
- gsub(/^Version */i, '').
37
- gsub(/720p/i, '').
38
- gsub(/hdtv/i, '').
39
- gsub(/proper/i, '').
40
- gsub(/rerip/i, '').
41
- gsub(/x\.?264/i, '').
42
- gsub(/^[- \.]*/, '').
43
- gsub(/[- \.]*$/, '').
44
- upcase
33
+ def is_featured?
34
+ via == "http://addic7ed.com"
45
35
  end
46
36
 
47
37
  def is_completed?
48
38
  status == 'Completed'
49
39
  end
50
40
 
41
+ protected
42
+
43
+ def normalize_version!
44
+ @version ||= ""
45
+ @version.gsub!(/^Version */i, '')
46
+ @version.gsub!(/720p/i, '')
47
+ @version.gsub!(/hdtv/i, '')
48
+ @version.gsub!(/proper/i, '')
49
+ @version.gsub!(/rerip/i, '')
50
+ @version.gsub!(/x\.?264/i, '')
51
+ @version.gsub!(/^[- \.]*/, '')
52
+ @version.gsub!(/[- \.]*$/, '')
53
+ @version.upcase!
54
+ end
55
+
51
56
  def is_compatible_with?(other_version)
52
- version == other_version or
53
- COMPATIBILITY_720P[version] == other_version or
54
- COMPATIBILITY_720P[other_version] == version
57
+ self.version == other_version ||
58
+ COMPATIBILITY_720P[self.version] == other_version ||
59
+ COMPATIBILITY_720P[other_version] == self.version
55
60
  end
56
61
 
57
- def is_more_popular_than?(other_sub)
58
- return true if other_sub.nil?
59
- return false if other_sub.via == 'http://addic7ed.com'
60
- return downloads > other_sub.downloads
62
+ def is_more_popular_than?(other_subtitle)
63
+ return true if other_subtitle.nil?
64
+ return false if other_subtitle.is_featured?
65
+ return self.downloads > other_subtitle.downloads
61
66
  end
62
67
 
63
68
  end
@@ -1,3 +1,3 @@
1
1
  module Addic7ed
2
- VERSION = '0.3.4'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -1,5 +1,5 @@
1
1
  module Addic7ed
2
- class Filename
2
+ class VideoFile
3
3
 
4
4
  TVSHOW_REGEX = /\A(?<showname>.*\w)[\[\. ]+S?(?<season>\d{1,2})[-\. ]?[EX]?(?<episode>\d{2})([-\. ]?[EX]?\d{2})*[\]\. ]+(?<tags>.*)-(?<group>\w*)(\.\w{3})?\z/i
5
5
 
@@ -32,15 +32,15 @@ module Addic7ed
32
32
  # Lazy getters
33
33
 
34
34
  def basename
35
- @basename ||= File.basename(@filename)
35
+ @basename ||= ::File.basename(@filename)
36
36
  end
37
37
 
38
38
  def dirname
39
- @dirname ||= File.dirname(@filename)
39
+ @dirname ||= ::File.dirname(@filename)
40
40
  end
41
41
 
42
42
  def extname
43
- @extname ||= File.extname(@filename)
43
+ @extname ||= ::File.extname(@filename)
44
44
  end
45
45
 
46
46
  def to_s
@@ -94,53 +94,64 @@ describe Addic7ed::Episode do
94
94
  end
95
95
 
96
96
  describe '#download_best_subtitle!' do
97
- before :each do
97
+ let(:episode) { Addic7ed::Episode.new(@filename) }
98
+
99
+ before do
98
100
  WebMock.reset!
99
101
  @page_stub = stub_request(:get, 'http://www.addic7ed.com/serie/The_Walking_Dead/3/2/8')
100
102
  .to_return File.new('spec/responses/walking-dead-3-2-8.http')
101
103
  @sub_stub = stub_request(:get, 'http://www.addic7ed.com/original/68018/4')
102
104
  .to_return File.new('spec/responses/walking-dead-3-2-8_best_subtitle.http')
103
- # The Episode object must be re-created between every test, since redirection may modify its URI
104
- @reset_episode = Addic7ed::Episode.new(@filename)
105
105
  # Prevent actual disk writing
106
106
  allow(Kernel).to receive(:open)
107
107
  end
108
108
 
109
109
  it 'gets the best subtitle candidate with a network request' do
110
- expect(@reset_episode).to receive(:best_subtitle).once.and_call_original
111
- @reset_episode.download_best_subtitle!('fr')
110
+ expect(episode).to receive(:best_subtitle).once.and_call_original
111
+ episode.download_best_subtitle!('fr')
112
112
  expect(@page_stub).to have_been_requested
113
113
  expect(@sub_stub).to have_been_requested
114
114
  end
115
115
 
116
116
  it 'raises DownloadError when a network error happens' do
117
117
  stub_request(:get, 'http://www.addic7ed.com/original/68018/4').to_timeout
118
- expect{ @reset_episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::DownloadError
118
+ expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::DownloadError
119
119
  end
120
120
 
121
121
  it 'is called recursively' do
122
122
  stub_request(:get, 'http://www.addic7ed.com/original/68018/4').to_return File.new('spec/responses/basic_redirection.http')
123
123
  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')
124
- expect(@reset_episode).to receive(:download_best_subtitle!).twice.and_call_original
125
- @reset_episode.download_best_subtitle!('fr')
124
+ expect(episode).to receive(:download_best_subtitle!).twice.and_call_original
125
+ episode.download_best_subtitle!('fr')
126
126
  end
127
127
 
128
128
  it 'raises HTTPError when stuck in a HTTP redirections loop' do
129
129
  stub_request(:get, 'http://www.addic7ed.com/original/68018/4')
130
130
  .to_return File.new('spec/responses/redirection_loop.http')
131
- expect{ @reset_episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::HTTPError
131
+ expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::HTTPError
132
132
  end
133
133
 
134
134
  it 'creates a new file on disk' do
135
135
  file = double('file')
136
- expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.srt', 'w').and_yield(file)
136
+ expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.fr.srt', 'w').and_yield(file)
137
137
  expect(file).to receive(:<<)
138
- @reset_episode.download_best_subtitle!('fr')
138
+ episode.download_best_subtitle!('fr')
139
+ end
140
+
141
+ context "when untagged option is set" do
142
+ let(:episode) { Addic7ed::Episode.new(@filename, true) }
143
+
144
+ it "does not include language code in subtitle filename" do
145
+ file = double('file')
146
+ expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.srt', 'w').and_yield(file)
147
+ expect(file).to receive(:<<)
148
+ episode.download_best_subtitle!('fr')
149
+ end
139
150
  end
140
151
 
141
152
  it 'raises SubtitleCannotBeSaved when a disk error happens' do
142
- expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.srt', 'w').and_raise('Persmission denied')
143
- expect{ @reset_episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::SubtitleCannotBeSaved
153
+ expect(Kernel).to receive(:open).with('The.Walking.Dead.S03E02.720p.HDTV.x264-EVOLVE.fr.srt', 'w').and_raise('Persmission denied')
154
+ expect{ episode.download_best_subtitle!('fr') }.to raise_error Addic7ed::SubtitleCannotBeSaved
144
155
  end
145
156
  end
146
157
  end
@@ -0,0 +1,167 @@
1
+ require "spec_helper"
2
+ require "./lib/addic7ed"
3
+
4
+ describe Addic7ed::Subtitle, "#normalize_version!" do
5
+ def normalized_version(version)
6
+ Addic7ed::Subtitle.new(version: version).version
7
+ end
8
+
9
+ it "upcases everything" do
10
+ expect(normalized_version("DiMENSiON")).to eq 'DIMENSION'
11
+ end
12
+
13
+ it "removes heading or trailing dots" do
14
+ expect(normalized_version(".DIMENSION.")).to eq 'DIMENSION'
15
+ end
16
+
17
+ it "removes heading or trailing whitespaces" do
18
+ expect(normalized_version(" DIMENSION ")).to eq 'DIMENSION'
19
+ end
20
+
21
+ it "removes heading or trailing dashes" do
22
+ expect(normalized_version("-DIMENSION-")).to eq 'DIMENSION'
23
+ end
24
+
25
+ it "removes '720p' tag" do
26
+ expect(normalized_version("720P DIMENSION")).to eq 'DIMENSION'
27
+ end
28
+
29
+ it "removes 'HDTV' tag" do
30
+ expect(normalized_version("HDTV DIMENSION")).to eq 'DIMENSION'
31
+ end
32
+
33
+ it "removes 'x264' tag" do
34
+ expect(normalized_version("X264 DIMENSION")).to eq 'DIMENSION'
35
+ expect(normalized_version("X.264 DIMENSION")).to eq 'DIMENSION'
36
+ end
37
+
38
+ it "removes 'PROPER' tag" do
39
+ expect(normalized_version("PROPER DIMENSION")).to eq 'DIMENSION'
40
+ end
41
+
42
+ it "removes 'RERIP' tag" do
43
+ expect(normalized_version("RERIP DIMENSION")).to eq 'DIMENSION'
44
+ end
45
+
46
+ it "removes the 'Version' prefix" do
47
+ expect(normalized_version("Version DIMENSION")).to eq 'DIMENSION'
48
+ end
49
+ end
50
+
51
+ describe Addic7ed::Subtitle, "#to_s" do
52
+ let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION", language: "fr", status: "Completed", url: "http://some.fancy.url", via: "http://addic7ed.com", downloads: "42") }
53
+
54
+ it "prints a human readable version" do
55
+ expect(subtitle.to_s).to eq "http://some.fancy.url\t->\tDIMENSION (fr, Completed) [42 downloads] (via http://addic7ed.com)"
56
+ end
57
+ end
58
+
59
+ describe Addic7ed::Subtitle, "#works_for?" do
60
+ let(:subtitle) { Addic7ed::Subtitle.new(version: "DIMENSION") }
61
+
62
+ context "when it is incomplete" do
63
+ before { allow(subtitle).to receive(:is_completed?).and_return(false) }
64
+
65
+ it "returns false" do
66
+ expect(subtitle.works_for? "DIMENSION").to be false
67
+ end
68
+ end
69
+
70
+ context "when it is completed" do
71
+ before { allow(subtitle).to receive(:is_completed?).and_return(true) }
72
+
73
+ it "returns true given the exact same version" do
74
+ expect(subtitle.works_for? "DIMENSION").to be true
75
+ end
76
+
77
+ it "returns true given a compatible version" do
78
+ expect(subtitle.works_for? "LOL").to be true
79
+ end
80
+
81
+ it "returns false given an incompatible version" do
82
+ expect(subtitle.works_for? "EVOLVE").to be false
83
+ end
84
+ end
85
+ end
86
+
87
+ describe Addic7ed::Subtitle, "#can_replace?" do
88
+ let(:defaults) { {version: "DIMENSION", language: "fr", status: "Completed", downloads: "10"} }
89
+ let(:subtitle) { Addic7ed::Subtitle.new(defaults) }
90
+ let(:other_subtitle) { Addic7ed::Subtitle.new(defaults) }
91
+
92
+ context "when it is incomplete" do
93
+ before { allow(subtitle).to receive(:is_completed?).and_return(false) }
94
+
95
+ it "returns false" do
96
+ expect(subtitle.can_replace? other_subtitle).to be false
97
+ end
98
+ end
99
+
100
+ context "when it is completed" do
101
+ before { allow(subtitle).to receive(:is_completed?).and_return(true) }
102
+
103
+ it "returns true given no other_subtitle" do
104
+ expect(subtitle.can_replace? nil).to be true
105
+ end
106
+
107
+ context "when other_subtitle has a different language" do
108
+ before { allow(other_subtitle).to receive(:language).and_return("en") }
109
+
110
+ it "returns false" do
111
+ expect(subtitle.can_replace? other_subtitle).to be false
112
+ end
113
+ end
114
+
115
+ context "when other_subtitle has an incompatible version" do
116
+ before { allow(subtitle).to receive(:is_compatible_with?).with(other_subtitle.version).and_return(false) }
117
+
118
+ it "returns false" do
119
+ expect(subtitle.can_replace? other_subtitle).to be false
120
+ end
121
+ end
122
+
123
+ context "when other_subtitle is featured by Addic7ed" do
124
+ before { allow(other_subtitle).to receive(:is_featured?).and_return(true) }
125
+
126
+ it "returns false" do
127
+ expect(subtitle.can_replace? other_subtitle).to be false
128
+ end
129
+ end
130
+
131
+ context "when other_subtitle has more downloads" do
132
+ before { allow(other_subtitle).to receive(:downloads).and_return(subtitle.downloads + 1) }
133
+
134
+ it "returns false" do
135
+ expect(subtitle.can_replace? other_subtitle).to be false
136
+ end
137
+ end
138
+
139
+ context "when other_subtitle has less downloads" do
140
+ before { allow(other_subtitle).to receive(:downloads).and_return(subtitle.downloads - 1) }
141
+
142
+ it "returns true" do
143
+ expect(subtitle.can_replace? other_subtitle).to be true
144
+ end
145
+ end
146
+ end
147
+ end
148
+
149
+ describe Addic7ed::Subtitle, "#is_featured?" do
150
+ it "returns true when 'via' is 'http://addic7ed.com'" do
151
+ expect(Addic7ed::Subtitle.new(via: 'http://addic7ed.com').is_featured?).to be true
152
+ end
153
+
154
+ it "returns false otherwise" do
155
+ expect(Addic7ed::Subtitle.new(via: 'anything else').is_featured?).to be false
156
+ end
157
+ end
158
+
159
+ describe Addic7ed::Subtitle, "#is_completed?" do
160
+ it "returns true when 'status' is 'Completed'" do
161
+ expect(Addic7ed::Subtitle.new(status: 'Completed').is_completed?).to be true
162
+ end
163
+
164
+ it "returns false otherwise" do
165
+ expect(Addic7ed::Subtitle.new(status: '80%').is_completed?).to be false
166
+ end
167
+ end
@@ -0,0 +1,189 @@
1
+ require 'spec_helper'
2
+ require './lib/addic7ed'
3
+
4
+ describe Addic7ed::VideoFile do
5
+ let(:file) { Addic7ed::VideoFile.new(filename) }
6
+
7
+ shared_examples "a media file" do |filename, expected_show_name|
8
+ let(:filename) { filename }
9
+
10
+ it "it detects successfully" do
11
+ expect(file.showname).to eq (expected_show_name || 'Showname')
12
+ expect(file.season ).to eq 2
13
+ expect(file.episode ).to eq 1
14
+ expect(file.tags ).to eq ['720P', 'HDTV', 'X264']
15
+ expect(file.group ).to eq 'GROUP'
16
+ end
17
+ end
18
+
19
+ shared_examples "an unknown file" do |filename|
20
+ let(:filename) { filename }
21
+
22
+ it "raises an error" do
23
+ expect{file}.to raise_error Addic7ed::InvalidFilename
24
+ end
25
+ end
26
+
27
+ describe "#initialize" do
28
+ context "with regular notation" do
29
+ it_behaves_like "a media file", "Showname.S02E01.720p.HDTV.x264-GROUP.mkv"
30
+ end
31
+
32
+ context "with x notation" do
33
+ it_behaves_like "a media file", "Showname.02x01.720p.HDTV.x264-GROUP.mkv"
34
+ end
35
+
36
+ context 'with 3-digits notation' do
37
+ it_behaves_like "a media file", "Showname.201.720p.HDTV.x264-GROUP.mkv"
38
+ end
39
+
40
+ context 'with brackets notation' do
41
+ it_behaves_like "a media file", "Showname.[S02E01].720p.HDTV.x264-GROUP.mkv"
42
+ end
43
+
44
+ context 'with brackets and x notation' do
45
+ it_behaves_like "a media file", "Showname.[2x01].720p.HDTV.x264-GROUP.mkv"
46
+ end
47
+
48
+ context 'with brackets and 3-digits notation' do
49
+ it_behaves_like "a media file", "Showname.[201].720p.HDTV.x264-GROUP.mkv"
50
+ end
51
+
52
+ context 'with brackets and x notation and space separator' do
53
+ it_behaves_like "a media file", "Showname [2x01] 720p.HDTV.x264-GROUP.mkv"
54
+ end
55
+
56
+ context 'with brackets and 3-digits notation and space separator' do
57
+ it_behaves_like "a media file", "Showname [201] 720p.HDTV.x264-GROUP.mkv"
58
+ end
59
+
60
+ context 'with lowercase filename' do
61
+ it_behaves_like "a media file", "showname.s02e01.720p.HDTV.x264-group.mkv", "showname"
62
+ end
63
+
64
+ context 'with multiple words in show name' do
65
+ it_behaves_like "a media file", "Show.Name.S02E01.720p.HDTV.x264-GROUP.mkv", "Show Name"
66
+ end
67
+
68
+ context 'with multiple words in show name separated by spaces' do
69
+ it_behaves_like "a media file", "Show Name.S02E01.720p.HDTV.x264-GROUP.mkv", "Show Name"
70
+ end
71
+
72
+ context 'with only numbers in show name' do
73
+ it_behaves_like "a media file", "42.S02E01.720p.HDTV.x264-GROUP.mkv", "42"
74
+ end
75
+
76
+ context "with production year" do
77
+ it_behaves_like "a media file", "Showname.2014.S02E01.720p.HDTV.x264-GROUP.mkv", "Showname 2014"
78
+ end
79
+
80
+ context "with a full path" do
81
+ it_behaves_like "a media file", "/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv"
82
+ end
83
+
84
+ context "with a relative path" do
85
+ it_behaves_like "a media file", "../path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv"
86
+ end
87
+
88
+ context "without extension" do
89
+ it_behaves_like "a media file", "Showname.S02E01.720p.HDTV.x264-GROUP"
90
+ end
91
+
92
+ context "with a double episode" do
93
+ it_behaves_like "a media file", "Showname.S02E0102.720p.HDTV.x264-GROUP.mkv"
94
+ end
95
+
96
+ context "with a double episode" do
97
+ it_behaves_like "a media file", "Showname.S02E01E02.720p.HDTV.x264-GROUP.mkv"
98
+ end
99
+
100
+ context "with a double episode with dash separator" do
101
+ it_behaves_like "a media file", "Showname.S02E01-02.720p.HDTV.x264-GROUP.mkv"
102
+ end
103
+
104
+ context "with no showname" do
105
+ it_behaves_like "an unknown file", ".S02E01.720p.HDTV.x264-GROUP.mkv"
106
+ end
107
+
108
+ context "with no season number" do
109
+ it_behaves_like "an unknown file", "Showname.E01.720p.HDTV.x264-GROUP.mkv"
110
+ end
111
+
112
+ context "with no episode number" do
113
+ it_behaves_like "an unknown file", "Showname.S02.720p.HDTV.x264-GROUP.mkv"
114
+ end
115
+
116
+ context "with no tag" do
117
+ it_behaves_like "an unknown file", "Showname.S02E01-GROUP.mkv"
118
+ end
119
+
120
+ context "with no group" do
121
+ it_behaves_like "an unknown file", "Showname.S02E01.720p.HDTV.x264.mkv"
122
+ end
123
+ end
124
+
125
+ describe '#encoded_filename' do
126
+ it 'changes all spaces to underscores' do
127
+ expect(Addic7ed::VideoFile.new("Show Name.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Show_Name'
128
+ end
129
+
130
+ it 'wraps country code with parenthesis' do
131
+ expect(Addic7ed::VideoFile.new("Showname.US.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname_(US)'
132
+ end
133
+
134
+ it 'detects country code even in lowercase' do
135
+ expect(Addic7ed::VideoFile.new("showname.us.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'showname_(us)'
136
+ end
137
+
138
+ it "removes country code for the original show when it's UK" do
139
+ expect(Addic7ed::VideoFile.new("Showname.UK.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname'
140
+ end
141
+
142
+ it 'removes production year' do
143
+ expect(Addic7ed::VideoFile.new("Showname.2014.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname'
144
+ end
145
+
146
+ it 'handles when both country code and production year are present' do
147
+ expect(Addic7ed::VideoFile.new("Showname.2014.UK.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname'
148
+ expect(Addic7ed::VideoFile.new("Showname.UK.2014.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname'
149
+ expect(Addic7ed::VideoFile.new("Showname.2014.US.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname_(US)'
150
+ expect(Addic7ed::VideoFile.new("Showname.US.2014.S02E01.720p.HDTV.x264-GROUP.mkv").encoded_showname).to eq 'Showname_(US)'
151
+ end
152
+ end
153
+
154
+ describe '#basename' do
155
+ it 'returns only file name given a full path' do
156
+ expect(Addic7ed::VideoFile.new("/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv").basename).to eq "Showname.S02E01.720p.HDTV.x264-GROUP.mkv"
157
+ end
158
+ end
159
+
160
+ describe '#dirname' do
161
+ it 'returns only path given a full path' do
162
+ expect(Addic7ed::VideoFile.new("/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv").dirname).to eq '/full/path/to'
163
+ end
164
+ end
165
+
166
+ describe '#extname' do
167
+ it 'returns only file extension given a full path' do
168
+ expect(Addic7ed::VideoFile.new("/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv").extname).to eq '.mkv'
169
+ end
170
+ end
171
+
172
+ describe '#to_s' do
173
+ it 'returns file name as a string' do
174
+ expect(Addic7ed::VideoFile.new("/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv").to_s).to eq "/full/path/to/Showname.S02E01.720p.HDTV.x264-GROUP.mkv"
175
+ end
176
+ end
177
+
178
+ describe '#inspect' do
179
+ it 'prints a human-readable detailed version' do
180
+ expect(Addic7ed::VideoFile.new("Showname.S02E01.720p.HDTV.x264-GROUP.mkv").inspect).to eq(
181
+ 'Guesses for Showname.S02E01.720p.HDTV.x264-GROUP.mkv:
182
+ show: Showname
183
+ season: 2
184
+ episode: 1
185
+ tags: ["720P", "HDTV", "X264"]
186
+ group: GROUP')
187
+ end
188
+ end
189
+ end
@@ -4,6 +4,8 @@ unless RUBY_ENGINE == 'rbx'
4
4
  end
5
5
 
6
6
  require 'webmock/rspec'
7
+ require 'pry'
8
+
7
9
  WebMock.disable_net_connect!(allow_localhost: true)
8
10
 
9
11
  RSpec.configure do |config|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: addic7ed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Baudino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-09 00:00:00.000000000 Z
11
+ date: 2015-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: nokogiri
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -79,14 +93,14 @@ files:
79
93
  - lib/addic7ed/common.rb
80
94
  - lib/addic7ed/episode.rb
81
95
  - lib/addic7ed/errors.rb
82
- - lib/addic7ed/filename.rb
83
96
  - lib/addic7ed/parser.rb
84
97
  - lib/addic7ed/subtitle.rb
85
98
  - lib/addic7ed/version.rb
86
- - spec/addic7ed-common_spec.rb
87
- - spec/addic7ed-episode_spec.rb
88
- - spec/addic7ed-filename_spec.rb
89
- - spec/addic7ed-subtitle_spec.rb
99
+ - lib/addic7ed/video_file.rb
100
+ - spec/lib/addic7ed/common_spec.rb
101
+ - spec/lib/addic7ed/episode_spec.rb
102
+ - spec/lib/addic7ed/subtitle_spec.rb
103
+ - spec/lib/addic7ed/video_file_spec.rb
90
104
  - spec/responses/basic_redirection.http
91
105
  - spec/responses/redirection_loop.http
92
106
  - spec/responses/walking-dead-3-2-1.http
@@ -117,15 +131,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
131
  version: '0'
118
132
  requirements: []
119
133
  rubyforge_project:
120
- rubygems_version: 2.2.2
134
+ rubygems_version: 2.4.5
121
135
  signing_key:
122
136
  specification_version: 4
123
137
  summary: Addic7ed auto-downloader
124
138
  test_files:
125
- - spec/addic7ed-common_spec.rb
126
- - spec/addic7ed-episode_spec.rb
127
- - spec/addic7ed-filename_spec.rb
128
- - spec/addic7ed-subtitle_spec.rb
139
+ - spec/lib/addic7ed/common_spec.rb
140
+ - spec/lib/addic7ed/episode_spec.rb
141
+ - spec/lib/addic7ed/subtitle_spec.rb
142
+ - spec/lib/addic7ed/video_file_spec.rb
129
143
  - spec/responses/basic_redirection.http
130
144
  - spec/responses/redirection_loop.http
131
145
  - spec/responses/walking-dead-3-2-1.http
@@ -1,309 +0,0 @@
1
- require 'spec_helper'
2
- require './lib/addic7ed'
3
-
4
- describe Addic7ed::Filename do
5
- before :all do
6
- # Valid filenames
7
- @filename = 'Californication.S06E07.720p.HDTV.x264-2HD.mkv'
8
- @filename_x = 'Californication.06x07.720p.HDTV.x264-2HD.mkv'
9
- @filename_3digits = 'Californication.607.720p.HDTV.x264-2HD.mkv'
10
- @filename_brackets = 'Californication.[S06E07].720p.HDTV.x264-2HD.mkv'
11
- @filename_x_brackets = 'Californication.[6x07].720p.HDTV.x264-2HD.mkv'
12
- @filename_3digits_brackets = 'Californication.[607].720p.HDTV.x264-2HD.mkv'
13
- @filename_brackets_spaces = 'Californication [607] 720p.HDTV.x264-2HD.mkv'
14
- @filename_x_brackets_spaces = 'Californication [6x07] 720p.HDTV.x264-2HD.mkv'
15
- @filename_3digits_brackets_spaces = 'Californication [607] 720p.HDTV.x264-2HD.mkv'
16
- @filename_lowercase = 'californication.s06e07.720p.hdtv.x264-2hd.mkv'
17
- @filename_lowercase_x = 'californication.6x07.720p.hdtv.x264-2hd.mkv'
18
- @filename_multiple_words = 'The.Walking.Dead.S03E11.720p.HDTV.x264-EVOLVE.mkv'
19
- @filename_multiple_words_spaces = 'The Walking Dead S03E11 720p.HDTV.x264-EVOLVE.mkv'
20
- @filename_numbers_only = '90210.S05E12.720p.HDTV.X264-DIMENSION.mkv'
21
- @filename_showname_year = 'The.Americans.2013.S01E04.720p.HDTV.X264-DIMENSION.mkv'
22
- @filename_full_path = '/data/public/Series/Californication/Saison 06/Californication.S06E07.720p.HDTV.x264-2HD.mkv'
23
- @filename_relative_path = '../Saison 06/Californication.S06E07.720p.HDTV.x264-2HD.mkv'
24
- @filename_no_extension = 'Californication.S06E07.720p.HDTV.x264-2HD'
25
- @filename_double_episode = 'Revenge.S02E21E22.720p.HDTV.X264-DIMENSION.mkv'
26
- @filename_double_episode_with_dash = 'Revenge.S02E21-22.720p.HDTV.X264-DIMENSION.mkv'
27
- # Invalid filenames
28
- @filename_no_showname = '.S06E07.720p.HDTV.x264-2HD.mkv'
29
- @filename_no_season = 'Californication.E07.720p.HDTV.x264-2HD.mkv'
30
- @filename_no_episode = 'Californication.S06.720p.HDTV.x264-2HD.mkv'
31
- @filename_no_tags = 'Californication.S06E07.2HD.mkv'
32
- @filename_no_group = 'Californication.S06E07.720p.HDTV.x264.mkv'
33
- # Filename with special tags
34
- @filename_showname_US = 'Shameless.US.S03E06.720p.HDTV.x264-IMMERSE.mkv'
35
- @filename_showname_UK = 'Shameless.UK.S09E11.720p.HDTV.x264-TLA.mkv'
36
- @filename_showname_US_lowercase = 'shameless.us.s04e01.720p.hdtv.x264-2hd.mkv'
37
- @filename_showname_UK_year = 'The.Hour.UK.2011.S01E03.REPACK.HDTV.XviD-FoV.avi'
38
- @filename_showname_year_UK = 'The.Hour.2011.UK.S01E03.REPACK.HDTV.XviD-FoV.avi'
39
- @filename_showname_US_year = 'The.Hour.US.2011.S01E03.REPACK.HDTV.XviD-FoV.avi'
40
- @filename_showname_year_US = 'The.Hour.2011.US.S01E03.REPACK.HDTV.XviD-FoV.avi'
41
- end
42
-
43
- describe '#initialize' do
44
- it 'succeeds given valid argument' do
45
- expect{ @file = Addic7ed::Filename.new(@filename) }.to_not raise_error
46
- expect(@file.showname).to eq 'Californication'
47
- expect(@file.season ).to eq 6
48
- expect(@file.episode ).to eq 7
49
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
50
- expect(@file.group ).to eq '2HD'
51
- end
52
-
53
- it 'succeeds given filename with x notation' do
54
- expect{ @file = Addic7ed::Filename.new(@filename_x) }.to_not raise_error
55
- expect(@file.showname).to eq 'Californication'
56
- expect(@file.season ).to eq 6
57
- expect(@file.episode ).to eq 7
58
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
59
- expect(@file.group ).to eq '2HD'
60
- end
61
-
62
- it 'succeeds given filename with 3-digits notation' do
63
- expect{ @file = Addic7ed::Filename.new(@filename_3digits) }.to_not raise_error
64
- expect(@file.showname).to eq 'Californication'
65
- expect(@file.season ).to eq 6
66
- expect(@file.episode ).to eq 7
67
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
68
- expect(@file.group ).to eq '2HD'
69
- end
70
-
71
- it 'succeeds given filename with brackets notation' do
72
- expect{ @file = Addic7ed::Filename.new(@filename_brackets) }.to_not raise_error
73
- expect(@file.showname).to eq 'Californication'
74
- expect(@file.season ).to eq 6
75
- expect(@file.episode ).to eq 7
76
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
77
- expect(@file.group ).to eq '2HD'
78
- end
79
-
80
- it 'succeeds given filename with brackets and x notation' do
81
- expect{ @file = Addic7ed::Filename.new(@filename_x_brackets) }.to_not raise_error
82
- expect(@file.showname).to eq 'Californication'
83
- expect(@file.season ).to eq 6
84
- expect(@file.episode ).to eq 7
85
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
86
- expect(@file.group ).to eq '2HD'
87
- end
88
-
89
- it 'succeeds given filename with brackets and 3-digits notation' do
90
- expect{ @file = Addic7ed::Filename.new(@filename_3digits_brackets) }.to_not raise_error
91
- expect(@file.showname).to eq 'Californication'
92
- expect(@file.season ).to eq 6
93
- expect(@file.episode ).to eq 7
94
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
95
- expect(@file.group ).to eq '2HD'
96
- end
97
-
98
- it 'succeeds given filename with brackets notation and space separator' do
99
- expect{ @file = Addic7ed::Filename.new(@filename_brackets_spaces) }.to_not raise_error
100
- expect(@file.showname).to eq 'Californication'
101
- expect(@file.season ).to eq 6
102
- expect(@file.episode ).to eq 7
103
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
104
- expect(@file.group ).to eq '2HD'
105
- end
106
-
107
- it 'succeeds given filename with brackets and x notation and space separator' do
108
- expect{ @file = Addic7ed::Filename.new(@filename_x_brackets_spaces) }.to_not raise_error
109
- expect(@file.showname).to eq 'Californication'
110
- expect(@file.season ).to eq 6
111
- expect(@file.episode ).to eq 7
112
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
113
- expect(@file.group ).to eq '2HD'
114
- end
115
-
116
- it 'succeeds given filename with brackets and 3-digits notation and space separator' do
117
- expect{ @file = Addic7ed::Filename.new(@filename_3digits_brackets_spaces) }.to_not raise_error
118
- expect(@file.showname).to eq 'Californication'
119
- expect(@file.season ).to eq 6
120
- expect(@file.episode ).to eq 7
121
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
122
- expect(@file.group ).to eq '2HD'
123
- end
124
-
125
- it 'succeeds given lowercase filename' do
126
- expect{ @file = Addic7ed::Filename.new(@filename_lowercase) }.to_not raise_error
127
- expect(@file.showname).to eq 'californication'
128
- expect(@file.season ).to eq 6
129
- expect(@file.episode ).to eq 7
130
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
131
- expect(@file.group ).to eq '2HD'
132
- end
133
-
134
- it 'succeeds given lowercase filename with x notation' do
135
- expect{ @file = Addic7ed::Filename.new(@filename_lowercase_x) }.to_not raise_error
136
- expect(@file.showname).to eq 'californication'
137
- expect(@file.season ).to eq 6
138
- expect(@file.episode ).to eq 7
139
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
140
- expect(@file.group ).to eq '2HD'
141
- end
142
-
143
- it 'succeeds given filename with showname containing multiple words' do
144
- expect{ @file = Addic7ed::Filename.new(@filename_multiple_words) }.to_not raise_error
145
- expect(@file.showname).to eq 'The Walking Dead'
146
- expect(@file.season ).to eq 3
147
- expect(@file.episode ).to eq 11
148
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
149
- expect(@file.group ).to eq 'EVOLVE'
150
- end
151
-
152
- it 'succeeds given filename with showname containing multiple words with space separator' do
153
- expect{ @file = Addic7ed::Filename.new(@filename_multiple_words_spaces) }.to_not raise_error
154
- expect(@file.showname).to eq 'The Walking Dead'
155
- expect(@file.season ).to eq 3
156
- expect(@file.episode ).to eq 11
157
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
158
- expect(@file.group ).to eq 'EVOLVE'
159
- end
160
-
161
- it 'succeeds given filename with showname containing only numbers' do
162
- expect{ @file = Addic7ed::Filename.new(@filename_numbers_only) }.to_not raise_error
163
- expect(@file.showname).to eq '90210'
164
- expect(@file.season ).to eq 5
165
- expect(@file.episode ).to eq 12
166
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
167
- expect(@file.group ).to eq 'DIMENSION'
168
- end
169
-
170
- it 'succeeds given filename with showname containing production year' do
171
- expect{ @file = Addic7ed::Filename.new(@filename_showname_year) }.to_not raise_error
172
- expect(@file.showname).to eq 'The Americans 2013'
173
- expect(@file.season ).to eq 1
174
- expect(@file.episode ).to eq 4
175
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
176
- expect(@file.group ).to eq 'DIMENSION'
177
- end
178
-
179
- it 'succeeds given filename containing full path' do
180
- expect{ @file = Addic7ed::Filename.new(@filename_full_path) }.to_not raise_error
181
- expect(@file.showname).to eq 'Californication'
182
- expect(@file.season ).to eq 6
183
- expect(@file.episode ).to eq 7
184
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
185
- expect(@file.group ).to eq '2HD'
186
- end
187
-
188
- it 'succeeds given filename containing relative path' do
189
- expect{ @file = Addic7ed::Filename.new(@filename_relative_path) }.to_not raise_error
190
- expect(@file.showname).to eq 'Californication'
191
- expect(@file.season ).to eq 6
192
- expect(@file.episode ).to eq 7
193
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
194
- expect(@file.group ).to eq '2HD'
195
- end
196
-
197
- it 'succeeds given filename containing no extension' do
198
- expect{ @file = Addic7ed::Filename.new(@filename_no_extension) }.to_not raise_error
199
- expect(@file.showname).to eq 'Californication'
200
- expect(@file.season ).to eq 6
201
- expect(@file.episode ).to eq 7
202
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
203
- expect(@file.group ).to eq '2HD'
204
- end
205
-
206
- it 'succeeds given filename which is a double episode' do
207
- expect{ @file = Addic7ed::Filename.new(@filename_double_episode) }.to_not raise_error
208
- expect(@file.showname).to eq 'Revenge'
209
- expect(@file.season ).to eq 2
210
- expect(@file.episode ).to eq 21
211
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
212
- expect(@file.group ).to eq 'DIMENSION'
213
- end
214
-
215
- it 'succeeds given filename which is a double episode (with a dash)' do
216
- expect{ @file = Addic7ed::Filename.new(@filename_double_episode_with_dash) }.to_not raise_error
217
- expect(@file.showname).to eq 'Revenge'
218
- expect(@file.season ).to eq 2
219
- expect(@file.episode ).to eq 21
220
- expect(@file.tags ).to eq ['720P', 'HDTV', 'X264']
221
- expect(@file.group ).to eq 'DIMENSION'
222
- end
223
-
224
- it 'fails given filename with no showname' do
225
- expect{ Addic7ed::Filename.new(@filename_no_showname) }.to raise_error Addic7ed::InvalidFilename
226
- end
227
-
228
- it 'fails given filename with no season number' do
229
- expect{ Addic7ed::Filename.new(@filename_no_season) }.to raise_error Addic7ed::InvalidFilename
230
- end
231
-
232
- it 'raises InvalidFilename given filename with no episode number' do
233
- expect{ Addic7ed::Filename.new(@filename_no_episode) }.to raise_error Addic7ed::InvalidFilename
234
- end
235
-
236
- it 'raises InvalidFilename given filename with no tags' do
237
- expect{ Addic7ed::Filename.new(@filename_no_tags) }.to raise_error Addic7ed::InvalidFilename
238
- end
239
-
240
- it 'raises InvalidFilename given filename with no group' do
241
- expect{ Addic7ed::Filename.new(@filename_no_group) }.to raise_error Addic7ed::InvalidFilename
242
- end
243
- end
244
-
245
- describe '#encoded_filename' do
246
- it 'changes all spaces to underscores' do
247
- expect(Addic7ed::Filename.new(@filename_multiple_words).encoded_showname).to eq 'The_Walking_Dead'
248
- end
249
-
250
- it 'wraps country code with parenthesis' do
251
- expect(Addic7ed::Filename.new(@filename_showname_US).encoded_showname).to eq 'Shameless_(US)'
252
- end
253
-
254
- it 'detects country code even in lowercase' do
255
- expect(Addic7ed::Filename.new(@filename_showname_US_lowercase).encoded_showname).to eq 'shameless_(us)'
256
- end
257
-
258
- it 'removes country code for the original show (usually UK)' do
259
- expect(Addic7ed::Filename.new(@filename_showname_UK).encoded_showname).to eq 'Shameless'
260
- end
261
-
262
- it 'removes production year' do
263
- expect(Addic7ed::Filename.new(@filename_showname_year).encoded_showname).to eq 'The_Americans'
264
- end
265
-
266
- it 'handles when both country code and production year are present' do
267
- expect(Addic7ed::Filename.new(@filename_showname_UK_year).encoded_showname).to eq 'The_Hour'
268
- expect(Addic7ed::Filename.new(@filename_showname_year_UK).encoded_showname).to eq 'The_Hour'
269
- expect(Addic7ed::Filename.new(@filename_showname_US_year).encoded_showname).to eq 'The_Hour_(US)'
270
- expect(Addic7ed::Filename.new(@filename_showname_year_US).encoded_showname).to eq 'The_Hour_(US)'
271
- end
272
- end
273
-
274
- describe '#basename' do
275
- it 'returns only file name given a full path' do
276
- expect(Addic7ed::Filename.new(@filename_full_path).basename).to eq 'Californication.S06E07.720p.HDTV.x264-2HD.mkv'
277
- end
278
- end
279
-
280
- describe '#dirname' do
281
- it 'returns only path given a full path' do
282
- expect(Addic7ed::Filename.new(@filename_full_path).dirname).to eq '/data/public/Series/Californication/Saison 06'
283
- end
284
- end
285
-
286
- describe '#extname' do
287
- it 'returns only file extension given a full path' do
288
- expect(Addic7ed::Filename.new(@filename_full_path).extname).to eq '.mkv'
289
- end
290
- end
291
-
292
- describe '#to_s' do
293
- it 'returns file name as a string' do
294
- expect(Addic7ed::Filename.new(@filename_full_path).to_s).to eq '/data/public/Series/Californication/Saison 06/Californication.S06E07.720p.HDTV.x264-2HD.mkv'
295
- end
296
- end
297
-
298
- describe '#inspect' do
299
- it 'prints a human-readable detailed version' do
300
- expect(Addic7ed::Filename.new(@filename).inspect).to eq(
301
- 'Guesses for Californication.S06E07.720p.HDTV.x264-2HD.mkv:
302
- show: Californication
303
- season: 6
304
- episode: 7
305
- tags: ["720P", "HDTV", "X264"]
306
- group: 2HD')
307
- end
308
- end
309
- end
@@ -1,155 +0,0 @@
1
- require 'spec_helper'
2
- require './lib/addic7ed'
3
-
4
- describe Addic7ed::Subtitle do
5
- describe '#normalized_version' do
6
- it 'upcases the version string' do
7
- expect(Addic7ed::Subtitle.new('DiMENSiON', '', '', '', '', '0').version).to eq 'DIMENSION'
8
- end
9
-
10
- it 'removes heading and trailing dots' do
11
- expect(Addic7ed::Subtitle.new('.DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
12
- expect(Addic7ed::Subtitle.new('DIMENSION.', '', '', '', '', '0').version).to eq 'DIMENSION'
13
- expect(Addic7ed::Subtitle.new('.DIMENSION.', '', '', '', '', '0').version).to eq 'DIMENSION'
14
- end
15
-
16
- it 'removes heading and trailing whitespaces' do
17
- expect(Addic7ed::Subtitle.new(' DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
18
- expect(Addic7ed::Subtitle.new('DIMENSION ', '', '', '', '', '0').version).to eq 'DIMENSION'
19
- expect(Addic7ed::Subtitle.new(' DIMENSION ', '', '', '', '', '0').version).to eq 'DIMENSION'
20
- end
21
-
22
- it 'removes heading and trailing dashes' do
23
- expect(Addic7ed::Subtitle.new('-DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
24
- expect(Addic7ed::Subtitle.new('DIMENSION-', '', '', '', '', '0').version).to eq 'DIMENSION'
25
- expect(Addic7ed::Subtitle.new('-DIMENSION-', '', '', '', '', '0').version).to eq 'DIMENSION'
26
- end
27
-
28
- it 'automatically removes "720p" in version string' do
29
- expect(Addic7ed::Subtitle.new('720p DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
30
- expect(Addic7ed::Subtitle.new('720P DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
31
- expect(Addic7ed::Subtitle.new('DIMENSION 720p', '', '', '', '', '0').version).to eq 'DIMENSION'
32
- expect(Addic7ed::Subtitle.new('DIMENSION 720P', '', '', '', '', '0').version).to eq 'DIMENSION'
33
- end
34
-
35
- it 'automatically removes "HDTV" in version string' do
36
- expect(Addic7ed::Subtitle.new('hdtv DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
37
- expect(Addic7ed::Subtitle.new('HDTV DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
38
- expect(Addic7ed::Subtitle.new('DIMENSION hdtv', '', '', '', '', '0').version).to eq 'DIMENSION'
39
- expect(Addic7ed::Subtitle.new('DIMENSION HDTV', '', '', '', '', '0').version).to eq 'DIMENSION'
40
- end
41
-
42
- it 'automatically removes "x264" in version string' do
43
- expect(Addic7ed::Subtitle.new('x264 DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
44
- expect(Addic7ed::Subtitle.new('X264 DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
45
- expect(Addic7ed::Subtitle.new('x.264 DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
46
- expect(Addic7ed::Subtitle.new('X.264 DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
47
- expect(Addic7ed::Subtitle.new('DIMENSION x264', '', '', '', '', '0').version).to eq 'DIMENSION'
48
- expect(Addic7ed::Subtitle.new('DIMENSION X264', '', '', '', '', '0').version).to eq 'DIMENSION'
49
- expect(Addic7ed::Subtitle.new('DIMENSION x.264', '', '', '', '', '0').version).to eq 'DIMENSION'
50
- expect(Addic7ed::Subtitle.new('DIMENSION X.264', '', '', '', '', '0').version).to eq 'DIMENSION'
51
- end
52
-
53
- it 'automatically removes "PROPER" in version string' do
54
- expect(Addic7ed::Subtitle.new('PROPER DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
55
- expect(Addic7ed::Subtitle.new('Proper DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
56
- expect(Addic7ed::Subtitle.new('DIMENSION PROPER', '', '', '', '', '0').version).to eq 'DIMENSION'
57
- expect(Addic7ed::Subtitle.new('DIMENSION Proper', '', '', '', '', '0').version).to eq 'DIMENSION'
58
- end
59
-
60
- it 'automatically removes "RERIP" in version string' do
61
- expect(Addic7ed::Subtitle.new('RERIP DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
62
- expect(Addic7ed::Subtitle.new('Rerip DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
63
- expect(Addic7ed::Subtitle.new('DIMENSION RERIP', '', '', '', '', '0').version).to eq 'DIMENSION'
64
- expect(Addic7ed::Subtitle.new('DIMENSION Rerip', '', '', '', '', '0').version).to eq 'DIMENSION'
65
- end
66
-
67
- it 'automatically removes "Version" prefix in version string' do
68
- expect(Addic7ed::Subtitle.new('Version DIMENSION', '', '', '', '', '0').version).to eq 'DIMENSION'
69
- end
70
- end
71
-
72
- describe '#to_s' do
73
- it 'prints a human readable version' do
74
- sub = Addic7ed::Subtitle.new('DIMENSION', 'fr', 'Completed', 'http://some.fancy.url', 'http://addic7ed.com', '42')
75
- expect(sub.to_s).to eq "http://some.fancy.url\t->\tDIMENSION (fr, Completed) [42 downloads] (via http://addic7ed.com)"
76
- end
77
- end
78
-
79
- describe '#works_for?' do
80
- context 'when incomplete' do
81
- before(:all) { @sub = Addic7ed::Subtitle.new('', '', '80%', '', '', '10') }
82
-
83
- it 'returns false' do
84
- expect(@sub.works_for?).to be false
85
- end
86
- end
87
-
88
- context 'when completed' do
89
- before(:all) { @sub = Addic7ed::Subtitle.new('DIMENSION', '', 'Completed', '', '', '10') }
90
-
91
- it 'returns true given the exact same version' do
92
- expect(@sub.works_for? 'DIMENSION').to be true
93
- end
94
-
95
- it 'returns true given a compatible version' do
96
- expect(@sub.works_for? 'LOL').to be true
97
- end
98
-
99
- it 'returns true when the subtitle is for a PROPER version' do
100
- sub = Addic7ed::Subtitle.new('PROPER DIMENSION', '', 'Completed', '', '', '10')
101
- expect(sub.works_for? 'DIMENSION').to be true
102
- expect(sub.works_for? 'LOL').to be true
103
- end
104
-
105
- it 'returns false given an incompatible version' do
106
- expect(@sub.works_for? 'EVOLVE').to be false
107
- end
108
- end
109
- end
110
-
111
- describe '#can_replace?' do
112
- context 'when incomplete' do
113
- it 'returns false' do
114
- sub = Addic7ed::Subtitle.new('', '', '80%', '', '', '10')
115
- any_other_sub = Addic7ed::Subtitle.new('', '', '', '', '', '0')
116
- expect(sub.can_replace? any_other_sub).to be false
117
- end
118
- end
119
-
120
- context 'when completed' do
121
- before(:all) { @sub = Addic7ed::Subtitle.new('DIMENSION', 'fr', 'Completed', '', '', '10') }
122
-
123
- it 'returns true given no other_sub' do
124
- expect(@sub.can_replace? nil).to be true
125
- end
126
-
127
- it 'returns false given other_sub for another language' do
128
- other_sub = Addic7ed::Subtitle.new('DIMENSION', 'en', 'Completed', '', '', '10')
129
- expect(@sub.can_replace? other_sub).to be false
130
- end
131
-
132
- it 'returns false given other_sub for incompatible version' do
133
- other_sub = Addic7ed::Subtitle.new('EVOLVE', 'fr', 'Completed', '', '', '10')
134
- expect(@sub.can_replace? other_sub).to be false
135
- end
136
-
137
- context 'given other_sub language & version compatible' do
138
- it 'returns false given other_sub featured by Addic7ed' do
139
- other_sub = Addic7ed::Subtitle.new('DIMENSION', 'fr', 'Completed', '', 'http://addic7ed.com', '10')
140
- expect(@sub.can_replace? other_sub).to be false
141
- end
142
-
143
- it 'returns false given other_sub with more downloads' do
144
- other_sub = Addic7ed::Subtitle.new('DIMENSION', 'fr', 'Completed', '', '', '20')
145
- expect(@sub.can_replace? other_sub).to be false
146
- end
147
-
148
- it 'returns true given other_sub with less downloads' do
149
- other_sub = Addic7ed::Subtitle.new('DIMENSION', 'fr', 'Completed', '', '', '5')
150
- expect(@sub.can_replace? other_sub).to be true
151
- end
152
- end
153
- end
154
- end
155
- end