Geek & Mild by Sean Sperte


Scrapblog. Filed in the same “The Awesomeness” folder as picnik, Scrapblog features support for most (popular) photo/image hosting services; basic tools for sharing, commenting and notes; RSS; and the ability to create a “Scrapblog” without even having an account or logging in!

Basically, Scrapblog allows you to create a web-/Flash-based scrapbook with your photos and images. You can publish, share, embed and subscribe to your “Scrapblog.” The creation of a Scrapblog is done inside a Flash-based UI (with, of course, more famfamfam icons), which is very nicely designed and easy to learn and use.

(Via Cameron.)

(»)

Apr 2nd Powering an Audio Archive With ExpressionEngine

One of the most often-asked questions I receive is about how The City Church’s audio archive is powered. It’s easier than you’d expect, but does require a bit of explanation. So, as promised, here’s a look under the hood.

Custom fields and weblog preferences

ExpressionEngine’s weblogs, or “databases” as I’ve labeled them, are much more flexible than a typical two- or three-field weblog. They can have custom fields, and have dozens of settings. I’ve assigned our Audio Archive database a custom field group which, beyond “title” and “URL title”, has an additional 13 fields. They include:

spacer

Each custom field comes with preference settings for type, formatting, hiding/showing, and instructions. Setting these preferences, I’m able to simplify the publish form as much as possible, but still give some advanced options to the publisher.

In addition to the custom fields, each entry (or “message” in this case) also has date, category, and status assignment(s). The nice thing about using a custom field for the service time is I don’t have to rely on our audio engineers (who do all the archive maintenance) to manually enter the service time in the entry date field — they simply click on the date itself. Also, since entries can have multiple categories assigned to them, a message can appear as a “Sunday Messages” and “Guest Speakers” entry simultaneously.

Speaking of categories, I’ve also set up a custom category group which has almost 30 categories (and sub-categories) for message assignment. They cover areas of ministry as well as special events. A few examples would be: “Sunday Messages”, “City Kids”, “Generation Church”, and “Men’s Ministry.”

The Audio Archive database also has some unique preferences that set it apart as a non-textual-based weblog. For instance, I’ve set the default status to be “closed” so that an entry can be created without it being immediately published and live. This enables an audio engineer to create the entry during a service while the message is being preached, but not have it available until he/she confirms the details of, say, the title or summary.

I’ve also set the database to: 1) disallow trackbacks (and auto-discovery code) in entries; 2) notify me via email of each entry published; 3) not show formatting buttons, author menu or forum topic on the publish page.

Setting up the templates

The fun stuff is in the templates. That’s where the magic happens. When displayed on a webpage, each message entry has links to listen, download, buy, etc.

spacer

Here’s an example of a typical archive listing:

  1. {exp:weblog:entries weblog="audioarchive" limit="5"}
  2. <div class="message">
  3. <p><strong><a class="{url_title_path=message}">{title}{if subtitle} ({subtitle}){/if}</a></strong><br />
  4. <span>{if speaker != "other"}{speaker}{if:else}{speaker_alt}{/if}</span> {entry_date format="%M %j, %Y"} &bull; {if servicetime != "other"}{servicetime}{if:else}{servicetime_alt}{/if} &bull; {campus}</p>
  5. <ul>
  6. <li class="listen"><a class="/listen/{entry_id}">
  7. <li class="download"><a class="/download.php?file={fileid}.mp3">Download</a></li>
  8. <li class="buy"><form name="post" method="post" action="www.ewebcart.com/cgi-bin/cart.pl">
  9. <!— shopping cart tags here //—>
  10. <a class="#"><input type="image" src="/img/spacer.gif">
  11. </form></li>
  12. {if notes}<li class="notes"><a class="/pdf/{notes}">Notes</a></li>{/if}
  13. <li class="comments"><a class="{url_title_path=message}">{if comment_total >= '2'}{comment_total} Comments{if:elseif comment_total == '1'}{comment_total} Comment{if:else}Add Comment{/if}</a></li>
  14. </ul>
  15. </div>
  16. {/exp:weblog:entries}

This code-block is found on the index page of the audio sub-section. Breaking it down, you can see I’ve wrapped each message in its own div with the class message. Inside the div I use a paragraph for {title} and some meta-info about the message. Notice the use of conditionals for {subtitle}, speaker and servicetime. If, for instance, the publisher gave the message a subtitle, it will appear in parenthesis after the title; if not, nothing will show.

Then (on line 5) comes the unordered list — with links to listen, download, buy, view notes or comment. The markup is pretty simple:

