-
Notifications
You must be signed in to change notification settings - Fork 4
/
get_destroy_all_software_screencasts.rb
56 lines (46 loc) · 1.56 KB
/
get_destroy_all_software_screencasts.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
require 'nokogiri'
require 'open-uri'
abs_dir_to_save_files = ARGV[0]
unless abs_dir_to_save_files
puts "Please supply a path to save downloads"
exit 1
end
unless File.exist?(abs_dir_to_save_files)
puts "Creating #{abs_dir_to_save_files}"
Dir.mkdir(abs_dir_to_save_files)
end
MAIN_PAGE = "https://www.destroyallsoftware.com"
main_page = Nokogiri::HTML(open("#{MAIN_PAGE}/screencasts/catalog"))
puts "Getting all screencast links..."
# Parse thru main page to pull all screencast links
links = main_page.css('.episode a').map do |e|
link = e.attributes['href'].value
{ link: link, name: link.split("/").last }
end
links.each_slice(4) do |group|
group.map do |hash|
next if File.exist?("#{abs_dir_to_save_files}/#{hash[:name]}.mp4")
Thread.new(abs_dir_to_save_files, hash) do
begin
puts "Opening screencast #{hash[:name]}"
sub_page = Nokogiri::HTML(open("#{MAIN_PAGE}#{hash[:link]}"))
extracted_video_link = sub_page.css('script')[1]
.children
.first
.content
.scan(/src = \"(.*)\"/)
.first
.first # second for 1040
puts "Saving screencast #{hash[:name]}..."
# Make destination DIR before running program
download = open("#{MAIN_PAGE}#{extracted_video_link}")
IO.copy_stream(download, "#{abs_dir_to_save_files}/#{hash[:name]}.mp4")
puts "Saved #{hash[:name]}!"
rescue OpenURI::HTTPError => ex
puts "Errors downloading #{hash[:name]} - #{ex.inspect}"
next
end
end
end.compact.each(&:join)
end
puts "Done!"