cherrypicker 0.3.0 → 0.3.1
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.
- data/README.md +3 -1
- data/cherrypicker.gemspec +1 -1
- data/lib/cherrypicker/download.rb +10 -8
- data/lib/cherrypicker/plugins/megavideo.rb +95 -0
- data/lib/cherrypicker/plugins/youtube.rb +67 -0
- data/lib/cherrypicker/version.rb +1 -1
- data/lib/cherrypicker.rb +2 -0
- metadata +3 -1
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@ Cherrypicker
|
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
4
|
Cherrypicker was part of my final year project for university it
|
|
5
|
-
is a Ruby Gem that lets you download from; Rapidshare, Hotfile and Vimeo
|
|
5
|
+
is a Ruby Gem that lets you download from; Rapidshare, Hotfile, Youtube and Vimeo
|
|
6
6
|
You can also utilise the LinkChecker to see if your files are
|
|
7
7
|
alive on Rapidshare and Hotfile
|
|
8
8
|
|
|
@@ -35,6 +35,8 @@ Examples
|
|
|
35
35
|
test3.download
|
|
36
36
|
|
|
37
37
|
Vimeo.new("http://www.vimeo.com/2119458", :location => "/Volumes/Storage/Desktop/cherrytest/").download
|
|
38
|
+
Youtube.new("http://www.youtube.com/watch?v=SF6I5VSZVqc", :location => "/Volumes/Storage/Desktop/cherrytest/").download
|
|
39
|
+
Megavideo.new("http://www.megavideo.com/?v=2PEKD0YS", :location => "/Volumes/Storage/Desktop/cherrytest/").download
|
|
38
40
|
|
|
39
41
|
Download.new("http://download.thinkbroadband.com/10MB.zip", :location => "/location/tosave/file/")
|
|
40
42
|
Download.new("http://download.thinkbroadband.com/10MB.zip", :location => "/location/tosave/file/", :size => 10485760)
|
data/cherrypicker.gemspec
CHANGED
|
@@ -29,18 +29,20 @@ class Download
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def download_file
|
|
32
|
-
|
|
32
|
+
uri = URI.parse(@link.to_s)
|
|
33
33
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
34
34
|
http.use_ssl = true if uri.scheme == "https"
|
|
35
35
|
request = Net::HTTP::Get.new(uri.request_uri)
|
|
36
36
|
request.initialize_http_header({"User-Agent" => random_agent})
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
unless (uri.host.include? 'youtube.com') && (uri.request_uri.include? 'videoplayback') #youtube throws EOFError
|
|
38
|
+
head = http.request_head(URI.escape(uri.path))
|
|
39
|
+
case head
|
|
40
|
+
when Net::HTTPForbidden
|
|
41
|
+
@size = nil #no content-length no progress bar
|
|
42
|
+
else
|
|
43
|
+
@size = head['content-length'] if @size.nil? && head['content-length'].to_i > 1024
|
|
44
|
+
end
|
|
45
|
+
end
|
|
44
46
|
http.request(request) do |response|
|
|
45
47
|
bar = ProgressBar.new((@filename ||= File.basename(uri.path)), @size.to_i) unless @size.nil?
|
|
46
48
|
File.open(@location + (@filename ||= File.basename(uri.path)), "wb") do |file|
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Class that can download from Vimeo
|
|
2
|
+
# Megavideo.new("http://www.megavideo.com/?v=2PEKD0YS", :location => "/Volumes/Storage/Desktop/cherrytest/").download
|
|
3
|
+
|
|
4
|
+
require 'open-uri'
|
|
5
|
+
|
|
6
|
+
class Megavideo
|
|
7
|
+
attr_accessor :link, :filename, :location, :download_url
|
|
8
|
+
|
|
9
|
+
def initialize(link, opts={})
|
|
10
|
+
o = {
|
|
11
|
+
:location => nil,
|
|
12
|
+
}.merge(opts)
|
|
13
|
+
|
|
14
|
+
@link = link
|
|
15
|
+
@filename = ""
|
|
16
|
+
@location = o[:location]
|
|
17
|
+
@download_url = ""
|
|
18
|
+
@size = 0
|
|
19
|
+
|
|
20
|
+
video_id = @link[/v[\/=](\w*)&?/, 1]
|
|
21
|
+
|
|
22
|
+
#credit http://stackoverflow.com/questions/5748876/build-array-of-flashvars-using-hpricot
|
|
23
|
+
html = open("http://megavideo.com/?v=#{video_id}").read
|
|
24
|
+
flashvars = Hash[ html.scan( /flashvars\.(\w+)\s*=\s*["']?(.+?)["']?;/ ) ]
|
|
25
|
+
|
|
26
|
+
key_s = flashvars["s"]
|
|
27
|
+
key_un = flashvars["un"]
|
|
28
|
+
key_k1 = flashvars["k1"]
|
|
29
|
+
key_k2 = flashvars["k2"]
|
|
30
|
+
|
|
31
|
+
title = flashvars["title"]
|
|
32
|
+
@size = flashvars["size"].to_i * 1024 * 1024
|
|
33
|
+
|
|
34
|
+
@download_url = "http://www#{key_s}.megavideo.com/files/#{decrypt(key_un,key_k1,key_k2)}/#{title}.flv"
|
|
35
|
+
@filename = title + ".flv"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def decrypt(un,k1,k2) #credit http://userscripts.org/scripts/review/42944
|
|
39
|
+
k1 = k1.to_i
|
|
40
|
+
k2 = k2.to_i
|
|
41
|
+
|
|
42
|
+
#convert the hex "un" to binary
|
|
43
|
+
location1 = Array.new
|
|
44
|
+
un.each_char do |char|
|
|
45
|
+
#puts "#{char} => #{char.to_i(16).to_s(2)}"
|
|
46
|
+
location1 << ("000" + char.to_i(16).to_s(2))[-4,4]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
location1 = location1.join("").split("")
|
|
50
|
+
|
|
51
|
+
location6 = Array.new
|
|
52
|
+
0.upto(383) do |n|
|
|
53
|
+
k1 = (k1 * 11 + 77213) % 81371
|
|
54
|
+
k2 = (k2 * 17 + 92717) % 192811
|
|
55
|
+
location6[n] = (k1 + k2) % 128
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
location3 = Array.new
|
|
59
|
+
location4 = Array.new
|
|
60
|
+
location5 = Array.new
|
|
61
|
+
location8 = Array.new
|
|
62
|
+
|
|
63
|
+
256.downto(0) do |n|
|
|
64
|
+
location5 = location6[n]
|
|
65
|
+
location4 = n % 128
|
|
66
|
+
location8 = location1[location5]
|
|
67
|
+
location1[location5] = location1[location4]
|
|
68
|
+
location1[location4] = location8
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
0.upto(127) do |n|
|
|
72
|
+
location1[n] = location1[n].to_i ^ location6[n+256] & 1
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
location12 = location1.join("")
|
|
76
|
+
location7 = Array.new
|
|
77
|
+
|
|
78
|
+
n = 0
|
|
79
|
+
while (n < location12.length) do
|
|
80
|
+
location9 = location12[n,4]
|
|
81
|
+
location7 << location9
|
|
82
|
+
n+=4
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
result = ""
|
|
86
|
+
location7.each do |bin|
|
|
87
|
+
result = result + bin.to_i(2).to_s(16)
|
|
88
|
+
end
|
|
89
|
+
result
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def download
|
|
93
|
+
Download.new(@download_url, :location => @location, :size => @size)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Class that can download from Vimeo
|
|
2
|
+
# Youtube.new("http://www.youtube.com/watch?v=SF6I5VSZVqc", :location => "/Volumes/Storage/Desktop/cherrytest/").download
|
|
3
|
+
|
|
4
|
+
require "cgi"
|
|
5
|
+
|
|
6
|
+
class Youtube
|
|
7
|
+
attr_accessor :link, :filename, :location, :download_url
|
|
8
|
+
|
|
9
|
+
def initialize(link, opts={})
|
|
10
|
+
|
|
11
|
+
o = {
|
|
12
|
+
:location => nil,
|
|
13
|
+
}.merge(opts)
|
|
14
|
+
|
|
15
|
+
@link = link
|
|
16
|
+
@filename = ""
|
|
17
|
+
@location = o[:location]
|
|
18
|
+
@download_url = ""
|
|
19
|
+
|
|
20
|
+
video_id = @link[/v[\/=](.*)/,1]
|
|
21
|
+
video_info = remote_query("http://www.youtube.com/get_video_info?video_id=#{video_id}").body
|
|
22
|
+
|
|
23
|
+
#converting the huge infostring into a hash. simply by splitting it at the & and then splitting it into key and value arround the =
|
|
24
|
+
#credit https://github.com/rb2k/viddl-rb/blob/master/plugins/youtube.rb
|
|
25
|
+
video_info_hash = Hash[*video_info.split("&").collect { |v|
|
|
26
|
+
key, value = v.split "="
|
|
27
|
+
value = CGI::unescape(value) if value
|
|
28
|
+
if key =~ /_map/
|
|
29
|
+
value = value.split(",")
|
|
30
|
+
value = if key == "fmt_map"
|
|
31
|
+
Hash[*value.collect{ |v|
|
|
32
|
+
k2, *v2 = v.split("/")
|
|
33
|
+
[k2, v2]
|
|
34
|
+
}.flatten(1)]
|
|
35
|
+
elsif key == "fmt_url_map" || key == "fmt_stream_map"
|
|
36
|
+
Hash[*value.collect { |v| v.split("|")}.flatten]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
[key, value]
|
|
40
|
+
}.flatten]
|
|
41
|
+
|
|
42
|
+
#Standard = 34 <- flv
|
|
43
|
+
#Medium = 18 <- mp4
|
|
44
|
+
#High = 35 <- flv
|
|
45
|
+
#720p = 22 <- mp4
|
|
46
|
+
#1080p = 37 <- mp4
|
|
47
|
+
#mobile = 17 <- 3gp
|
|
48
|
+
# --> 37 > 22 > 35 > 18 > 34 > 17
|
|
49
|
+
formats = video_info_hash["fmt_map"].keys
|
|
50
|
+
|
|
51
|
+
format_ext = {}
|
|
52
|
+
format_ext["37"] = ["mp4", "MP4 Highest Quality 1920x1080"]
|
|
53
|
+
format_ext["22"] = ["mp4", "MP4 1280x720"]
|
|
54
|
+
format_ext["35"] = ["flv", "FLV 854x480"]
|
|
55
|
+
format_ext["34"] = ["flv", "FLV 640x360"]
|
|
56
|
+
format_ext["18"] = ["mp4", "MP4 480x270"]
|
|
57
|
+
format_ext["17"] = ["3gp", "3gp"]
|
|
58
|
+
format_ext["5"] = ["flv", "old default?"]
|
|
59
|
+
|
|
60
|
+
@download_url = video_info_hash["fmt_url_map"][formats.first]
|
|
61
|
+
@filename = video_info_hash["title"].delete("\"'").gsub(/[^0-9A-Za-z]/, '_') + "." + format_ext[formats.first].first
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def download
|
|
65
|
+
Download.new(@download_url, :location => @location, :filename => @filename)
|
|
66
|
+
end
|
|
67
|
+
end
|
data/lib/cherrypicker/version.rb
CHANGED
data/lib/cherrypicker.rb
CHANGED
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: cherrypicker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease:
|
|
5
|
-
version: 0.3.
|
|
5
|
+
version: 0.3.1
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Karl Entwistle
|
|
@@ -44,8 +44,10 @@ files:
|
|
|
44
44
|
- lib/cherrypicker/helpers.rb
|
|
45
45
|
- lib/cherrypicker/linkchecker.rb
|
|
46
46
|
- lib/cherrypicker/plugins/hotfile.rb
|
|
47
|
+
- lib/cherrypicker/plugins/megavideo.rb
|
|
47
48
|
- lib/cherrypicker/plugins/rapidshare.rb
|
|
48
49
|
- lib/cherrypicker/plugins/vimeo.rb
|
|
50
|
+
- lib/cherrypicker/plugins/youtube.rb
|
|
49
51
|
- lib/cherrypicker/version.rb
|
|
50
52
|
- test/test_helper.rb
|
|
51
53
|
- test/unit/hostfile_test.rb
|