cherrypicker 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/bin/cherrypick ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'cherrypicker'
4
+ require 'getoptlong'
5
+ require 'pathname'
6
+
7
+ def usage()
8
+ puts "Cherrypicker lets you download from; Rapidshare, Hotfile, Hotfile, Youtube, Vimeo & Megavideo"
9
+ puts "Usage: cherrypick link [--directory|-d] [--username|-u] [--password|-p]"
10
+ puts
11
+ puts "example: cherrypick http://www.youtube.com/watch?v=I5DCwN28y8o -d \"~/Movies\""
12
+ puts "example: cherrypick http://rapidshare.com/files/453165880/test_file.txt -u \"karlentwistle\" -p \"foobar\""
13
+ end
14
+
15
+ if not ARGV[0]
16
+ usage
17
+ exit
18
+ end
19
+
20
+ parser = GetoptLong.new
21
+ parser.set_options(
22
+ ["-d", "--directory", GetoptLong::REQUIRED_ARGUMENT],
23
+ ["-u", "--username", GetoptLong::REQUIRED_ARGUMENT],
24
+ ["-p", "--password", GetoptLong::REQUIRED_ARGUMENT]
25
+ )
26
+
27
+ username = ""
28
+ password = ""
29
+ directory = ""
30
+
31
+ loop do
32
+
33
+ opt, arg = parser.get
34
+ break if not opt
35
+
36
+ case opt
37
+ when "-u"
38
+ username = arg
39
+ when "-p"
40
+ password = arg
41
+ when "-d"
42
+ directory = arg
43
+ end
44
+
45
+ end
46
+
47
+ unless directory == "" || nil?
48
+ p path = Pathname.new(directory)
49
+
50
+ if not path.directory?
51
+ puts "Directory not found " + path.to_s
52
+ usage
53
+ exit
54
+ end
55
+ end
56
+
57
+ username = nil unless username != ""
58
+ password = nil unless password != ""
59
+ directory = nil unless directory != ""
60
+
61
+ Cherrypicker::Cherrypick.new(ARGV[0], :location => directory, :username => username, :password => password)
@@ -0,0 +1,24 @@
1
+ require 'open-uri'
2
+
3
+ module Cherrypicker
4
+ class Cherrypick
5
+ attr_accessor :link, :location, :username, :password
6
+
7
+ def initialize(link, opts={})
8
+ o = {
9
+ :location => nil,
10
+ :username => nil,
11
+ :password => nil,
12
+ }.merge(opts)
13
+
14
+ @link = link
15
+ @username = o[:username]
16
+ @password = o[:password]
17
+ @directory = o[:location]
18
+
19
+ classname = URI.parse(@link.to_s).host[/[^www\.]+/].capitalize
20
+ instance = Object.const_get('Cherrypicker').const_get("#{classname}")
21
+ instance.new(@link, :location => @location, :username => @username, :password => @password).download
22
+ end
23
+ end
24
+ end
@@ -7,52 +7,53 @@ require 'net/http'
7
7
  require 'net/https'
8
8
  require 'progressbar'
9
9
  require 'open-uri'
10
-
11
- class Download
12
- attr_accessor :link, :size, :location, :progress, :filename, :finished
10
+ module Cherrypicker
11
+ class Download
12
+ attr_accessor :link, :size, :location, :progress, :filename, :finished
13
13
 
14
- def initialize(link, opts={})
15
- o = {
16
- :location => nil,
17
- :size => nil,
18
- :filename => nil
19
- }.merge(opts)
14
+ def initialize(link, opts={})
15
+ o = {
16
+ :location => nil,
17
+ :size => nil,
18
+ :filename => nil
19
+ }.merge(opts)
20
20
 
21
- @link = link
22
- @size = o[:size]
23
- @location = o[:location] ||= ""
24
- @filename = o[:filename]
25
- @progress = 0
26
- @finished = false
21
+ @link = link
22
+ @size = o[:size]
23
+ @location = o[:location] ||= ""
24
+ @filename = o[:filename]
25
+ @progress = 0
26
+ @finished = false
27
27
 
