diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2010-09-15 14:09:42 +0200 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2010-09-15 14:54:12 +0200 |
commit | 3a863b20a43d3013a47dfc3e2081076a3b3ac840 (patch) | |
tree | a4a19f7d746ba54faf6c6de8bbd42b8bcfa2b236 | |
parent | 8bcbbc0c3225b09b1c0f20c2974f95f38db333ec (diff) |
tumblr: support reblogging and fix HTML issues
Detect tumblr posts and use the reblogging API to post them. Also
produce HTML-escaped lines for video and photo captions because
the format=markdown specification doesn't seem to apply to them.
-rw-r--r-- | data/rbot/plugins/tumblr.rb | 71 |
1 files changed, 58 insertions, 13 deletions
diff --git a/data/rbot/plugins/tumblr.rb b/data/rbot/plugins/tumblr.rb index 55489743..a135e6c3 100644 --- a/data/rbot/plugins/tumblr.rb +++ b/data/rbot/plugins/tumblr.rb @@ -20,12 +20,17 @@ require 'cgi' class TumblrPlugin < Plugin RBOT = CGI.escape("rbot #{$version.split.first}") WRITE_URL = "http://www.tumblr.com/api/write" + REBLOG_URL = "http://www.tumblr.com/api/reblog" + READ_URL = "http://%{user}.tumblr.com/api/read?id=%{id}" LOGIN = "email=%{email}&password=%{pwd}&group=%{group}&format=markdown&generator=" + RBOT PHOTO = "&type=photo&source=%{src}&click-through-url=%{src}" VIDEO = "&type=video&embed=%{src}" CAPTION = "&caption=%{desc}" LINK = "&type=link&url=%{src}" - DESC = "&name=%{desc}" + NAME = "&name=%{name}" + DESC = "&description=%{desc}" + REBLOG = "&post-id=%{id}&reblog-key=%{reblog}" + COMMENT = "&comment=%{desc}" def help(plugin, topic="") case topic @@ -50,25 +55,65 @@ class TumblrPlugin < Plugin if line and nick = options[:nick] line = "<#{nick}> #{line}" end + html_line = line ? CGI.escapeHTML(line) : line req = LOGIN % account - type = options[:htmlinfo][:headers]['content-type'].first rescue nil - case type - when /^image\/.*/ - data = PHOTO - data << CAPTION if line - else - if url.match(%r{^http://(\w+\.)?youtube\.com/watch.*}) - data = VIDEO + ready = false + api_url = WRITE_URL + tumblr = options[:htmlinfo][:headers]['x-tumblr-user'].to_s rescue nil + if tumblr + id = url.match(/\/post\/(\d+)/) + if id + id = id[1] + + read_url = READ_URL % { :user => tumblr, :id => id} + # TODO seems to return 503 a little too frequently + xml = @bot.httputil.get(read_url) + + if xml + reblog = REXML::Document.new(xml).elements["//post"].attributes["reblog-key"] rescue nil + if reblog and not reblog.empty? + api_url = REBLOG_URL + data = REBLOG + data << COMMENT + html_line = CGI.escapeHTML("(via <a href=%{url}>%{tumblr}</a>" % { + :url => url, :tumblr => tmblr + }) unless html_line + req << (data % { + :id => id, + :reblog => reblog, + :desc => CGI.escape(htmlline) + }) + ready = true + end + end + end + end + + if not ready + type = options[:htmlinfo][:headers]['content-type'].first rescue nil + case type + when /^image\/.*/ + data = PHOTO data << CAPTION if line else - data = LINK - data << DESC if line + if url.match(%r{^http://(\w+\.)?youtube\.com/watch.*}) + data = VIDEO + data << CAPTION if line + else + data = LINK + data << NAME if line + end end + req << (data % { + :src => CGI.escape(url), + :desc => CGI.escape(html_line), + :name => CGI.escape(line) + }) end - req << (data % { :src => CGI.escape(url), :desc => CGI.escape(line) }) + debug "posting #{req.inspect}" - resp = @bot.httputil.post(WRITE_URL, req) + resp = @bot.httputil.post(api_url, req) debug "tumblr response: #{resp.inspect}" end |