spacer When unstyled, this code-block is relatively plain and [arguably] semantic. The only point of contention comes from the use of a transparent GIF for the form submit button. In hindsight I suppose I could’ve just used input type="image", but I was preoccupied in trying to utilize CSS for all images.

Of course, ExpressionEngine has built-in support for XML templates, so serving a podcast is just as simple:

  1. {exp:weblog:entries weblog="audioarchive" category="4" orderby="date" sticky="off" limit="10" rdf="off"}
  2. <item>
  3. <title>{exp:xml_encode}{title}{/exp:xml_encode}{if subtitle} ({exp:xml_encode}{subtitle}{/exp:xml_encode}){/if}</title>
  4. <link>{url_title_path=message}</link>
  5. <guid isPermaLink="false">{fileid}</guid>
  6. <description><![CDATA[{exp:markdown}{if summary}{summary}{if:else}Speaker: {if speaker_alt}{speaker_alt}{if:else}{speaker}{/if} - This message was preached on {entry_date format="%F %j%S"} at the {servicetime} service, at the {campus} Campus. No additional summary available.{/if}{/exp:markdown}]]></description>
  7. <dc:date>{entry_date format="%Y-%m-%d"}</dc:date>
  8. <!— itunes-specific item tags —>
  9. <itunes:author>{if speaker_alt !=''}{speaker_alt}{/if}{if speaker_alt ==''}{speaker}{/if}</itunes:author>
  10. <itunes:subtitle>{if summary}{summary}{if:else}Speaker: {if speaker_alt}{speaker_alt}{if:else}{speaker}{/if} - This message was preached on {entry_date format="%F %j%S"} at the {servicetime} service, at the {campus} Campus. No additional summary available.{/if}</itunes:subtitle>
  11. <itunes:explicit>no</itunes:explicit>
  12. {if keywords}<itunes:keywords>{keywords}</itunes:keywords>{/if}
  13. <itunes:summary>{if summary}{summary}{if:else}Speaker: {if speaker_alt}{speaker_alt}{if:else}{speaker}{/if} - This message was preached on {entry_date format="%F %j%S"} at the {servicetime} service, at the {campus} Campus. No additional summary available.{/if}</itunes:summary>
  14. <!— end itunes-specific tags —>
  15. {exp:feed_enclosures}<a class="www.thecity.org/audioarchive/{fileid}.mp3" rel="enclosure">{title}</a>{/exp:feed_enclosures}
  16. </item>
  17. {/exp:weblog:entries}

… Okay, so it doesn’t look so simple — but with proper code formatting and highlighting it becomes much easier to understand. I won’t go into detail about every line, but I will point out a few key elements.

First, notice the use of <![CDATA[ ... ]]> for the {summary} field. I use it because the field is set with no formatting, allowing me to format on the template-side — in this case, using the Markdown plugin.

Secondly, you can see I’m using a lot of iTunes-specific code. I suppose it goes without saying, but a podcast without these tags will have an uphill battle getting exposure on the iTunes Podcast Directory.

Finally, notice the actual file link is wrapped in {exp:feed_enclosures}. This tag performs some wizardry and somehow quantifies the file’s bit-size and serves a correctly formatted enclosure element. At least, I think that’s what it does.

Maintaining the archives

So with this infrastructure in place, maintenance of the audio archive has been effortless for me. The only thing I need to do is quality control; making sure message details are correct, no weird symbols are used, and the website stays online. I’m completely out of the loop during the process, which (I’ve been told) goes something like this:

  1. The message is recorded to a master CD during the service
  2. The master CD is then ripped and (quickly) edited for content and equalization
  3. The audio file is compressed and encoded as an MP3 (email our lead audio engineer for details about this step)
  4. The file is uploaded to the server
  5. A new entry is created in the audio archive EE database

I’m yawning just thinking about how little I have to do to keep it all going. ExpressionEngine rocks.

5 comments | permalink

@media Antarctica. I’m SO going … buttons with my new logo in hand.

Update: Uh. I SO thought this was an April Fools joke. Boy, do I feel sheepish. Okay, so this was an April Fools joke after all.

(»)

I can’t put my finger on why, but I just love, love, love the new Method Arts logo.

And Brian Warren’s. And Mark Bixby’s. And Scott Boms’. And Garrett Dimon’s. And Shawn Grimes’. And Dan Rubin’s. And Dave Shea’s. And Jeff Croft’s. And Garrett Murray’s. And Steve Smith’s. And Nathan Smith’s. And David Hemphill’s. And Dustin Diaz’s. And Jina Bolton’s. And Jonathan Snook’s. And … All these.

