Paginating Multiple Content Types (Using Redis) Part 1
A tutorial on paginating objects of different ContentTypes using redis.
Added by Sean Coonce on June 13, 2011
A Brief Background
Paginating iterables and querysets in Django is made quite sane through the use of the Paginator class. However, if you need to paginate objects that span multiple content types, the problem becomes slightly more complicated.
We first dealt with this problem when the Tested guys wanted add a "How-To" section to their site which would incorporate Articles, Reviews, and Videos (all of which are distinctly different models). This tutorial will set up a few sample models and walk you through paginating them as a single group.
A Quick Example
We have sample repository showing how everything works together in more detail on Github if you're interested. For this example we'll define an Article and Review model, both of which we'll need to paginate:
>>> class Article(models.Model): >>> pass >>> >>> class Review(models.Model): >>> pass
Before we begin, let's run through how we would paginate Articles.
>>> from django.core.paginator import Paginator
>>> articles = Article.objects.all()
>>> paginator = Paginator(articles, 10) # Paginate articles w/ 10 per page
>>> page = paginator.page(1)
>>> page.object_list
This is fairly simple and Django's Paginator class handles Querysets very efficiently (by limiting and offsetting the query behind the scenes) and can handle any iterable as well. However, when paginating objects that span multiple content types, things get a little messy. While we could write code that effectively merges Articles and Reviews into a single organized list and pass that to the Paginator, that solution does NOT scale and we don't have a defined way to sort that list. You can't sort by their primary keys because you have no idea which pk from which model should come first.
In order to paginate instances of these two models, we'll set up and manage a list of the objects in redis. The data in the list will consist of "content_type_id:object_id" strings similar to what's found below. For those unfamiliar with Django, the ContentTypes Framework provides you with are a generic interface for working with your models. Every one of your models are assigned a unique ContentType id which allows us to create a content type id/ojbect id combination to uniquely identify each object we wish to paginate. Below is an abstraction of what our object list will look like in redis.
>>> ['article_ct:article.id','review_ct:review.id'....]
We can get object data into redis a number of ways: using signals, overriding the models' save() method, etc. In our production sites, we use a slightly more complex system that registers and manages a handful of post_save()/post_delete() hooks on the models we're interested in -- but for the sake of this example let's just override the save() method on the Article and Review models defined above.
>>> KEY = 'your_storage_key'
>>> class Article(models.Model):
>>> def save(self, *args):
>>> super(Article, self).save(*args)
>>> redis.lpush(KEY, "%d:%d" % (ContentType.objects.get_for_model(self), self.id))
>>>
>>> class Review(models.Model):
>>> def save(self, *args):
>>> super(Review, self).save(*args)
>>> redis.lpush(KEY, "%d:%d" % (ContentType.objects.get_for_model(self), self.id))
All we're doing here is pushing new objects onto the same redis list whenever an Article or Review is saved. This will work great for new objects, but it will also add duplicate objects to the list if we update an object that already exists.
So let's tweak the save() methods above so that they only add 'new' objects to the list.
>>> def save(self, *args):
>>> created = not self.id
>>> super(Article, self).save(*args)
>>> if created:
>>> redis.lpush(KEY, "%d:%d" % (ContentType.objects.get_for_model(self), self.id))
Now we should be set up to insert data into redis like so:
>>># Let's create a handful of Articles and Reviews
>>> article_1 = Article.objects.create()
>>> review_1 = Review.objects.create()
>>> article_2 = Article.objects.create()
>>> review_2 = Review.objects.create()
>>> review_3 = Review.objects.create()
>>>
>>># Check their content_types
>>> ContentType.objects.get_for_model(Article)
>>> 1
>>> ContentType.objects.get_for_model(Review)
>>> 2
>>>
>>># Fetch the list of objects from redis
>>> redis.lrange(KEY, 0, -1)
>>> ['2:3','2:2','1:2','2:1','1:1'] # [review_3, review_2, article_2, review_1, article_1]
At this point we now have data being properly stored in redis. We'll now use this redis list to get, paginate and factory objects.
Pagination
In our production environment, we have a RedisPaginator that subclasses Django's Paginator class and overrides _get_count() and page(), but we can simplify things in this example:
>>># Let's get the first page containing three items
>>> page = 1
>>> results_per_page = 3
>>>
>>># Use the page to calc the lower limit of the slice
>>> bottom = (page - 1) * results_per_page
>>>
>>># Use the results_per_page to calc the upper limit of the slice
>>> top = bottom + results_per_page - 1
>>> count = redis.llen(KEY)
>>> if top >= count:
>>> top = count - 1
>>>
>>># Get a slice of the object list in redis using the bottom and top bounds
>>> redis.lrange(KEY, bottom, top)
>>> ['2:3','2:2','1:2']
Factory Objects Returned in the Page
So this logic will fetch a paginated 'page' the "content_type_id:object_id" strings out of redis given a page number and the number of results per page you want - now let's finish this off by factorying each object returned in the page:
>>> def factory_object(ct_obj_string):
>>> # Split the string to get the ct_id/obj_id
>>> ct_id, obj_id = ct_obj_string.split(':')
>>> return ContentType.objects.get_for_id(ct_id).models_class().objects.get(id=obj_id)
>>>
>>> [factory_object(ct_obj_id) for ct_obj_id in redis.lrange(KEY, bottom, top)]
Clean Up
So we now have post-save logic that pushes new objects into a redis list. We also have logic to get paginated data out of that list as well as a small function to factory each object in the object list. But we don't have any logic to handle the use case when an Review or Article is deleted, so let's add it.
Again, there are a number of ways we could implement this using post_delete() signals, etc., but let's just override the delete() method on the Article and Review models to allow them to flush items from the redis list after they are deleted.
>>> def delete(self): >>> redis.lrem(KEY, "%d:%d" % (ContentType.objects.get_for_model(self), self.id))
>>> super(Article, self).delete()
And there we are -- super simple pagination of objects spanning multiple content types using redis. If you enjoyed that, but need a little more power -- for instance, if you want to sort objects based on a common field like a 'publish_date' -- then stay tuned because we'll be adding a complimentary post that goes into more depth with a slightly more complex example using sorted sets.
Business Update: Ads are back
A little update on how we try to pay ourselves.
Added by Tatum on June 1, 2011
Starting tomorrow, you will notice more advertisements than normal on the sites. This increase comes from us testing out a few different ad representation partners that can sell ads on our sites. If you have feedback on the ads, please leave us a comment below. We would love to hear any constructive feedback.
Many of you have already asked us why we’re not running more ads, or more directly, “how the hell do y’all make money?“ A little background can address those questions.
We have been incredibly lucky to have had the directive to focus completely on our product over the last few years. That product is the editorial content we produce every day and the technology that enables our editors and you to publish, share, and socialize on our sites. Our goal was ambitious: We wanted to deliver a great audience experience while innovating on the media revenue model. So we put our heads down and focused on product and process with the assumption if we can figure out how to get an audience who loves our product, we’ll figure out how to make money.
We’ve done pretty well at building an audience, and now we’re starting to develop a concurrent focus on revenue. Last September we launched our Whiskey Pass, where members can subscribe and get high-definition video, live member-only shows, and no advertisements. Now we’re closing in on 10,000 paid members! (Come on Australia, I’m pulling for you!) We also opened up the Whiskey Store last year and have sold over 10,000 T-shirts, mugs, and other assorted goodies. We even got a call from the Mr. Holland’s Opus people who thanked us for the link to their charity because we were a “significant contributor” this year to their efforts to keep music in schools. Honestly, nothing makes us feel better than building direct relationships with our biggest users and developing a level of trust that inspires them to pay us directly for our work. We cannot thank you enough.
However, we are a media business. For now, most media companies rely on advertising for the majority of their revenue--and in that respect, we are no different. Where we differ from most media companies, though, is that we’ve decided to be very careful about how we introduce advertising onto our sites. We’re social publishers, which is a fancy way of saying that our sites are really your sites. You guys and gals spend more time here than the average “content only” site. And if we suddenly plaster every open wall in the house with ads, you might not want to come over and visit as often.
We feel like the time is right to start trying out some new ad partners. We will be trying out different ad types on the site and in the videos. We will have control over the ad types, but we won’t have much control over the contents of the ads. That’s certainly something we’ve tried to exert control over in the past, but it’s just the nature of the business right now. Do know that we are in a review process, so we are going to lean toward working with the partner who does the best job of selling relative ads to our audience. That’s good for you, the marketer and our business. Interests are aligned, so to speak.
For those of you who hate ads, we strongly encourage you to join our paid member program, which removes all display and video ads from the sites. You’ll also get a shirt and we’ll invite you over to a live, members-only Happy Hour three times a month! For those folks who are unable to pay for a membership, we hope you’ll give the ads a chance and know that those marketers are helping pay for trips to E3, penguin suits, and Vinny’s ever-growing library of ridiculous fire effects.
As always, thanks for supporting us. We enjoy working for you.
You Have Excellent Taste. Now Make Something
Dave answers the question most asked of Whiskey Media employees.
Added by Dave Snider on April 29, 2011
By far the questions I get asked most often through private messages on our sites are "how can I learn to do what you do?" and "how can I get a job at Whiskey Media?" I guess that makes sense. After all, I've taken little effort hiding my history as a
fan-turned-web-designer. Over the years I've usually taken the time to answer these PMs directly and write up whatever I'm thinking that day, but lately the notes have been coming in at a rate I can't keep up with. Finally I figured it best to formally put up a beefy post that I can point everyone to. So here it goes...
The Good News
You have excellent taste. You already know what to build/write/create.
The Bad News
It's going to take you a couple years to figure out how to become proficient at the tools and gain the experience necessary to create content professionally. Most of you will quit rather than go through the arduous process of improvement.
How do I know you have excellent taste? You contacted me, silly. This may surprise you, but I'm pretty hard to find. I design medium sized web-sites and am involved in about 5 percent of the front-facing content that most people consume on those sites. That you even know who a designer of a web site is means that you have a huge investment in our sites and the Internet at large. Actually, it's kind of weird, dude. My guess is that your family and friends think there is something wrong with you.
Continue reading this story »
Postmortem: Whiskey Downtime Due to Amazon Web Services Failure
When Amazon's Elastic Block Store failed in April 2011, our sites were down for almost 48 hours. Here's what we learned during the downtime, and how we're working to prevent it in the future.
Added by Andy McCurdy on April 26, 2011

