From ddd5dbb5fbf956909f792b2aba1c721b2cca9b56 Mon Sep 17 00:00:00 2001 From: Alagu Date: Fri, 16 Sep 2011 15:31:01 -0700 Subject: [PATCH 1/3] Change to new posterous API --- lib/jekyll/migrators/posterous.rb | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/jekyll/migrators/posterous.rb b/lib/jekyll/migrators/posterous.rb index 6cfc2430..326fd9d1 100644 --- a/lib/jekyll/migrators/posterous.rb +++ b/lib/jekyll/migrators/posterous.rb @@ -1,11 +1,14 @@ require 'rubygems' require 'jekyll' require 'fileutils' -require 'net/http' +require 'net/https' +require 'open-uri' require 'uri' require "json" -# ruby -r './lib/jekyll/migrators/posterous.rb' -e 'Jekyll::Posterous.process(email, pass, blog)' +# ruby -r './lib/jekyll/migrators/posterous.rb' -e 'Jekyll::Posterous.process(email, pass, api_token, blog)' +# You can find your api token in posterous api page - http://posterous.com/api . Click on any of the 'view token' links to see your token. +# blog is optional, by default it is the primary one module Jekyll module Posterous @@ -14,6 +17,9 @@ module Jekyll raise ArgumentError, 'Stuck in a redirect loop. Please double check your email and password' if limit == 0 response = nil + + puts uri_str + puts '-------' Net::HTTP.start('posterous.com') do |http| req = Net::HTTP::Get.new(uri_str) req.basic_auth @email, @pass @@ -27,12 +33,11 @@ module Jekyll end end - def self.process(email, pass, blog = 'primary') - @email, @pass = email, pass - @api_token = JSON.parse(self.fetch("/api/2/auth/token").body)['api_token'] + def self.process(email, pass, api_token, blog = 'primary') + @email, @pass , @api_token = email, pass, api_token FileUtils.mkdir_p "_posts" - posts = JSON.parse(self.fetch("/api/v2/users/me/sites/#{blog}/posts?api_token=#{@api_token}").body) + posts = JSON.parse(self.fetch("/api/2/sites/#{blog}/posts?api_token=#{@api_token}").body) page = 1 while posts.any? @@ -54,14 +59,15 @@ module Jekyll # Write out the data and content to file File.open("_posts/#{name}", "w") do |f| - f.puts data + puts name + f.puts name f.puts "---" f.puts content end end page += 1 - posts = JSON.parse(self.fetch("/api/v2/users/me/sites/#{blog}/posts?api_token=#{@api_token}&page=#{page}").body) + posts = JSON.parse(self.fetch("/api/2/sites/#{blog}/posts?api_token=#{@api_token}&page=#{page}").body) end end end From 840b0c14aee65d0f6812c00fcf229a7463aa9cb6 Mon Sep 17 00:00:00 2001 From: Beau Simensen Date: Fri, 25 Nov 2011 19:06:16 -0600 Subject: [PATCH 2/3] YAML front matter fix, cleaned up slug generation, added tags and store some posterous information from the original post. --- lib/jekyll/migrators/posterous.rb | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/migrators/posterous.rb b/lib/jekyll/migrators/posterous.rb index 326fd9d1..d78be193 100644 --- a/lib/jekyll/migrators/posterous.rb +++ b/lib/jekyll/migrators/posterous.rb @@ -6,7 +6,7 @@ require 'open-uri' require 'uri' require "json" -# ruby -r './lib/jekyll/migrators/posterous.rb' -e 'Jekyll::Posterous.process(email, pass, api_token, blog)' +# ruby -r './lib/jekyll/migrators/posterous.rb' -e 'Jekyll::Posterous.process(email, pass, api_token, blog, tags_key)' # You can find your api token in posterous api page - http://posterous.com/api . Click on any of the 'view token' links to see your token. # blog is optional, by default it is the primary one @@ -33,7 +33,7 @@ module Jekyll end end - def self.process(email, pass, api_token, blog = 'primary') + def self.process(email, pass, api_token, blog = 'primary', tags_key = 'categories') @email, @pass , @api_token = email, pass, api_token FileUtils.mkdir_p "_posts" @@ -43,24 +43,32 @@ module Jekyll while posts.any? posts.each do |post| title = post["title"] - slug = title.gsub(/[^[:alnum:]]+/, '-').downcase + slug = title.gsub(/[^[:alnum:]]+/, '-').gsub(/^-+|-+$/, '').downcase + posterous_slug = post["slug"] date = Date.parse(post["display_date"]) content = post["body_html"] published = !post["is_private"] name = "%02d-%02d-%02d-%s.html" % [date.year, date.month, date.day, slug] + tags = [] + post["tags"].each do |tag| + tags.push(tag["name"]) + end # Get the relevant fields as a hash, delete empty fields and convert # to YAML for the header data = { 'layout' => 'post', 'title' => title.to_s, - 'published' => published + 'published' => published, + tags_key => tags, + 'posterous_url' => post["full_url"], + 'posterous_slug' => posterous_slug }.delete_if { |k,v| v.nil? || v == ''}.to_yaml # Write out the data and content to file File.open("_posts/#{name}", "w") do |f| puts name - f.puts name + f.puts data f.puts "---" f.puts content end From 0284b8b22f12081f7e35563592be41ae082c3cfe Mon Sep 17 00:00:00 2001 From: Beau Simensen Date: Sun, 22 Jan 2012 20:58:56 -0800 Subject: [PATCH 3/3] Handle Posterous rate limiting --- lib/jekyll/migrators/posterous.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/jekyll/migrators/posterous.rb b/lib/jekyll/migrators/posterous.rb index deca8689..f1601ba3 100644 --- a/lib/jekyll/migrators/posterous.rb +++ b/lib/jekyll/migrators/posterous.rb @@ -29,6 +29,11 @@ module Jekyll case response when Net::HTTPSuccess then response when Net::HTTPRedirection then fetch(response['location'], limit - 1) + when Net::HTTPForbidden then + retry_after = response.to_hash['retry-after'][0] + puts "We have been told to try again after #{retry_after} seconds" + sleep(retry_after.to_i + 1) + fetch(uri_str, limit - 1) else response.error! end end