AnimeDL 0.2.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/LICENSE.txt +0 -0
- data/README.md +1 -2
- data/anime_dl.gemspec +1 -1
- data/bin/anime-dl +9 -10
- data/fmab_anime_dl.jpg +0 -0
- data/lib/anime_dl.rb +18 -4
- data/lib/anime_dl/anime_heaven.rb +3 -7
- data/lib/episode.rb +9 -11
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0e5e478e8a86cb5f8215af8aad1586028288f8cc8106eacf459c48d1bd99100d
|
4
|
+
data.tar.gz: 76b3925b61f39259701df307aa9e2b46e8d6dcf034aec6576e88da15623cdc9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5bbd47f17f794a72045563b676fa125aa9e3a45e730528fd3b5fd9ac3be7526bcf4bf7242bb1b8681b787175caf1d498e3a4c5fe3aaeffbff1873494142aecf
|
7
|
+
data.tar.gz: a9e7b929234af8b7a44e9a1cfc6af576894e5eaeaeadff3dc96a0726a8db3338d78d4e4c7a3ae6c112f27ccf730f348eb71a83a1bae9dfce253fd9f6b05aaa2c
|
data/.gitignore
CHANGED
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -57,8 +57,7 @@ On choosing a particular anime, the user can then choose to get links or downloa
|
|
57
57
|
|
58
58
|
`$ anime-dl` - (downloads videos to './anime_name/')]
|
59
59
|
`$ anime-dl -f .` - (downloads videos to './')]
|
60
|
-
`$ anime-dl -f /path/to/directory` - (downloads videos to '/path/to/directory/
|
61
|
-
`$ anime-dl -f /path/to/directory/` - (downloads videos to '/path/to/directory/anime_name/')]
|
60
|
+
`$ anime-dl -f /path/to/directory` - (downloads videos to '/path/to/directory/')]
|
62
61
|
|
63
62
|
|
64
63
|
### Specifying Episodes:
|
data/anime_dl.gemspec
CHANGED
data/bin/anime-dl
CHANGED
@@ -6,7 +6,7 @@ require "fileutils"
|
|
6
6
|
# APP OPTIONS
|
7
7
|
options = { episode: true, file: nil, quiet: false }
|
8
8
|
help_statements = {
|
9
|
-
episode: %Q[Prevents the app from asking for an Episodes prompt. Gets
|
9
|
+
episode: %Q[Prevents the app from asking for an Episodes prompt. Gets details for all episodes.],
|
10
10
|
file: %Q[Provide location to store extracted details. Creates sub-directories as needed. (Usage Examples below).],
|
11
11
|
quiet: %Q[Suppresses large, in-program help statements.],
|
12
12
|
help: %Q[Shows this message and exits.],
|
@@ -45,7 +45,7 @@ ARGV.options do |opts|
|
|
45
45
|
|
46
46
|
|
47
47
|
opts.on( "-v", "--version", help_statements[:version]) do
|
48
|
-
puts "AnimeDL: Version 0.
|
48
|
+
puts "AnimeDL: Version 1.0.5"
|
49
49
|
exit
|
50
50
|
end
|
51
51
|
|
@@ -63,8 +63,7 @@ ARGV.options do |opts|
|
|
63
63
|
opts.separator "(If user chooses to DOWNLOAD videos)"
|
64
64
|
opts.separator %Q[ `$ anime-dl` (downloads videos to './anime_name/')]
|
65
65
|
opts.separator %Q[ `$ anime-dl -f .` (downloads videos to './')]
|
66
|
-
opts.separator %Q[ `$ anime-dl -f /path/to/directory` (downloads videos to '/path/to/directory/
|
67
|
-
opts.separator %Q[ `$ anime-dl -f /path/to/directory/` (downloads videos to '/path/to/directory/anime_name/')]
|
66
|
+
opts.separator %Q[ `$ anime-dl -f /path/to/directory` (downloads videos to '/path/to/directory/')]
|
68
67
|
opts.separator ""
|
69
68
|
|
70
69
|
opts.separator "Specifying Episodes:"
|
@@ -99,11 +98,11 @@ unless (options[:quiet])
|
|
99
98
|
"Or you can also provide multiple space-seperated ranges with each range having the format 'start-end'.\n" +
|
100
99
|
"Examples (assuming anime below has more than 18 episodes):\n" +
|
101
100
|
" `Episodes: 2 4 5` - Retrieves details for episodes 2, 4 and 5\n" +
|
102
|
-
" `Episodes: 4-
|
101
|
+
" `Episodes: 4-7` - Retrieves details for episodes 4, 5, 6 and 7\n" +
|
103
102
|
" `Episodes: 8-l` - Retrieves details for episodes 8 to the last episode\n" +
|
104
|
-
" `Episodes: 2 9-
|
103
|
+
" `Episodes: 2 9-11 18-l` - Retrieves details for episodes 2, 9, 10, 11 and 18 to the end\n" +
|
105
104
|
"(Running app with '-a' or '--all' will automatically retrieve all episodes)\n" +
|
106
|
-
"(Enter empty response to get all episodes
|
105
|
+
"(Enter empty response to get all episodes or '-1' to exit)\n\n"
|
107
106
|
}
|
108
107
|
else
|
109
108
|
$user_prompts = {
|
@@ -231,7 +230,7 @@ begin
|
|
231
230
|
|
232
231
|
end
|
233
232
|
rescue => error
|
234
|
-
puts "\nDirectory creation failed
|
233
|
+
puts "\nDirectory creation failed.\n\n"
|
235
234
|
puts error
|
236
235
|
exit
|
237
236
|
end
|
@@ -264,14 +263,14 @@ else
|
|
264
263
|
end
|
265
264
|
|
266
265
|
# Links
|
267
|
-
links = instance.
|
266
|
+
links = instance.getVideoLinks(choice, range, options[:quiet], to_print)
|
268
267
|
file_write(options[:file], links, choice) if (options[:file] && scrape_option == 'l')
|
269
268
|
|
270
269
|
# Downloads
|
271
270
|
if ( scrape_option == 'd' )
|
272
271
|
if (options[:file] == nil)
|
273
272
|
options[:file] = choice.content.split(" | ")[0]
|
274
|
-
|
273
|
+
FileUtils.mkdir_p( options[:file] )
|
275
274
|
end
|
276
275
|
|
277
276
|
AnimeDL.download(options[:file], links)
|
data/fmab_anime_dl.jpg
CHANGED
File without changes
|
data/lib/anime_dl.rb
CHANGED
@@ -14,7 +14,7 @@ module AnimeDL
|
|
14
14
|
# Search
|
15
15
|
def search(query)
|
16
16
|
results_page = @agent.get("http://animeheaven.eu/search.php?q=#{query}")
|
17
|
-
return results_page.search(".
|
17
|
+
return results_page.search(".iepcon").search(".cona")
|
18
18
|
end
|
19
19
|
|
20
20
|
# Returns the total number of episodes
|
@@ -22,13 +22,28 @@ module AnimeDL
|
|
22
22
|
@anime_page = @agent.get(option.attributes['href'].value) unless (@anime_page)
|
23
23
|
episodes = @anime_page.search(".infoepbox").search("a")
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
# New Episodes have a different class
|
26
|
+
begin
|
27
|
+
first = episodes.last.search(".infoept2")[0].content.to_i
|
28
|
+
rescue
|
29
|
+
first = episodes.last.search(".infoept2r")[0].content.to_i
|
30
|
+
end
|
31
|
+
begin
|
32
|
+
last = episodes.first.search(".infoept2")[0].content.to_i
|
33
|
+
rescue
|
34
|
+
last = episodes.first.search(".infoept2r")[0].content.to_i
|
35
|
+
end
|
36
|
+
|
27
37
|
return first, last
|
28
38
|
end
|
29
39
|
|
30
40
|
|
31
41
|
# UTILITY
|
42
|
+
def parseURL(url)
|
43
|
+
url = url.to_s[/luu1=rrl\(".*?"\)/][10...-2]
|
44
|
+
return url.tr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm")
|
45
|
+
end
|
46
|
+
|
32
47
|
def limit_exceeded(quiet)
|
33
48
|
return "Unfortunately \"animeheaven.eu\" only allows a certain number of page views per day (>170, <350).\n" +
|
34
49
|
"It seems you have exceeded that limit :(.\n" +
|
@@ -36,7 +51,6 @@ module AnimeDL
|
|
36
51
|
|
37
52
|
return "(Limit exceeded)"
|
38
53
|
end
|
39
|
-
|
40
54
|
end
|
41
55
|
|
42
56
|
# Download
|
@@ -16,7 +16,7 @@ module AnimeDL
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# Video Links
|
19
|
-
def
|
19
|
+
def getVideoLinks(option, range = [], quiet = false, output = false)
|
20
20
|
episode_links = getPageLinks(option, range)
|
21
21
|
episodes = []
|
22
22
|
|
@@ -37,17 +37,13 @@ module AnimeDL
|
|
37
37
|
|
38
38
|
# Video Link Retrieval
|
39
39
|
episode_no = episode_page.uri.to_s[/e=.+/][2..-1] # (Regex for safety)
|
40
|
-
video_src = episode_page.search("script")[
|
40
|
+
video_src = parseURL(episode_page.search("script")[3])
|
41
41
|
|
42
42
|
episode = Episode.new(episode_no, video_src)
|
43
43
|
episodes << episode
|
44
44
|
|
45
45
|
# Progress Bar increment
|
46
|
-
|
47
|
-
progress_bar.progress += 1 unless (output)
|
48
|
-
rescue
|
49
|
-
# Bypass InvalidProgressBar Error if raised
|
50
|
-
end
|
46
|
+
progress_bar.progress += 1 unless (output) rescue nil
|
51
47
|
|
52
48
|
puts episode.details if (output)
|
53
49
|
end
|
data/lib/episode.rb
CHANGED
@@ -9,33 +9,31 @@ class Episode
|
|
9
9
|
attr_reader :number, :link
|
10
10
|
|
11
11
|
def download_to(path = ".")
|
12
|
-
url_base = @link.split('/')[2]
|
13
|
-
url_path = '/'+@link.split('/')[3..-1].join('/')
|
12
|
+
url_base = @link.split('/')[2] # Animeheaven
|
13
|
+
url_path = '/'+@link.split('/')[3..-1].join('/') # Sub Url
|
14
14
|
|
15
15
|
Net::HTTP.start(url_base) do |http|
|
16
16
|
response = http.request_head(URI.escape(url_path))
|
17
17
|
progress_bar = ProgressBar.create(:progress_mark => "\#", :length => 80, :total => response['content-length'].to_i)
|
18
|
-
file = File.new( File.join( path, "Episode #{@number}.mp4" ), 'w')
|
18
|
+
file = File.new( File.join( path, "Episode #{@number}.mp4.tmp" ), 'w')
|
19
19
|
|
20
20
|
begin
|
21
21
|
http.get(URI.escape(url_path)) do |str|
|
22
22
|
file.write(str)
|
23
|
-
|
24
|
-
begin
|
25
|
-
progress_bar.progress += str.length
|
26
|
-
rescue
|
27
|
-
# Bypass InvalidProgressBar Error if raised
|
28
|
-
end
|
23
|
+
progress_bar.progress += str.length rescue nil
|
29
24
|
end
|
30
25
|
rescue Exception
|
31
26
|
# Handle SystemExit or Interrupt
|
32
|
-
puts "Download incomplete. Deleting file
|
33
|
-
|
27
|
+
puts "Download incomplete. Deleting file.\n\n"
|
28
|
+
file.close
|
29
|
+
File.delete(File.join( path, "Episode #{@number}.mp4.tmp" ))
|
34
30
|
raise
|
35
31
|
exit
|
36
32
|
end
|
37
33
|
|
38
34
|
progress_bar.finish
|
35
|
+
file.close
|
36
|
+
File.rename(file, File.join( path, "Episode #{@number}.mp4" ))
|
39
37
|
end
|
40
38
|
|
41
39
|
puts "\n"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: AnimeDL
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anirudh Sundar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mechanize
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
77
|
+
rubygems_version: 2.7.3
|
78
78
|
signing_key:
|
79
79
|
specification_version: 4
|
80
80
|
summary: The AnimeDL gem is used to get episode links or download episodes for a particular
|