首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PragPub杂志发送到Kindle的Ruby脚本

将PragPub杂志发送到Kindle的Ruby脚本
EN

Code Review用户
提问于 2013-05-08 21:46:24
回答 1查看 139关注 0票数 1

我写了一个小红宝石脚本下载的PragPub杂志,并通过电子邮件发送到我的Kindle。我很想得到一些反馈。

具体来说,我觉得有一个更好的方法是下载文件并写入磁盘。它曾经这样做过:

代码语言:javascript
复制
open(filepath, 'wb') do |file|
  file << open(url).read
end

但是,当这个问题还没有解决的时候,这就造成了一个问题。http请求将失败,磁盘上将保留一个空文件。所以我把它改成了这个

代码语言:javascript
复制
  begin
    content = open(url).read
  rescue OpenURI::HTTPError => e
    abort "Unable to download #{filename}: #{e.message}"
  end
  open(filepath, 'wb') do |file|
    file << content
  end

这个更好用,但感觉有点笨重。

此外,在Ruby-land中,只编写这样的过程样式脚本是常见的/可接受的,还是应该组织成类(Es)和方法?

pragpub2kindle.rb

代码语言:javascript
复制
#!/usr/bin/env ruby

require 'open-uri'
require 'mail'
require 'optparse'

options = {}
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: pragpub2kindle.rb [options] [yyyy-mm]"
  options[:mailto] = nil
  opts.on('-t', '--mailto EMAIL', 'Send attachment to email address') do |email|
    options[:mailto] = email
  end
  options[:mailfrom] = nil
  opts.on('-f', '--mailfrom EMAIL', 'Send attachment from email address') do |email|
    options[:mailfrom] = email
  end
  options[:dir] = nil
  opts.on('-d', '--dir DIR', 'Directory to save files') do |dir|
    options[:dir] = dir
  end
  opts.on('-h', '--help', 'Display this screen') do
    puts opts
    exit
  end
end

optparse.parse!

mandatory = [:mailto, :mailfrom]
missing = mandatory.select{ |param| options[param].nil? }
if not missing.empty?
  puts "Missing options: #{missing.join(', ')}"
  puts optparse
  exit
end

dir = options[:dir] || Dir.getwd
if (!(File.directory?(dir) && File.writable?(dir)))
  puts "Directory not valid or not writable: #{dir}"
  puts optparse
  exit
end

if ARGV.length == 1
  year_month = ARGV.first
  if !year_month.match(/\d{4}-\d{2}/)
    puts "Invalid date format: #{year_month}"
    puts optparse
    exit
  end
else
  year = Time.now.strftime("%Y")
  month = Time.now.strftime("%m")
  year_month = "#{year}-#{month}"
end

filename = "pragpub-#{year_month}.mobi"
year = year_month[0..3]

url = "http://magazines.pragprog.com/#{year}/#{filename}"
filepath = File.join(dir, filename)

if File.exists?(filepath)
  puts "#{filename} already exists"
else
  puts "Downloading #{filename}..."
  begin
    content = open(url).read
  rescue OpenURI::HTTPError => e
    abort "Unable to download #{filename}: #{e.message}"
  end
  open(filepath, 'wb') do |file|
    file << content
  end
  mail_to = options[:mailto]
  mail_from =  options[:mailfrom]
  puts "Sending #{filename} to #{mail_to}..."
  mail = Mail.new
  mail.to = mail_to
  mail.from = mail_from
  mail.subject = filename
  mail.attachments[filename] = {
    :mime_type => 'application/x-mobipocket-ebook',
    :content => File.read(filepath)
  }
  mail.deliver!
end
EN

回答 1

Code Review用户

回答已采纳

发布于 2013-05-09 12:03:40

对于第一个片段,没有多少改进的余地,但是您可以使用File.write

代码语言:javascript
复制
begin
  content = open(url).read
  File.write(filepath, content)
rescue OpenURI::HTTPError => e
  abort "Unable to download #{url}: #{e.to_s}"
end

对于选项解析部分,我肯定会推荐一些比optparse更好的东西,例如https://github.com/jashmenn/trollop/

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/25958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档