Eek!
If you frequently visit the Whiskey Media sites, you probably noticed we suffered significant downtime last week. It wasn't just us, quite a few sites around the web were experiencing issues--this wasn't a coincidence. All of these sites are hosted on Amazon's cloud-hosting service
Amazon Web Services (AWS).
AWS experienced a significant outage early Thursday morning lasting for a little over two days. Amazons' customers were affected in different ways, depending on how they use AWS. The outage primarily impacted the AWS Elastic Block Store (EBS) product. Essentially, EBS provides easily-accessible long-term storage attached to virtual servers on AWS over the network. We use EBS to store everything on the sites except images, audio, and video.
Amazon puts forth great effort to make sure the data anyone stores on EBS volumes is safe. They're constantly monitoring the health of the system, and if any hard drive starts showing signs of failure, they mirror its contents and swap it out. On Thursday, something happened that caused the monitoring system to report that
all EBS volumes needed to be re-mirrored. This overloaded EBS and took the entire system down.
Why We Were Affected
We use several different data stores for our sites. Our
PostgreSQL,
MongoDB, and
Redis servers all use EBS for data storage. The beautiful thing about EBS is that it separates the servers from the data stored on them. If one of these servers goes down, the data remains safe in the EBS volume and we can spawn a new server, attach the old EBS volume to it, and be up and running again within a few minutes. Of course, no system is infallible, so we keep live backups of all of our data stored on another set of EBS volumes.
Amazon's EBS failure was isolated in one of their Northern Virginia data centers--what Amazon calls an Availability Zone. Amazon recommends spreading your application out across many AZs, to prevent failure in one zone from bringing down your site. Unfortunately, many people, including us, didn't follow Amazon's advice. Our main EBS volumes
and their replicas were stored within the same Availability Zone as the rest of our servers. As a result, we were completely at the mercy of AWS engineers until they restored access to our EBS volumes. While we could have recreated the databases from the previous night's offset backup, we would have lost nearly 24 hours of data and ultimately decided to wait for Amazon.
What We Learned
While the downtime was unfortunate, we learned a lot about AWS during this outage.
The most obvious lesson is that we need to be spread across multiple Availability Zones. We would have been back online in minutes rather than days had we had our data replicated to another AZ. We've already started doing this, and plan to have all critical data replicated to at least two more AZs by the end of this week.
In addition to mirroring our data across multiple AZs, we're also going to keep a live copy of the data locally as well. We love the convenience of EBS. But we also want the comfort of knowing that we have data spread across multiple systems. In the event of another large scale AWS meltdown, we may have some downtime, but should be able to get the sites back up relatively quickly using a local copy of the data.
What we won't be doing is moving off of Amazon. There's a number of blogs out there predicting the death of the cloud, but they couldn't be more wrong. Amazon has a strong track record of reliability and will learn from this downtime. However, there are many Amazon-hosted sites that experienced very little or no downtime during the EBS failure in Virginia because they followed Amazon's advice. I'm confident that Amazon Web Services will become even more reliable as a result of this outage.
While the outage was unfortunate, some good did come of it. We were able to push almost a dozen hours of live video content over Justin.tv and let our audience know that we were doing that using Twitter, Facebook, and other social networks. While this was an impromptu reaction to the site downtime, it's something we'll add to the Whiskey Media playbook should we experience significant downtime again in the future.
Thanks to all of our loyal members for their support during the downtime. Your encouraging emails, Twitter messages, and Facebook posts were much appreciated, and helped keep morale high while we were waiting on Amazon to fix EBS. To compensate all of our loyal members, we've extended the length of all active subscriptions by three days. Thanks for your continued support.
March Engineering Update
We go behind the scenes and show off some of our internal staff tools.
Added by Dave Snider on March 22, 2011
PAX wasn't the only reason for an empty office last week. While Jeff and the gang headed to Boston (I did end up buying a lot of beers btw) Andy and the engineering team spent the week in Atlanta for
PyCon. We've recently started a small team in Prague, Czech Republic led by Honza Král. They're primarily working on our backend infrastructure, making the sites faster and have a higher uptime. This was the first week all the engineers have been under the same roof (or sang karaoke) together. I figured now would be a good time to give our community an update on what we've been up to the last few months.
Distillery

