Brightkite maps with Sweetcron

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!

 

2 Responses to "Brightkite maps with Sweetcron"

  1. wow - thanks for this! i was just trying to figure out how to do it today. am a little behind on my web since i moved to print :)
     
  2. Wonderful and thank you. I have used it in my Sweetcron.
     

Leave a Reply