summaryrefslogtreecommitdiffstats
path: root/ompload/ompload
blob: d639f3c72a96a6c8f5218939e84c9c7d46f2c373 (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env ruby
#
# Copyright 2007-2009 David Shakaryan <omp@gentoo.org>
# Copyright 2007-2009 Brenden Matthews <brenden@rty.ca>
#
# Distributed under the terms of the GNU General Public License v3
#

require 'tempfile'

argv = Array.new

quiet = false
url_only = false
help = false
skip = false
filename = 'pasta'

$stdin.fcntl(4, File::NONBLOCK)
stdin = $stdin.read if !$stdin.eof
unless stdin.nil?
	argv << ''
end

ARGV.each_index do |i|
	if skip
		skip = false
		next
	end
	if ARGV[i] =~ /-q|--quiet/
		quiet = true
	elsif ARGV[i] =~ /-u|--url/
		url_only = true
	elsif ARGV[i] =~ /-h|--help/
		help = true
	elsif ARGV[i] =~ /-f|--filename/
		filename = ARGV[i + 1]
		skip = true
	else
		argv << ARGV[i]
	end
end

nocurl = false
curl = %x{curl --version 2> /dev/null}
if curl.empty?
	nocurl = true
	$stderr.puts 'Error: curl missing or not in path.  Cannot continue.'
	$stderr.puts 
end

if (ARGV.size < 1 and (stdin.nil? or stdin.empty?)) or help or nocurl
	$stderr.puts 'Usage:  ompload [-h|--help] [options] [file(s)]'
	$stderr.puts '  -q, --quiet     Only output errors and warnings'
	$stderr.puts '  -u, --url       Only output URL when finished'
	$stderr.puts '  -f, --filename  Filename to use when posting data'
	$stderr.puts '                  from stdin'
	$stderr.puts 
	$stderr.puts '  You can supply a list of files or data via stdin (or both)'
	$stderr.puts 
	$stderr.puts '  This script requires a copy of cURL in the path.'
	Process.exit
end

errors = 0

wait = 5

Url = 'http://omploader.org/'
Max_size = 2**30

used_stdin = false
first = true

argv.each do |arg|

	if stdin.nil? and !used_stdin and !File.file?(arg)
		$stderr.puts "Invalid argument '#{arg}': file does not exist (or is not a regular file)."
		errors += 1
		next
	elsif File.size(arg) > Max_size
		$stderr.puts "Error omploading '#{arg}': file exceeds " + (Max_size).to_s + " bytes (size was " + File.size(arg).to_s + ")."
		errors += 1
		next
	end

	if !first
		# try not to hammer the server
		puts 'Sleeping for ' + wait.to_s + 's' if !quiet and !url_only
		sleep(wait)
	else
		first = false
	end

	tmp = Tempfile.new(filename)
	if !stdin.nil? and !used_stdin
		# upload from stdin
		puts "Progress for '#{arg}'" if !quiet and !url_only
		if quiet or url_only
			p = IO.popen("curl -s -F 'file1=@-;filename=\"#{filename}\"' #{Url}upload -o '#{tmp.path}'", "w+")
		else
			p = IO.popen("curl -# -F 'file1=@-;filename=\"#{filename}\"' #{Url}upload -o '#{tmp.path}'", "w+")
		end
		p.puts stdin
		p.close_write
		Process.wait
		used_stdin = true
	else
		# upload file
		puts "Progress for '#{arg}'" if !quiet and !url_only
		# escape quotes
		tmp_path = arg.gsub('"', '\"')
		if quiet or url_only
			%x{curl -s -F file1=@"#{tmp_path}" #{Url}upload -o '#{tmp.path}'}
		else
			%x{curl -# -F file1=@"#{tmp_path}" #{Url}upload -o '#{tmp.path}'}
		end
	end
	if !File.size?(tmp.path)
		$stderr.puts "Error omploading '#{arg}'"
		errors += 1
		next
	end
	output = IO.read(tmp.path)

	# parse for an ID
	if output =~ /View file: <a href="v([A-Za-z0-9+\/]+)">/
		id = $1
		puts "Omploaded '#{arg}' to #{Url}v#{id}" if !quiet
		wait = 5
	elsif output =~ /Slow down there, cowboy\./
		wait += 60
		argv << arg
		$stderr.puts "Got throttled when trying to ompload '#{arg}'"
		$stderr.puts "Increasing wait and attempting to continue..."
		errors += 1
	else
		$stderr.puts "Error omploading '#{arg}'"
		errors += 1
	end

end

if !quiet and !url_only
	if errors < 1
		puts "Success."
	else
		puts "Finished with #{errors} errors."
	end
end