One toolset to rule them all.
About a month ago we switched most of our internal staff tools to a unified platform we've internally dubbed Distillery. We now have a central, site-agnostic toolset that we use to publish articles, quests, videos and promo content on the sites. Traditionally we've spent little time on staff tools since our editorial friends using these tools are right beside us. They let us know about the bugs, but we subdue them with a beer in favor of improving user-facing products. After three years, it's finally time to clean house and make something a bit more professional. Our end-goal is to make the world's best publishing platform for the management of structured data, social-from-the-start websites.
Rubix

What kind of automatic emails are we sending to users? How many times are they clicking through? Now we know.
One of the fundamental problems we have as a company is trying to tell people what makes our sites different. For anyone that has never hit an edit button, you might confuse our sites for being yet another blog network. So after an inspirational
Django-Dash code sprint last year (We placed second... grr) we decided to build an internal analytics platform to showcase the sheer amount of data that goes through our sites. While the rest of the web tends to be pageview centric, we care more about what content our users are actually contributing and not what logged-out users are consuming. Not only does it let us pinpoint our best users, but we now know how far people make it through long-form videos, how many API requests we get every day, what data those consumers are most interested in, and a plethora of other stats. Here's some quick stats:
- We had 5 million API requests in February.
- In February 718 Wiki tasks were closed by users.
- Comic Vine had over 40,000 wiki submissions alone in February.
- This year, Giant Bomb's Catherine Quick Look is our most watched video.
- User The Dark Huntress is Whiskey Media's top commenter this year.
- Our users comment on other users' blog posts more than on videos or articles.
A New WYSIWYG Editor

