Last night I cranked out a quick and dirty Brightkite plugin for Habari. It pulls the most current checked in data and displays that along with a map on your site. Here on this site, it outputs something along these lines:

Or I could have just pointed you to my sidebar to the right to see it in action here. To use the plugin you'll need a Google Maps API Key to generate the images. If you don't already have one, you can get one for free from here.
The latest version can be grabbed from the Habari Extras repo. Installation instructions are up on the wiki here. Feel free to contact me if you hit any issues.
May 28, 2009
| Tags: brightkite, habari and plugin | Leave A Comment
I've gotten a few pings on how I generate the maps for my Brightkite entries in my lifestream with Sweetcron. It's pretty simple and straight forward. Looking out on the Google group for Sweetcron, I see that no one really shared what they had done in the past, so here's my implementation. You'll need to get a Google Maps API Key for this to work on your site. If you don't already have one, you can get one here.
First things first. For some reason (I haven't had a chance to dig into it yet) Sweetcron won't import a BK feed directly (at the time of this entry). To work around this just run your BK feed through Feedburner, and then use that as the feed URL in Sweetcron.
Secondly, we'll need to pull some additional information when Sweetcron pulls in the feed. To accomplish this one, we'll create a new class. You can download the class here or just copy out the code below. To install this, simply drop it into your system/application/plugins directory. Make sure to edit the file and update your GOOGLE_MAPS_API_KEY for image generation. (You'll also want to rename the extension from .phps to .php if you download it.)
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* @todo: Change these to match your setup
*/
define('GOOGLE_MAPS_API_KEY', '!!CHANGE THIS TO YOUR GOOGLE MAPS API KEY!!');
define('IMG_SIZE_CHECKIN', '230x200');
define('IMG_SIZE_MESSAGE', '230x100');
/**
* Namespaces that we'll be working with
*/
define('NS_GEORSS', 'http://www.georss.org/georss');
define('NS_BKITE', 'http://brightkite.com/placeFeed');
define('NS_MEDIA', 'http://search.yahoo.com/mrss');
/**
* Simple Brightkite class for Sweetcron
*/
class Brightkite_com {
function pre_db($item, $original)
{
// First let's pull out the GeoRSS
$_coords = $original->get_item_tags( NS_GEORSS, 'point');
$_name = $original->get_item_tags( NS_GEORSS, 'featurename' );
// Pull the BrightKite Feed info
$_placelink = $original->get_item_tags( NS_BKITE, 'placeLink');
$_type = $original->get_item_tags( NS_BKITE, 'eventType');
// Convert to something we can use
// @todo: Find another way to do this, SimplePie should include a default way.
list( $lat, $long ) = split( " ", $_coords[0]['data'] );
$name = $_name[0]['data'];
$type = $_type[0]['data'];
// Populate data to be saved along with the item.
$item->item_data['geo']['name'] = $name;
$item->item_data['geo']['lat'] = $lat;
$item->item_data['geo']['long'] = $long;
$item->item_data['bk']['placelink'] = $_placelink[0]['data'];
$item->item_data['bk']['type'] = $type;
// Check to see what type of pose this is.
// $type will be set to one of 'photo', 'message', or 'checkin'
if ( $type == "photo" ) {
$_caption = $original->get_item_tags( NS_BKITE, 'photoCaption');
$_imglink = $original->get_item_tags( NS_BKITE, 'photoLink');
$imglink = $_imglink[0]['data'];
$item->item_data['bk']['caption'] = $_caption[0]['data'];
$item->item_data['bk']['imglink'] = $imglink;
}
elseif ( $type == "message" ) {
// @todo: Figure out why SC doesn't pull this by default.
$item->item_data['description'] = $original->get_description();
}
elseif ( $type == "checkin" ) {
// Don't need any additional info. It's just a checkin.
}
return $item;
}
function pre_display($item)
{
// Generate the URL for our image
$mapimg = 'http://maps.google.com/staticmap?center=';
$mapimg .= $item->item_data['geo']['lat'] . ',' . $item->item_data['geo']['long'];
$mapimg .= '&zoom=12&sensor=false&markers=';
$mapimg .= $item->item_data['geo']['lat'] . ',' . $item->item_data['geo']['long'];
$mapimg .= '&key=' . GOOGLE_MAPS_API_KEY . '&size=';
// Make sure to choose the correct size for the image
if ( $item->item_data['bk']['type'] == "message" ) {
$item->item_data['gmapimg'] = $mapimg . IMG_SIZE_MESSAGE;
} else {
$item->item_data['gmapimg'] = $mapimg . IMG_SIZE_CHECKIN;
}
return $item;
}
}
?>So what does this class give us? It gives us access to all of the GeoRSS information along with some extras that we can use in our _activity_feed.php. The following are now available to you in _activity_feed.php in your theme:
/**
* Returns 'type' of BK entry
* This will be 'photo', 'message', or 'checkin'
*/
$item->item_data['bk']['type'];
/**
* For type 'photo'
*/
// URL to image
$item->item_data['bk']['imglink'];
// Caption for image
$item->item_data['bk']['caption'];
/**
* For type 'message'
*/
// Text of our note that we posted
$item->item_data['description']
/**
* For all types
*/
// Link to Brightkite object
$item->item_data['bk']['placelink'];
// Place Name
$item->item_data['geo']['name'];
// Google map image URL
$item->item_data['gmapimg'];
So if you're still wondering how to use this at this point, pretty simple. You just need to modify your _activity_feed.php file (located in your theme directory) to handle the additional data. Here's the loop in mine that builds my lifestream:
// ...
<?php elseif ($item->get_feed_domain() == 'brightkite.com'): ?>
<?php if ( $item->item_data['bk']['type'] == 'photo' ): ?>
<p class="activity_image_text">
<a href="<?php echo $item->get_permalink(); ?>/<?php echo $item->get_name(); ?>">
<?php echo $item->item_data['bk']['caption']; ?>
</a>
<span class="activity_image_content"></span>
</p>
<span class="type_label photo"></span>
<a class="activity_image" href="<?php echo $item->get_original_permalink(); ?>" style="background: url(<?php echo $item->item_data['bk']['imglink']; ?>) center no-repeat;"></a>
<?php elseif ( $item->item_data['bk']['type'] == 'message' ): ?>
<a href="<?php echo $item->item_data['bk']['placelink']; ?>">
<img class="bkite_note" alt="<?php echo $item->item_data['geo']['name']; ?>" src="<?php echo $item->item_data['gmapimg']; ?>">
</a>
<span class="type_label regular"></span>
<div class="inner_container">
<p class="bkite">"<?php echo $item->item_data['description']; ?>"</p>
</div>
<?php elseif ( $item->item_data['bk']['type'] == 'checkin' ): ?>
<p class="checkin">
<a class="checkin" href="<?php echo $item->item_data['bk']['placelink']; ?>">
<img alt="<?php echo $item->item_data['geo']['name']; ?>" src="<?php echo $item->item_data['gmapimg']; ?>">
</a>
Checked in @ <a href="<?php echo $item->item_data['bk']['placelink']; ?>"><?php echo $item->item_data['geo']['name']; ?></a>
<br>
</p>
<?php endif; ?>
<?php elseif (!$item->feed_id): ?>
// ...
This is obviously not the only way to do it, nor the best, but just the way I have it running here. Have fun!
Apr 27, 2009
| Tags: brightkite, google, lifestream, maps, plugin and sweetcron | 2 Comments