subdb 0.1.1 → 0.1.2
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/bin/subdb +36 -75
- data/bin/subdb-gui +82 -0
- data/lib/subdb.rb +1 -3
- data/lib/subdb/client_utils.rb +111 -0
- data/lib/subdb/version.rb +1 -1
- data/vendor/multipart-post/composite_io.rb +93 -0
- data/vendor/multipart-post/multipart_post.rb +3 -0
- data/vendor/multipart-post/multipartable.rb +13 -0
- data/vendor/multipart-post/net/http/post/multipart.rb +27 -0
- data/vendor/multipart-post/parts.rb +66 -0
- metadata +14 -21
data/bin/subdb
CHANGED
|
@@ -1,85 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
# Copyright (c) 2011 Wilker Lúcio
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
|
12
|
+
# all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
+
# THE SOFTWARE.
|
|
2
21
|
|
|
3
22
|
require "rubygems"
|
|
4
23
|
|
|
5
24
|
$: << File.expand_path("../../lib", __FILE__)
|
|
25
|
+
$: << File.expand_path("../../vendor/multipart-post", __FILE__)
|
|
6
26
|
|
|
7
27
|
require "subdb"
|
|
8
28
|
|
|
9
|
-
files =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
for path in files
|
|
27
|
-
base = File.dirname(path) + "/" + File.basename(path, File.extname(path))
|
|
28
|
-
sub = nil
|
|
29
|
-
|
|
30
|
-
for subext in Subdb::SUB_EXTESNIONS
|
|
31
|
-
subpath = base + subext
|
|
32
|
-
|
|
33
|
-
if File.exists?(subpath)
|
|
34
|
-
sub = subpath
|
|
35
|
-
break
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
puts "Scanning #{path} [#{i}/#{files.length}]"
|
|
40
|
-
|
|
41
|
-
begin
|
|
42
|
-
subdb = Subdb.new(path)
|
|
43
|
-
puts "Hash: #{subdb.hash}"
|
|
44
|
-
|
|
45
|
-
remote = subdb.search
|
|
46
|
-
puts (remote ? "Found with languages: #{remote}" : "No subtitle found")
|
|
47
|
-
|
|
48
|
-
if sub and !remote
|
|
49
|
-
puts "Local subtitle found and none on server, uploading..."
|
|
50
|
-
|
|
51
|
-
begin
|
|
52
|
-
subdb.upload(sub)
|
|
53
|
-
puts "Upload completed"
|
|
54
|
-
rescue
|
|
55
|
-
puts "Error on upload: #{$!}"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
if !sub and remote
|
|
60
|
-
puts "downloading from remote"
|
|
61
|
-
|
|
62
|
-
begin
|
|
63
|
-
downloaded = subdb.download(languages)
|
|
64
|
-
|
|
65
|
-
if downloaded
|
|
66
|
-
File.open(base + ".srt", "w") do |f|
|
|
67
|
-
f << downloaded
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
puts "Download done ok"
|
|
71
|
-
else
|
|
72
|
-
puts "No version for your languages"
|
|
73
|
-
end
|
|
74
|
-
rescue
|
|
75
|
-
puts "Error on download: #{$!}"
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
rescue
|
|
79
|
-
puts "Can't open: #{$!}"
|
|
29
|
+
files = Subdb::ClientUtils.scan_paths($*)
|
|
30
|
+
|
|
31
|
+
Subdb::ClientUtils.sync files, ["pt", "en"] do |action, arg|
|
|
32
|
+
case action
|
|
33
|
+
when :scan then puts "Scanning #{arg[0]} [#{arg[1] + 1}/#{files.length}]"
|
|
34
|
+
when :scanned then puts "Hash: #{arg.hash}"
|
|
35
|
+
when :remote then puts arg ? "Found with languages: #{arg}" : "No subtitle found"
|
|
36
|
+
when :uploading then puts "Local subtitle found and none on server, uploading..."
|
|
37
|
+
when :upload_ok then puts "Upload completed"
|
|
38
|
+
when :upload_failed then puts "Error on upload: #{arg[1]}"
|
|
39
|
+
when :downloading then puts "Download from remote..."
|
|
40
|
+
when :download_ok then puts "Download done"
|
|
41
|
+
when :download_not_found then puts "No version found for your language"
|
|
42
|
+
when :download_failed then puts "Error on download: #{arg[1]}"
|
|
43
|
+
when :scan_failed then puts "Error opening: #{arg}"
|
|
44
|
+
when :file_done then puts
|
|
80
45
|
end
|
|
81
|
-
|
|
82
|
-
puts
|
|
83
|
-
|
|
84
|
-
i += 1
|
|
85
46
|
end
|
data/bin/subdb-gui
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env jruby
|
|
2
|
+
|
|
3
|
+
require 'java'
|
|
4
|
+
require File.expand_path("../../javalib/filedrop.jar", __FILE__)
|
|
5
|
+
|
|
6
|
+
import java.awt.BorderLayout
|
|
7
|
+
import java.awt.Color
|
|
8
|
+
import javax.swing.BorderFactory
|
|
9
|
+
import javax.swing.JLabel
|
|
10
|
+
import javax.swing.JFrame
|
|
11
|
+
import javax.swing.JPanel
|
|
12
|
+
import javax.swing.JProgressBar
|
|
13
|
+
import javax.swing.JScrollPane
|
|
14
|
+
import javax.swing.JTextArea
|
|
15
|
+
|
|
16
|
+
include_class java.lang.System
|
|
17
|
+
include_class Java::FileDrop
|
|
18
|
+
|
|
19
|
+
class Example < JFrame
|
|
20
|
+
include FileDrop::Listener
|
|
21
|
+
|
|
22
|
+
def initialize
|
|
23
|
+
super "Simple"
|
|
24
|
+
|
|
25
|
+
@uploading = false
|
|
26
|
+
|
|
27
|
+
self.init_ui
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def init_ui
|
|
31
|
+
@dropper = JPanel.new
|
|
32
|
+
@dropper.set_border BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10), BorderFactory.createLineBorder(Color.black))
|
|
33
|
+
|
|
34
|
+
@progress = JProgressBar.new(0, 100)
|
|
35
|
+
|
|
36
|
+
hint = JLabel.new("Arraste suas pastas ou arquivos aqui.")
|
|
37
|
+
|
|
38
|
+
@dropper.add(hint, BorderLayout::CENTER)
|
|
39
|
+
|
|
40
|
+
@log = JTextArea.new
|
|
41
|
+
|
|
42
|
+
outer_panel = JPanel.new
|
|
43
|
+
|
|
44
|
+
content_pane.add(@dropper, BorderLayout::CENTER)
|
|
45
|
+
content_pane.add(@progress, BorderLayout::SOUTH)
|
|
46
|
+
|
|
47
|
+
# @progress.set_indeterminate true
|
|
48
|
+
|
|
49
|
+
FileDrop.new(nil, @dropper, self)
|
|
50
|
+
|
|
51
|
+
set_size 500, 300
|
|
52
|
+
set_resizable false
|
|
53
|
+
set_default_close_operation JFrame::EXIT_ON_CLOSE
|
|
54
|
+
set_location_relative_to nil
|
|
55
|
+
set_visible true
|
|
56
|
+
|
|
57
|
+
@progress.set_string_painted true
|
|
58
|
+
@progress.set_string "enviando"
|
|
59
|
+
|
|
60
|
+
Thread.new do
|
|
61
|
+
i = 0
|
|
62
|
+
|
|
63
|
+
while true
|
|
64
|
+
@progress.set_value i
|
|
65
|
+
i += 1
|
|
66
|
+
sleep(5)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def filesDropped(files)
|
|
72
|
+
return if @uploading
|
|
73
|
+
|
|
74
|
+
@uploading = true
|
|
75
|
+
|
|
76
|
+
for file in files
|
|
77
|
+
puts file.to_s
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
Example.new
|
data/lib/subdb.rb
CHANGED
|
@@ -26,11 +26,9 @@ require 'digest/md5'
|
|
|
26
26
|
require 'net/http/post/multipart'
|
|
27
27
|
|
|
28
28
|
require 'subdb/version'
|
|
29
|
+
require 'subdb/client_utils'
|
|
29
30
|
|
|
30
31
|
class Subdb
|
|
31
|
-
VIDEO_EXTENSIONS = ['.avi', '.mkv', '.mp4', '.mov', '.mpg', '.wmv', '.rm', '.rmvb', '.divx']
|
|
32
|
-
SUB_EXTESNIONS = ['.srt', '.sub']
|
|
33
|
-
|
|
34
32
|
API = "http://api.thesubdb.com/"
|
|
35
33
|
SANDBOX = "http://sandbox.thesubdb.com/"
|
|
36
34
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Copyright (c) 2011 Wilker Lúcio
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
# furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
|
11
|
+
# all copies or substantial portions of the Software.
|
|
12
|
+
#
|
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
# THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
module Subdb::ClientUtils
|
|
22
|
+
VIDEO_EXTENSIONS = ['.avi', '.mkv', '.mp4', '.mov', '.mpg', '.wmv', '.rm', '.rmvb', '.divx']
|
|
23
|
+
SUB_EXTESNIONS = ['.srt', '.sub']
|
|
24
|
+
|
|
25
|
+
class << self
|
|
26
|
+
def scan_paths(paths)
|
|
27
|
+
video_ext = VIDEO_EXTENSIONS.join(",")
|
|
28
|
+
|
|
29
|
+
paths.inject([]) do |files, path|
|
|
30
|
+
if File.directory?(path)
|
|
31
|
+
path = path.chomp("/")
|
|
32
|
+
files = files.concat(Dir.glob("#{path}/**/*{#{video_ext}}"))
|
|
33
|
+
else
|
|
34
|
+
files << path if VIDEO_EXTENSIONS.include?(File.extname(path))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
files
|
|
38
|
+
end.sort
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def sync(paths, languages = ["en"])
|
|
42
|
+
i = 0
|
|
43
|
+
|
|
44
|
+
for path in paths
|
|
45
|
+
base = File.dirname(path) + "/" + File.basename(path, File.extname(path))
|
|
46
|
+
sub = find_subtitle(path)
|
|
47
|
+
|
|
48
|
+
yield :scan, [path, i]
|
|
49
|
+
|
|
50
|
+
begin
|
|
51
|
+
subdb = Subdb.new(path)
|
|
52
|
+
|
|
53
|
+
yield :scanned, subdb
|
|
54
|
+
|
|
55
|
+
remote = subdb.search
|
|
56
|
+
|
|
57
|
+
yield :remote, remote
|
|
58
|
+
|
|
59
|
+
if sub and !remote
|
|
60
|
+
yield :uploading, subdb
|
|
61
|
+
|
|
62
|
+
begin
|
|
63
|
+
subdb.upload(sub)
|
|
64
|
+
yield :upload_ok, subdb
|
|
65
|
+
rescue
|
|
66
|
+
yield :upload_failed, [subdb, $!]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if !sub and remote
|
|
71
|
+
yield :downloading, subdb
|
|
72
|
+
|
|
73
|
+
begin
|
|
74
|
+
downloaded = subdb.download(languages)
|
|
75
|
+
|
|
76
|
+
if downloaded
|
|
77
|
+
File.open(base + ".srt", "w") do |f|
|
|
78
|
+
f << downloaded
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
yield :download_ok, subdb
|
|
82
|
+
else
|
|
83
|
+
yield :download_not_found, subdb
|
|
84
|
+
end
|
|
85
|
+
rescue
|
|
86
|
+
yield :download_failed, [subdb, $!]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
rescue
|
|
90
|
+
yield :scan_failed, $!
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
i += 1
|
|
94
|
+
|
|
95
|
+
yield :file_done, [subdb, i]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def find_subtitle(path)
|
|
100
|
+
base = File.dirname(path) + "/" + File.basename(path, File.extname(path))
|
|
101
|
+
|
|
102
|
+
for subext in SUB_EXTESNIONS
|
|
103
|
+
subpath = base + subext
|
|
104
|
+
|
|
105
|
+
return subpath if File.exists?(subpath)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
nil
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
data/lib/subdb/version.rb
CHANGED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# (c) Copyright 2007-2011 Nick Sieger.
|
|
3
|
+
# See the file README.txt included with the distribution for
|
|
4
|
+
# software license details.
|
|
5
|
+
#++
|
|
6
|
+
|
|
7
|
+
# Concatenate together multiple IO objects into a single, composite IO object
|
|
8
|
+
# for purposes of reading as a single stream.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
#
|
|
12
|
+
# crio = CompositeReadIO.new(StringIO.new('one'), StringIO.new('two'), StringIO.new('three'))
|
|
13
|
+
# puts crio.read # => "onetwothree"
|
|
14
|
+
#
|
|
15
|
+
class CompositeReadIO
|
|
16
|
+
# Create a new composite-read IO from the arguments, all of which should
|
|
17
|
+
# respond to #read in a manner consistent with IO.
|
|
18
|
+
def initialize(*ios)
|
|
19
|
+
@ios = ios.flatten
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Read from the IO object, overlapping across underlying streams as necessary.
|
|
23
|
+
def read(amount = nil, buf = nil)
|
|
24
|
+
buffer = buf || ''
|
|
25
|
+
done = if amount; nil; else ''; end
|
|
26
|
+
partial_amount = amount
|
|
27
|
+
|
|
28
|
+
loop do
|
|
29
|
+
result = done
|
|
30
|
+
|
|
31
|
+
while !@ios.empty? && (result = @ios.first.read(partial_amount)) == done
|
|
32
|
+
@ios.shift
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
|
|
36
|
+
buffer << result if result
|
|
37
|
+
partial_amount -= result.length if partial_amount && result != done
|
|
38
|
+
|
|
39
|
+
break if partial_amount && partial_amount <= 0
|
|
40
|
+
break if result == done
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if buffer.length > 0
|
|
44
|
+
buffer
|
|
45
|
+
else
|
|
46
|
+
done
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Convenience methods for dealing with files and IO that are to be uploaded.
|
|
52
|
+
class UploadIO
|
|
53
|
+
# Create an upload IO suitable for including in the params hash of a
|
|
54
|
+
# Net::HTTP::Post::Multipart.
|
|
55
|
+
#
|
|
56
|
+
# Can take two forms. The first accepts a filename and content type, and
|
|
57
|
+
# opens the file for reading (to be closed by finalizer). The second accepts
|
|
58
|
+
# an already-open IO, but also requires a third argument, the filename from
|
|
59
|
+
# which it was opened.
|
|
60
|
+
#
|
|
61
|
+
# UploadIO.new("file.txt", "text/plain")
|
|
62
|
+
# UploadIO.new(file_io, "text/plain", "file.txt")
|
|
63
|
+
attr_reader :content_type, :original_filename, :local_path, :io
|
|
64
|
+
|
|
65
|
+
def initialize(filename_or_io, content_type, filename = nil)
|
|
66
|
+
io = filename_or_io
|
|
67
|
+
local_path = ""
|
|
68
|
+
if io.respond_to? :read
|
|
69
|
+
local_path = filename_or_io.path
|
|
70
|
+
else
|
|
71
|
+
io = File.open(filename_or_io)
|
|
72
|
+
local_path = filename_or_io
|
|
73
|
+
end
|
|
74
|
+
filename ||= local_path
|
|
75
|
+
|
|
76
|
+
@content_type = content_type
|
|
77
|
+
@original_filename = File.basename(filename)
|
|
78
|
+
@local_path = local_path
|
|
79
|
+
@io = io
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def self.convert!(io, content_type, original_filename, local_path)
|
|
83
|
+
raise ArgumentError, "convert! has been removed. You must now wrap IOs using:\nUploadIO.new(filename_or_io, content_type, filename=nil)\nPlease update your code."
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def method_missing(*args)
|
|
87
|
+
@io.send(*args)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def respond_to?(meth)
|
|
91
|
+
@io.respond_to?(meth) || super(meth)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'parts'
|
|
2
|
+
module Multipartable
|
|
3
|
+
DEFAULT_BOUNDARY = "-----------RubyMultipartPost"
|
|
4
|
+
def initialize(path, params, headers={}, boundary = DEFAULT_BOUNDARY)
|
|
5
|
+
super(path, headers)
|
|
6
|
+
parts = params.map {|k,v| Parts::Part.new(boundary, k, v)}
|
|
7
|
+
parts << Parts::EpiloguePart.new(boundary)
|
|
8
|
+
ios = parts.map{|p| p.to_io }
|
|
9
|
+
self.set_content_type("multipart/form-data", { "boundary" => boundary })
|
|
10
|
+
self.content_length = parts.inject(0) {|sum,i| sum + i.length }
|
|
11
|
+
self.body_stream = CompositeReadIO.new(*ios)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# (c) Copyright 2007-2008 Nick Sieger.
|
|
3
|
+
# See the file README.txt included with the distribution for
|
|
4
|
+
# software license details.
|
|
5
|
+
#++
|
|
6
|
+
|
|
7
|
+
require 'net/http'
|
|
8
|
+
require 'stringio'
|
|
9
|
+
require 'cgi'
|
|
10
|
+
require 'composite_io'
|
|
11
|
+
require 'multipartable'
|
|
12
|
+
require 'parts'
|
|
13
|
+
|
|
14
|
+
module Net #:nodoc:
|
|
15
|
+
class HTTP #:nodoc:
|
|
16
|
+
class Put
|
|
17
|
+
class Multipart < Put
|
|
18
|
+
include Multipartable
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
class Post #:nodoc:
|
|
22
|
+
class Multipart < Post
|
|
23
|
+
include Multipartable
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Parts
|
|
2
|
+
module Part #:nodoc:
|
|
3
|
+
def self.new(boundary, name, value)
|
|
4
|
+
if value.respond_to? :content_type
|
|
5
|
+
FilePart.new(boundary, name, value)
|
|
6
|
+
else
|
|
7
|
+
ParamPart.new(boundary, name, value)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def length
|
|
12
|
+
@part.length
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_io
|
|
16
|
+
@io
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class ParamPart
|
|
21
|
+
include Part
|
|
22
|
+
def initialize(boundary, name, value)
|
|
23
|
+
@part = build_part(boundary, name, value)
|
|
24
|
+
@io = StringIO.new(@part)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def build_part(boundary, name, value)
|
|
28
|
+
part = ''
|
|
29
|
+
part << "--#{boundary}\r\n"
|
|
30
|
+
part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n"
|
|
31
|
+
part << "\r\n"
|
|
32
|
+
part << "#{value}\r\n"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Represents a part to be filled from file IO.
|
|
37
|
+
class FilePart
|
|
38
|
+
include Part
|
|
39
|
+
attr_reader :length
|
|
40
|
+
def initialize(boundary, name, io)
|
|
41
|
+
file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
|
|
42
|
+
@head = build_head(boundary, name, io.original_filename, io.content_type, file_length)
|
|
43
|
+
@length = @head.length + file_length
|
|
44
|
+
@io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new("\r\n"))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def build_head(boundary, name, filename, type, content_len)
|
|
48
|
+
part = ''
|
|
49
|
+
part << "--#{boundary}\r\n"
|
|
50
|
+
part << "Content-Disposition: form-data; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
|
|
51
|
+
part << "Content-Length: #{content_len}\r\n"
|
|
52
|
+
part << "Content-Type: #{type}\r\n"
|
|
53
|
+
part << "Content-Transfer-Encoding: binary\r\n"
|
|
54
|
+
part << "\r\n"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Represents the epilogue or closing boundary.
|
|
59
|
+
class EpiloguePart
|
|
60
|
+
include Part
|
|
61
|
+
def initialize(boundary)
|
|
62
|
+
@part = "--#{boundary}--\r\n"
|
|
63
|
+
@io = StringIO.new(@part)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: subdb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 31
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 1
|
|
9
|
-
-
|
|
10
|
-
version: 0.1.
|
|
9
|
+
- 2
|
|
10
|
+
version: 0.1.2
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Wilker Lucio
|
|
@@ -15,25 +15,10 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-04-
|
|
18
|
+
date: 2011-04-20 00:00:00 -03:00
|
|
19
19
|
default_executable:
|
|
20
|
-
dependencies:
|
|
21
|
-
|
|
22
|
-
name: multipart-post
|
|
23
|
-
prerelease: false
|
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
-
none: false
|
|
26
|
-
requirements:
|
|
27
|
-
- - ">="
|
|
28
|
-
- !ruby/object:Gem::Version
|
|
29
|
-
hash: 19
|
|
30
|
-
segments:
|
|
31
|
-
- 1
|
|
32
|
-
- 1
|
|
33
|
-
- 0
|
|
34
|
-
version: 1.1.0
|
|
35
|
-
type: :runtime
|
|
36
|
-
version_requirements: *id001
|
|
20
|
+
dependencies: []
|
|
21
|
+
|
|
37
22
|
description: API for SubDB
|
|
38
23
|
email:
|
|
39
24
|
- wilkerlucio@gmail.com
|
|
@@ -45,8 +30,15 @@ extra_rdoc_files: []
|
|
|
45
30
|
|
|
46
31
|
files:
|
|
47
32
|
- bin/subdb
|
|
33
|
+
- bin/subdb-gui
|
|
34
|
+
- lib/subdb/client_utils.rb
|
|
48
35
|
- lib/subdb/version.rb
|
|
49
36
|
- lib/subdb.rb
|
|
37
|
+
- vendor/multipart-post/composite_io.rb
|
|
38
|
+
- vendor/multipart-post/multipart_post.rb
|
|
39
|
+
- vendor/multipart-post/multipartable.rb
|
|
40
|
+
- vendor/multipart-post/net/http/post/multipart.rb
|
|
41
|
+
- vendor/multipart-post/parts.rb
|
|
50
42
|
- LICENSE
|
|
51
43
|
- README.textile
|
|
52
44
|
has_rdoc: true
|
|
@@ -58,6 +50,7 @@ rdoc_options: []
|
|
|
58
50
|
|
|
59
51
|
require_paths:
|
|
60
52
|
- - lib
|
|
53
|
+
- vendor
|
|
61
54
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
55
|
none: false
|
|
63
56
|
requirements:
|