jastix-scribd_fu 1.2.3.3
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/MIT-LICENSE +20 -0
- data/README +191 -0
- data/Rakefile +22 -0
- data/generators/scribd_config/scribd_config_generator.rb +7 -0
- data/generators/scribd_config/templates/scribd.yml +9 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/lib/attachment_fu/methods.rb +164 -0
- data/lib/paperclip/methods.rb +232 -0
- data/lib/scribd_fu.rb +108 -0
- data/lib/scribd_fu_helper.rb +58 -0
- data/rails/init.rb +7 -0
- data/scribd_fu.gemspec +19 -0
- data/uninstall.rb +1 -0
- metadata +75 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
h1. Scribd_fu
|
2
|
+
|
3
|
+
A Ruby on Rails plugin that streamlines interaction with the Scribd service
|
4
|
+
(scribd.com), and even works Attachment_fu or Paperclip!
|
5
|
+
|
6
|
+
|
7
|
+
h2. What it does
|
8
|
+
|
9
|
+
Scribd_fu hides out in the shadows like a document converting ninja, just
|
10
|
+
waiting to process your data into a convenient Flash format (like YouTube) with
|
11
|
+
the help of the black majick of Scribd.com. Imagine embedding huge documents
|
12
|
+
right inline with your web UI, no downloading, no necessary programs on the
|
13
|
+
client side (except for Flash) to view your data. It's pretty damned cool.
|
14
|
+
|
15
|
+
|
16
|
+
h2. Requirements
|
17
|
+
|
18
|
+
Scribd_fu requires the rscribd gem for talking to scribd, and either the wicked
|
19
|
+
awesome Attachment_fu plugin or the equally awesome Paperclip plugin.
|
20
|
+
|
21
|
+
|
22
|
+
h2. How to Install & Use
|
23
|
+
|
24
|
+
Scribd_fu depends on rscribd, so installing it as a gem should also pull in
|
25
|
+
rscribd. First, add Scribd_fu to your list of gems in
|
26
|
+
<tt>config/environment.rb</tt>:
|
27
|
+
|
28
|
+
<pre>config.gem 'mdarby-scribd_fu', :lib => 'scribd_fu'</pre>
|
29
|
+
|
30
|
+
Note that this will only work if you have http://gems.github.com in your list of
|
31
|
+
gem sources:
|
32
|
+
|
33
|
+
<pre>$ gem source -a http://gems.github.com</pre>
|
34
|
+
|
35
|
+
Then run:
|
36
|
+
|
37
|
+
<pre>$ sudo rake gems:install</pre>
|
38
|
+
|
39
|
+
To install it and the rscribd gem. If you don't add github as a gem source, you
|
40
|
+
can add the <tt>:source</tt> option to the <tt>config.gem</tt> call; however,
|
41
|
+
this means you will have to separately require the rscribd gem, since using
|
42
|
+
<tt>:source</tt> will not search for the rscribd gem in your regular sources.
|
43
|
+
|
44
|
+
Then, install either Paperclip or Attachment_fu.
|
45
|
+
|
46
|
+
h3. Attachment_fu
|
47
|
+
|
48
|
+
If you want to install Attachment_fu, you should probably use the git
|
49
|
+
repository on github:
|
50
|
+
|
51
|
+
<pre>$ script/plugin install git://github.com/technoweenie/attachment_fu.git</pre>
|
52
|
+
|
53
|
+
h3. Paperclip
|
54
|
+
|
55
|
+
If you'd rather use Paperclip (the most important advantage, with respect to
|
56
|
+
Scribd_fu, will be being able to have more than one document-related column in a
|
57
|
+
single model), you should probably require it as a gem dependency rather than
|
58
|
+
using it in plugin form. In Rails 2.1 or greater:
|
59
|
+
|
60
|
+
<pre>config.gem 'paperclip'</pre>
|
61
|
+
|
62
|
+
Then run:
|
63
|
+
|
64
|
+
<pre>$ rake gems:install</pre>
|
65
|
+
|
66
|
+
To install it.
|
67
|
+
|
68
|
+
|
69
|
+
h2. How to Use
|
70
|
+
|
71
|
+
h3. Shared steps
|
72
|
+
|
73
|
+
* Sign up for Scribd (it's totally free) at
|
74
|
+
http://www.scribd.com/publisher/signup_api.
|
75
|
+
* Run <tt>script/generate scribd_config</tt> and fill out the new
|
76
|
+
config/scribd.yml file with your Scribd login credentials.
|
77
|
+
|
78
|
+
h3. Attachment_fu
|
79
|
+
|
80
|
+
Enter the below line into any attachment_fu-using model whose attachment you'd like to
|
81
|
+
Scribdify:
|
82
|
+
|
83
|
+
<pre>acts_as_scribd_document</pre>
|
84
|
+
|
85
|
+
Add the following fields into a new migration for the target model (and run the
|
86
|
+
migration!):
|
87
|
+
|
88
|
+
<pre>t.integer :scribd_id
|
89
|
+
t.string :scribd_access_key</pre>
|
90
|
+
|
91
|
+
Scribd_fu will use these to track scribd-related information.
|
92
|
+
|
93
|
+
Now, when you upload a file to that model, Scribd_fu will automatically handle
|
94
|
+
the scribd side of things for you. No muss, no fuss. Files are uploaded to
|
95
|
+
scribd when the model is saved. If the file fails to upload to scribd, the model
|
96
|
+
save will fail.
|
97
|
+
|
98
|
+
Scribd_fu also provides the <tt>validates_as_scribd_document</tt> validation,
|
99
|
+
which verifies that the document's information is being saved correctly (i.e.,
|
100
|
+
that the <tt>content_type</tt>, <tt>scribd_id</tt>, and
|
101
|
+
<tt>scribd_access_key</tt> are present) and that the attachment is scribdable to
|
102
|
+
begin with (that is to say, that the content type of the file is a scribdable
|
103
|
+
content type).
|
104
|
+
|
105
|
+
Note that Scribd_fu will only upload the file to Scribd. Scribd then has to
|
106
|
+
convert it to their iPaper format. Usually this is a pretty fast operation, but
|
107
|
+
if you want to be safe or have a contingency plan in case someone tries to
|
108
|
+
access the document and it isn't converted yet, the set of methods
|
109
|
+
<tt>conversion_complete?</tt>, <tt>conversion_successful?</tt>, and
|
110
|
+
<tt>conversion_error?</tt> can be used to determine the current conversion
|
111
|
+
status of the document. Also note that if you try to display a file that hasn't
|
112
|
+
been converted to scribd yet, the iPaper viewer will actually say that it is
|
113
|
+
still converting complete with a spinner, so these methods will often not be
|
114
|
+
necessary.
|
115
|
+
|
116
|
+
To view a Scribd document, just throw the below code into your view (where
|
117
|
+
<tt>@document</tt> is an object of your Scribd/Attachment_fu model):
|
118
|
+
<pre><%= display_scribd(@document) %></pre>
|
119
|
+
That's it!
|
120
|
+
|
121
|
+
h3. Paperclip
|
122
|
+
|
123
|
+
For each attachment that you want to be scribdable, mark it using the
|
124
|
+
<tt>has_scribdable_attachment</tt> method. For example, if I had the line:
|
125
|
+
|
126
|
+
<pre>has_attached_file :document</pre>
|
127
|
+
|
128
|
+
And I wanted the <tt>document</tt> attachment to be scribdable, I would add:
|
129
|
+
|
130
|
+
<pre>has_scribdable_attachment :document</pre>
|
131
|
+
|
132
|
+
In addition, you have to add two columns for each scribdable attachment. These
|
133
|
+
are <tt>_scribd_id</tt> and <tt>_scribd_access_key</tt>, both prefixed by the
|
134
|
+
attachment name. For the above example, we would have the following migration
|
135
|
+
statements:
|
136
|
+
|
137
|
+
<pre>t.integer :document_scribd_id
|
138
|
+
t.string :document_scribd_access_key</pre>
|
139
|
+
|
140
|
+
Scribdable attachments can also be validated using the
|
141
|
+
<tt>validates_attachment_scribdability</tt> validation:
|
142
|
+
|
143
|
+
<pre>validates_attachment_scribdability :document</pre>
|
144
|
+
|
145
|
+
This validation checks that the content type, scribd id, and access key are all
|
146
|
+
available, and it verifies that the content type is a scribdable content type.
|
147
|
+
|
148
|
+
As mentioned in the Attachment_fu section, Scribd_fu will only upload the file
|
149
|
+
to Scribd. Scribd then has to do the actual conversion to iPaper. For tracking
|
150
|
+
the status of this conversion, you have three methods, each of which take the
|
151
|
+
attachment whose status you want:
|
152
|
+
|
153
|
+
* <tt>conversion_complete?</tt> -- e.g.,
|
154
|
+
<tt>model.conversion_complete?(:document)</tt>
|
155
|
+
* <tt>conversion_successful?</tt> -- e.g.,
|
156
|
+
<tt>model.conversion_successful?(:document)</tt>
|
157
|
+
* <tt>conversion_error?</tt> -- e.g.,
|
158
|
+
<tt>model.conversion_error?(:document)</tt>
|
159
|
+
|
160
|
+
Also note that if you try to display a file that hasn't been converted to scribd
|
161
|
+
yet, the iPaper viewer will actually say that it is still converting with a
|
162
|
+
spinner, so these methods will often not be necessary.
|
163
|
+
|
164
|
+
To view a Scribd document, just throw the below code into your view (where
|
165
|
+
<tt>@model</tt> is an object of your Scribd/Paperclip model, and
|
166
|
+
<tt>document</tt> is the name of the scribdable attachment):
|
167
|
+
|
168
|
+
<pre><%= display_scribd(@model, :document) %></pre>
|
169
|
+
|
170
|
+
That's it!
|
171
|
+
|
172
|
+
|
173
|
+
h2. Access
|
174
|
+
|
175
|
+
You can set the default access on all documents by setting the 'access' key in
|
176
|
+
the scribd.yml file to either 'private' or 'public'.
|
177
|
+
|
178
|
+
You can also override the default access level and control access on a
|
179
|
+
per-document basis by setting the 'is_public' attribute to either true or false.
|
180
|
+
If this column is not defined, the default option in the scribd.yml will be
|
181
|
+
used.
|
182
|
+
|
183
|
+
Please note that setting the access level only works before the document is
|
184
|
+
initially uploaded to Scribd.
|
185
|
+
|
186
|
+
|
187
|
+
h2. About the Author
|
188
|
+
|
189
|
+
My name is Matt Darby. I’m a 29 year old professional Web Developer and IT Manager. I am the IT Manager and Lead Web Developer at Dynamix Engineering and recently earned a Master’s Degree in Computer Science from Franklin University in Columbus, OH.
|
190
|
+
|
191
|
+
Feel free to check out my "blog":http://blgo.matt-darby.com or to "recommend me":http://workingwithrails.com
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
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/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/rails/init"
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'fileutils'
|
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
|
164
|
+
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'fileutils'
|
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
|
232
|
+
|
data/lib/scribd_fu.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'attachment_fu/methods'
|
2
|
+
require 'paperclip/methods'
|
3
|
+
|
4
|
+
module ScribdFu
|
5
|
+
# A list of content types supported by scribd.
|
6
|
+
CONTENT_TYPES = ['application/pdf', 'image/jpeg', 'image/pjpeg',
|
7
|
+
'image/gif', 'image/png', 'image/x-png', 'image/jpg',
|
8
|
+
'application/msword', 'application/mspowerpoint',
|
9
|
+
'application/vnd.ms-powerpoint', 'application/excel',
|
10
|
+
'application/vnd.ms-excel', 'application/postscript',
|
11
|
+
'text/plain', 'application/rtf',
|
12
|
+
'application/vnd.oasis.opendocument.text',
|
13
|
+
'application/vnd.oasis.opendocument.presentation',
|
14
|
+
'application/vnd.oasis.opendocument.spreadsheet',
|
15
|
+
'application/vnd.sun.xml.writer',
|
16
|
+
'application/vnd.sun.xml.impress',
|
17
|
+
'application/vnd.sun.xml.calc',
|
18
|
+
# OOXML, AKA `the MIME types from hell'. Seriously, these are long enough to
|
19
|
+
# start their own dictionary...
|
20
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
21
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
22
|
+
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
23
|
+
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
24
|
+
'application/vnd.openxmlformats-officedocument.presentationml.template',
|
25
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
26
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.template']
|
27
|
+
|
28
|
+
def self.included(base)
|
29
|
+
base.extend ActsAsScribdDocument
|
30
|
+
end
|
31
|
+
|
32
|
+
module ActsAsScribdDocument
|
33
|
+
# Synonym for <tt>has_scribdable_attachment(nil)</tt>.
|
34
|
+
def acts_as_scribd_document
|
35
|
+
has_scribdable_attachment
|
36
|
+
end
|
37
|
+
|
38
|
+
# Marks the given +attribute+ as a scribdable document file. If +attribute+
|
39
|
+
# is nil, assumes this is an Attachment_fu model and deals with the setup
|
40
|
+
# accordingly; otherwise, assumes a +paperclip+ model and sets up scribding
|
41
|
+
# related to the particular given attribute.
|
42
|
+
def has_scribdable_attachment(attribute = nil)
|
43
|
+
class_eval do
|
44
|
+
include ScribdFu::InstanceMethods
|
45
|
+
|
46
|
+
if attribute.nil?
|
47
|
+
include ScribdFu::AttachmentFu::InstanceMethods
|
48
|
+
else
|
49
|
+
include ScribdFu::Paperclip::InstanceMethods # ignored if already done
|
50
|
+
|
51
|
+
add_scribd_attribute attribute # class method added by above include
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module InstanceMethods
|
58
|
+
# Sets up Scribd configuration info when this module is included.
|
59
|
+
def self.included(base)
|
60
|
+
base.extend ClassMethods
|
61
|
+
|
62
|
+
mattr_reader :scribd_config, :scribd_login
|
63
|
+
|
64
|
+
begin
|
65
|
+
require 'rscribd'
|
66
|
+
rescue LoadError
|
67
|
+
raise RequiredLibraryNotFoundError.new('rscribd could not be loaded')
|
68
|
+
end
|
69
|
+
|
70
|
+
begin
|
71
|
+
unless @@scribd_login
|
72
|
+
@@scribd_config = YAML.load_file("#{RAILS_ROOT}/config/scribd.yml").symbolize_keys
|
73
|
+
@@scribd_config = @@scribd_config[:scribd]
|
74
|
+
|
75
|
+
# Ensure we can connect to the Service
|
76
|
+
Scribd::API.instance.key = @@scribd_config['key'].to_s.strip
|
77
|
+
Scribd::API.instance.secret = @@scribd_config['secret'].to_s.strip
|
78
|
+
|
79
|
+
@@scribd_login = Scribd::User.login @@scribd_config['user'].to_s.strip, @@scribd_config['password'].to_s.strip
|
80
|
+
end
|
81
|
+
rescue
|
82
|
+
raise "config/scribd.yml file not found, or your credentials are incorrect."
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def access_level
|
87
|
+
if self.respond_to?(:is_public) && self.is_public != nil
|
88
|
+
scribd_access = self.is_public ? 'public' : 'private'
|
89
|
+
else
|
90
|
+
scribd_access = scribd_config['access']
|
91
|
+
end
|
92
|
+
|
93
|
+
scribd_access
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
module ClassMethods
|
98
|
+
# Sets up the scribd_options accessor, a before_destroy hook to ensure the
|
99
|
+
# deletion of associated Scribd documents, and an after_save hook to upload
|
100
|
+
# to scribd.
|
101
|
+
def self.extended(base)
|
102
|
+
base.class_inheritable_accessor :scribd_options
|
103
|
+
|
104
|
+
base.before_destroy :destroy_scribd_documents
|
105
|
+
base.before_validation :upload_to_scribd
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,58 @@
|
|
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
ADDED
data/scribd_fu.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "scribd_fu"
|
3
|
+
s.version = "1.2.3.3"
|
4
|
+
s.date = "2009-04-26"
|
5
|
+
s.summary = "Quick and easy interactions with Scribd's iPaper service"
|
6
|
+
s.email = "matt@matt-darby.com"
|
7
|
+
s.homepage = "http://github.com/mdarby/scribd_fu/tree/master"
|
8
|
+
s.description = "A Rails plugin that streamlines interactions with the Scribd service"
|
9
|
+
s.has_rdoc = false
|
10
|
+
s.authors = ["Matt Darby"]
|
11
|
+
s.files = ['init.rb', 'install.rb', 'uninstall.rb', 'MIT-LICENSE', 'Rakefile',
|
12
|
+
'README', 'lib/scribd_fu.rb', 'lib/scribd_fu_helper.rb',
|
13
|
+
'lib/attachment_fu/methods.rb', 'lib/paperclip/methods.rb',
|
14
|
+
'rails/init.rb', 'scribd_fu.gemspec',
|
15
|
+
'generators/scribd_config/scribd_config_generator.rb',
|
16
|
+
'generators/scribd_config/templates/scribd.yml']
|
17
|
+
s.add_dependency 'rscribd'
|
18
|
+
end
|
19
|
+
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jastix-scribd_fu
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.3.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Darby
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-04-26 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rscribd
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description: A Rails plugin that streamlines interactions with the Scribd service
|
26
|
+
email: matt@matt-darby.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- init.rb
|
35
|
+
- install.rb
|
36
|
+
- uninstall.rb
|
37
|
+
- MIT-LICENSE
|
38
|
+
- Rakefile
|
39
|
+
- README
|
40
|
+
- lib/scribd_fu.rb
|
41
|
+
- lib/scribd_fu_helper.rb
|
42
|
+
- lib/attachment_fu/methods.rb
|
43
|
+
- lib/paperclip/methods.rb
|
44
|
+
- rails/init.rb
|
45
|
+
- scribd_fu.gemspec
|
46
|
+
- generators/scribd_config/scribd_config_generator.rb
|
47
|
+
- generators/scribd_config/templates/scribd.yml
|
48
|
+
has_rdoc: false
|
49
|
+
homepage: http://github.com/mdarby/scribd_fu/tree/master
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.2.0
|
71
|
+
signing_key:
|
72
|
+
specification_version: 2
|
73
|
+
summary: Quick and easy interactions with Scribd's iPaper service
|
74
|
+
test_files: []
|
75
|
+
|