diff --git a/lib/scribd_fu.rb b/lib/scribd_fu.rb deleted file mode 100644 index 22dece0..0000000 --- a/lib/scribd_fu.rb +++ /dev/null @@ -1,261 +0,0 @@ -module ScribdFu - - ConfigPath = "config/scribd_fu.yml".freeze - - # A list of content types supported by iPaper. - ContentTypes = [ - 'application/pdf', - 'application/msword', - 'application/mspowerpoint', - 'application/vnd.ms-powerpoint', - 'application/excel', - 'application/vnd.ms-excel', - 'application/postscript', - 'text/plain', - 'text/rtf', - 'application/rtf', - 'application/vnd.oasis.opendocument.text', - 'application/vnd.oasis.opendocument.presentation', - 'application/vnd.oasis.opendocument.spreadsheet', - 'application/vnd.sun.xml.writer', - 'application/vnd.sun.xml.impress', - 'application/vnd.sun.xml.calc', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' - ] - - # RegExp that matches AWS S3 URLs - S3 = /^https?:\/\/s3.amazonaws.com/ - CLOUD_FRONT = /^http:\/\/[A-Za-z0-9]*.cloudfront.net/ - - # Available parameters for the JS API - # http://www.scribd.com/publisher/api/api?method_name=Javascript+API - Available_JS_Params = [ :height, :width, :page, :my_user_id, :search_query, - :jsapi_version, :disable_related_docs, :mode, :auto_size, :hide_disabled_buttons, :hide_full_screen_button] - - class ScribdFuError < StandardError #:nodoc: - end - - class ScribdFuUploadError < ScribdFuError #:nodoc: - end - - - class << self - - def included(base) #:nodoc: - base.extend ClassMethods - end - - # Login, store, and return a handle to the Scribd user account - def scribd_user - begin - # Ensure we can login to Scribd, and get a handle on the account - Scribd::API.instance.key = config[:key] - Scribd::API.instance.secret = config[:secret] - @scribd_user = Scribd::User.login(config[:user], config[:password]) - rescue - raise ScribdFuError, "Your Scribd credentials are incorrect" - end - end - - # Upload a file to Scribd - def upload(obj, file_path) - begin - args = { :file => escape(file_path), :access => access_level } - res = if obj.ipaper_my_user_id - scribd_user - args[:my_user_id] = obj.ipaper_my_user_id - Scribd::Document.create(args) - else - scribd_user.upload(args) - end - obj.update_attributes({:ipaper_id => res.doc_id, :ipaper_access_key => res.access_key}) - rescue - raise ScribdFuUploadError, "Sorry, but #{obj.class} ##{obj.id} could not be uploaded to Scribd" - end - end - - # Delete an iPaper document - def destroy(document) - document.destroy - end - - # Read, store, and return the ScribdFu config file's contents - def config - path = defined?(Rails) ? File.join(Rails.root, ConfigPath) : ConfigPath - raise ScribdFuError, "#{path} does not exist" unless File.file?(path) - - # Load the config file and strip any whitespace from the values - @config ||= YAML.load_file(path).each_pair{|k,v| {k=>v.to_s.strip}}.symbolize_keys! - end - - # Get the preferred access level for iPaper documents - def access_level - config[:access] || 'private' - end - - # Load, store, and return the associated iPaper document - def load_ipaper_document(id) - # Yes, catch-all rescues are bad, but the end rescue - # should return nil, so laziness FTW. - scribd_user.find_document(id) rescue nil - end - - # Replace spaces with '%20' (needed by Paperclip models). - def escape(str) - basename = File.basename(str, ".*") - File.join(File.dirname(str), "#{url_encode(basename)}#{File.extname(str)}").to_s - end - - def url_encode(str) - str.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) } - end - - # See if a URL is S3 or CloudFront based - def amazon_based?(url) - url =~ S3 || url =~ CLOUD_FRONT - end - - # Strip off any trailing "?1234567890" cache strings - # They cause headaches on Scribd's end. - def strip_cache_string(url) - pos = url.rindex('?') - (pos) ? url[0, pos] : url - end - - end - - module ClassMethods - - # Load and inject ScribdFu goodies - # opts can be :on => :create, defaults to :on => :save - def has_ipaper_and_uses(str, opts = {:on => :save }) - check_environment - load_base_plugin(str) - - include InstanceMethods - - attr_accessor :ipaper_my_user_id - - send("after_#{opts[:on]}", :upload_to_scribd) # This *MUST* be an after_save - before_destroy :destroy_ipaper_document - end - - private - - # Configure ScribdFu for this particular environment - def check_environment - load_rscribd - check_config - end - - def check_config - ScribdFu::config - end - - # Load the rscribd gem - def load_rscribd - begin - require 'rscribd' - rescue LoadError - raise ScribdFuError, 'Please install the rscribd gem' - end - end - - # Load Attachment_Fu specific methods and files - def load_attachment_fu - require 'scribd_fu/attachment_fu' - include ScribdFu::AttachmentFu::InstanceMethods - end - - # Load Paperclip specific methods and files - def load_paperclip - require 'scribd_fu/paperclip' - include ScribdFu::Paperclip::InstanceMethods - end - - # Load either AttachmentFu or Paperclip-specific methods - def load_base_plugin(str) - if str == 'AttachmentFu' - load_attachment_fu - elsif str == 'Paperclip' - load_paperclip - else - raise ScribdFuError, "Sorry, only Attachment_fu and Paperclip are supported." - end - end - - end - - module InstanceMethods - - def self.included(base) - base.extend ClassMethods - end - - # Upload the associated file to Scribd for iPaper conversion - # This is called +after_save+ and cannot be called earlier, - # so don't get any ideas. - def upload_to_scribd - ScribdFu::upload(self, file_path) if scribdable? - end - - # Checks whether the associated file is convertable to iPaper - def scribdable? - ContentTypes.include?(get_content_type) && ipaper_id.blank? - end - - # Responds true if the conversion is converting - def conversion_processing? - !(conversion_complete? || conversion_successful? || conversion_error?) - end - - # Responds true if the conversion is complete -- note that this gives no - # indication as to whether the conversion had an error or was succesful, - # just that the conversion completed. - def conversion_complete? - ipaper_document && ipaper_document.conversion_status != 'PROCESSING' - end - - # Responds true if the document has been converted. - def conversion_successful? - ipaper_document && ipaper_document.conversion_status =~ /^DISPLAYABLE|DONE$/ - end - - # Responds true if there was a conversion error while converting to iPaper. - def conversion_error? - ipaper_document && ipaper_document.conversion_status == 'ERROR' - end - - # Responds the Scribd::Document associated with this model, or nil if it does not exist. - def ipaper_document - @document ||= ScribdFu::load_ipaper_document(ipaper_id) - end - - # Destroys the scribd document for this record. This is called +before_destroy+ - def destroy_ipaper_document - ScribdFu::destroy(ipaper_document) if ipaper_document - end - - # Display the iPaper document in a view - def display_ipaper(options = {}) - id = options.delete(:id) || to_param - view_mode = options.delete(:view_mode) || 'list' - - <<-END - - END - end - - end - -end - -# Let's do this. -ActiveRecord::Base.send(:include, ScribdFu) if Object.const_defined?("ActiveRecord") -