mdarby-scribd_fu 1.2.3.2 → 2.0
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/init.rb +1 -1
- data/lib/scribd_fu.rb +215 -73
- data/scribd_fu.gemspec +2 -2
- metadata +2 -2
- data/README +0 -1
- data/Rakefile +0 -22
- data/generators/scribd_config/scribd_config_generator.rb +0 -7
- data/generators/scribd_config/templates/scribd.yml +0 -9
- data/install.rb +0 -1
- data/lib/attachment_fu/methods.rb +0 -163
- data/lib/paperclip/methods.rb +0 -231
- data/lib/scribd_fu_helper.rb +0 -58
- data/rails/init.rb +0 -7
- data/uninstall.rb +0 -1
data/init.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), "lib", "scribd_fu")
|
data/lib/scribd_fu.rb
CHANGED
@@ -1,108 +1,250 @@
|
|
1
|
-
require 'attachment_fu/methods'
|
2
|
-
require 'paperclip/methods'
|
3
|
-
|
4
1
|
module ScribdFu
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
2
|
+
|
3
|
+
ConfigPath = "#{RAILS_ROOT}/config/scribd_fu.yml".freeze
|
4
|
+
|
5
|
+
# A list of content types supported by iPaper.
|
6
|
+
ContentTypes = [
|
7
|
+
'application/pdf',
|
8
|
+
'application/msword',
|
9
|
+
'application/mspowerpoint',
|
10
|
+
'application/vnd.ms-powerpoint',
|
11
|
+
'application/excel',
|
12
|
+
'application/vnd.ms-excel',
|
13
|
+
'application/postscript',
|
14
|
+
'text/plain',
|
15
|
+
'application/rtf',
|
16
|
+
'application/vnd.oasis.opendocument.text',
|
17
|
+
'application/vnd.oasis.opendocument.presentation',
|
18
|
+
'application/vnd.oasis.opendocument.spreadsheet',
|
19
|
+
'application/vnd.sun.xml.writer',
|
20
|
+
'application/vnd.sun.xml.impress',
|
21
|
+
'application/vnd.sun.xml.calc',
|
20
22
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
21
23
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
22
24
|
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
23
25
|
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
24
26
|
'application/vnd.openxmlformats-officedocument.presentationml.template',
|
25
27
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
26
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.template'
|
28
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.template'
|
29
|
+
]
|
30
|
+
|
31
|
+
# Available parameters for the JS API
|
32
|
+
# http://www.scribd.com/publisher/api/api?method_name=Javascript+API
|
33
|
+
Available_JS_Params = [ :height, :width, :page, :my_user_id, :search_query,
|
34
|
+
:jsapi_version, :disable_related_docs, :mode, :auto_size ]
|
27
35
|
|
28
|
-
|
29
|
-
base.extend ActsAsScribdDocument
|
36
|
+
class ScribdFuError < StandardError #:nodoc:
|
30
37
|
end
|
31
38
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
39
|
+
class ScribdFuUploadError < ScribdFuError #:nodoc:
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
class << self
|
44
|
+
|
45
|
+
def included(base) #:nodoc:
|
46
|
+
base.extend ClassMethods
|
36
47
|
end
|
37
48
|
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
# Login, store, and return a handle to the Scribd user account
|
50
|
+
def scribd_user
|
51
|
+
begin
|
52
|
+
# Ensure we can login to Scribd, and get a handle on the account
|
53
|
+
Scribd::API.instance.key = config[:key]
|
54
|
+
Scribd::API.instance.secret = config[:secret]
|
55
|
+
@scribd_user = Scribd::User.login(config[:user], config[:password])
|
56
|
+
rescue
|
57
|
+
raise ScribdFuError, "Your Scribd credentials are incorrect"
|
58
|
+
end
|
59
|
+
end
|
45
60
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
61
|
+
# Upload a file to Scribd
|
62
|
+
def upload(obj, file_path)
|
63
|
+
begin
|
64
|
+
res = scribd_user.upload(:file => "#{file_path}", :access => access_level)
|
65
|
+
obj.update_attributes({:ipaper_id => res.doc_id, :ipaper_access_key => res.access_key})
|
66
|
+
rescue
|
67
|
+
raise ScribdFuUploadError, "Sorry, but #{obj.class} ##{obj.id} could not be uploaded to Scribd"
|
68
|
+
end
|
69
|
+
end
|
50
70
|
|
51
|
-
|
52
|
-
|
71
|
+
# Delete an iPaper document
|
72
|
+
def destroy(document)
|
73
|
+
document.destroy
|
74
|
+
end
|
75
|
+
|
76
|
+
# Read, store, and return the ScribdFu config file's contents
|
77
|
+
def config
|
78
|
+
raise ScribdFuError, "#{ConfigPath} does not exist" unless File.file?(ConfigPath)
|
79
|
+
|
80
|
+
# Load the config file and strip any whitespace from the values
|
81
|
+
@config ||= YAML.load_file(ConfigPath).each_pair{|k,v| {k=>v.to_s.strip}}.symbolize_keys!
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get the preferred access level for iPaper documents
|
85
|
+
def access_level
|
86
|
+
config[:access] || 'private'
|
87
|
+
end
|
88
|
+
|
89
|
+
# Load, store, and return the associated iPaper document
|
90
|
+
def load_ipaper_document(id)
|
91
|
+
begin
|
92
|
+
@document ||= scribd_user.find_document(id)
|
93
|
+
rescue
|
94
|
+
raise ScribdFuError, "Scribd Document ##{id} not found!"
|
53
95
|
end
|
54
96
|
end
|
97
|
+
|
55
98
|
end
|
56
99
|
|
57
|
-
module
|
58
|
-
# Sets up Scribd configuration info when this module is included.
|
59
|
-
def self.included(base)
|
60
|
-
base.extend ClassMethods
|
100
|
+
module ClassMethods
|
61
101
|
|
62
|
-
|
102
|
+
# Load and inject ScribdFu goodies
|
103
|
+
def has_ipaper_and_uses(str)
|
104
|
+
check_environment
|
105
|
+
load_base_plugin(str)
|
63
106
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
107
|
+
include InstanceMethods
|
108
|
+
|
109
|
+
after_save :upload_to_scribd # This *MUST* be an after_save
|
110
|
+
before_destroy :destroy_ipaper_document
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
# Configure ScribdFu for this particular environment
|
116
|
+
def check_environment
|
117
|
+
load_rscribd
|
118
|
+
check_config
|
119
|
+
check_fields
|
68
120
|
end
|
69
121
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
@@scribd_config = @@scribd_config[:scribd]
|
122
|
+
def check_config
|
123
|
+
ScribdFu::config
|
124
|
+
end
|
74
125
|
|
75
|
-
|
76
|
-
|
77
|
-
|
126
|
+
# Load the rscribd gem
|
127
|
+
def load_rscribd
|
128
|
+
begin
|
129
|
+
require 'rscribd'
|
130
|
+
rescue LoadError
|
131
|
+
raise ScribdFuError, 'Please install the rscribd gem'
|
132
|
+
end
|
133
|
+
end
|
78
134
|
|
79
|
-
|
135
|
+
# Load Attachment_Fu specific methods and files
|
136
|
+
def load_attachment_fu
|
137
|
+
require 'scribd_fu/attachment_fu'
|
138
|
+
include ScribdFu::AttachmentFu::InstanceMethods
|
139
|
+
end
|
140
|
+
|
141
|
+
# Load Paperclip specific methods and files
|
142
|
+
def load_paperclip
|
143
|
+
require 'scribd_fu/paperclip'
|
144
|
+
include ScribdFu::Paperclip::InstanceMethods
|
145
|
+
end
|
146
|
+
|
147
|
+
# Ensure ScribdFu-centric attributes exist
|
148
|
+
def check_fields
|
149
|
+
fields = %w{ipaper_id ipaper_access_key}.inject([]){|stack, f| stack << "#{name}##{f}" unless column_names.include?(f); stack}
|
150
|
+
raise ScribdFuError, "These fields are missing: #{fields.to_sentence}" if fields.size > 0
|
151
|
+
end
|
152
|
+
|
153
|
+
# Load either AttachmentFu or Paperclip-specific methods
|
154
|
+
def load_base_plugin(str)
|
155
|
+
if str == 'AttachmentFu'
|
156
|
+
load_attachment_fu
|
157
|
+
elsif str == 'Paperclip'
|
158
|
+
load_paperclip
|
159
|
+
else
|
160
|
+
raise ScribdFuError, "Sorry, only Attachment_fu and Paperclip are supported."
|
80
161
|
end
|
81
|
-
rescue
|
82
|
-
raise "config/scribd.yml file not found, or your credentials are incorrect."
|
83
162
|
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
module InstanceMethods
|
167
|
+
|
168
|
+
def self.included(base)
|
169
|
+
base.extend ClassMethods
|
84
170
|
end
|
85
171
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
172
|
+
# Upload the associated file to Scribd for iPaper conversion
|
173
|
+
# This is called +after_save+ and cannot be called earlier,
|
174
|
+
# so don't get any ideas.
|
175
|
+
def upload_to_scribd
|
176
|
+
ScribdFu::upload(self, file_path) if scribdable?
|
177
|
+
end
|
92
178
|
|
93
|
-
|
179
|
+
# Checks whether the associated file is convertable to iPaper
|
180
|
+
def scribdable?
|
181
|
+
ContentTypes.include?(get_content_type) && ipaper_id.blank?
|
94
182
|
end
|
95
|
-
end
|
96
183
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
def self.extended(base)
|
102
|
-
base.class_inheritable_accessor :scribd_options
|
184
|
+
# Responds true if the conversion is converting
|
185
|
+
def conversion_processing?
|
186
|
+
!(conversion_complete? || conversion_successful? || conversion_error?)
|
187
|
+
end
|
103
188
|
|
104
|
-
|
105
|
-
|
189
|
+
# Responds true if the conversion is complete -- note that this gives no
|
190
|
+
# indication as to whether the conversion had an error or was succesful,
|
191
|
+
# just that the conversion completed.
|
192
|
+
def conversion_complete?
|
193
|
+
ipaper_document && ipaper_document.conversion_status != 'PROCESSING'
|
106
194
|
end
|
195
|
+
|
196
|
+
# Responds true if the document has been converted.
|
197
|
+
def conversion_successful?
|
198
|
+
ipaper_document && ipaper_document.conversion_status =~ /^DISPLAYABLE|DONE$/
|
199
|
+
end
|
200
|
+
|
201
|
+
# Responds true if there was a conversion error while converting to iPaper.
|
202
|
+
def conversion_error?
|
203
|
+
ipaper_document && ipaper_document.conversion_status == 'ERROR'
|
204
|
+
end
|
205
|
+
|
206
|
+
# Responds the Scribd::Document associated with this model, or nil if it does not exist.
|
207
|
+
def ipaper_document
|
208
|
+
@document ||= ScribdFu::load_ipaper_document(ipaper_id)
|
209
|
+
end
|
210
|
+
|
211
|
+
# Destroys the scribd document for this record. This is called +before_destroy+
|
212
|
+
def destroy_ipaper_document
|
213
|
+
ScribdFu::destroy(ipaper_document) if ipaper_document
|
214
|
+
end
|
215
|
+
|
216
|
+
# Display the iPaper document in a view
|
217
|
+
def display_ipaper(options = {})
|
218
|
+
alt = options.has_key?(:alt) ? options[:alt] : ""
|
219
|
+
|
220
|
+
<<-END
|
221
|
+
<script type="text/javascript" src="http://www.scribd.com/javascripts/view.js"></script>
|
222
|
+
<div id="embedded_flash">#{alt}</div>
|
223
|
+
<script type="text/javascript">
|
224
|
+
var scribd_doc = scribd.Document.getDoc(#{ipaper_id}, '#{ipaper_access_key}');
|
225
|
+
#{js_params(options)}
|
226
|
+
scribd_doc.write("embedded_flash");
|
227
|
+
</script>
|
228
|
+
END
|
229
|
+
end
|
230
|
+
|
231
|
+
|
232
|
+
private
|
233
|
+
|
234
|
+
# Check and collect any Javascript params that might have been passed in
|
235
|
+
def js_params(options)
|
236
|
+
opt = []
|
237
|
+
|
238
|
+
options.each_pair do |k, v|
|
239
|
+
opt << "scribd_doc.addParam('#{k}', '#{v}');" if Available_JS_Params.include?(k)
|
240
|
+
end
|
241
|
+
|
242
|
+
opt.compact.join("\n")
|
243
|
+
end
|
244
|
+
|
107
245
|
end
|
246
|
+
|
108
247
|
end
|
248
|
+
|
249
|
+
# Let's do this.
|
250
|
+
ActiveRecord::Base.send(:include, ScribdFu) if Object.const_defined?("ActiveRecord")
|
data/scribd_fu.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "scribd_fu"
|
3
|
-
s.version = "
|
4
|
-
s.date = "2009-03-
|
3
|
+
s.version = "2.0"
|
4
|
+
s.date = "2009-03-29"
|
5
5
|
s.summary = "Quick and easy interactions with Scribd's iPaper service"
|
6
6
|
s.email = "matt@matt-darby.com"
|
7
7
|
s.homepage = "http://github.com/mdarby/scribd_fu/tree/master"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdarby-scribd_fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: "2.0"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Darby
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-29 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
data/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
README.textile
|
data/Rakefile
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
desc 'Default: run unit tests.'
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
desc 'Test the Scribd_fu plugin.'
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << 'lib'
|
11
|
-
t.pattern = 'test/**/*_test.rb'
|
12
|
-
t.verbose = true
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Generate documentation for the Scribd_fu plugin.'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'Scribd_fu'
|
19
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
20
|
-
rdoc.rdoc_files.include('README')
|
21
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
-
end
|
data/install.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Install hook code here
|
@@ -1,163 +0,0 @@
|
|
1
|
-
require 'ftools'
|
2
|
-
|
3
|
-
module ScribdFu
|
4
|
-
module AttachmentFu
|
5
|
-
module ClassMethods
|
6
|
-
# Adds validations to the current model to check that its attachment is
|
7
|
-
# scribdable.
|
8
|
-
def validates_as_scribd_document
|
9
|
-
validates_presence_of :scribd_id, :scribd_access_key, :content_type
|
10
|
-
validate :scribdable?
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module InstanceMethods
|
15
|
-
def self.included(base)
|
16
|
-
base.extend ClassMethods
|
17
|
-
end
|
18
|
-
|
19
|
-
# Checks whether the attachment is scribdable. This boils down to a check
|
20
|
-
# to ensure that the contents of the attachment are of a content type that
|
21
|
-
# scribd can understand.
|
22
|
-
def scribdable?
|
23
|
-
ScribdFu::CONTENT_TYPES.include?(content_type)
|
24
|
-
end
|
25
|
-
|
26
|
-
def scribd_id=(id)
|
27
|
-
write_attribute :scribd_id, id.to_s.strip
|
28
|
-
end
|
29
|
-
|
30
|
-
def scribd_access_key=(key)
|
31
|
-
write_attribute :scribd_access_key, key.to_s.strip
|
32
|
-
end
|
33
|
-
|
34
|
-
# Destroys the scribd document for this record. This is called
|
35
|
-
# +before_destroy+, as set up by ScribdFu::ClassMethods#extended.
|
36
|
-
#
|
37
|
-
# Also available as destroy_scribd_document, which makes more sense in
|
38
|
-
# terms of pluralization for external calls.
|
39
|
-
def destroy_scribd_documents
|
40
|
-
unless scribd_document.nil?
|
41
|
-
if scribd_document.destroy
|
42
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Removing Object #{id} successful"
|
43
|
-
else
|
44
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Removing Object #{id} failed!"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
alias_method :destroy_scribd_document, :destroy_scribd_documents
|
49
|
-
|
50
|
-
# Uploads the attachment to scribd for processing.. This is called
|
51
|
-
# +before_validation+, as set up by ScribdFu::ClassMethods#extended.
|
52
|
-
def upload_to_scribd
|
53
|
-
if scribdable? and self.scribd_id.blank?
|
54
|
-
with_file_path do |file_path|
|
55
|
-
if resource = scribd_login.upload(:file => "#{file_path}",
|
56
|
-
:access => access_level)
|
57
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Object #{id} successfully uploaded for conversion to iPaper."
|
58
|
-
|
59
|
-
self.scribd_id = resource.doc_id
|
60
|
-
self.scribd_access_key = resource.access_key
|
61
|
-
|
62
|
-
save
|
63
|
-
else
|
64
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Object #{id} upload failed!"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns a URL for a thumbnail for this model's attachment.
|
71
|
-
#
|
72
|
-
# If Scribd does not provide a thumbnail URL, then Attachment_fu's
|
73
|
-
# thumbnail is fallen back on by returning the value of
|
74
|
-
# <tt>public_filename(:thumb)</tt>.
|
75
|
-
#
|
76
|
-
# Sample use in a view:
|
77
|
-
# <%= image_tag(@attachment .thumbnail_url, :alt => @attachment.name) %>
|
78
|
-
def thumbnail_url
|
79
|
-
(scribd_document && scribd_document.thumbnail_url) or
|
80
|
-
public_filename(:thumb)
|
81
|
-
end
|
82
|
-
|
83
|
-
# Returns the actual image data of a thumbnail for this model's
|
84
|
-
# attachment.
|
85
|
-
#
|
86
|
-
# If Scribd does not have a thumbnail for this file, then Attachment_fu's
|
87
|
-
# thumbnanil is fallen back on by returning the file at
|
88
|
-
# <tt>full_filename(:thumb)</tt>.
|
89
|
-
#
|
90
|
-
# Sample use in a controller:
|
91
|
-
# render :inline => @attachment.thumbnail_file,
|
92
|
-
# :content_type => 'image/jpeg'
|
93
|
-
def thumbnail_file
|
94
|
-
path = (scribd_document && scribd_document.thumbnail_url) ||
|
95
|
-
full_filename(:thumb)
|
96
|
-
|
97
|
-
open(path).read
|
98
|
-
rescue Errno::ENOENT
|
99
|
-
nil
|
100
|
-
end
|
101
|
-
|
102
|
-
# Yields the correct path to the file, either the local filename or the
|
103
|
-
# S3 URL.
|
104
|
-
#
|
105
|
-
# This method creates a temporary file of the correct filename if
|
106
|
-
# necessary, so as to be able to give scribd the right filename. The file
|
107
|
-
# is destroyed when the passed block ends.
|
108
|
-
def with_file_path(&block) # :yields: full_file_path
|
109
|
-
# TODO We can probably do this using respond_to?
|
110
|
-
if scribd_config['storage'].eql?('s3')
|
111
|
-
yield s3_url
|
112
|
-
elsif save_attachment? # file hasn't been saved, use the temp file
|
113
|
-
temp_rename = File.join(Dir.tmpdir, filename)
|
114
|
-
File.copy(temp_path, temp_rename)
|
115
|
-
|
116
|
-
yield temp_rename
|
117
|
-
else
|
118
|
-
yield full_filename
|
119
|
-
end
|
120
|
-
ensure
|
121
|
-
temp_rename && File.unlink(temp_rename) # always delete this
|
122
|
-
end
|
123
|
-
|
124
|
-
# Responds true if the conversion is complete -- note that this gives no
|
125
|
-
# indication as to whether the conversion had an error or was succesful,
|
126
|
-
# just that the conversion completed.
|
127
|
-
#
|
128
|
-
# Note that this method still returns false if the model does not refer to a
|
129
|
-
# valid document. scribd_attributes_valid? should be used to determine the
|
130
|
-
# validity of the document.
|
131
|
-
def conversion_complete?
|
132
|
-
scribd_document && scribd_document.conversion_status != 'PROCESSING'
|
133
|
-
end
|
134
|
-
|
135
|
-
# Responds true if the document has been converted.
|
136
|
-
#
|
137
|
-
# Note that this method still returns false if the model does not refer to a
|
138
|
-
# valid document. scribd_attributes_valid? should be used to determine the
|
139
|
-
# validity of the document.
|
140
|
-
def conversion_successful?
|
141
|
-
scribd_document && scribd_document.conversion_status =~ /^DISPLAYABLE|DONE$/
|
142
|
-
end
|
143
|
-
|
144
|
-
# Responds true if there was a conversion error while converting
|
145
|
-
# to iPaper.
|
146
|
-
#
|
147
|
-
# Note that this method still returns false if the model does not refer to a
|
148
|
-
# valid document. scribd_attributes_valid? should be used to determine the
|
149
|
-
# validity of the document.
|
150
|
-
def conversion_error?
|
151
|
-
scribd_document && scribd_document.conversion_status == 'ERROR'
|
152
|
-
end
|
153
|
-
|
154
|
-
# Responds the Scribd::Document associated with this model, or nil if it
|
155
|
-
# does not exist.
|
156
|
-
def scribd_document
|
157
|
-
@scribd_document ||= scribd_login.find_document(scribd_id)
|
158
|
-
rescue Scribd::ResponseError # at minimum, the document was not found
|
159
|
-
nil
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
data/lib/paperclip/methods.rb
DELETED
@@ -1,231 +0,0 @@
|
|
1
|
-
require 'ftools'
|
2
|
-
|
3
|
-
module ScribdFu
|
4
|
-
module Paperclip
|
5
|
-
module ClassMethods
|
6
|
-
# Adds validations to the current model to check that the attachment at
|
7
|
-
# +attribute+ is scribdable. If +attribute+ is nil, then all attachments
|
8
|
-
# that have been marked as scribdable are validated.
|
9
|
-
#
|
10
|
-
# Note that all calls to has_scribdable_attachment should be made before
|
11
|
-
# calling validates_attachment_scribdability with a nil parameter;
|
12
|
-
# otherwise, only those that have been created already will be validated.
|
13
|
-
def validates_attachment_scribdability(attribute = nil)
|
14
|
-
attributes = attribute.nil? ? scribd_attributes : [attribute]
|
15
|
-
|
16
|
-
attributes.each do |attribute|
|
17
|
-
validates_presence_of "#{attribute}_scribd_id",
|
18
|
-
"#{attribute}_scribd_access_key",
|
19
|
-
"#{attribute}_content_type"
|
20
|
-
validates_attachment_content_type attribute,
|
21
|
-
:content_type => ScribdFu::CONTENT_TYPES
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Adds the given +attribute+ to the list of attributes that are uploaded
|
26
|
-
# to scribd.
|
27
|
-
#
|
28
|
-
# Note that a scribd attribute should not be added if it is not a
|
29
|
-
# Paperclip attachment attribute.
|
30
|
-
def add_scribd_attribute(attribute)
|
31
|
-
write_inheritable_attribute :scribd_attributes, [] if scribd_attributes.nil?
|
32
|
-
|
33
|
-
scribd_attributes << attribute
|
34
|
-
|
35
|
-
setup_scribd_attribute(attribute)
|
36
|
-
end
|
37
|
-
|
38
|
-
def scribd_attributes
|
39
|
-
read_inheritable_attribute :scribd_attributes
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
# Sets up methods needed for the given +attribute+ to be scribdable.
|
44
|
-
def setup_scribd_attribute(attribute)
|
45
|
-
define_method("#{attribute}_scribd_id=") do |id|
|
46
|
-
write_attribute "#{attribute}_scribd_id", id.to_s.strip
|
47
|
-
end
|
48
|
-
|
49
|
-
define_method("#{attribute}_scribd_access_key=") do |key|
|
50
|
-
write_attribute "#{attribute}_scribd_access_key", key.to_s.strip
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
module InstanceMethods
|
56
|
-
def self.included(base)
|
57
|
-
base.extend ClassMethods
|
58
|
-
end
|
59
|
-
|
60
|
-
# Checks whether the given attribute is scribdable. This boils down to a
|
61
|
-
# check to ensure that the contents of the attribute are of a content type
|
62
|
-
# that scribd can understand.
|
63
|
-
def scribdable?(attribute)
|
64
|
-
ScribdFu::CONTENT_TYPES.include?(self["#{attribute}_content_type"])
|
65
|
-
end
|
66
|
-
|
67
|
-
# Destroys all scribd documents for this record. This is called
|
68
|
-
# +before_destroy+, as set up by ScribdFu::ClassMethods#extended.
|
69
|
-
def destroy_scribd_documents
|
70
|
-
self.class.scribd_attributes.each do |attribute|
|
71
|
-
document = scribd_document_for(self["#{attribute}_scribd_id"])
|
72
|
-
|
73
|
-
unless document.nil?
|
74
|
-
if document.destroy
|
75
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Removing Object #{id}##{attribute} successful"
|
76
|
-
else
|
77
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Removing Object #{id}##{attribute} failed!"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# Uploads all scribdable attributes to scribd for processing. This is
|
84
|
-
# called +before_validation+, as set up by
|
85
|
-
# ScribdFu::ClassMethods#extended.
|
86
|
-
def upload_to_scribd
|
87
|
-
self.class.scribd_attributes.each do |attribute|
|
88
|
-
scribd_id = self["#{attribute}_scribd_id"]
|
89
|
-
|
90
|
-
if scribdable?(attribute) and scribd_id.blank?
|
91
|
-
with_file_path_for(attribute) do |filename|
|
92
|
-
if resource = scribd_login.upload(:file => filename,
|
93
|
-
:access => access_level)
|
94
|
-
self.send("#{attribute}_scribd_id=", resource.doc_id)
|
95
|
-
self.send("#{attribute}_scribd_access_key=", resource.access_key)
|
96
|
-
|
97
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Object " +
|
98
|
-
"#{id}##{attribute} successfully uploaded " +
|
99
|
-
"for conversion to iPaper."
|
100
|
-
else
|
101
|
-
logger.info "[Scribd_fu] #{Time.now.rfc2822}: Object " +
|
102
|
-
"#{id}##{attribute} upload failed!"
|
103
|
-
|
104
|
-
false # cancel the save
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# Returns a URL for a thumbnail for the specified +attribute+ attachment.
|
112
|
-
#
|
113
|
-
# If Scribd does not provide a thumbnail URL, then Paperclip's thumbnail
|
114
|
-
# is fallen back on by returning the value of
|
115
|
-
# <tt>attribute.url(:thumb)</tt>.
|
116
|
-
#
|
117
|
-
# Sample use in a view:
|
118
|
-
# <%= image_tag(@attachment.thumbnail_url, :alt => @attachment.name) %>
|
119
|
-
def thumbnail_url(attribute)
|
120
|
-
doc = scribd_document_for(attribute)
|
121
|
-
|
122
|
-
(doc && doc.thumbnail_url) or self.send(attribute).url(:thumb)
|
123
|
-
end
|
124
|
-
|
125
|
-
# Returns the actual image data of a thumbnail for the specified
|
126
|
-
# +attribute+ attachment.
|
127
|
-
#
|
128
|
-
# If Scribd does not have a thumbnail for this file, then
|
129
|
-
# Paperclip's thumbnanil is fallen back on by returning the file from
|
130
|
-
# <tt>attribute.to_file(:thumb)</tt>.
|
131
|
-
#
|
132
|
-
# Sample use in a controller:
|
133
|
-
# render :inline => @attachment.thumbnail_file,
|
134
|
-
# :content_type => 'image/jpeg'
|
135
|
-
def thumbnail_file(attribute)
|
136
|
-
doc = scribd_document_for(attribute)
|
137
|
-
|
138
|
-
if doc && doc.thumbnail_url
|
139
|
-
open(doc.thumbnail_url).read
|
140
|
-
else
|
141
|
-
send(attribute).to_file(:thumb).open { |f| f.read }
|
142
|
-
end
|
143
|
-
rescue Errno::ENOENT, NoMethodError # file not found or nil thumb file
|
144
|
-
nil
|
145
|
-
end
|
146
|
-
|
147
|
-
# Responds true if the conversion is complete for the given +attribute+ --
|
148
|
-
# note that this gives no indication as to whether the conversion had an
|
149
|
-
# error or was succesful, just that the conversion completed. See
|
150
|
-
# <tt>conversion_successful?</tt> for that information.
|
151
|
-
#
|
152
|
-
# Note also that this method still returns false if the model does not
|
153
|
-
# refer to a valid document. scribd_attributes_valid? should be used to
|
154
|
-
# determine the validity of the document.
|
155
|
-
def conversion_complete?(attribute)
|
156
|
-
doc = scribd_document_for(attribute)
|
157
|
-
|
158
|
-
doc && doc.conversion_status != 'PROCESSING'
|
159
|
-
end
|
160
|
-
|
161
|
-
# Responds true if the document for the given +attribute+ has been
|
162
|
-
# converted successfully. This *will* respond false if the conversion has
|
163
|
-
# failed.
|
164
|
-
#
|
165
|
-
# Note that this method still returns false if the model does not refer to a
|
166
|
-
# valid document. <tt>scribd_attributes_valid?</tt> should be used to
|
167
|
-
# determine the validity of the document.
|
168
|
-
def conversion_successful?(attribute)
|
169
|
-
doc = scribd_document_for(attribute)
|
170
|
-
|
171
|
-
doc && doc.conversion_status =~ /^DISPLAYABLE|DONE$/
|
172
|
-
end
|
173
|
-
|
174
|
-
# Responds true if there was a conversion error while converting the given
|
175
|
-
# +attribute+ to iPaper.
|
176
|
-
#
|
177
|
-
# Note that this method still returns false if the model does not refer to a
|
178
|
-
# valid document. <tt>scribd_attributes_valid?</tt> should be used to
|
179
|
-
# determine the validity of the document.
|
180
|
-
def conversion_error?(attribute)
|
181
|
-
doc = scribd_document_for(attribute)
|
182
|
-
|
183
|
-
doc && doc.conversion_status == 'ERROR'
|
184
|
-
end
|
185
|
-
|
186
|
-
# Responds the Scribd::Document associated with the given +attribute+, or
|
187
|
-
# nil if it does not exist.
|
188
|
-
def scribd_document_for(attribute)
|
189
|
-
scribd_documents[attribute] ||= scribd_login.find_document(self["#{attribute}_scribd_id"])
|
190
|
-
rescue Scribd::ResponseError # at minimum, the document was not found
|
191
|
-
nil
|
192
|
-
end
|
193
|
-
|
194
|
-
private
|
195
|
-
def scribd_documents
|
196
|
-
@scribd_documents ||= HashWithIndifferentAccess.new
|
197
|
-
end
|
198
|
-
|
199
|
-
# Returns the full filename for the given attribute. If the file is
|
200
|
-
# stored on S3, this is a full S3 URI, while it is a full path to the
|
201
|
-
# local file if the file is stored locally.
|
202
|
-
def full_filename_for(attribute)
|
203
|
-
filename = attachment_for(attribute).path
|
204
|
-
end
|
205
|
-
|
206
|
-
# Yields the correct path to the file for the attachment in
|
207
|
-
# +attribute+, either the local filename or the S3 URL.
|
208
|
-
#
|
209
|
-
# This method creates a temporary file of the correct filename for the
|
210
|
-
# attachment in +attribute+ if necessary, so as to be able to give
|
211
|
-
# scribd the right filename. The file is destroyed when the passed block
|
212
|
-
# ends.
|
213
|
-
def with_file_path_for(attribute, &block) # :yields: full_file_path
|
214
|
-
attachment = attachment_for(attribute)
|
215
|
-
|
216
|
-
if attachment.respond_to?(:s3)
|
217
|
-
yield attachment.url
|
218
|
-
elsif File.exists?(attachment.path)
|
219
|
-
yield attachment.path
|
220
|
-
else # file hasn't been saved, use a tempfile
|
221
|
-
temp_rename = File.join(Dir.tmpdir, attachment.original_filename)
|
222
|
-
File.copy(attachment.to_file.path, temp_rename)
|
223
|
-
|
224
|
-
yield temp_rename
|
225
|
-
end
|
226
|
-
ensure
|
227
|
-
temp_rename && File.unlink(temp_rename) # always delete this
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
data/lib/scribd_fu_helper.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
module ScribdFuHelper
|
2
|
-
# Available parameters for the JS API
|
3
|
-
# http://www.scribd.com/publisher/api/api?method_name=Javascript+API
|
4
|
-
AVAILABLE_JS_PARAMS = [ :height, :width, :page, :my_user_id, :search_query,
|
5
|
-
:jsapi_version, :disable_related_docs, :mode, :auto_size ]
|
6
|
-
|
7
|
-
|
8
|
-
# Displays the scribd object for the attachment on the given +object+. If
|
9
|
-
# +alt_text_or_attribute+ is given, then it will be used as the alternate text
|
10
|
-
# for an Attachment_fu model, or as the attribute name for a Paperclip
|
11
|
-
# model. If you want to specify alternate text for a Paperclip model, use the
|
12
|
-
# last parameter, +alt_text_if_paperclip+.
|
13
|
-
#
|
14
|
-
# If you are using Paperclip, you _must_ specify +alt_text_or_attribute+ as
|
15
|
-
# the attribute on which the scribd object exists.
|
16
|
-
#
|
17
|
-
# For example, using Attachment_fu:
|
18
|
-
# <%= display_scribd document %>
|
19
|
-
# <%= display_scribd document, 'You need Flash to view this document' %>
|
20
|
-
#
|
21
|
-
# Using Paperclip:
|
22
|
-
# <%= display_scribd user, :biography %>
|
23
|
-
# <%= display_scribd user, :biography, 'You need Flash for biographies." %>
|
24
|
-
def display_scribd(object, alt_text_or_attribute = '', alt_text_if_paperclip = nil)
|
25
|
-
# Resolve the right scribd ID, access key, and alt text.
|
26
|
-
if object.respond_to?("scribd_id")
|
27
|
-
scribd_id = object.scribd_id
|
28
|
-
scribd_ak = object.scribd_access_key
|
29
|
-
|
30
|
-
alt_text = alt_text_or_attribute
|
31
|
-
else
|
32
|
-
scribd_id = object.send "#{alt_text_or_attribute}_scribd_id"
|
33
|
-
scribd_ak = object.send "#{alt_text_or_attribute}_scribd_access_key"
|
34
|
-
|
35
|
-
alt_text = alt_text_if_paperclip
|
36
|
-
end
|
37
|
-
|
38
|
-
begin
|
39
|
-
# Collect a set of addParam statements to set up JS parameters for the scribd document
|
40
|
-
# (only if they are valid).
|
41
|
-
param_includes = options[:params].collect do |param, value|
|
42
|
-
"scribd_doc.addParam('#{param}', '#{value}');" if AVAILABLE_JS_PARAMS.include?(param)
|
43
|
-
end.compact.join("\n")
|
44
|
-
rescue
|
45
|
-
# Where is 'options' coming from???
|
46
|
-
end
|
47
|
-
|
48
|
-
<<-END
|
49
|
-
<script type="text/javascript" src="http://www.scribd.com/javascripts/view.js"></script>
|
50
|
-
<div id="embedded_flash">#{alt_text}</div>
|
51
|
-
<script type="text/javascript">
|
52
|
-
var scribd_doc = scribd.Document.getDoc(#{scribd_id}, '#{scribd_ak}');
|
53
|
-
#{param_includes}
|
54
|
-
scribd_doc.write("embedded_flash");
|
55
|
-
</script>
|
56
|
-
END
|
57
|
-
end
|
58
|
-
end
|
data/rails/init.rb
DELETED
data/uninstall.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Uninstall hook code here
|