spacer

And with all the great logo design originality out there, you’d think Jesse would find some inspiration — but no, he goes and straight up copies another site’s logo. And to think I used to respect him as a designer.

(1)

A couple of new changes at Geek & Mild today. I’ve revised the About Me page slightly, tweaked the Asides font and vertical rhythm, changed the RSS feed to denote Asides with “[Aside]” in the title, and upgraded the logomark (by far my favorite improvement). Your thoughts, as usual, will be ignored.

spacer

(3)

Easier INS and DEL tags with TextExpander. A nice tip for inserting correctly-formatted ins and del elements using the veritable TextExpander.

(»)

Instant Domain Search Widget. Did you know they had a widget? I didn’t know they had a widget. How come they have a widget and I didn’t know? (Now there’s a nice example of something to use Dashcode on.)

(»)

spacer

I stayed up tonight to watch a local news story covering Mike Davidson’s “prank” on Senator John McCain. Mike did a great job on camera, looked good, and articulated the situation very well. Love the iMac shot — and I had no idea he is left-handed.

(»)

Uni-Form - One Form to Rule Them All. Nice implementation in attempt of standardizing HTML forms. The idea centers around similar concepts as Microformats. It’s definitely worth a look if you have to deploy forms (of any size).

(»)

Shua brings it. Or “How Joshua Blankenship went there with asking why the Church sucks, creatively speaking.”

(I’ve chosen to not participate in the discussion, though I have many thoughts on the matter.)

(»)

Mar 27th Adobe Announces Creative Suite 3

spacer Today Adobe announced Creative Suite 3. The accompanying product matrix makes even Microsoft’s Windows Vista version grid look simple. It’s a mess to sort out, even for a veteran Adobe user.

Visiting the product page I thought to myself, “it would be nice if they offered some sort of ‘select the products you use/need and we’ll show you which package to buy’ feature.” Further exploration revealed a handy Product Selector applet (Flash, of course) that seemed to fit the bill perfectly. Unfortunately, as soon as it was done pre-loading I realized it fell short; offering areas of design, rather than specific products for use.

spacer

I think, Adobe, it’s safe to assume the majority of your consumers know which products they need already.

Needless to say, I attempted to fill out the “questionnaire” anyway — curious what product package would be recommended for my somewhat unique requirements. Here’s what I checked:

What was suggested? Of course! The mamma-jamma Master Collection, retailing for $2,500, with an upgrade cost for me (with my CS2 Standard license) of $1,999.

Let’s look at what I’d get with the Master Collection … no, better yet, let’s look at what I don’t need, but would still get with it:

… not to mention the various “shared features” I don’t use or need, such as Version Cue, Device Central, Acrobat Connect, Dynamic Link, etc.

Maybe I’ll just upgrade Photoshop.

0 comments | permalink

Mar 25th Removing “www” From a Domain

Here’s what I do to remove “www” from my domain. I put this code in my .htaccess file:

  1. RewriteEngine On
  2. #Handle removal of “www”
  3. RewriteCond %{HTTP_HOST} ^www.YOURDOMAIN.com(.*)$ [NC]
  4. RewriteRule ^(.*)$ YOURDOMAIN.com/$1 [R=301,L]

A couple quick notes about this method if you want to use it as your own:

  1. In order to see/edit .htaccess, you may have to show “invisible” files in your FTP application.
  2. This only works on servers running Apache.

For more information, and a technical explanation of what each line does, read John Gruber’s post (and subsequent opinion of why one would want to do this) from May 2006.

0 comments | permalink

The Project Chain. Required reading for the week.

(»)

spacer

Gosh, I wish I could use the same excuse with my boss. “Sorry, something prevented me from completing the project.”

(»)

Darth Vader on Twitter.

Has discovered that my mask is excellent at straining the pulp from my morning glass of orange juice.

(»)

Twitter doesn’t like
All the special characters;
No more pipes for me
Dan Rubin

(»)

Redesigning the ExpressionEngine Site. Jesse walks-through the design process of redesigning (and rebranding) the pMachine websites. Well done, Jesse. Great article!

(»)

Twittering Your Home. Are we taking this a little too far? Nah.

(»)

spacer
An Uncompromising Wish, originally uploaded by Eric Rolph.

(»)

John Gruber took Andy Baio’s Twitter-growth data and created a graph showing Twitter’s growth from March to October last year. Also, take a look at Andy’s own charts reflecting the absurd growth thereafter.

(»)

« Older entries
gipoco.com is neither affiliated with the authors of this page nor responsible for its contents. This is a safe-cache copy of the original web site.