class News2Kindle::Task

Public Class Methods

new(name) click to toggle source
# File lib/news2kindle/task.rb, line 23
def initialize(name)
        @name = name
        require "news2kindle/generator/#{@name}"
        @generator = News2Kindle::Generator.const_get(@name.split(/-/).map{|a|a.capitalize}.join)
end

Public Instance Methods

run(to, from, opts) click to toggle source
# File lib/news2kindle/task.rb, line 29
def run(to, from, opts)
        Dir.mktmpdir do |dir|
                @generator::new(dir).generate(opts) do |opf|
                        file = "#{@name}.#{Time.now.strftime("%Y%m%d%H%M%S%2N")}.mobi"
                        Kindlegen.run(opf, '-o', file, '-locale', 'ja')
                        mobi = Pathname(opf).dirname + file
                        if mobi.file?
                                News2Kindle.logger.info "generated #{mobi} successfully."
                                deliver([to].flatten, from, mobi, opts)
                        else
                                News2Kindle.logger.error 'failed mobi generation.'
                        end
                end
        end
end

Private Instance Methods

deliver(to_address, from_address, mobi, opts) click to toggle source
# File lib/news2kindle/task.rb, line 46
def deliver(to_address, from_address, mobi, opts)
        to_dropbox = to_address.map{|a| /^dropbox:/ =~ a ? a : nil}.compact
        deliver_via_dropbox(to_dropbox, mobi)
        deliver_via_mail(to_address - to_dropbox, from_address, mobi, opts)
end
deliver_via_dropbox(to_address, mobi) click to toggle source
# File lib/news2kindle/task.rb, line 68
def deliver_via_dropbox(to_address, mobi)
        return if to_address.empty?

        begin
                auth = Pit::get('news2kindle')
                unless auth[:dropbox_token]
                        print "Enter dropbox app key: "
                        api_key = $stdin.gets.chomp

                        print "Enter dropbox app secret: "
                        api_secret = $stdin.gets.chomp

                        authenticator = DropboxApi::Authenticator.new(api_key, api_secret)
                        puts "\nGo to this url and click 'Authorize' to get the token:"
                        puts authenticator.authorize_url

                        print "Enter the token: "
                        code = $stdin.gets.chomp

                        auth[:dropbox_token] = authenticator.get_token(code).token
                        Pit::set('news2kindle', data: auth)
                end
                client = DropboxApi::Client.new(auth[:dropbox_token])
                to_address.each do |address|
                        file = Pathname(address.sub(/^dropbox:/, '')) + mobi.basename
                        open(mobi) do |f|
                                client.chunk_upload(file){f.read(10_000_000)}
                        end
                        News2Kindle.logger.info "saved to #{file} successfully."
                end
        rescue
                News2Kindle.logger.error "failed while saving to dropbox."
                News2Kindle.logger.debug $!
                $@.each{|l| News2Kindle.logger.debug l}
        end
end
deliver_via_mail(to_address, from_address, mobi, opts) click to toggle source
# File lib/news2kindle/task.rb, line 52
def deliver_via_mail(to_address, from_address, mobi, opts)
        return if to_address.empty?

        Mail.deliver do
                from from_address
                to  to_address
                subject 'sent by news2kindle'
                body 'dummy text'
                attachments[mobi.basename.to_s] = {
                        :mime_type => 'application/octet-stream',
                        :content => open(mobi, &:read)
                }
        end
        News2Kindle.logger.info "sent mails successfully."
end