28
- download_file
29
- end
28
+ download_file
29
+ end
30
30
 
31
- def download_file
32
- uri = URI.parse(@link.to_s)
33
- http = Net::HTTP.new(uri.host, uri.port)
34
- http.use_ssl = true if uri.scheme == "https"
35
- request = Net::HTTP::Get.new(uri.request_uri)
36
- request.initialize_http_header({"User-Agent" => random_agent})
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
31
+ def download_file
32
+ uri = URI.parse(@link.to_s)
33
+ http = Net::HTTP.new(uri.host, uri.port)
34
+ http.use_ssl = true if uri.scheme == "https"
35
+ request = Net::HTTP::Get.new(uri.request_uri)
36
+ request.initialize_http_header({"User-Agent" => Cherrypicker::random_agent})
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
44
45
  end
45
- end
46
- http.request(request) do |response|
47
- bar = ProgressBar.new((@filename ||= File.basename(uri.path)), @size.to_i) unless @size.nil?
48
- File.open(@location + (@filename ||= File.basename(uri.path)), "wb") do |file|
49
- response.read_body do |segment|
50
- @progress += segment.length
51
- bar.set(@progress) unless @size.nil?
52
- file.write(segment)
46
+ http.request(request) do |response|
47
+ bar = ProgressBar.new((@filename ||= File.basename(uri.path)), @size.to_i) unless @size.nil?
48
+ File.open(@location + (@filename ||= File.basename(uri.path)), "wb") do |file|
49
+ response.read_body do |segment|
50
+ @progress += segment.length
51
+ bar.set(@progress) unless @size.nil?
52
+ file.write(segment)
53
+ end
53
54
  end
54
55
  end
56
+ @finished = true
55
57
  end
56
- @finished = true
57
58
  end
58
59
  end
@@ -4,36 +4,38 @@ require 'net/http'
4
4
  require 'net/https'
5
5
  require 'open-uri'
6
6
 
7
- def remote_query(url)
8
- begin
9
- uri = URI.parse(url)
10
- http = Net::HTTP.new(uri.host, uri.port)
11
- http.use_ssl = true if uri.scheme == "https"
12
- http.open_timeout = 3 # seconds
13
- http.read_timeout = 3 # seconds
14
- request = Net::HTTP::Get.new(uri.request_uri)
15
- request.initialize_http_header({"User-Agent" => random_agent})
16
- response = http.request(request)
17
- if response["X-APICPU"]
18
- if (response["X-APICPU"][/(\d*)\/\d*/, 1]).to_i > 9500
19
- sleep 60 # seconds
7
+ module Cherrypicker
8
+ def self.remote_query(url)
9
+ begin
10
+ uri = URI.parse(url)
11
+ http = Net::HTTP.new(uri.host, uri.port)
12
+ http.use_ssl = true if uri.scheme == "https"
13
+ http.open_timeout = 3 # seconds
14
+ http.read_timeout = 3 # seconds
15
+ request = Net::HTTP::Get.new(uri.request_uri)
16
+ request.initialize_http_header({"User-Agent" => random_agent})
17
+ response = http.request(request)
18
+ if response["X-APICPU"]
19
+ if (response["X-APICPU"][/(\d*)\/\d*/, 1]).to_i > 9500
20
+ sleep 60 # seconds
21
+ end
20
22
  end
23
+ return response
24
+ rescue SocketError
25
+ $stderr.print "IO failed: " + $!
26
+ raise
21
27
  end
22
- return response
23
- rescue SocketError
24
- $stderr.print "IO failed: " + $!
25
- raise
26
28
  end
27
- end
28
29
 
29
- def hash_to_url(hash)
30
- hash.keys.inject('') do |query_string, key|
31
- query_string << '&' unless key == hash.keys.first
32
- query_string << "#{URI.encode(key.to_s)}=#{URI.encode(hash[key])}"
30
+ def self.hash_to_url(hash)
31
+ hash.keys.inject('') do |query_string, key|
32
+ query_string << '&' unless key == hash.keys.first
33
+ query_string << "#{URI.encode(key.to_s)}=#{URI.encode(hash[key])}"
34
+ end
33
35
  end