How Mike debugs our WYSIWYG.
Mike Horn is currently at work building a new WYSIWYG editor called Parchment. After years of hacking on top of existing editors we decided this time to start from scratch and make an open-source one that can be contributed to from others outside of Whiskey Media. Hopefully this will mean better support across different browsers. We're building a plugin-architecture that we can use to improve things like image galleries, lists, photo uploads and off-site embeds. In general we want to be smarter about cleaning existing code that users paste into the editor. From a designer's standpoint, I'll finally be able to know that all the images, paragraphs and links don't have weird padding issues. We're also adding some more polish to the user interface and have some clever ideas for automatic link generation and table creation. It's a work in progress, but we'll update the blog later with a github repository if you'd like to help contribute or just check out Mike's awesome codes.
Hulu, Amazon and iTunes on Screened
Ethan's been working on Screened to get Hulu, Amazon and iTunes episode links tied to our TV show pages. Screened continues to grow its database at an insane rate. At this pace, we'll soon have more TV and movie data than we do game or comic book data. If you're looking to help out, simply add a link to a Hulu or Amazon on any of our show pages and our furious robots will match up the correct episodes.
Andy's also working on the Netflix integration to make it more stable and add new features. Look for more notes on that soon.
Improvements in Design

A new nav is in the works.
Alexis has begun a deep dive into our core design practices. After his restyle of the livestream chat I'm really excited to see what other parts of my initial designs he can refresh. He currently has a new header treatment for Giant Bomb and Comic Vine that should remove a lot of the pixel hunting and frustration people have with our current navigation structure. Over the coming months we'll be going through and improving sections of the sites in a similar way with the goal of simplifying and improving existing features before rushing head on into new ones. Expect changes to our wiki, image and list systems.
The Thank You Economy- "People Do Scale"
put something here
Added by Mike Tatum on March 9, 2011
Above is a video of Gary Vanerchuk's interview of MSNBC on March 9th. Gary is promoting his new book, "The Thank You Economy" and dropping mad truths on the future of business in a connected world.
Do you ever randomly turn on the TV just to have something on in the background only to discover a great show? Well, that's what happened to me this morning at 5:45am PST. I literally flipped on the TV right as Gary Vanerchuck was coming on
MSNBC's Morning Joe show. Typically, I would have immediately changed the channel to ESPN. But the "How social media makes businesses more personal" definitely caught my attention, and I've been a fan of Gary's
Wine Library TV since my
CHOW.com days.
If you are a fan of the Whiskey sites, you should watch this video. We really believe in much of what Gary's saying. For any our paid members (
9k and growing!) or people who have bought merch from
the Whiskey store, you know that we do our best to make sure each of you feels like you got value for the money you spend with us. Every person matters, and it still feels like that to us, even though we're getting
more than 4 million visitors a month, there's still a sense that real people run the company for real customers. I love Gary's "our grandparent's DNA" reference--basically he says that having a one-to-one relationship with customers is coming back into fashion again, just like it was with our grandparents. We live that every single day.
I also LOVED when Gary said "that people scale".
Dave is always saying "we make real websites with real people", and that is definitely a core tenet of Whiskey. We hire and value the people who actually create the content, code, and community in our brands. Even though we're small in headcount, I feel like we're having a big impact on how media will be done in the future.
Like Gary, I think lots of people think "social media" is overhyped right now. I also think that social is changing business for the better. By
getting smaller and connecting with our customers, we believe we are building a bigger and better business for the future. So thank you to you guys, our customers, for being a part of our business.
Why We Want to Do a World Tour
The tour starts early this weekend at PAX.
Added by Dave Snider on March 8, 2011
On last week's
Whiskey Media Happy Hour we formally announced the
Giant Bomb World Tour. In short, we're trying to find ways to meet up in person with our community in more places than our home port of San Francisco... as long as the user-base can hit certain paid membership goals. The genesis for the project started when our head of business development, Mike Tatum, jokingly mentioned that we'd be heading to Australia if we got a set number of Twitter messages from that country. Then a funny thing happened: we all sobered up the next morning and that idea wouldn't go away. Why couldn't we meet up with our community where they live?

