Posterous exporter for Toto

13 Jul '11

I’ve been experimenting a bit with a cute blogging engine called Toto and wanted to migrate my Posterous posts so I wrote a little script in Ruby to download them all and format them in a Toto-appropriate way.

This script uses the posterous gem just to retrieve each post and put it in a YAML text file that Toto can understand. At the moment there are a few problems…

  • Since YAML uses “:” as a control character I had to remove any colons from titles and replaced them with dashes… I wonder if there’s a way to preserve them so that the text files are still human-readable?
  • The posterous gem only seems to get one page of posts at a time since my blog has 19 pages, I just ran my downloading method for each one.

Anyway, here’s the script! Maybe someone will chime in and tell me all the things I’m doing wrong:

#!/usr/bin/env ruby

require 'posterous'
require 'toto'

Posterous.config = {
  'username'  => 'username',
  'password'  => 'password',
  'api_token' => 'api_token'
}

include Posterous

@site = Site.primary

Dir.chdir( "~/src/posterousparser" )

def saveposts(pagenumber = 0)
  @site.posts(:page => pagenumber).each do |e|
    timestamp = e.display_date
    yyyy = timestamp[0..3]
    mm = timestamp[5..6]
    dd = timestamp[8..9]

    title = e.title.gsub(":", "-")
    slug = title.strip.slugize
    filename = "#{yyyy}-#{mm}-#{dd}-#{slug}.txt"

    puts "Writing #{filename}...\n"

    file = File.new("#{filename}", "w")
    file.puts "---\n"
    file.puts "title: #{title}\n"
    file.puts "author: #{e.user["display_name"]}"
    file.puts "date: #{dd}/#{mm}/#{yyyy}\n"
    file.puts "timestamp: #{e.display_date}\n"

    file.print "tags: "

    e.tags.each do |a|
      file.print "#{a["name"]} "
    end

    file.puts "\n\n"
    file.puts "#{e.body_full}\n"
    file.puts "\n"
    file.close

  end
end

puts "Downloading posts now!"

for i in 1..19 do
  saveposts(i)
end