Now that my MT -> LJ bridge is finally working the way I want it to, I’ll take the time to do a little documentation.
The basic architecture is as follows. I have an MT template containing a verbose RSS .91 feed, which is an index template, so the page it produces is rebuilt every time I post. I added a CGI script residing on my server to the list of URLs to ping when my blog is updated. The CGI runs blagg (an RSS aggregator) with the LiveJournal plugin, which pushes the post to my LiveJournal.
Notes:
Blagg is not a very smart parser; it expects the RSS tags to come in a certain order. Specifically, it requires first <title>, then <link> then <description>. As it happens, this is not the order in which the default MT RSS .91 template presents the tags, so I had to modify a copy of the template to put things in an order blagg would understand. I also expanded the description field to contain the entire post, since I wanted people to be able to read the full entry without leaving the LJ page. Finally, I replaced encode_xml=”1” with encode_html=”1” throughout the template, since encode_xml encodes some characters in a way that most browsers won’t understand. Specifically, IE can’t make sense of '.
My CGI script looks like this:
#!/usr/bin/perl -w
use strict;
use XMLRPC::Transport::HTTP;
my $server = XMLRPC::Transport::HTTP::CGI
-> dispatch_to('weblogUpdates')
-> handle
;
package weblogUpdates;
sub ping {
`/home/durrell/bin/pushlj.sh &`;
return "OK";
}
pushlj.sh is this:
#!/bin/sh
lockfile=/tmp/lj-bridge.lck
blagg=/home/durrell/bin/blagg
plugin=-plugin=livejournal
mode=-mode=automatic
login=-login=bryant
REQUEST_METHOD=
i=1
while [ $i -lt 5 ]; do
if [ ! -e $lockfile ]; then
touch $lockfile
$blagg $plugin $mode $login
rm $lockfile
i=5
else
sleep 60
i=$(( $i + 1 ))
fi
done
Why a separate script? Because in case I run into a lock, I don’t want the CGI to sit around waiting for the lock to vanish. Also, I intend to put a five minute delay in there to give me time to edit a bad post before it hits LJ.
Why the REQUEST_METHOD= bit? Because blagg processes its command line switches with CGI.pm. This is a very clever method of processing arbitrary switches in an elegant manner, but if REQUEST_METHOD is set, then CGI.pm won’t look for parameters on the command line. So I have to unset it somewhere. Getopt::Long really ought to have a method for processing arbitrary switches, but that’s a rant for another post.
Finally, since I’m using version 1.0 of the livejournal plugin, I had to edit the plugin a little to make it set the preformatted flag for posting. I also tweaked it a little to store the password in the plugin itself, since I don’t like the idea of exposing the password on the command line (and thus in the process table). Version 1.1 of the plugin allows you to specify preformatted mode with a command line switch, but I haven’t upgraded yet.