Great ideas require dumb landing pages! Nice work Alexis.
The quick dismissal was because it's expensive, that's why. As a small company we can't really afford to put people on cross-continent flights with a bunch of production gear. Plus, where the hell are we gonna host these things? That'll cost money too. Plus, those travel days will mean we'll have to work extra hard before these things just to make sure the site doesn't go stale. There's a high cost to doing something this dumb.
But what if we offered it as a member perk? We've pretty much already decided as a company that when it comes to our paid members, once you've made that investment in us, we only want to offer you additional things either for free or at cost. Believe me, there's not much money in selling a few thousand $15 dollar T-Shirts. But that's OK, because we just sold near 2,000 T-Shirts to the only 9,000 people who could actually buy them. That's pretty staggering when you realize they were available for three days and announced haphazardly on a live Internet broadcast. I'll take that kind of success as an indication we're still doing stuff you appreciate.
So from that perspective we decided to use the same rationalization for the World Tour. OK, it's expensive. But what if we could get 15,000 subscriptions by the end of Summer? Then we could justify spending 10% of our revenue from the memberships to go to select cities, rent out a bar, and at the very least shake hands, say thank you and have some laughs. We might be able to even do more than that; but really, at the end of the day, if that's all it was, I'm pretty sure everyone involved would still have a good time.
How do I know that? Well, because I'm going to
PAX East this weekend for exactly that. Even though Giant Bomb is officially going so they can host a panel on Friday, I decided to log some unused PTO days and buy myself a personal flight to hang out with our community. It's going to be exciting to shake hands with the people I spend most of my days chatting with through small form fields.
So consider Boston the unofficial preamble of the World Tour. Ryan and I will try very last minute to find a bar downtown on Saturday that will host a group of real-life strangers (but Internet friends) to hang out, have a cold one, and talk video games and the sites we love. If you run into me at PAX make sure to hit me up for a beer (or contact me through
Twitter), because I genuinely believe if you're a Whiskey Media member you've earned it. Just do me the favor and try and convince a friend or two to join our goofy alliance of nerds as well, I'd like to make it to more than just Boston under the same clubhouse spirit. Our International crowd deserves the opportunity as well.
And hey, if you think all of this sounds vague, don't worry... It most certainly is. Sometimes you just gotta point in the distance and let your arrows fly. As long as we hit our goals, we'll make sure to think up something stupid to make it worth your while.
The Making of Comic Vine's 3-Minute Expert
Joey walks us through the wonderful world of After Effects.
Added by Joey Fameli on March 4, 2011
After Effects was something I rarely touched before joining Whiskey. I've used it for some simple tracking work and light compositing, but nothing nearly as extensive as motion graphics or working in 3D planes. In the last few months I've made a conscious effort to learn the software by jumping in head first and implementing the software into various Whiskey projects, specifically and most prominently in Comic Vine's 3-Minute Expert series.
We've been doing the CV 3-Minute Expert for a year now, and if you've been keeping up with all of them you might of noticed a definite solidification of style and structure take place somewhere around the Kraven the Hunter episode. I've gotten a few requests to detail how we put these videos together, so I thought I'd take this render time to write up a little behind the scenes blog.
It all Starts with Getting Organized

Asset Organization is CRUCIAL!
The process starts with Tony, Comic VIne's lead editor. Once he's chosen a character or concept to discuss he does an crazy amount of research and fact checking and eventually pens the script. He simultaneously gathers and scans assets and images and organizes them into folders. If you look in the example you can see that each paragraph ends with a bracketed number, ie, [01], [02]. He then supplies me numbered folders filled with all the images associated with that point of topic.
This part is extremely important, because without these folders, I'll end up spending a crazy amount of time starting and stopping, trying to find or sift images, or jumping onto the Comic Vine to cross reference to make sure I'm not putting the Bucky Barnes Captain America where the Steve Rogers Captain America is supposed to be, and…well you get the point. I work a lot better when I can maintain a continuous flow, and Tony has always been really good at picking out the best images and taking that preliminary step of asset organization.
The Shoot
We then shoot Tony in front of a green screen. Aside from the intro and outro, I try to keep Tony framed up in what I call a "cowboy shot", framed from around the mid-thigh up. This gives me enough leeway to composite Tony in the comic panels, scale him up and down as needed, and throw him inside Fin Fang Foom's mouth, or attach him onto the Source Wall.
After we shoot, I take the footage into Final Cut where I edit together the cut and flow of the piece. The first run is a basic cut, nothing fancy. I then export out to After Effects using a 3rd party plug-in called Automatic Duck. Auto-Duck allows me to export out the final cut timeline into After Effects, while keeping all the meta-data, cuts, handles, and effects that I had in Final Cut. If you're not really an After Effects user, this probably wont make much sense so I'll just skip this part; but if you are, I cant praise this plug-in enough. It's made a lot of my projects a helluva lot easier, and I can't thank Vinny enough for the nod.
Setting the Tone and Working in After Effects

Camera Movements
Now comes the insanity. I play the audio from the Final Cut sequence a few times while shuffling through the images. I do this a couple times to get a grasp on the tone and style of the piece, and to discover what images really hit a strong note with me. Then I usually take those into Photoshop and do some finishing, cut outs, etc. It's about here where I get a feel for how I want to move my virtual cameras and images around to service that tone. For example, Black Widow was more of a James Bond-style with intensity and intrigue; Kraven was a dichotomy of campiness and tragedy, and The Red Skull was more of a front lines war documentary/videography style. After I feel I have a grasp on how I want these pieces to play out, I set up my first virtual camera into After Effects and get to it.
Nowadays, most every 3-Minute I do is in the 3D world of After Effects; I like to have full control of my camera, and this is the way I've become most comfortable with. As I place images around I start to move my camera, set up depth of field, camera shake, zoom, dolly, and so on with key frames that ease-in, ease-out, rove, etc. The images don't do much moving and it's essentially all virtual cameras. When I get to a good cut I set up a new camera and "hide" the other camera as well as the layers and images associated with it. This is crucial because by the time I get to the end of the 3-Minute sequence I have something like 100 layers, and the project would just be too cluttered. I commonly go through about 10 cameras in a 4 1/2 minute video.
The Final Polish

Taking the sequence back into Final Cut
After the motion graphics and effects are done in after effects I export back out to Final Cut. I place the After Effects version on top of the original and play through a couple times to make sure everything looks good. Often times I need to tweak a couple things and jump back to After Effects. Once I feel good about the graphics I start having fun with sound effects, music, and audio mixing.
That's about it, simple enough once you look at the steps. The Comic Vine 3-Minute Expert has essentially been my training ground for After Effects and while there are a few things that I feel like I've learned real well, I know there is plenty more for me to learn. I try to find at least one new tool to play with every new video, and I have to admit it's been really fun. Who knows what the future will hold for us, maybe by this time next year the Comic Vine 3-Minute Expert videos will be filled with motion captured Tonys', and live explosives that you can watch in full Smell-a-vision on your 3D setups!

