download_tv 2.2.2 → 2.3.0
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/tv +7 -4
- data/lib/download_tv/configuration.rb +29 -24
- data/lib/download_tv/downloader.rb +6 -7
- data/lib/download_tv/grabbers/torrentapi.rb +10 -3
- data/lib/download_tv/grabbers/tpb.rb +1 -1
- data/lib/download_tv/linkgrabber.rb +7 -8
- data/lib/download_tv/myepisodes.rb +1 -0
- data/lib/download_tv/torrent.rb +20 -24
- data/lib/download_tv/version.rb +1 -1
- data/lib/download_tv.rb +9 -0
- data/test/config_test.rb +6 -3
- data/test/downloader_test.rb +24 -31
- data/test/grabbers_test.rb +2 -4
- data/test/test_helper.rb +1 -1
- data/test/torrent_test.rb +29 -13
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f8dda689a52414ffbba9c500ddd35c559726b77e
|
|
4
|
+
data.tar.gz: 34a781bc82bde130397290dc0038bbb3e842198d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ab18d3786f2b7ca4b7a5757355f50a7e1cfcfb871e375dc165841e8212a2518b48d64970a0a069699fecbf6b6b422880bf15704d53b8f87b68b168790d72d8b6
|
|
7
|
+
data.tar.gz: c5cbe9275f0174e56da29fa4ba3f90054e663b05f1dc2633b36dc05254af3c3cf74dec11f3db5f80996975f27add8e1d1f231525d0556ff796dc37f214b875ec
|
data/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Specific options:
|
|
|
37
37
|
|
|
38
38
|
By default, it fetches the list of episodes from MyEpisodes.com that have aired since the program was run for the last time and tries to download them. The -o flag can be used in order to re-download the episodes from previous days. The --dry-run option is useful to prevent download_tv from updating the date (for example, when running the application shortly after an episode airs)
|
|
39
39
|
|
|
40
|
-
In order to download a single episode, use the -d flag: *tv -d Breaking Bad S04E01*
|
|
40
|
+
In order to download a single episode, use the -d flag, quoting the string when it contains spaces: *tv -d "Breaking Bad S04E01"*
|
|
41
41
|
|
|
42
42
|
The -f flag can be used to read the list of episodes to download from a file. Each line of the file is interpreted as a episode to download: *tv -f /path/to/listofeps*
|
|
43
43
|
|
data/bin/tv
CHANGED
|
@@ -74,13 +74,13 @@ opt_parser.parse!(ARGV)
|
|
|
74
74
|
begin
|
|
75
75
|
case options[:cmd]
|
|
76
76
|
when 'run'
|
|
77
|
-
dl = DownloadTV::Downloader.new(
|
|
78
|
-
dl.run(options[:dry])
|
|
77
|
+
dl = DownloadTV::Downloader.new(config)
|
|
78
|
+
dl.run(options[:dry], options[:offset].abs)
|
|
79
79
|
when 'dl'
|
|
80
|
-
dl = DownloadTV::Downloader.new(
|
|
80
|
+
dl = DownloadTV::Downloader.new(config)
|
|
81
81
|
dl.download_single_show(options[:arg])
|
|
82
82
|
when 'file'
|
|
83
|
-
dl = DownloadTV::Downloader.new(
|
|
83
|
+
dl = DownloadTV::Downloader.new(config)
|
|
84
84
|
dl.download_from_file(options[:arg])
|
|
85
85
|
when 'config'
|
|
86
86
|
DownloadTV::Configuration.new(config, true)
|
|
@@ -90,4 +90,7 @@ begin
|
|
|
90
90
|
rescue Interrupt
|
|
91
91
|
puts 'Interrupt signal detected. Exiting...'
|
|
92
92
|
exit 1
|
|
93
|
+
rescue SocketError, Errno::ECONNRESET, Net::OpenTimeout
|
|
94
|
+
warn 'Connection error.'
|
|
95
|
+
exit 1
|
|
93
96
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
module DownloadTV
|
|
2
|
+
##
|
|
3
|
+
# Class used for managing the configuration of the application
|
|
2
4
|
class Configuration
|
|
3
5
|
attr_reader :content, :config_path
|
|
4
|
-
|
|
5
|
-
def initialize(content={}, force_change=false)
|
|
6
|
-
FileUtils.mkdir_p(File.join(ENV[
|
|
7
|
-
@config_path = content[:path] || File.join(ENV[
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
def initialize(content = {}, force_change = false)
|
|
8
|
+
FileUtils.mkdir_p(File.join(ENV['HOME'], '.config', 'download_tv'))
|
|
9
|
+
@config_path = content[:path] || File.join(ENV['HOME'], '.config', 'download_tv', 'config')
|
|
10
|
+
|
|
9
11
|
if File.exist? @config_path
|
|
10
12
|
load_config
|
|
11
13
|
@content.merge!(content) unless content.empty?
|
|
@@ -17,48 +19,52 @@ module DownloadTV
|
|
|
17
19
|
end
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
|
|
21
22
|
def change_configuration
|
|
22
23
|
if @content[:myepisodes_user]
|
|
23
24
|
print "Enter your MyEpisodes username (#{@content[:myepisodes_user]}) : "
|
|
24
25
|
else
|
|
25
|
-
print
|
|
26
|
+
print 'Enter your MyEpisodes username: '
|
|
26
27
|
end
|
|
27
28
|
@content[:myepisodes_user] = STDIN.gets.chomp
|
|
28
29
|
|
|
29
|
-
print
|
|
30
|
-
@content[:cookie] = STDIN.gets.chomp.
|
|
30
|
+
print 'Save cookie? (y)/n: '
|
|
31
|
+
@content[:cookie] = !(STDIN.gets.chomp.casecmp? 'n')
|
|
31
32
|
|
|
32
33
|
if @content[:ignored]
|
|
33
34
|
puts "Enter a comma-separated list of shows to ignore: (#{@content[:ignored]})"
|
|
34
35
|
else
|
|
35
|
-
puts
|
|
36
|
+
puts 'Enter a comma-separated list of shows to ignore: '
|
|
36
37
|
end
|
|
37
|
-
|
|
38
|
-
@content[:ignored] = STDIN.gets.chomp.split(
|
|
38
|
+
|
|
39
|
+
@content[:ignored] = STDIN.gets.chomp.split(',').map(&:strip).map(&:downcase)
|
|
39
40
|
STDOUT.flush
|
|
40
41
|
|
|
41
42
|
# When modifying existing config, keeps previous values
|
|
42
43
|
# When creating new one, sets defaults
|
|
43
44
|
@content[:auto] ||= true
|
|
44
45
|
@content[:subs] ||= true
|
|
45
|
-
@content[:grabber] ||=
|
|
46
|
-
@content[:date] ||= Date.today-1
|
|
46
|
+
@content[:grabber] ||= 'TorrentAPI'
|
|
47
|
+
@content[:date] ||= Date.today - 1
|
|
47
48
|
@content[:version] = DownloadTV::VERSION
|
|
48
49
|
|
|
49
50
|
serialize
|
|
50
51
|
end
|
|
51
52
|
|
|
52
|
-
|
|
53
53
|
def serialize
|
|
54
|
-
File.
|
|
54
|
+
File.write(@config_path, JSON.generate(@content))
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def load_config
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
source = File.read(@config_path)
|
|
59
|
+
@content = JSON.parse(source, symbolize_names: true)
|
|
60
|
+
|
|
61
|
+
@content[:date] = Date.parse(@content[:date]) if @content[:date]
|
|
62
|
+
|
|
63
|
+
change_configuration if !@content[:version] || breaking_changes?(@content[:version])
|
|
64
|
+
rescue JSON::ParserError
|
|
65
|
+
@content = {}
|
|
66
|
+
change_configuration
|
|
67
|
+
retry
|
|
62
68
|
end
|
|
63
69
|
|
|
64
70
|
##
|
|
@@ -66,12 +72,11 @@ module DownloadTV
|
|
|
66
72
|
# Returns false if a patch has been detected
|
|
67
73
|
# Returns nil if it's the same version
|
|
68
74
|
def breaking_changes?(version)
|
|
69
|
-
DownloadTV::VERSION.split(
|
|
75
|
+
DownloadTV::VERSION.split('.').zip(version.split('.')).find_index { |x, y| y > x }&.< 2
|
|
70
76
|
end
|
|
71
|
-
|
|
72
77
|
|
|
73
78
|
def print_config
|
|
74
|
-
@content.each {|k, v| puts "#{k}: #{v}"}
|
|
79
|
+
@content.each { |k, v| puts "#{k}: #{v}" }
|
|
75
80
|
end
|
|
76
81
|
end
|
|
77
|
-
end
|
|
82
|
+
end
|
|
@@ -4,8 +4,7 @@ module DownloadTV
|
|
|
4
4
|
class Downloader
|
|
5
5
|
attr_reader :offset, :config
|
|
6
6
|
|
|
7
|
-
def initialize(
|
|
8
|
-
@offset = offset.abs
|
|
7
|
+
def initialize(config = {})
|
|
9
8
|
@config = Configuration.new(config) # Load configuration
|
|
10
9
|
|
|
11
10
|
@filters = [
|
|
@@ -39,8 +38,8 @@ module DownloadTV
|
|
|
39
38
|
##
|
|
40
39
|
# Finds download links for all new episodes aired since the last run of the program
|
|
41
40
|
# It connects to MyEpisodes in order to find which shows to track and which new episodes aired.
|
|
42
|
-
def run(dont_update_last_run)
|
|
43
|
-
date = check_date
|
|
41
|
+
def run(dont_update_last_run, offset = 0)
|
|
42
|
+
date = check_date(offset)
|
|
44
43
|
|
|
45
44
|
myepisodes = MyEpisodes.new(@config.content[:myepisodes_user], @config.content[:cookie])
|
|
46
45
|
# Log in using cookie by default
|
|
@@ -120,10 +119,10 @@ module DownloadTV
|
|
|
120
119
|
end
|
|
121
120
|
end
|
|
122
121
|
|
|
123
|
-
def check_date
|
|
122
|
+
def check_date(offset)
|
|
124
123
|
last = @config.content[:date]
|
|
125
|
-
if last -
|
|
126
|
-
last -
|
|
124
|
+
if last - offset != Date.today
|
|
125
|
+
last - offset
|
|
127
126
|
else
|
|
128
127
|
puts 'Everything up to date'
|
|
129
128
|
exit
|
|
@@ -10,6 +10,16 @@ module DownloadTV
|
|
|
10
10
|
@wait = 2.1
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
##
|
|
14
|
+
# Specific implementation for TorrentAPI (requires token)
|
|
15
|
+
def online?
|
|
16
|
+
@agent.read_timeout = 2
|
|
17
|
+
@agent.get(format(@url, 'test', 'test'))
|
|
18
|
+
true
|
|
19
|
+
rescue Mechanize::ResponseCodeError, Net::HTTP::Persistent::Error
|
|
20
|
+
false
|
|
21
|
+
end
|
|
22
|
+
|
|
13
23
|
##
|
|
14
24
|
# Connects to Torrentapi.org and requests a token.
|
|
15
25
|
# Returns said token.
|
|
@@ -54,9 +64,6 @@ module DownloadTV
|
|
|
54
64
|
links = obj['torrent_results'].collect { |i| i['download'] }
|
|
55
65
|
|
|
56
66
|
names.zip(links)
|
|
57
|
-
# Temporary solution for Cloudflare being obnoxious
|
|
58
|
-
rescue Mechanize::ResponseCodeError
|
|
59
|
-
raise NoTorrentsError
|
|
60
67
|
end
|
|
61
68
|
end
|
|
62
69
|
end
|
|
@@ -2,7 +2,7 @@ module DownloadTV
|
|
|
2
2
|
##
|
|
3
3
|
# ThePirateBay grabber
|
|
4
4
|
class ThePirateBay < LinkGrabber
|
|
5
|
-
def initialize(tpb_proxy = 'https://
|
|
5
|
+
def initialize(tpb_proxy = 'https://thepiratebay.cr')
|
|
6
6
|
proxy = tpb_proxy.gsub(%r{/+$}, '') || 'https://thepiratebay.cr'
|
|
7
7
|
|
|
8
8
|
super("#{proxy}/search/%s/0/7/0")
|
|
@@ -7,20 +7,19 @@ module DownloadTV
|
|
|
7
7
|
def initialize(url)
|
|
8
8
|
@url = url
|
|
9
9
|
@agent = Mechanize.new
|
|
10
|
+
@agent.user_agent = DownloadTV::USER_AGENT
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
def
|
|
13
|
-
agent =
|
|
14
|
-
agent.
|
|
15
|
-
|
|
13
|
+
def online?
|
|
14
|
+
@agent.read_timeout = 2
|
|
15
|
+
@agent.get(format(@url, 'test'))
|
|
16
|
+
true
|
|
17
|
+
rescue Mechanize::ResponseCodeError, Net::HTTP::Persistent::Error
|
|
18
|
+
false
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
def get_links(_s)
|
|
19
22
|
raise NotImplementedError
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
|
-
|
|
23
|
-
class NoTorrentsError < StandardError; end
|
|
24
|
-
|
|
25
|
-
class NoSubtitlesError < StandardError; end
|
|
26
25
|
end
|
data/lib/download_tv/torrent.rb
CHANGED
|
@@ -2,7 +2,7 @@ module DownloadTV
|
|
|
2
2
|
##
|
|
3
3
|
# Class in charge of managing the link grabbers
|
|
4
4
|
class Torrent
|
|
5
|
-
attr_reader :g_names, :g_instances, :
|
|
5
|
+
attr_reader :g_names, :g_instances, :tries
|
|
6
6
|
|
|
7
7
|
def grabbers
|
|
8
8
|
%w[Eztv KAT ThePirateBay TorrentAPI]
|
|
@@ -11,11 +11,11 @@ module DownloadTV
|
|
|
11
11
|
def initialize(default_grabber = nil)
|
|
12
12
|
@g_names = grabbers
|
|
13
13
|
@g_instances = []
|
|
14
|
-
|
|
15
|
-
@tries = @n_grabbers - 1
|
|
14
|
+
reset_tries
|
|
16
15
|
|
|
17
16
|
# Silently ignores bad names
|
|
18
|
-
|
|
17
|
+
found = @g_names.find_index(default_grabber)
|
|
18
|
+
@g_names.rotate! found + 1 if found
|
|
19
19
|
|
|
20
20
|
change_grabbers
|
|
21
21
|
end
|
|
@@ -24,47 +24,43 @@ module DownloadTV
|
|
|
24
24
|
if !@g_names.empty?
|
|
25
25
|
# Instantiates the last element from g_names, popping it
|
|
26
26
|
newt = (DownloadTV.const_get @g_names.pop).new
|
|
27
|
-
newt.test_connection
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
if newt.online?
|
|
29
|
+
@g_instances.unshift newt
|
|
30
|
+
else
|
|
31
|
+
warn "Problem accessing #{newt.class.name}"
|
|
32
|
+
@tries -= 1 # We won't be using this grabber
|
|
33
|
+
change_grabbers
|
|
34
|
+
end
|
|
35
|
+
else # Rotates the instantiated grabbers
|
|
33
36
|
@g_instances.rotate!
|
|
34
37
|
end
|
|
35
|
-
rescue Mechanize::ResponseCodeError, Net::HTTP::Persistent::Error
|
|
36
|
-
warn "Problem accessing #{newt.class.name}"
|
|
37
|
-
# We won't be using this grabber
|
|
38
|
-
@n_grabbers -= 1
|
|
39
|
-
@tries = @n_grabbers - 1
|
|
40
|
-
|
|
41
|
-
change_grabbers
|
|
42
|
-
rescue SocketError, Errno::ECONNRESET, Net::OpenTimeout
|
|
43
|
-
warn 'Connection error.'
|
|
44
|
-
exit 1
|
|
45
38
|
end
|
|
46
39
|
|
|
47
40
|
def get_links(show)
|
|
48
41
|
links = @g_instances.first.get_links(show)
|
|
49
42
|
|
|
50
|
-
|
|
51
|
-
@tries = @n_grabbers - 1
|
|
43
|
+
reset_tries
|
|
52
44
|
|
|
53
45
|
links
|
|
54
46
|
rescue NoTorrentsError
|
|
55
47
|
puts "No torrents found for #{show} using #{@g_instances.first.class.name}"
|
|
56
48
|
|
|
57
49
|
# Use next grabber
|
|
58
|
-
if @tries
|
|
50
|
+
if @tries.positive?
|
|
59
51
|
@tries -= 1
|
|
60
52
|
change_grabbers
|
|
61
53
|
retry
|
|
62
54
|
|
|
63
|
-
else
|
|
64
|
-
|
|
55
|
+
else
|
|
56
|
+
reset_tries
|
|
65
57
|
# Handle show not found here!!
|
|
66
58
|
return []
|
|
67
59
|
end
|
|
68
60
|
end
|
|
61
|
+
|
|
62
|
+
def reset_tries
|
|
63
|
+
@tries = @g_names.size + @g_instances.size - 1
|
|
64
|
+
end
|
|
69
65
|
end
|
|
70
66
|
end
|
data/lib/download_tv/version.rb
CHANGED
data/lib/download_tv.rb
CHANGED
|
@@ -11,4 +11,13 @@ require 'download_tv/torrent'
|
|
|
11
11
|
require 'download_tv/myepisodes'
|
|
12
12
|
require 'download_tv/linkgrabber'
|
|
13
13
|
require 'download_tv/subtitles'
|
|
14
|
+
|
|
15
|
+
module DownloadTV
|
|
16
|
+
USER_AGENT = "DownloadTV #{DownloadTV::VERSION}".freeze
|
|
17
|
+
|
|
18
|
+
class NoTorrentsError < StandardError; end
|
|
19
|
+
|
|
20
|
+
class NoSubtitlesError < StandardError; end
|
|
21
|
+
end
|
|
22
|
+
|
|
14
23
|
Dir[File.join(__dir__, 'download_tv', 'grabbers', '*.rb')].each { |file| require file }
|
data/test/config_test.rb
CHANGED
|
@@ -132,14 +132,17 @@ describe DownloadTV::Configuration do
|
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
describe 'the serialize method' do
|
|
135
|
-
it 'stores the configuration in a
|
|
135
|
+
it 'stores the configuration in a JSON file' do
|
|
136
136
|
# Calls serialize
|
|
137
137
|
run_silently do
|
|
138
138
|
STDIN.stub :gets, 'anything' do
|
|
139
139
|
DownloadTV::Configuration.new(path: config_path)
|
|
140
140
|
end
|
|
141
141
|
end
|
|
142
|
-
content = File.open(config_path, 'rb') { |f| Marshal.load(f) }
|
|
142
|
+
# content = File.open(config_path, 'rb') { |f| Marshal.load(f) }
|
|
143
|
+
source = File.read(config_path)
|
|
144
|
+
content = JSON.parse(source, symbolize_names: true)
|
|
145
|
+
content[:date] = Date.parse(content[:date])
|
|
143
146
|
|
|
144
147
|
content[:cookie].must_equal true
|
|
145
148
|
content[:myepisodes_user].must_equal 'anything'
|
|
@@ -147,7 +150,7 @@ describe DownloadTV::Configuration do
|
|
|
147
150
|
content[:auto].must_equal true
|
|
148
151
|
content[:subs].must_equal true
|
|
149
152
|
content[:grabber].must_equal 'TorrentAPI'
|
|
150
|
-
content[:date].must_equal
|
|
153
|
+
content[:date].must_equal Date.today - 1
|
|
151
154
|
content[:version].must_equal DownloadTV::VERSION
|
|
152
155
|
end
|
|
153
156
|
end
|
data/test/downloader_test.rb
CHANGED
|
@@ -13,19 +13,10 @@ describe DownloadTV::Downloader do
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
describe 'when creating the object' do
|
|
16
|
-
it 'should store the first argument as @offset' do
|
|
17
|
-
DownloadTV::Downloader.new(3, path: config_path).offset.must_equal 3
|
|
18
|
-
DownloadTV::Downloader.new(-3, path: config_path).offset.must_equal 3
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it 'should receive an integer for the offset' do
|
|
22
|
-
-> { DownloadTV::Downloader.new('foo') }.must_raise NoMethodError
|
|
23
|
-
end
|
|
24
|
-
|
|
25
16
|
it 'can receive an optional configuration hash' do
|
|
26
|
-
dl = DownloadTV::Downloader.new(
|
|
27
|
-
dl.config[:auto].must_equal true
|
|
28
|
-
dl.config[:grabber].must_equal 'KAT'
|
|
17
|
+
dl = DownloadTV::Downloader.new(auto: true, grabber: 'KAT', path: config_path)
|
|
18
|
+
dl.config.content[:auto].must_equal true
|
|
19
|
+
dl.config.content[:grabber].must_equal 'KAT'
|
|
29
20
|
end
|
|
30
21
|
end
|
|
31
22
|
|
|
@@ -34,7 +25,7 @@ describe DownloadTV::Downloader do
|
|
|
34
25
|
shows = ['Mr. Foo S01E02', 'Bar (UK) S00E22', "Let's S05E03", 'Baz: The Story S05E22']
|
|
35
26
|
result = ['Mr. Foo S01E02', 'Bar S00E22', 'Lets S05E03', 'Baz The Story S05E22']
|
|
36
27
|
|
|
37
|
-
dl = DownloadTV::Downloader.new(
|
|
28
|
+
dl = DownloadTV::Downloader.new(ignored: [], path: config_path)
|
|
38
29
|
dl.fix_names(shows).must_equal result
|
|
39
30
|
end
|
|
40
31
|
|
|
@@ -42,67 +33,67 @@ describe DownloadTV::Downloader do
|
|
|
42
33
|
shows = ['Mr. Foo S01E02', 'Bar (UK) S00E22', 'Ignored S20E22', "Let's S05E03"]
|
|
43
34
|
result = ['Mr. Foo S01E02', 'Bar S00E22', 'Lets S05E03']
|
|
44
35
|
|
|
45
|
-
dl = DownloadTV::Downloader.new(
|
|
36
|
+
dl = DownloadTV::Downloader.new(ignored: ['ignored'], path: config_path)
|
|
46
37
|
dl.fix_names(shows).must_equal result
|
|
47
38
|
end
|
|
48
39
|
end
|
|
49
40
|
|
|
50
41
|
describe 'the check_date method' do
|
|
51
42
|
it 'exits the script when up to date' do
|
|
52
|
-
dl = DownloadTV::Downloader.new(
|
|
53
|
-
to_run = -> { run_silently { dl.check_date } }
|
|
43
|
+
dl = DownloadTV::Downloader.new(date: Date.today, path: config_path)
|
|
44
|
+
to_run = -> { run_silently { dl.check_date(0) } }
|
|
54
45
|
to_run.must_raise SystemExit
|
|
55
46
|
end
|
|
56
47
|
|
|
57
48
|
it 'uses the offset to adjust the date' do
|
|
58
49
|
# Would exit with offset 0
|
|
59
|
-
dl = DownloadTV::Downloader.new(
|
|
50
|
+
dl = DownloadTV::Downloader.new(date: Date.today, path: config_path)
|
|
60
51
|
|
|
61
|
-
date = dl.check_date
|
|
52
|
+
date = dl.check_date(1)
|
|
62
53
|
|
|
63
54
|
date.must_equal(Date.today - 1)
|
|
64
|
-
dl.config[:date].must_equal Date.today
|
|
55
|
+
dl.config.content[:date].must_equal Date.today
|
|
65
56
|
end
|
|
66
57
|
end
|
|
67
58
|
|
|
68
59
|
describe 'the filter_shows method' do
|
|
69
60
|
it 'removes names with 2160p in them' do
|
|
70
|
-
dl = DownloadTV::Downloader.new(
|
|
61
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
71
62
|
links = [['Link 1', ''], ['Link 2 2160p', ''], ['Link 3', '']]
|
|
72
63
|
res = [['Link 1', ''], ['Link 3', '']]
|
|
73
64
|
dl.filter_shows(links).must_equal res
|
|
74
65
|
end
|
|
75
66
|
|
|
76
67
|
it 'removes names with 1080p in them' do
|
|
77
|
-
dl = DownloadTV::Downloader.new(
|
|
68
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
78
69
|
links = [['Link.1080p', ''], ['Link 2 2160p', ''], ['Link 3', '']]
|
|
79
70
|
res = [['Link 3', '']]
|
|
80
71
|
dl.filter_shows(links).must_equal res
|
|
81
72
|
end
|
|
82
73
|
|
|
83
74
|
it 'removes names with 720p in them' do
|
|
84
|
-
dl = DownloadTV::Downloader.new(
|
|
75
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
85
76
|
links = [['Link 1', ''], ['Link 2 720p', ''], ['Link.720p.rip', '']]
|
|
86
77
|
res = [['Link 1', '']]
|
|
87
78
|
dl.filter_shows(links).must_equal res
|
|
88
79
|
end
|
|
89
80
|
|
|
90
81
|
it 'removes names with WEB in them' do
|
|
91
|
-
dl = DownloadTV::Downloader.new(
|
|
82
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
92
83
|
links = [['Link 1 WEBRIP', ''], ['Link 2 rip', ''], ['Link.720p.rip', '']]
|
|
93
84
|
res = [['Link 2 rip', '']]
|
|
94
85
|
dl.filter_shows(links).must_equal res
|
|
95
86
|
end
|
|
96
87
|
|
|
97
88
|
it 'removes names without PROPER or REPACK in them' do
|
|
98
|
-
dl = DownloadTV::Downloader.new(
|
|
89
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
99
90
|
links = [['Link 1', ''], ['Link 2 2160p', ''], ['Link 3', ''], ['Link 4 PROPER', ''], ['Link REPACK 5', '']]
|
|
100
91
|
res = [['Link 4 PROPER', ''], ['Link REPACK 5', '']]
|
|
101
92
|
dl.filter_shows(links).must_equal res
|
|
102
93
|
end
|
|
103
94
|
|
|
104
95
|
it "doesn't apply a filter if it would reject every option" do
|
|
105
|
-
dl = DownloadTV::Downloader.new(
|
|
96
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
106
97
|
links = [['Link 1 720p', ''], ['Link 2 2160p', ''], ['Link 720p 3', '']]
|
|
107
98
|
res = [['Link 1 720p', ''], ['Link 720p 3', '']]
|
|
108
99
|
dl.filter_shows(links).must_equal res
|
|
@@ -115,11 +106,12 @@ describe DownloadTV::Downloader do
|
|
|
115
106
|
show = 'Example Show S01E01'
|
|
116
107
|
|
|
117
108
|
t.expect(:get_links, [], [show])
|
|
118
|
-
dl = DownloadTV::Downloader.new(
|
|
109
|
+
dl = DownloadTV::Downloader.new(auto: true, path: config_path)
|
|
119
110
|
dl.get_link(t, show).must_equal ''
|
|
120
111
|
t.expect(:get_links, [], [show])
|
|
121
|
-
dl = DownloadTV::Downloader.new(
|
|
112
|
+
dl = DownloadTV::Downloader.new(auto: false, path: config_path)
|
|
122
113
|
dl.get_link(t, show).must_equal ''
|
|
114
|
+
t.verify
|
|
123
115
|
end
|
|
124
116
|
|
|
125
117
|
it 'returns the first link when auto is set to true' do
|
|
@@ -127,8 +119,9 @@ describe DownloadTV::Downloader do
|
|
|
127
119
|
show = 'Example Show S01E01'
|
|
128
120
|
|
|
129
121
|
t.expect(:get_links, [['Name 1', 'Link 1'], ['Name 2', 'Link 2']], [show])
|
|
130
|
-
dl = DownloadTV::Downloader.new(
|
|
122
|
+
dl = DownloadTV::Downloader.new(auto: true, path: config_path)
|
|
131
123
|
dl.get_link(t, show).must_equal 'Link 1'
|
|
124
|
+
t.verify
|
|
132
125
|
end
|
|
133
126
|
end
|
|
134
127
|
|
|
@@ -137,7 +130,7 @@ describe DownloadTV::Downloader do
|
|
|
137
130
|
prev = RbConfig::CONFIG['host_os']
|
|
138
131
|
RbConfig::CONFIG['host_os'] = 'linux-gnu'
|
|
139
132
|
|
|
140
|
-
dl = DownloadTV::Downloader.new(
|
|
133
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
141
134
|
dl.detect_os.must_equal 'xdg-open'
|
|
142
135
|
|
|
143
136
|
RbConfig::CONFIG['host_os'] = prev
|
|
@@ -147,7 +140,7 @@ describe DownloadTV::Downloader do
|
|
|
147
140
|
prev = RbConfig::CONFIG['host_os']
|
|
148
141
|
RbConfig::CONFIG['host_os'] = 'darwin15.6.0'
|
|
149
142
|
|
|
150
|
-
dl = DownloadTV::Downloader.new(
|
|
143
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
151
144
|
dl.detect_os.must_equal 'open'
|
|
152
145
|
|
|
153
146
|
RbConfig::CONFIG['host_os'] = prev
|
|
@@ -157,7 +150,7 @@ describe DownloadTV::Downloader do
|
|
|
157
150
|
prev = RbConfig::CONFIG['host_os']
|
|
158
151
|
RbConfig::CONFIG['host_os'] = 'dummy'
|
|
159
152
|
|
|
160
|
-
dl = DownloadTV::Downloader.new(
|
|
153
|
+
dl = DownloadTV::Downloader.new(path: config_path)
|
|
161
154
|
|
|
162
155
|
to_run = -> { run_silently { dl.detect_os.must_equal 'xdg-open' } }
|
|
163
156
|
to_run.must_raise SystemExit
|
data/test/grabbers_test.rb
CHANGED
|
@@ -6,14 +6,12 @@ describe DownloadTV::LinkGrabber do
|
|
|
6
6
|
|
|
7
7
|
instances.each do |grabber|
|
|
8
8
|
describe grabber do
|
|
9
|
+
next unless grabber.online?
|
|
10
|
+
|
|
9
11
|
it 'will have a url attribute on creation' do
|
|
10
12
|
grabber.url.wont_be_nil
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
it 'should get a 200 code response' do
|
|
14
|
-
grabber.test_connection.code.must_equal '200'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
15
|
it "will raise NoTorrentsError when torrent can't be found" do
|
|
18
16
|
notfound = -> { grabber.get_links('Totally Fake Show askjdgsaudas') }
|
|
19
17
|
notfound.must_raise DownloadTV::NoTorrentsError
|
data/test/test_helper.rb
CHANGED
|
@@ -4,7 +4,7 @@ require 'minitest/autorun'
|
|
|
4
4
|
|
|
5
5
|
def create_dummy_config(in_path, config = {})
|
|
6
6
|
config[:version] = DownloadTV::VERSION unless config[:version]
|
|
7
|
-
File.
|
|
7
|
+
File.write(in_path, JSON.generate(config))
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def run_silently
|
data/test/torrent_test.rb
CHANGED
|
@@ -1,28 +1,44 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
describe DownloadTV::Torrent do
|
|
4
|
-
before do
|
|
5
|
-
@t = DownloadTV::Torrent.new
|
|
6
|
-
end
|
|
7
|
-
|
|
8
4
|
describe 'when creating the object' do
|
|
9
|
-
|
|
10
|
-
@t.
|
|
11
|
-
@t.g_instances.empty?.must_equal false
|
|
12
|
-
@t.n_grabbers.must_be :>, 0
|
|
5
|
+
before do
|
|
6
|
+
@t = DownloadTV::Torrent.new
|
|
13
7
|
end
|
|
14
8
|
|
|
15
9
|
it 'will have the right amount of grabbers' do
|
|
16
|
-
|
|
17
|
-
@t.n_grabbers.must_equal @t.g_names.size + 1
|
|
10
|
+
@t.g_names.size.must_equal @t.grabbers.size - 1
|
|
18
11
|
@t.g_instances.size.must_equal 1
|
|
19
12
|
end
|
|
20
13
|
|
|
21
14
|
it 'will populate the instances' do
|
|
22
|
-
@t.
|
|
15
|
+
@t.grabbers.size.times.each { @t.change_grabbers }
|
|
23
16
|
@t.g_names.empty?.must_equal true
|
|
24
|
-
@t.g_instances.
|
|
25
|
-
|
|
17
|
+
@t.g_instances.size.must_equal @t.grabbers.size
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'will start with all tries available' do
|
|
21
|
+
@t.tries.must_equal @t.grabbers.size - 1
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'will call get_links on its grabber' do
|
|
25
|
+
@t.g_instances.first.stub :get_links, %w[test result] do
|
|
26
|
+
@t.get_links('test show').must_equal %w[test result]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'when giving it a default grabber' do
|
|
32
|
+
it 'has a default order' do
|
|
33
|
+
t = DownloadTV::Torrent.new(nil)
|
|
34
|
+
t.g_instances.first.class.name.must_equal 'DownloadTV::TorrentAPI'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
%w[Eztv KAT ThePirateBay TorrentAPI].each do |g|
|
|
38
|
+
it 'correctly uses the given grabber first' do
|
|
39
|
+
t = DownloadTV::Torrent.new(g)
|
|
40
|
+
t.g_instances.first.class.name.must_equal "DownloadTV::#{g}"
|
|
41
|
+
end
|
|
26
42
|
end
|
|
27
43
|
end
|
|
28
44
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: download_tv
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- guille
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -134,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
134
134
|
version: '0'
|
|
135
135
|
requirements: []
|
|
136
136
|
rubyforge_project:
|
|
137
|
-
rubygems_version: 2.6.
|
|
137
|
+
rubygems_version: 2.6.13
|
|
138
138
|
signing_key:
|
|
139
139
|
specification_version: 4
|
|
140
140
|
summary: DownloadTV is a tool that allows the user to find magnet links for tv show
|