34
- end
35
36
 
36
- def random_agent
37
- @useragent = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24"]
38
- return @useragent[0]
37
+ def self.random_agent
38
+ @useragent = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24"]
39
+ return @useragent[0]
40
+ end
39
41
  end
@@ -6,115 +6,116 @@
6
6
  # puts rapid.filename
7
7
  # puts rapid.host
8
8
  # rapid.download
9
+ module Cherrypicker
10
+ class LinkChecker
11
+ attr_accessor :links, :status
9
12
 
10
- class LinkChecker
11
- attr_accessor :links, :status
12
-
13
- def initialize(links)
14
- @links = links
15
- if links[0] =~ /^http(s|):\/\/(www.|)rapidshare.com/
16
- @status = rapidshare
17
- else
18
- @status = hotfile
13
+ def initialize(links)
14
+ @links = links
15
+ if links[0] =~ /^http(s|):\/\/(www.|)rapidshare.com/
16
+ @status = rapidshare
17
+ else
18
+ @status = hotfile
19
+ end
19
20
  end
20
- end
21
21
 
22
- def rapidshare
23
- links = self.links
24
- files = Array.new
25
- filenames = Array.new
26
- singlelinks = Array.new
22
+ def rapidshare
23
+ links = self.links
24
+ files = Array.new
25
+ filenames = Array.new
26
+ singlelinks = Array.new
27
27
 