That's a lot of Layers
Whiskey Data Batch: February - Wiki Edition
Our monthly data-porn, shout-out to our power users
Added by Ethan Lance on March 3, 2011

Egypt is back online!
Power members of Whiskey Media know I post a monthly data-porn blog with stats celebrating the top wiki contributors and a list of the most compelling user blog posts. Usually I would write a unique post per site... but not today! In the last month we've launched an internal tracking tool we call "Rubix" that allows us to monitor stats across the entire network. That means we can see not only how much a user contributes to Comic Vine, but also to Giant Bomb, Anime Vice and Tested.
So rather than give you stats from one site I thought it'd be fun to show the best contributors across all of Whiskey Media combined.
Top Wiki Contributors

For the first couple years, we were convinced Fesak was a sentient robot. We're still not sure.
Like a boss,
Comic Vine and
Screened wiki editors went to work in February. St. Valentine could not slow these guys down. Wiki fiends
fesak,
mike20 and
aztek_the_lost made the most
individual contributions (meaning the number of separate submissions) to our wiki. Cupid be damned, these guys have one desire, wiki madness!
Rubix also allows us to track the number of new pages that go into our sites as well. Power contributor mike20 over on Screened is famous for creating brand new character pages. In the first week of February alone we had over
400 new characters added to our wiki. I can now happily report we closed out the month with 2,500 movie and TV show characters added to Screened's wiki.
That is insane!
Top Wiki Point Earners

Screened and Anime Vice users were the top wiki point gainers
To the right you can see who earned the most wiki points. As you may or may not know we give the most points for filling out the actual wiki descriptions throughout the sites as opposed to adding images or info fields.
Gort (Screened) and
FoxxFireArt (Anime Vice) are two of our most prolific writers and benefited hugely by earning big points in the wiki for filling in empty pages with excellent articles. Filling out pages with original content really makes a difference.
For example, check out Gort's work on
Battle Star Gallactica; every episode has a full plot summary. Also peruse FoxxFireArt's detailed article on
One Piece and all of its ancillary characters.
Most Active Wikis

Comic Vine wins.
I'm not surprised that Comic Vine leads in individual wiki contributions. Wednesday is comic book day and that site adds hundreds of both new and old comic books to our database each week. We've also been laser focused on Wiki Task Queue initiatives at
Comic Vine and
Screened since January. On Comic Vine, we're trying to tighten up the style of existing pages, while on Screened we're still continuing to fill in the gaps.
This week, the wiki task theme for Comic Vine is to clean up
Green Lantern articles in anticipation of the upcoming Ryan Reynolds movie. Screened on the other hand is focused on "Hot Dudes", and you can thank user
Christina for that. She's getting over our "Hot Girls" theme from a couple weeks ago. Not to be left out, on Anime Vice we're going to grow the overall wiki contributions as we ramp up our
Anime Style Guide and
Anime Task Queue.

Icarusflies super power: Patience.
As you'd imagine since Comic Vine and Screened get the most wiki edits, Comic Vine and Screened moderators have the most work to do. Huge props to
Icarusflies (Comic Vine),
ScanCase (Screened) and
ZombiePie (Giant Bomb) for being our top 3 wiki mods in February! They continue to make sure that new users know the rules when contributing to our sites. It's a pretty thankless job and you've got to have a certain kind of love for the subject matter to sift through both the good and bad that come from new users to the community.
Interested in this kinda stuff? Visit my previous data porn posts:
A New Coat of Paint for Whiskey Media
Dave covers some of the thought process behind the redesign.
Added by Dave Snider on March 2, 2011
As you can likely tell, we've redesigned the corporate Whiskey Media website. We did this for a number of reasons, but in the end we took on this project to accomplish two things.
- We wanted to host the site on our internal "Distillery" platform so that we could see how it worked on a smaller site.
- We needed a better way to talk with the industry and our users about the cool stuff we're doing.

My workspace can get a little cluttered.
The first was pretty easy. We've spent the last three months on our internal tools and infrastructure so that launching a new site takes little more than a couple weeks of design and a few configuration options. With that comes a new 'lite' version of the Whiskey Media platform. The lite version uses the same core technology our other sites use, absent some features. When a site grows large enough, it's simply a matter of flipping a few switches to enable it with the same awesome features that come standard on our other sites.
The second goal will take an ongoing effort from a number of our staff members. We've always done a great job entertaining and interacting with our users but historically we've not been so great about telling them or the industry what we've been up to. That's going to change. We plan on using this site to regularly discuss new features we roll out and to provide insight into the decisions we made to get there. We're going to be talking about our business, technology, design philosophy, video production and editorial content here. We'll also have some of our power-users and moderators writing here as well. Expect articles on everything from priority lists of the bug queue to tutorials on Photoshop.
Mostly though, we just needed a place to answer the common questions we get all day; both from companies that want to work with us and users that are looking for advice on how to break into this industry. If you've got ideas for topics you'd be interested in reading about, please send an email to dave@whiskeymedia.com. But enough of that, let's talk about design and I'm sure your first question...
Who Builds a Brown Website?