28
- self.links.each do |link|
29
- files << link[/files\/(\d*)\//, 1]
30
- filenames << link[/files\/\d*\/(.*)/, 1]
31
- end
28
+ self.links.each do |link|
29
+ files << link[/files\/(\d*)\//, 1]
30
+ filenames << link[/files\/\d*\/(.*)/, 1]
31
+ end
32
32
 
33
- query = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&" +
34
- hash_to_url({
35
- :files => files.join(","),
36
- :filenames => filenames.join(","),
37
- :incmd5 => '0'
38
- })
33
+ query = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=checkfiles&" +
34
+ Cherrypicker::hash_to_url({
35
+ :files => files.join(","),
36
+ :filenames => filenames.join(","),
37
+ :incmd5 => '0'
38
+ })
39
39
 
40
- check = remote_query(query).body.split("\n")
40
+ check = Cherrypicker::remote_query(query).body.split("\n")
41
41
 
42
- #"452966383,ROT007-WEB-2011.rar,23635847,23,1,tl2,0"
43
- check.each_with_index do |c, index|
44
- c[/([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)/]
45
- size = Regexp.last_match(3)
46
- if Regexp.last_match(5) == "1"
47
- status = "Alive"
48
- else
49
- status = "Dead"
42
+ #"452966383,ROT007-WEB-2011.rar,23635847,23,1,tl2,0"
43
+ check.each_with_index do |c, index|
44
+ c[/([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)\,([^,]+)/]
45
+ size = Regexp.last_match(3)
46
+ if Regexp.last_match(5) == "1"
47
+ status = "Alive"
48
+ else
49
+ status = "Dead"
50
+ end
51
+ singlelinks << Cherrypicker::SingleLink.new(links[index], "#{status}", size)
50
52
  end
51
- singlelinks << SingleLink.new(links[index], "#{status}", size)
52
- end
53
53
 
54
- links = {}
55
- singlelinks.each do |a|
56
- links[a.status] ||= []
57
- links[a.status] << [a.link, a.size]
54
+ links = {}
55
+ singlelinks.each do |a|
56
+ links[a.status] ||= []
57
+ links[a.status] << [a.link, a.size]
58
+ end
59
+ return links
58
60
  end
59
- return links
60
- end
61
61
 
62
- def hotfile
63
- links = self.links
64
- ids = Array.new
65
- keys = Array.new
66
- singlelinks = Array.new
62
+ def hotfile
63
+ links = self.links
64
+ ids = Array.new
65
+ keys = Array.new
66
+ singlelinks = Array.new
67
67
 
68
- links.each do |link|
69
- link[/http\:\/\/hotfile\.com\/dl\/([^\/]+)\/([^\/]+)\/([^\/]+)/]
70
- ids << Regexp.last_match(1)
71
- keys << Regexp.last_match(2)
72
- end
68
+ links.each do |link|
69
+ link[/http\:\/\/hotfile\.com\/dl\/([^\/]+)\/([^\/]+)\/([^\/]+)/]
70
+ ids << Regexp.last_match(1)
71
+ keys << Regexp.last_match(2)
72
+ end
73
73
 
74
- query = "http://api.hotfile.com/?action=checklinks&" +
75
- hash_to_url({
76
- :links => links.join(","),
77
- :id => ids.join(","),
78
- :keys => keys.join(","),
79
- :files => "id,status,size"
80
- })
74
+ Cherrypicker::query = "http://api.hotfile.com/?action=checklinks&" +
75
+ hash_to_url({
76
+ :links => links.join(","),
77
+ :id => ids.join(","),
78
+ :keys => keys.join(","),
79
+ :files => "id,status,size"
80
+ })
81
81
 
82
- check = remote_query(query).body.split("\n")
82
+ check = Cherrypicker::remote_query(query).body.split("\n")
83
83
 
84
- unless check.size == 0
85
- #"111044909,1,Playaz-Sub_Zero-PLAYAZ015-WEB-2011-EGM.rar "
86
- check.each_with_index do |c, index|
87
- c[/([^,]+)\,([^,]+)\,([^,]+)/]
88
- name = Regexp.last_match(3)
89
- size = Regexp.last_match(1)
90
- if Regexp.last_match(2) == "1"
91
- status = "Alive"
92
- else
93
- status = "Dead"
84
+ unless check.size == 0
85
+ #"111044909,1,Playaz-Sub_Zero-PLAYAZ015-WEB-2011-EGM.rar "
86
+ check.each_with_index do |c, index|
87
+ c[/([^,]+)\,([^,]+)\,([^,]+)/]
88
+ name = Regexp.last_match(3)
89
+ size = Regexp.last_match(1)
90
+ if Regexp.last_match(2) == "1"
91
+ status = "Alive"
92
+ else
93
+ status = "Dead"
94
+ end
95
+ singlelinks << Cherrypicker::SingleLink.new(links[index], "#{status}", size)
96
+ end
97
+ else
98
+ links.each do |link|
99
+ singlelinks << Cherrypicker::SingleLink.new(link, "Dead", nil)
94
100
  end
95
- singlelinks << SingleLink.new(links[index], "#{status}", size)
96
- end
97
- else
98
- links.each do |link|
99
- singlelinks << SingleLink.new(link, "Dead", nil)
100
101
  end
101
- end
102
102
 
103
- links = {}
104
- singlelinks.each do |a|
105
- links[a.status] ||= []
106
- links[a.status] << [a.link, a.size]
103
+ links = {}
104
+ singlelinks.each do |a|
105
+ links[a.status] ||= []
106
+ links[a.status] << [a.link, a.size]
107
+ end
108
+ return links
107
109
  end
108
- return links
109
110
  end
110
- end
111
111
 
112
- class SingleLink
113
- attr_accessor :link, :status, :size
112
+ class SingleLink
113
+ attr_accessor :link, :status, :size
114
114
 
115
- def initialize(link, status, size)
116
- @size = size
117
- @link = link
118
- @status = status
115
+ def initialize(link, status, size)
116
+ @size = size
117
+ @link = link
118
+ @status = status
119
+ end
119
120
  end
120
121
  end
@@ -4,44 +4,45 @@
4
4
  # hotfile.download
5
5
 
6
6
  require 'open-uri'
7
-
8
- class Hotfile
9
- attr_accessor :link, :hostname, :filename, :username, :password, :size, :location, :query
7
+ module Cherrypicker
8
+ class Hotfile
9
+ attr_accessor :link, :hostname, :filename, :username, :password, :size, :location, :query
10
10
 
11
- def initialize(link, username, password, opts={})
12
- if link =~ /hotfile.com\/dl\/\d*\/[0-9a-f]*\/.*.*\.html/
13
- @link = link[/(.*)\.html/, 1] #remove .html from link
14
- else
15
- @link = link
16
- end
11
+ def initialize(link, username, password, opts={})
12
+ if link =~ /hotfile.com\/dl\/\d*\/[0-9a-f]*\/.*.*\.html/
13
+ @link = link[/(.*)\.html/, 1] #remove .html from link
14
+ else
15
+ @link = link
16
+ end
17
17
 
18
- uri = URI.parse(@link)
18
+ uri = URI.parse(@link)
19
19
 
20
- o = {
21
- :location => nil,
22
- :size => nil,
23
- }.merge(opts)
20
+ o = {
21
+ :location => nil,
22
+ :size => nil,
23
+ }.merge(opts)
24
24
 
25
- @username = username
26
- @password = password
27
- @size = o[:size]
28
- @location = o[:location]
29
- @filename = File.basename(uri.path)
30
- end
25
+ @username = username
26
+ @password = password
27
+ @size = o[:size]
28
+ @location = o[:location]
29
+ @filename = File.basename(uri.path)
30
+ end
31
31
 
32
- def download
33
- Download.new(download_url, :location => @location, :size => @size, :filename => @filename)
34
- end
32
+ def download
33
+ Download.new(download_url, :location => @location, :size => @size, :filename => @filename)
34
+ end
35
35
 
36
- def create_url
37
- hash_to_url({
38
- :link => @link,
39
- :username => @username.to_s,
40
- :password => @password.to_s,
41
- })
42
- end
36
+ def create_url
37
+ Cherrypicker::hash_to_url({
38
+ :link => @link,
39
+ :username => @username.to_s,
40
+ :password => @password.to_s,
41
+ })
42
+ end
43
43
 
44
- def download_url
45
- remote_query("http://api.hotfile.com/?action=getdirectdownloadlink&" + create_url).response.body.gsub(/\n/,'')
44
+ def download_url
45
+ Cherrypicker::remote_query("http://api.hotfile.com/?action=getdirectdownloadlink&" + create_url).response.body.gsub(/\n/,'')
46
+ end
46
47
  end
47
48
  end
@@ -2,94 +2,95 @@
2
2
  # Megavideo.new("http://www.megavideo.com/?v=2PEKD0YS", :location => "/Volumes/Storage/Desktop/cherrytest/").download
3
3
 
4
4
  require 'open-uri'
5
+ module Cherrypicker
6
+ class Megavideo
7
+ attr_accessor :link, :filename, :location, :download_url
5
8
 
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)
9
+ def initialize(link, opts={})
10
+ o = {
11
+ :location => nil,
12
+ }.merge(opts)
13
13
 
14
- @link = link
15
- @filename = ""
16
- @location = o[:location]
17
- @download_url = ""
18
- @size = 0
14
+ @link = link
15
+ @filename = ""
16
+ @location = o[:location]
17
+ @download_url = ""
18
+ @size = 0
19
19
 
20
- video_id = @link[/v[\/=](\w*)&?/, 1]
20
+ video_id = @link[/v[\/=](\w*)&?/, 1]
21
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*["']?(.+?)["']?;/ ) ]
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
25
 
26
- key_s = flashvars["s"]
27
- key_un = flashvars["un"]
28
- key_k1 = flashvars["k1"]
29
- key_k2 = flashvars["k2"]
26
+ key_s = flashvars["s"]
27
+ key_un = flashvars["un"]
28
+ key_k1 = flashvars["k1"]
29
+ key_k2 = flashvars["k2"]
30
30
 
31
- title = flashvars["title"]
32
- @size = flashvars["size"].to_i * 1024 * 1024
31
+ title = flashvars["title"]
32
+ @size = flashvars["size"].to_i * 1024 * 1024
33
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
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
37
 
38
- def decrypt(un,k1,k2) #credit http://userscripts.org/scripts/review/42944
39
- k1 = k1.to_i
40
- k2 = k2.to_i
38
+ def decrypt(un,k1,k2) #credit http://userscripts.org/scripts/review/42944
39
+ k1 = k1.to_i
40
+ k2 = k2.to_i
41
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
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
48
 
49
- location1 = location1.join("").split("")
49
+ location1 = location1.join("").split("")
50
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
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
57
 
58
- location3 = Array.new
59
- location4 = Array.new
60
- location5 = Array.new
61
- location8 = Array.new
58
+ location3 = Array.new
59
+ location4 = Array.new
60
+ location5 = Array.new
61
+ location8 = Array.new
62
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
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
70
 
71
- 0.upto(127) do |n|
72
- location1[n] = location1[n].to_i ^ location6[n+256] & 1
73
- end
71
+ 0.upto(127) do |n|
72
+ location1[n] = location1[n].to_i ^ location6[n+256] & 1
73
+ end
74
74
 
75
- location12 = location1.join("")
76
- location7 = Array.new
75
+ location12 = location1.join("")
76
+ location7 = Array.new
77
77
 
78
- n = 0
79
- while (n < location12.length) do
80
- location9 = location12[n,4]
81
- location7 << location9
82
- n+=4
83
- end
78
+ n = 0
79
+ while (n < location12.length) do
80
+ location9 = location12[n,4]
81
+ location7 << location9
82
+ n+=4
83
+ end
84
84
 
85
- result = ""
86
- location7.each do |bin|
87
- result = result + bin.to_i(2).to_s(16)
85
+ result = ""
86
+ location7.each do |bin|
87
+ result = result + bin.to_i(2).to_s(16)
88
+ end
89
+ result
88
90
  end
89
- result
90
- end
91
91
 
92
- def download
93
- Download.new(@download_url, :location => @location, :size => @size)
92
+ def download
93
+ Download.new(@download_url, :location => @location, :size => @size)
94
+ end
94
95
  end
95
96
  end
@@ -3,51 +3,52 @@
3
3
  # rapid = Rapidshare.new("http://rapidshare.com/files/329036215/The.Matrix.bandaa25.part06.rar", "username", "password")
4
4
  # rapid.download
5
5
  require 'open-uri'
6
-
7
- class Rapidshare
8
- attr_accessor :link, :fileid, :filename, :hostname, :username, :password, :size, :location
6
+ module Cherrypicker
7
+ class Rapidshare
8
+ attr_accessor :link, :fileid, :filename, :hostname, :username, :password, :size, :location
9
9
 
10
- def initialize(link, username, password, opts={})
11
- uri = URI.parse(link)
10
+ def initialize(link, username, password, opts={})
11
+ uri = URI.parse(link)
12
12
 
13
- o = {
14
- :location => nil,
15
- :size => nil,
16
- }.merge(opts)
13
+ o = {
14
+ :location => nil,
15
+ :size => nil,
16
+ }.merge(opts)
17
17
 
18
- @link = link
19
- @username = username
20
- @password = password
21
- @fileid = fileid
22
- @size = o[:size]
23
- @location = o[:location]
24
- @filename = File.basename(uri.path)
25
- @hostname = hostname
26
- end
18
+ @link = link
19
+ @username = username
20
+ @password = password
21
+ @fileid = fileid
22
+ @size = o[:size]
23
+ @location = o[:location]
24
+ @filename = File.basename(uri.path)
25
+ @hostname = hostname
26
+ end
27
27
 
28
- def download
29
- Download.new(@hostname + remote_url, :location => @location, :size => @size, :filename => @filename)
30
- end
28
+ def download
29
+ Download.new(@hostname + remote_url, :location => @location, :size => @size, :filename => @filename)
30
+ end
31
31
 
32
- def fileid
33
- @link[/files\/(\d*)\//, 1]
34
- end
32
+ def fileid
33
+ @link[/files\/(\d*)\//, 1]
34
+ end
35
35
 
36
- def remote_url
37
- "/cgi-bin/rsapi.cgi?sub=download&" + create_url
38
- end
36
+ def remote_url
37
+ "/cgi-bin/rsapi.cgi?sub=download&" + create_url
38
+ end
39
39
 
40
- def create_url
41
- hash_to_url({
42
- :fileid => @fileid,
43
- :filename => @filename,
44
- :login => @username.to_s,
45
- :password => @password.to_s,
46
- })
47
- end
40
+ def create_url
41
+ Cherrypicker::hash_to_url({
42
+ :fileid => @fileid,
43
+ :filename => @filename,
44
+ :login => @username.to_s,
45
+ :password => @password.to_s,
46
+ })
47
+ end
48
48
 
49
- def hostname
50
- query = remote_query("http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&" + create_url)
51
- query.response.response["Location"][/(.*).rapidshare.com/, 1] + ".rapidshare.com"
52
- end
49
+ def hostname
50
+ query = Cherrypicker::remote_query("http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=download&" + create_url)
51
+ query.response.response["Location"][/(.*).rapidshare.com/, 1] + ".rapidshare.com"
52
+ end
53
+ end
53
54
  end
@@ -8,43 +8,44 @@
8
8
  # \_/ |_|_| |_| |_|\___|\___/
9
9
  # you know, for videos
10
10
  #-->
11
+ module Cherrypicker
12
+ class Vimeo
13
+ attr_accessor :link, :filename, :location, :download_url
11
14
 
12
- class Vimeo
13
- attr_accessor :link, :filename, :location, :download_url
14
-
15
- def initialize(link, opts={})
15
+ def initialize(link, opts={})
16
16
 
17
- o = {
18
- :location => nil,
19
- }.merge(opts)
17
+ o = {
18
+ :location => nil,
19
+ }.merge(opts)
20
20
 
21
- @link = link
22
- @filename = ""
23
- @location = o[:location]
24
- @download_url = ""
21
+ @link = link
22
+ @filename = ""
23
+ @location = o[:location]
24
+ @download_url = ""
25
25
 
26
- hostname = "http://www.vimeo.com/moogaloop/play/clip"
26
+ hostname = "http://www.vimeo.com/moogaloop/play/clip"
27
27
 
28
- #the vimeo ID consists of decimal numbers in the URL
29
- vimeo_id = @link[/\d+/]
30
- response = remote_query("http://www.vimeo.com/moogaloop/load/clip:#{vimeo_id}")
31
- title = response.body[/<caption>(.*)<\/caption>/, 1]
32
- request_signature = response.body[/<request_signature>(.*)<\/request_signature>/, 1]
33
- request_signature_expires = response.body[/<request_signature_expires>(\d+)<\/request_signature_expires>/, 1]
34
- hd = response.body[/<isHD>(.*)<\/isHD>/, 1]
28
+ #the vimeo ID consists of decimal numbers in the URL
29
+ vimeo_id = @link[/\d+/]
30
+ response = Cherrypicker::remote_query("http://www.vimeo.com/moogaloop/load/clip:#{vimeo_id}")
31
+ title = response.body[/<caption>(.*)<\/caption>/, 1]
32
+ request_signature = response.body[/<request_signature>(.*)<\/request_signature>/, 1]
33
+ request_signature_expires = response.body[/<request_signature_expires>(\d+)<\/request_signature_expires>/, 1]
34
+ hd = response.body[/<isHD>(.*)<\/isHD>/, 1]
35
35
 
36
- if hd.to_i == 0
37
- download_url = ":#{vimeo_id}/#{request_signature}/#{request_signature_expires}"
38
- else
39
- download_url = ":#{vimeo_id}/#{request_signature}/#{request_signature_expires}/?q=hd"
40
- end
36
+ if hd.to_i == 0
37
+ download_url = ":#{vimeo_id}/#{request_signature}/#{request_signature_expires}"
38
+ else
39
+ download_url = ":#{vimeo_id}/#{request_signature}/#{request_signature_expires}/?q=hd"
40
+ end
41
41
 
42
- @filename = title.delete("\"'").gsub(/[^0-9A-Za-z]/, '_') + ".flv"
43
- reply = remote_query("#{hostname}#{download_url}")
44
- @download_url = reply.response['location']
45
- end
42
+ @filename = title.delete("\"'").gsub(/[^0-9A-Za-z]/, '_') + ".flv"
43
+ reply = Cherrypicker::remote_query("#{hostname}#{download_url}")
44
+ @download_url = reply.response['location']
45
+ end
46
46
 
47
- def download
48
- Download.new(@download_url, :location => @location)
47
+ def download
48
+ Download.new(@download_url, :location => @location)
49
+ end
49
50
  end
50
51
  end
@@ -1,67 +1,68 @@
1
1
  # Class that can download from Vimeo
2
2
  # Youtube.new("http://www.youtube.com/watch?v=SF6I5VSZVqc", :location => "/Volumes/Storage/Desktop/cherrytest/").download
3
+ require 'cgi'
3
4
 
4
- require "cgi"
5
+ module Cherrypicker
6
+ class Youtube
7
+ attr_accessor :link, :filename, :location, :download_url
5
8
 
6
- class Youtube
7
- attr_accessor :link, :filename, :location, :download_url
8
-
9
- def initialize(link, opts={})
9
+ def initialize(link, opts={})
10
10
 
11
- o = {
12
- :location => nil,
13
- }.merge(opts)
11
+ o = {
12
+ :location => nil,
13
+ }.merge(opts)
14
14
 
15
- @link = link
16
- @filename = ""
17
- @location = o[:location]
18
- @download_url = ""
15
+ @link = link
16
+ @filename = ""
17
+ @location = o[:location]
18
+ @download_url = ""
19
19
 
20
- video_id = @link[/v[\/=](.*)/,1]
21
- video_info = remote_query("http://www.youtube.com/get_video_info?video_id=#{video_id}").body
20
+ video_id = @link[/v[\/=](.*)/,1]
21
+ video_info = Cherrypicker::remote_query("http://www.youtube.com/get_video_info?video_id=#{video_id}").body
22
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]
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
37
38
  end
38
- end
39
- [key, value]
40
- }.flatten]
39
+ [key, value]
40
+ }.flatten]
41
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
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
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?"]
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
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
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
63
 
64
- def download
65
- Download.new(@download_url, :location => @location, :filename => @filename)
64
+ def download
65
+ Download.new(@download_url, :location => @location, :filename => @filename)
66
+ end
66
67
  end
67
68
  end
@@ -1,3 +1,3 @@
1
1
  module Cherrypicker
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
data/lib/cherrypicker.rb CHANGED
@@ -1,8 +1,9 @@
1
+ require 'cherrypicker/cherrypick'
1
2
  require 'cherrypicker/download'
2
3
  require 'cherrypicker/linkchecker'
3
4
  require 'cherrypicker/helpers'
4
- require "cherrypicker/plugins/vimeo"
5
- require "cherrypicker/plugins/rapidshare"
6
- require "cherrypicker/plugins/hotfile"
7
- require "cherrypicker/plugins/youtube"
8
- require "cherrypicker/plugins/megavideo"
5
+ require 'cherrypicker/plugins/vimeo'
6
+ require 'cherrypicker/plugins/rapidshare'
7
+ require 'cherrypicker/plugins/hotfile'
8
+ require 'cherrypicker/plugins/youtube'
9
+ require 'cherrypicker/plugins/megavideo'
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: cherrypicker
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.2
5
+ version: 0.3.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Karl Entwistle
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-22 00:00:00 +01:00
13
+ date: 2011-04-23 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -27,8 +27,8 @@ dependencies:
27
27
  description:
28
28
  email:
29
29
  - Karl@Entwistle.com
30
- executables: []
31
-
30
+ executables:
31
+ - cherrypick
32
32
  extensions: []
33
33
 
34
34
  extra_rdoc_files: []
@@ -38,8 +38,10 @@ files:
38
38
  - Gemfile
39
39
  - README.md
40
40
  - Rakefile
41
+ - bin/cherrypick
41
42
  - cherrypicker.gemspec
42
43
  - lib/cherrypicker.rb
44
+ - lib/cherrypicker/cherrypick.rb
43
45
  - lib/cherrypicker/download.rb
44
46
  - lib/cherrypicker/helpers.rb
45
47
  - lib/cherrypicker/linkchecker.rb