My job is pretty awesome sometimes.
I guess I do. I've been building sites for so long that it's gotten hard for me to stray from the typical white or blue color schemes you find on most sites. Brown is something that just isn't used very often. However, brown is one of the best colors to lay our badass company logo on top of. It makes the logo stand out far better than the standard boring-white-corporate-drone website you're used to seeing.
I wanted to give the site the feel of sitting in the bar at our office, which is way,
way too nice for the group of professional adolescents that make up our development and editorial teams. To me, the site evokes leather couches, shelves of exotic liqueur (or Dr. Zeaus), and a lights-out mood. The intent is to convey that while we may look like a bunch of idiots on video, everyone here is super professional and at the top of their game. And this website should reflect that.
We are User-Powered
As part of the redesign I wanted a spot to show off the insane amount of community content that comes to us on a daily basis. Whether that's the artwork people send in, the videos they make, or Photoshop mashups that appear on our forums, I expect this kind of content and more to fill up the community section.

John wins the favorite facial hair award.
I also wanted a place to show our actual user-base. Sometimes the Internet can be a fairly cold place and when we talk to other companies in this field, they tend to talk about "community" as some sort of unknown entity. Whiskey Media doesn't see it that way. Our community is made of real, awesome people, and they live all over the world. It makes me really pumped that when I asked for people to send in photos of themselves for this site I got not tens, but hundreds of responses. I'm sorry I couldn't fit everyone in, but I'll make sure that photo widget will update more in the coming weeks.
Lastly, since this site doesn't come with the full feature set of our larger domains that our existing users have grown accustomed to, here's a couple notes for getting comfortable.
- Your Whiskey Pass will work on this site. To login, just use one of the links in the comment area and it should ask you if you want to create a new profile. Click "Yes," the left button.
- Once your account is set up, you can change your avatar by clicking your the default avatar image you see next to your first comment. I know it's a little hokey for the moment, but it's our best solution at the moment.
The Wild World of Community Promos
Did you know that most of our top banner promos come from users?
Added by Dave Snider on March 2, 2011
I got my start as a designer by building small web-sites for the various gaming clans and guilds I used to be in during the early years of the Internet. It wasn't easy. There wasn't much documentation or coursework for a curious 15-year-old that wanted to elevate his web and Photoshop skills to something better than a starry background. After I realized I wasn't getting many "hits" on my first GeoCities page, I figured I'd volunteer on larger, established sites to practice my craft. Mostly this involved making images and logos to accompany the stories that went up.
It was under that spirit (and let's be perfectly honest, my own laziness) that I started asking our community to help out making the top slot promos that show up on our sites for live-shows and big events. In concept, it's just about the stupidiest thing a growing company can do. Let's give our users access to the most important part of our homepage! In practice though, it's turned out way better than I could have ever imagined. Each week we get at least a dozen really well done promos submitted by our fans for events like Thursday Night Throwdown and The Screening Room.
Not everything is great. Remember, most people are submitting these for the same reason I did when I was 15. They just want the practice and to have their work seen and critiqued. But many of the promos are extremely well done. There have definitely been a couple weeks where Ryan and I had to get a third vote to pick the winner.

The amount of in-joke detail is insane.
The above image for Bad Company 2: Vietnam's TNT by Giant Bomb user cookiesforbreakfast is probably my favorite ever submitted. While there's no doubt that it is one of the most polished, it's more the attention to detail and Giant Bomb lore that caught my eye. Note the following:
- The pac-man pin on ryan's helmet.
- The nine of spades, a reference to a bum card trick we tried to pull on camera.
- Not only does the cigar looks natural, but the smoke from it and the guns sits on a plane that fades into the background.
- The shadow from the helmet that covers his face and the trickle of blood escaping his brow.
- The fact that you'd never know those aren't Ryan's hands.
- Lastly, the god-damned awesome highlight work on Ryan's face that perfectly match the lighting on the guns.
When we started accepting user promos I thought I'd get some interesting Photoshop mash-ups and the usual bad cut-outs. I never thought we'd get submissions that were better than something that I'd be able to create myself. So much for ego. Here's a scattering of promos from the previous year in case you missed them while they were up. If you're interested in helping out, there's a whole bunch of users on a shared Dropbox that can give you an invite. It's a pretty chill crowd.
The Whiskey Technology Stack
Here is a brief overview of the technology stack we use at Whiskey Media.
Added by Sean Coonce on March 1, 2011
What We Do
Here at Whiskey Media we build and run a handful of web sites that integrate deep editable product databases and best-in-breed editorial and video coverage with the power and influence of passionate communities. The technology team tries to build the most interesting, fun and empowering sites on the Internet.

We relaunched our live chat recently.
Yeah, but what do we really do? Each day is a battle of resources against bugs, hackers and feature requests. Each day, we try to improve every aspect of each site we've launched. Whether its streamlining our chat interface or updating our deployment process, we're always trying improve the experience our user's have on our sites.
A Brief History
A lot of the original team came over from CNet where we worked on entertainment sites such as GameSpot, TV.com and MP3.com. LAMP was our name and PHP development was our game. It wasn't until we decided that we were going to re-launch Comic Vine in the winter of 2008 that Andy made the tough sell to push us towards a new web framework called Django.
At first we were hesitant. Here was a young company, making a crucial architectural decision based on (at the time) an unproven framework. I think it was only Andy who would have known that the recommendation to use Django would prove to be one of the most important technological decisions Whiskey Media has ever made.
The Stack
We use a number of different technologies and tools to get our sites up and humming. This post simply outlines our stack. We'll dive deeper into each particular topic in upcoming posts.

Everyone loves a pony!
Django: Django is a Python web framework and is at the core of everything we do. We've been using Django since before its 1.0 release and have been lucky enough to have worked with one of its founders in Jacob Kaplan-Moss and count ourselves doubly lucky to have one of its core committers working along side us in Honza Král.
Simply put, Django lets us move fast. If you're trying to set up something as simple as blog, or are looking to build complex service based system, Django is a wonderfully powerful and intuitive framework for perfectionists with deadlines.
Amazon:
S3/CloudFront: All of our media is stored on Amazon's S3 service. Whether its our hour long Endurance Run videos, user uploaded content, or our beautifully crafted javascript and CSS -- its all stored on S3. CloudFront sits on top of S3 distributing our content to edge locations throughout the world. We'll get to how we use S3 and CloudFront in future posts; for now, just know that it is an incredibly functional service and we're happy to be using them.
EC2: Shortly after Amazon launched S3, they started to build onto their suite of cloud based services. It was only a matter of time until they solved cloud based hosting and from there, it was only a matter of time until we migrated our sites to utilize EC2's power and scalability. Our outstanding ops team will be posting tips and tricks for working with EC2 in future posts.
PostgreSQL: We love relational data, and PostgreSQL stores our bread and butter data.
Solr/Haystack: Our sites tend to have large product databases that need to be indexed and searched quickly and efficiently. Solr is our back-bone when it comes to search and Haystack is an elegant Python library that sits on top of it. We’ll get deeper into how we use both of these technologies in future posts, but for now know that they’re a godsend and life would be much more difficult without them.
jQuery: Although we started as a MooTools shop, we are slowly and steadily migrating to jQuery. Mike Horn is leading the front-end charge and if you're in San Francisco and interested in getting together to talk shop about all things front-end --- Horn has recently started a meet up at the Whiskey Bar downstairs.
Redis/Mongo/Memcached: We use a handful of no-sql solutions in different situations depending on the specific problem we're dealing with. Although these technologies are relatively new, we fully embrace the power, speed and scalability they provide.

Our frontend is a directionally aware woman.
Rabbit/Celery: In order to improve the speed of our sites, we have started to rely heavily on asynchronous processing systems such as RabbitMQ and Celery. These async queueing systems have become an integral part of what we do and we will be writing about how we use them, tune them, etc. in future posts.
Compass/SASS: About a year ago, we started using a CSS framework called Compass. It allows our front-end developers to be more pragmatic with their front-end logic and enables us to launch new features faster.
Fabric: Fabric is the heart of our deployment process. We've come a long way from rolling our own deployment scripts to building stable fabfiles - and we believe in this process so much that we recently added Fabric's core developer
Jeff Forcier to our team.
Wrap Up
This is just the first of a series of blog posts from our engineering/ops teams. We'll be discussing everything from Redis to Fabric and jQuery to Django. So whether you're interested in keeping tabs on the latest site features or you're a budding developer and find yourself interested on what makes us tick, add us to your RSS reader and stay tuned.
How to Make a Monday
Drew shows off the making of I Love Mondays.
Added by drewbert on March 1, 2011
Hey y'all. At the risk of breaking the illusion, and driving you all insane with our banjo loop, I thought I'd give some insight into what it takes to edit a typical segment of I Love Mondays, from start to finish. So, in the immortal words of
Jonesy, "here it is... at ten times speed."
How Image Captions Help Our Sites Grow
There seems to be a direct influence of image captions to search growth on Screened.
Added by Ethan Lance on Feb. 16, 2011
This post is for nerds who like stats and are interested in how a nascent wiki site like
Screened grows in monthly visitors. If a site does not grow each month, it's dead. I spend alot of time pouring over graphs and charts; noting what small changes to wiki code or what wiki task initiative had a perceivable effect on daily visits. For example, around January we began making a concerted effort to add descriptive captions to our image galleries. What do you think, is the image search spike in January-February a coincidence?

Sept 2010 - Feb 2011 image search traffic
The effect wiki editors have on the site is easy to see. We've more than tripled the amount of new visitors to Screened who reach us because they found one of our images in Google image search. And we've more than doubled our over all visits from new users who reach us via searches on Google.

Sept 2010 - Feb 2011 overall search traffic
From what I see in google analytics, our quotes pages and images gain us the most new users. You know what's cool about that? Quotes and images are also the easiest way to contribute to the site. The task queue can be found
here. In preparation for some secret upcoming editorial features, the current task initiative is "Car Chase" movies.
The Wonderful World of Video Data Management
Here is a story.
Added by drewbert on Dec. 7, 2010
Giant Bomb's Game of the Year awards are fast approaching, and you know what that means! Asset compilation! This is the time of year when we descend into the dusty catacombs of Giant Bomb's video archives and pull out all the relevant footage of games we're talking about. Since a few of you have requested insight into such topics, I thought now would be a good time to shed some light on how we manage our video data.
The life of a Giant Bomb gameplay video, such as a Quick Look, begins at the capture stage. We plug our consoles into our capture gear, turn on the microphones, and hit "record" (it's a little more complicated than that, but that's for another post). The resulting video file is saved onto our capture machine, which resides in the control room. From there, the producer copies this "master" file over the network to their machine so they can work on it.

Capturing some exciting gameplay footage
Continue reading this story »