Saturday, December 27, 2008

iPhone 3G



Background - The decision making process
- If you read my blog at all you probably know I'm no apple lover. It's not that I exactly hate their products. I just don't like how apple does business (constant hardware upgrades and breaking backwards compatibility with accessories, expensive battery replacement policies, etc), the image they try to push so hard (I hate turtle necks. I don't even like long sleeved shirts much. I really don't go to Starbucks that often let alone sip lattes. :-), and the attitudes of some of their ummm lets say very loyal fans.
- Also, I probably have to admit I'm a bit biased. It's not like I love Microsoft or anything. I mean they do some things that really piss me off (though I'm getting more tolerant of vista). It just so happens I'm a windows developer so I use the PC and related technologies everyday so I'm comfortable with it. I'm a power user and a tinkerer. I'll usually take power, flexibility, and functionality over ease of use or flash/image.
- My gadget background comes from a long list of non-apple products: archos jukebox recorder 20 and later sandisk sansa e280 mp3 players with rockbox custom firmware, wife uses an HTC 8525 windows mobile 6 smart phone, my ipaq 4150 pocket pc, popcorn hour, dell laptops, etc.
- I'm also a very late adopter when it comes to the whole convergence thing with mobile electronics. My fear has always been that you drain the battery playing games, listening to music, or watching videos and then you can't make a phone call when you really need to or miss an important call. But it sure is hard to beat the convenience.
- I've been using my Sony Ericsson T637 for I think 4 yrs now. It was time for an upgrade. I was already on AT&T so I pretty much limited my choices to that carrier. I would have considered the google G1 except it's only on T-Mobile and their coverage is just way too small for my needs. I liked my wife's HTC 8525 enough. I looked at the replacement model, the Tilt, but backed off because of the video driver issues. I quietly waited for the next HTC phone while everybody was going crazy over the iPhone 3G. Finally the AT&T Fuze was released. I went to the at&t store and tried the fuze and iPhone back to back for at least an hour. Over two weeks I thought about it, did a ton of online research, and read reviews. This is a summary of my analysis:
iPhone dislikes:
- non user replaceable batter but this is becoming a bit less of a concern. At least on the 3G the battery is NOT soldered in (unlike the original iphone). So if you really wanted to you could take it apart and replace the battery yourself.
- no way to tether but I guess you can jailbreak
- I like keeping my phone in my front pocket, and I'm afraid it's a bit too big for that. I know it's thin and has that nice big screen but it also makes the length and width quite a bit bigger than the fuze.
- I hate itunes but I guess I would have to install it. (I hate hate hate quicktime, VLC FTW!!!)
- I don't like ipods in general for mp3 playback b/c I love rockbox so I probably won't use it much.
- no cut and paste
- If I plan to write native apps for it I need a mac (and please not a hackintosh) to run the iphone sdk on it. Otherwise I'm limited to web based apps.
- no microsdhc slot. memory is fixed though 16gb isn't bad.
- touch keyboard which I hear you get use to in about two weeks. Why do some apps not let you go horizontal and therefore get the bigger keyboard like notes?
- doesn't sync notes or tasks with outlook
- oh yeah and the built in note taking app kind of sucks

iPhone likes:
- really responsive
- best browsing experience ever in a hand held. They really nailed this. It's so much better than ie or opera with touchflo on the fuze. It's scary how good it is at zooming in on text and formatting/wrapping it so it's easy to read. I'm sure it's analyzing the html for frames, div's, tables, etc. Whatever it is doing, it's doing incredibly well.
- nice big screen, I bet transcoded videos would like nice on it.
- google maps runs better too
- it's already getting a lot of interesting games and apps. I almost look at it as another gaming platform.

Fuze dislikes:
- slow browsing, pretty much still sucks (ie and opera)
- a bit of a brick but pretty pocketable
- lacks some more of the interesting apps/games that are coming out on the iphone which of course will be exclusive to that platform.
- expensive
- touchflo gui can't compete
- no standard headphone jack, requires included adapter

Fuze likes:
- windows mobile which I'm already familiar with. I already have a set of apps I depend on.
- tons of free apps
- very customizable os, not as locked down.
- I can immediately code against the .net compact framework
- 640X480 screen. tiny but really crisp. talk about high pixel density
- a real keyboard which is tons better than the iphone touch screen one. I think the bit of extra thickness is worth it.
- microsdhc (16gb cards are out now)
- replaceable battery
- syncs everything with outlook
- no need to install itunes!

- I talked to friends about it. The ones who did have one loved it. My other co-workers and friends pretty much had an intervention when I told them I was considering getting an iPhone. There's quite a lot of Apple hate, a lot of it for very good valid reasons and some not quite as rational.
- So given all this background and still ending up with an iPhone is a pretty big step for me.

First Impressions
- So I've had the iPhone for only a week. So far it's been mostly positive. I picked up the 16gb black model.
- iTunes: All I can say is I hate it less now after using it for some time. I still hate how it's forces you to install quicktime. Running msconfig you can at least stop the qthelper from starting up. You need to keep the itunes background task for it to properly detect when the iphone is plugged in. The search is kind of wacky. I like the advance search ability to limit to just application but I like the list style display of results of the simple search. Syncing contacts and calendar with outlook is a snap. Notes on the other hand takes a bit more work (more on that later). Buying applications is very simple though and quite addicting and there are some really nice apps out there. I had some earlier bad experiences with itunes on older hardware but it seems to be pretty well behaved on my quad core server. I plan to mostly use iTunes to buy apps and sync my own content. The ability to check for app updates and download them all is quite handy. I have to admit subscribing to video podcasts and having them sync to my iPhone and being able to watch them anywhere is kind of convenient. Though if you want it to automatically grab new podcasts you'll need to keep itunes running in the tray which uses 117MB. Eh, it's why I wrote and continue to use rcFeedMe.
- Check out iTunes Library Updater. I briefly tried it out and it seems to work ok with iTunes 8. It allows you to sync the iTunes library with any directory you want. It also has command line support.
- I like this iTunes Lyrics Importer. Pretty slick to have the lyrics of a song show up on the iPhone while the song is playing.
- I still like this id3 tag editor for bulk changes.
- iphone also shows up in "my computer" as a device so you can click on it and get to your photos. The camera isn't all that great with no focus, macro, or flash. Here are some samples I took with pretty poor lighting using steadycam on the iphone :

- 320X480, text looks great, so do videos
- Capacitive Touchscreen with multi-touch really does a make a pretty big difference in usability.
- The built in speaker isn't half bad.
- I can't say a whole lot on how good of a phone the iPhone actually is since I haven't had that many calls on it yet. Voice quality seems fine. Not sure how reliable it is as far as dropped calls go.
- Visual voice mail is very nice and convenient.
- Google maps is pretty amazing with good gps support and real time traffic. You can have it plot turn by turn directions, and the gps seems to track your car pretty accurately in real time (tested this while the wife was driving on the freeway), but the directions are not spoken, and the directions don't seem to advance along with your current position in real time (you have to hit the next button). It's just missing like 10% of some critical functionality that would make it a fully fledged car navigation gps. As it is, it is already the killer app on the iphone. If it just had a bit more polish, it could replace yet another piece of mobile electronics.
- Email client: gmail support is great. Setting up was really easy with great imap support. Of course you could always just browse to gmail too but the built in mail client is pretty great. I just wish it had landscape mode for easier typing. Again, why do so few apps support landscape mode!!??!!?!
- Audio: I still love rockbox and directory/file based browsing vs tag based. Sound quality is good. You can flag any mp3 file as resumable and change the type to audio book in itunes (highlight files, get info) so it makes listening to audio books easier but doesn't even come close to rockbox's bookmark system. I'm going to stick with my Sansa e280 with rockbox for the bulk of my mp3 listening. Once you go rockbox there really is no substitute.

- Video: I used handbake to convert some DVD's to mp4 for the iphone. I just used the built in iphone profile and upped DRC to 1.5 for audio. Encoding on my quad core q6600 @ 2.9ghz takes around 13min. Quality is very good with a typical movie taking around 430MB of space. I like the ability to zoom in and crop out a bit off the sides but remove the black bars on the top and bottom by double tapping the screen. Seeking is pretty quick and it does resume where you left off on each individual video. It's no TCPMP but it's good enough for me.
- Like I said early I think the browser is the most amazing part. Reading blogs, forums, and most other sites just works really well. The only thing I wish it has is flash and silverlight support.
- My concerns about the pocketablility of the iphone is mostly a non issue. It fits pretty well, not too heavy, and isn't as obtrusive as I thought it would be.
- Custom Ring tones: It's pretty easy to take any mp3 and convert it into a ring tone. I did this in Vista 32bit. First you need something that can convert between audio formats. I personally like dbpoweramp. It works great and is nicely integrated into file explorer. First, convert your mp3 -> wav using dbpoweramp. Then, open it in audacity. Here you can make it louder if you want. What you really need to do is create a clip that is less than 30 seconds. Save your clip as .wav. Download this dbpoweramp codec (m4a). Convert your 30 sec wav file to m4a using dbpoweramp. Rename the extension from m4a to m4r. Drag your m4r file into itunes ringtones section. Sync your iphone. That's pretty much it. If you don't want to use dbpoweramp you can look at doing it with just itunes and audacity. I haven't researched it enough but you might want to start here.
- Custom Wallpaper: I use paint.net for the best results. Take your jpg and crop/resize until it is 320×480. Then, just sync the photo to your iphone. What is pretty crappy is it only shows up on the unlock screen. There doesn't seem to be a way to have it display all the time behind your icons without jailbreaking it.
- Network speeds: I used Speedtest on the iphone to run these tests. Of course these tests are also dependent on how loaded the test server is so you could get different results in the exact same location but at different times.
WiFi (my dsl is 6mbps/768kbps): 2304kbps/378kbps
3G: I tested in many locations with a range of around 600kbps - 1300kbps. Average is usually around 800kbps. Upstream is usually 200-300kbps.
Edge: I was once out in a small town with only edge and ran the speed test. I got around 180kbps/60kbps. I was amazed it still worked at all. But yeah edge is pretty slow.
Overall I'm satisfied with the network speeds. 3G definitely makes a difference.
- I've read it's a good idea to reboot your iphone once in a while especially after you've loaded a lot of new apps on it. Just hold down the sleep and home buttons for about 10 seconds until it reboots and you see the apple logo.
- The iphone does continue charging even if you completely turn off the phone (hold down sleep for several seconds, slide the red slider). Just plug in the charger while the iphone is on and then turn off the iphone.
- The bluetooth on the iphone paired just fine with the hands free on my Acura TL 2007 type-s. The import address book feature also works fine over bluetooth though it only imported 273 contacts which was the maximum size the car supports.
- Cool app that kind of lets you get directly to the storage of the iphone though it's a bit limited if your iphone isn't jailbroken
http://i-funbox.com/
- Some sites that work well with iphone:
meebo
dropbox
- Pressing sleep and home buttons at the same time for a short second will take a screenshot of whatever you see. It's quite a handy feature. The image will be in your camera roll.

Battery Life:
- Battery life seems pretty good. I did drain it to 20% one day when I played field runners for 5 hrs straight with another 2 hrs or so of just messing around with it.
- You can see here how to remove the battery.
- You might consider getting AppleCare. It doubles the warranty from 1 yr to 2 yrs and can be purchased at anytime during the first year. It does cover the battery so if you plan to keep your iphone for a while it might be worth it. It's $69 for appleCare and $79 for a battery replacement. I'm still thinking about it.
- I haven't noticed any serious battery issues with 2.2. It is suggested here that you completely quit out of safari by holding down the home button for several seconds until safari closes. The theory is safari is somehow holding on to connections or something. I personally haven't had to do this.

Accessories:

Most of the dust you see here is actually on the surface and not trapped underneath the film:

- Case: I picked the Griffin Elan Form. It's $17.50 at amazon but I picked it up locally at best buy for $30. I really like this case since it adds very little bulk, offers some protection with the hard plastic inner lining, and the outside is a nice leather texture which gives some needed grip when holding it. The only thing I didn't like was the screen protector. It's just a hard piece of plastic which looks bad. For the screen protector I went with the Power Support Anti-Glare Film Set which I picked up for $15 locally at the apple store (first time in an apple store, felt a bit odd and out of place there :-). Applying it was a bit tricky. Wash your hands very well. Use a lint free cloth and clean the iphone really really well. I did this in the bathroom and steamed it up by running the shower with hot water. This supposedly helps keep the dust out of the air. I had some problems aligning it. Use a couple of strips of scotch tape on the end of the film to lift and realign the film until it's just right. Unfortunately I still got around 4 small pieces of lint under the screen. Two are kind of noticeable but off to the side. As you roll down the film make sure there are no air bubbles. I found trying to push the air bubbles out doesn't work as well as re-lifting the film up and just rolling it down again and letting the static cling do its thing on keeping the air bubbles out. I put it on while the case was on. It will fit if you align it just right without touching any edges of the case. Some people found some cases would mess up the edges of the film. It didn't for me. If you align it right, you should be able to take the case on/off without issue. Overall it looks pretty good with no air bubbles and just a few minor strands of lint. The film gives it a bit of texture, really helps keep down the finger prints, doesn't feel any less responsive, and works much better in bright outside conditions.
- The other option instead of using a case is to go full body film coverage like invisible shield, best skins ever, or full body films. ilounge seems to like full body films the best. I've tried out invisible shield on my sansa and let me tell you. If you thought applying a static cling film was tough, these full body films with adhesive that you have to wet then bend around curves and such is even harder. Lets just say I'm pretty happy with my case + anti-glare screen protector that I have right now.
- Accessories: I picked up additional chargers, car chargers, sync cables, etc from ebay. I bought some from this seller and the items worked fine.

Complaints/Rants:
- I would prefer a few more hard buttons or even a full flip out keyboard but I guess it's ok. I still hate hate hate the touch keyboard. Even with the predictive feature it still mostly sucks compared to a real keyboard with that much needed tactile feedback. It's even worse since so few apps support the larger horizontal keyboard. I don't care what apple says but the vertical keyboard is pretty much broken or is designed for people with keebler elves sized hands.
- Unable to run unsigned apps or get full access to the OS without jail breaking kind of sucks. I've considered jail breaking but haven't yet since, well this is my phone first and foremost and it has to be stable and reliable. I'm going to see if I can live with the iPhone the way it is, and so far I think I'm ok with it as annoying as it can be sometimes.
- Oh and f*** you very much apple for changing how the iphone 3g charges compared to all your other products. Yeah all those chargers I got for my wife's nano plug right into the connector but don't do squat. Is there any reason why they did this except as an obvious money grab? Looks like somebody is making a charge converter.
- The way they lock down the video output forcing you to buy their ridiculously overpriced dock and cables is why I hate apple.
- The lack of cut and paste and true multitasking (or at least some sort of app that shows you what is running and memory usage) is quite frustrating. There are some crude and limited work arounds:
http://pastebud.com/
http://www.biocow.com/iCopy/
I haven't tried any of them yet.
- No Slingbox mobile player available. UPDATE: slingplayer for iphone demoed at ces 2009. It should be out in the first quarter.
- I hate how it's hard coded to 9 pages (16 icons each) of app icons. That means you have 144 icons + the 4 on the bottom for 148. There are some built in apps too which further reduced the amount of apps you can install. Hard coding this limit is pretty stupid. After only a week I only have 22 spaces left to install apps. If you try to install over the limit, they just don't show up on the iphone. They give you all this storage space and thousands of apps and then put this retarded hard limit in the GUI.
- No proper a2db BT profile support for listening to music in stereo over bluetooth headphones. What a waste of the built in bluetooth.
- http://bluwiki.com/go/Ipodhash - encrypted itunes library file and no ability to sync with anything other than itunes though people have hacked around it. Alternative ways to sync 3rd party application data.
- No MMS.

Development:
- To write native apps you need a mac to install the sdk on. The other approach is to write web apps. There are some nice frameworks out there to make your web app look and feel like a native app:
http://iwebkit.net/
http://webapp.net.free.fr/ - I've been messing with this one a bit and it seems to play nice with .net too.
Some more frameworks
some general tips on iphone web development
- Being a c# programmer I dread the thought of learning objective c.

A quick comparison to the Blackberry Storm:
- As an aside I tried my brother's new Blackberry Storm. Their take is a bit interesting. It's still a touch keyboard but you push down and the entire screen clicks in basically acting like a giant button (haptic feedback sure does sound a lot more fancy though). Sure, you get that click when you activate something but it's still not nearly as good as a real keypad where you can feel the individual keys. We had a bit of a phone off over Christmas. We both agreed the iPhone wins but the Storm has potential. The software just isn't there to really take advantage of all the hardware it has. It felt pretty clunky and sluggish (and this was after the firmware update). It handled video pretty well. Email support wasn't as good. He didn't really have any technically impressive 3d games installed so I couldn't really get a feel how gaming would be on it. Browsing didn't have the intelligent zooming/text formatting that the iPhone has. Their map kind of sucked, was sluggish, and doesn't even use the built in GPS. It seems like almost nothing supports the GPS on the Storm whereas it's very prevalent in most iPhone apps.

Applications
- One of the main reasons I went with the iphone is the selection of really useful and mostly free (or low cost) application and games not available on any other platform. Some of the free apps are ad supported. Too many apps require creating accounts. There are also reports of privacy concerns for some applications so just be careful.
Here are some sites that cover iphone apps without the need to install itunes:
http://www.appleiphoneapps.com/
http://appstorefeed.com/
http://www.apptism.com/
http://appBeacon.com
I'll be linking to these sites instead of itunes directly since I pretty much hate sites that link to itunes when I didn't want or need to install itunes.

Must have:
- Speedtest (free) - great for testing your network bandwidth wherever you are.
- Darkroom (free) - (was steadycam) Uses the sensors on the iphone to wait until you are still before snapping a photo.
- Melodis Voice Dialer (free) - Uses your voice to find contacts and call them. It works really well.
- Say Where (free) - what voice dialer does for contacts this does for google maps. Just say what you are looking for or the address.
- Evernote (free) - Great note taking app. Sync with desktop, web, iphone. Mark the note as favorite on the iphone and it is stored locally for offline viewing. It installs an outlook add-on that lets you export all your outlook notes into evernote. You can take a photo and it will OCR it though this is a bit difficult without focus or macro mode on the iphone camera. You can take voice notes. The only thing missing on the iphone is the ability to take an ink note. Oh and again no horizontal keyboard support. WHY!!!???!!!! Really come on. Going horizontal should be supported across the board at the OS level. Another one to consider is YouNote which does have ink notes.
- Jott (free) - Record short 15 sec voice notes and it will transcribe them to text for you. It's pretty neat and works quite well though 15 sec is a bit short. I used it quite a bit while writing this review. I used jott to create little notes of things I wanted to add to the review.
- Voice Notes (free) - Record voice notes for an unlimited amount of time and sync with your pc over wifi. The desktop sync app is very small and just a single exe file. The files are in .caf format which play fine in quicktime. More info here.
- Flashlight (free)
- Stanza (free) - my favorite ebook reader. Can sync your own content from pc over wifi. The process is a bit clunky but it does work.
- Holy Bible (free) - One of the few versions that has NIV for free as long as you are online. You also have the option of purchasing NIV for off line viewing or downloading many of the free non-copyrighted translations.
- The Weather Channel (free) - Lots of info and even the feeds of local weather video.
- Twitterfon (free) - I like this better than Twitterific.
- AP Mobile News (free)
- Shazam (free) - Amazing ability to record a clip of any song you hear and figure out what song it is.
- midomi (free) - similar to shazam. I like how shazam vibrates when it is done recording the sample. Still testing. Not sure which app I like better.
- Bloomberg (free) - much better than the built in stock checker, you can enter holdings information, the detail view has a nice large graph when you go horizontal, built in related news
- To Do's (free) - task list
- EasyWriter (free) - Create/reply/forward emails using landscape keyboard for typing.

Worth a look:
- Scribble (free) - drawing app
- 1password (free) - securely store information. Can't sync with pc (only mac).
- Mocha VNC Lite (free) - It works but man things sure are tiny.
- Urbanspoon (free) - Restaurant picker.
- yelp (free) - Find business near you. More than just restaurants, lots of categories.
- Now Playing (free) - Nicely integrates rotten tomatoes, imdb, trailers, and reviews though online ticketing seems a bit limited.
- Google Mobile App (free) - Search google using your voice. Eh, doesn't work as well as it should.
- Google Earth (free)
- WootWatch (free) - supports all the woot and woot variant pages and even woot offs
- Amazon (free) - The amazon Remembers thing actually works! Take a picture of an item and it will try to figure out the product from analyzing the photo.
- eBay (free)
- IGN (free) - great for reading IGN reviews.
- i.TV (free) - TV listings, also you can manage your netflix queues.
- Joost (free) - More videos but requires wifi.
- a2Z Pro Unit Converter (free)
- Tanslator (free)
- Dictionaire (free)
- FreeSaurus (free) - thesaurus
- Wikipanion (free) - formats wikipedia really nicely
- YPmobile (free) - the real yellow pages.
- WiFinder (free) - find wifi hotspots
- Facebook (free) - It seems nice but I don't use facebook that much.
- a free level (free) - No calibration makes it a bit less useful
- Distance (free) - use the gps to measure distance
- Simplify Media ($4 now, use to be free) - Stream your music collection to your iphone. I'm a bit concerned with privacy issues but I might try this out.

Internet Radio: I tested all these on wifi and 3g and also to see if calls would get through.
- Pandora (free) - internet radio. Works well. I like this one.
- Last.fm (free) - another good free one.
- AOL Radio (free) - pretty good selection, works pretty well except for one fatal flaw. It blocks all incoming calls and sends them right to voice mail. No other radio app I've tested exhibited this odd behavior. UPDATE: the incoming calls issue has been fixed now.
- Wunder Radio ($6) - Largest selection of channels with a lot of your local stations available. It's $6 but it's pretty darn impressive. I've only used it a short while but haven't run into any stability problems yet. It's better than having a fm tuner!
- Slacker Radio (free) - Saw this on loaded. Just tried it briefly. Seems to have a nice selection of stations. Calls get through just fine. I've tried all these radio apps and this is now my favorite. The sound quality is the best.

Time Wasters:
- Seadragon (free) - interesting photo demo
- Lightsaber (free) - the kids love it
- Bubble Wrap (free)
- PBJ Time (free) - Peanut Butter Jelly Time!
- Lie Detector (free)
- Magic 8 Ball (free)
- Turkey Hunt (free)
- Newton's Cradle (free) - who doesn't like the swinging metal balls
- freebird (free) - lighter, candle, glowstick
- zippo (free) - lots of lighters to choose from, can use the mic to try and blow it out.
- I Can Has Cheezburger - lolcats and lolz.

Games:
- Chopper ($1) - choplifterish, fun, nice graphics, good use of motion controls
- Fieldrunners ($5) - nice graphics, polished, tower defense, but in the end a bit limited. I was hooked for 5 hrs and then I was pretty much done with it.
- 7 Cities TD ($5) - probably the best tower defense game, looks great, deep.
- Tap Defense (free) - tower defense and it's free!
- Hero of Sparta ($10) - hack and slash, god of warish, 3d showcase (almost psp levels), framerate suffers, pretty good touch virtual control pad
- Moto Chaser ($1) - pretty nice 3d racer.
- Rolando ($10) - Locoroco ish, pretty nice touch, gesture, motion based controls. I need to spend more time with it to get a better impression.
- Dropship ($1) - 3d space shooter with retro vector style graphics. I need to spend more time with it to get a better impression.
- Texas Hold'em ($5) - developed by apple. I like the two modes (vertical vs horizontal) of play. I haven't really played enough yet to judge the AI.
- Galcon ($5) - Risk in space in 1 min rounds. Multiplayer over the internet is great! Give the free lite version a try to see if you like it.
- Enigmo ($2) - Interesting puzzle game with nice physics on the water.
- Touch Physics ($1) - Draw shapes and use physics to move the circle to the goal.
- Warfare Inc. ($5) - a real RTS game. I haven't had a chance to really dig in yet.
- The Plateau ($1) - Move orbs to untangle lines. Puzzles are procedurally generated. Definitely worth $1.
- Checkers (free)
- iChess (free) - long nag screen on startup.
- Morocco (free) - othello
- Sol Free Solitaire (free)
- 21 Pro (free) - ads are a bit annoying but a pretty complete blackjack game.
- Black Jack (free) - simple, fast, and clean
- Touch4 (free) - connect 4
- TanZen Lite (free) - pretty nice interface, no hint system
- Tangrams LE (free) - a bit more difficult to rotate pieces but has a nice hint system. Good for kids.
- Crazy Penguin Catapult Lite (free) - ok little diversion.
- Space Deadbeef (free) - horizontal shooter, great graphics, innovative control system (though some might hate it)
- Tap Tap Revenge (free) - I just couldn't get into this rhythm game, and I didn't like the motion control aspects.
- Cube (free) - interesting 3d shooter tech demo with pretty twitchy motion controls and bad framerate.
- JellyCar (free) - I've played this on XNA before, and it's pretty fun here too.
- Sudoku (free)
- Topple (free) - stacking game
- I Say Free (free) - simon
- Rogue (free) - @
- Crash Landing (free) - lunar lander this is NOT!
- Darts (free)
- iSlots (free) - Vegas slot machine
- Labyrinth LE (free) - motion controls work great, very fluid ball animation/movement. This one is my favorite. I might buy the full version.
- Marble Mash (free) - Ball doesn't move as smooth as Labyrinth.
- Mines (free) - Minesweeper
- Advent (free) - the original adventure text game
- Adventure (free) - atari 2600 adventure
- Frotz (free) - interactive fiction, includes many games including zork
- Whack the Groundhog Lite (free) - whack a mole
- Arora Feint The Beginning (free) - a bit like puzzle quest
- MotionX Poker Quest Lite (free) - poker dice game
- Paper Football Lite (free)
- Puzzle Loop (free) - zuma
- Reign of Swords (free) - turn based strategy, haven't played much yet
- Crystal Defenders Lite (free) - bad controls
- RhinoBall (free) - bolt, at least it's 3d
- PapiJump (free) - simplistic jumping platform game with tilt controls.

Highly recommended. I have to admit I'm impressed. I'm learning to live with the few annoyances but for the most part the good far out weighs the bad.

UPDATE: 12/30/08
- Hmmm I think I might have just discovered a very compelling reason to start listening to my podcasts on the iphone. I primarily listen to audio podcasts during my work commute. The problem with using a standalone player like my sansa is if somebody calls I pick it up over my hands free system in my car. This obviously cuts the audio from the aux input to the phone over bluetooth. Then, I have to quickly pause my mp3 player or I'll lose my place and miss some of the podcast. With the iphone the podcast is automatically paused when I answer the call with my car (car switches audio to bluetooth), then when I'm done and hang up, it just seamlessly continues my podcast right where it left off (car automatically cuts back to aux input). This obviously only works so well because my phone and mp3 player are the same device. Oh damn you convergence and your conveniences. Maybe I'll just use the sansa/rockbox for music in the office.
- So I've been playing around with dropbox some more. So you can basically do what simplify media does but with dropbox. If you put media in your dropbox folder like mp3's, m4v's (video), and jpg you can view all this through the safari browser on the iphone. When you click on a music or video file, quicktime launches and streams it nicely even over 3g. It's able to keep up just fine.

UPDATE: 4/24/09
Here is an update of apps that I'm running:

- Free Memory ($1) - nice way to free up memory and even displays your battery level as a percentage.
- Air Sharing ($5)- Great way to carry documents, pdf's, and other files with you. The viewer is quite nice and remembers where you left off in documents. It does a pretty impressive job rendering complex pdf's. You sync files over local wifi which is quick and easy to do (your iphone basically becomes a mini web server when running the app).
- Skype (free)- Feels very much like the native phone app. Chat works pretty well too. You can't host conference calls though but you can join them. Call quality is quite good.
- Speedtest.net (free)- My favorite flash based desktop browser bandwidth test site now has a very nice free app.
- Kindle (free) - Hey it's kindle for iphone. The latest version of Stanza is still a far superior reader but hey this gets you access to hundreds of thousands of kindle books if you don't mind DRM ebooks. No text to speech and no periodicals support is a bit of a bummer. No store integration. You still need to use a browser to buy books.
- Rss Player ($1) - I picked this up when it was briefly free. The big draw is it lets you download podcasts that are over 10mb. It's ok to use in a pinch but I still sync the majority of my podcasts through itunes.
- Textfree Lite (free)- Pretty good way to send and receive text messages for free. Sending is always free and if the other person replies it is also free. If the other party initiates the texting then of course regular sms charges apply unless the other person is also using Textfree. The lite version limits you to 15 messages a day. It also supports email notifications. It all works pretty well. If it gets update with true push notification when iphone 3.0 comes it I might just buy the full app.
- Geocaching ($10)- The app to get if you are use geocaching.com. The only thing is I can't figure out how to enter my own coordinates.
- SnapTel (free)- Snap a picture of any media (books, movies, music, games, etc) and it will identify it and give you links to prices and other information. It works quite well and is very forgiving on photo quality.
- iHandy Level (free)- a pretty good free level with calibration.
- Units (free)- I think I like this unit conversion app better.
- Speller (free)- a nice dictionary, spell checker

Games:
- geoDefenese ($4) - Picked this up back when it was $1. Tower defense with geometry wars graphics. This is probably my favorite TD game. It's tough but I finished all the levels.
- Sentinel ($5) - Another nice TD game with some nice graphics. Needs more maps.
- Elemental Monster TD ($4) - picked this up but haven't had a chance to play it yet
- Time Crisis Strike ($6) - I love the light gun game and this isn't half bad.
- Blue Defense ($2) - great simple shooter with geometry wars graphics. This is a great little game if you only have a few minutes. Simple and elegant.
- Blue Attack ($2) - didn't quite like this as much as defend.
- Rebel Onslaught ($1) - reminds me a bit of starfox. Graphics are pretty nice.
- Payback ($5) - GTA clone that I haven't played much yet.
- Centipede - a great iphone port. Controls are great!
- Fantastic Contraption ($5) - physics based puzzler that I played a bit on the pc before. I haven't had time to mess with the iphone version much yet.
- ExZeus ($5) - also came out on the wii as counter force. It's not a bad 3d on rails shooter. Think 3d space harrier with bots.
- Sneezies ($2) - Cute little time waster. Chain reaction game. My wife likes this one.
- iDracula ($3) - dual stick shooting top down. Nice graphics. Good controls. They nailed the dual analog touch sticks.
- Shooter - based on the movie. Picked it up on sale. Haven't messed with it much yet.
- Days of Thunder ($1) - not a bad racer with lots of smashing.
- Zen Bound ($5) - interesting relaxing wrap a string around different 3d objects puzzle game.
- Sky Force Reloaded ($3) - good vertical shmup.
- Oregon Trail - remake of a classic
- GI Joyride ($1) - very simple controls. Graphics are good but this one just didn't have enough to keep me interested.
- wolf3d ($5) - from idsoftware. Great controls, graphics. Classic fps comes to iphone in incredible form. MUST BUY!
- Galaxy On Fire ($6) - 3d space sim/shooter. Nice graphics. Lots of gameplay hours.
- Freeballin' ($1) - interesting pinball game.
- Belowscape ($1) - an average geometry wars clone but it's all I could find.
- Tetris - it's tetris. Picked it up after the price drop.
- Rogue Touch ($3) - Picked it up when it was $1. it's rouge with nice graphics and controls.
- UniWar ($1) - turn based, hex, advance wars, lots of multiplayer options including play by email.
- Underworlds ($5) - a true diablo clone with some nice graphics. Controls take some getting use to.
- AirCoaster 3D ($1) - 3d coaster sim (and I use sim lightly). Comes with an editor and the ability to share your coasters. Think no limits lite.
- Clearout (free) - nice head to head multiplayer game
- Lights off (free)- classic puzzle game. Try to toggle all the lights off.

Friday, December 26, 2008

LINKSYS PLK200 PowerLine AV Ethernet Adapter Kit


- So I bought some of these for my parents this Christmas. They needed internet access for a set top box in a deadspot where wireless was spotty. So I decided to give these a try. I just set these up at there house and ran some tests with my laptop while I was there.
- These typical go for around $125 online. They seem to be a tad on the pricey side.
- Setting up required basically zero effort. Just plug the adapters in (one next to the router, one next to the device that needs network access) and the supplied ethernet cables (router <-> powerline adapter ----house electrical wiring ---- powerline adapter <-> internet device[add a switch if you need more ethernet ports on this end]). I didn't have to run the included install cd or anything. My laptop immediately got an ip address via dhcp.
- There seems to be 3 status lights: power, powerline (the adapters are talking to each other across the house electrical wiring), and ethernet (which flashes when there is traffic).
- So I grabbed my laptop and ran some performance tests.
baseline case: connected directly to the router via ethernet.
ping to maxpc tf2 server
C:\Windows\System32>ping -t 66.151.138.34

Pinging 66.151.138.34 with 32 bytes of data:
Reply from 66.151.138.34: bytes=32 time=76ms TTL=113
Reply from 66.151.138.34: bytes=32 time=60ms TTL=113
Reply from 66.151.138.34: bytes=32 time=77ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=58ms TTL=113
Reply from 66.151.138.34: bytes=32 time=76ms TTL=113
Reply from 66.151.138.34: bytes=32 time=57ms TTL=113
Reply from 66.151.138.34: bytes=32 time=76ms TTL=113
Reply from 66.151.138.34: bytes=32 time=76ms TTL=113
Reply from 66.151.138.34: bytes=32 time=59ms TTL=113
Reply from 66.151.138.34: bytes=32 time=76ms TTL=113
Reply from 66.151.138.34: bytes=32 time=58ms TTL=113
Reply from 66.151.138.34: bytes=32 time=58ms TTL=113
Reply from 66.151.138.34: bytes=32 time=78ms TTL=113
Reply from 66.151.138.34: bytes=32 time=58ms TTL=113

Ping statistics for 66.151.138.34:
Packets: Sent = 15, Received = 15, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 57ms, Maximum = 78ms, Average = 66ms

Data transfer rate for real world 100 ethernet is usually around 70mb.

- both powerline adapters plugged directly into the wall socket from across the house. No power extensions/strips used.
C:\Windows\System32>ping -t 66.151.138.34

Pinging 66.151.138.34 with 32 bytes of data:
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=64ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=80ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=80ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113

Ping statistics for 66.151.138.34:
Packets: Sent = 14, Received = 14, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 61ms, Maximum = 80ms, Average = 70ms

throughput was 30mbps measured by copying a large file across a network share using fastcopy and double checked with netpersec.

- powerline near router plugged directly into the wall, the one across the house connected to my laptop is on a 6ft power extension cord that ends in a 3 way split.
C:\Windows\System32>ping -t 66.151.138.34

Pinging 66.151.138.34 with 32 bytes of data:
Reply from 66.151.138.34: bytes=32 time=81ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=80ms TTL=113
Reply from 66.151.138.34: bytes=32 time=63ms TTL=113
Reply from 66.151.138.34: bytes=32 time=80ms TTL=113
Reply from 66.151.138.34: bytes=32 time=64ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=78ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=78ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=80ms TTL=113
Reply from 66.151.138.34: bytes=32 time=62ms TTL=113
Reply from 66.151.138.34: bytes=32 time=61ms TTL=113
Reply from 66.151.138.34: bytes=32 time=79ms TTL=113

Ping statistics for 66.151.138.34:
Packets: Sent = 17, Received = 17, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 61ms, Maximum = 81ms, Average = 71ms

throughput was 20mbps.

- So basically ping is really good with these adapters with almost no impact at all. Throughput is pretty good but not great. You definitely want to avoid any power extension cords if at all possible.
- Since I just installed these I don't know how reliable they are.
- They do seem to produce quite a bit of heat.

No real conclusion yet but so far I'm liking them. They are a bit pricey for what they do, pretty niche, and super easy to setup. Bandwidth is good enough for our particular situation (atsc hd video is < 20mbps so in theory it should support streaming hd videos but I did NOT test this). If they are stable 24/7 for a long period of time (without need of power cycling the adapters or anything) then I would definitely recommend them if your particular situation requires a device like this.

UPDATE: 03/22/2009
- Upgraded the firmware to 3.3. It is suppose to help stability and increased my throughput to 47mbps. You have to install the utility from the same support site. It looks all kind of messed up at least in vista but it still works. I was able to see enough to still get around. Flash each box to 3.3. Trying to change the network password is about the most confusing thing in the world. At this point I'm still not sure if the change actually took place.

Saturday, December 20, 2008

Playstation Home (PS3)




- I gave the open beta a try. Here are some early impressions after playing around with it for a couple of hours.
- First you download it from the cross media bar and let it install. Upon launching, it wants to reserve 3gb of space.
- I ran into several connection issues. After multiple tries I was finally in and created my avatar.
- Next, you are dropped into your home which then runs through the tutorial.
- The graphics are pretty impressive if a bit sterile.
- I like all the animations that are included though the dancing still isn't as good as guild wars.
- There are a LOT of download progress bars: go to a new location for the first time - download (though you can do this in the background), play bowling - download, play an arcade game - download, watch a video at the theater - download, etc. I wish there was an option to just download everything at once so I could just walk away and try it all later.
- First was the main lounge/hub. Not much to do there. I walked around a bit and did some dancing. Hitting start lets you quickly jump to any location.
- Next I tried the theater. You can walk around while the big screen in there is downloading the movie (you see a progress bar on the screen). It turned out to be the Twilight trailer followed by the related Paramore music video which just then loops. You can walk up to most video screens, advertisements to go full screen (which isn't quite full screen but close, you are always in the 3D world). Video quality was ok (think xvid).
- Next up was the bowling alley. I bowled a 144 in my first game. It's all timing meter based (like golf games)....so yeah not all that exciting.
- Next, I tried the arcade in there: there was some lame arkanoid/breakout clone, echochrome, and some crappy puzzle game.
- I played a bit of pool which was ok.
- Oh yeah and it's like in real life. If all the lanes, arcade machines, pool tables, etc are taken you have just wait around until one frees up.
- I decided to try some of the themed areas. First was far cry 2 which looked quite impressive. It felt like you were in the game. There is an office and a train station. There are few points of interest like an interactive map and something that looked like a board game which I didn't try since they were all full.
- I then hopped over to Sully's bar from uncharted. There was a crappy pitfall looking game and some doors with locks on them which I didn't get to try because again they were all full.
- Finally I went to the mall where you can buy furniture at $1 a piece to decorate your virtual home, buy a new home for $5, or some clothing and accessories at 50 cents each. This is almost as bad as buying icons (gamer pics) on 360. I watched another video on the wall which had some Asian girl (I think from Qore) that went over what was new on PSN. I sat down and played some chess with a random stranger.
- There is voice communication and text. The communication stuff seems to be proximity based so there is no need to "start a conversation" with somebody. Just walk up to them and start talking.
- It seems like there are some party system game launching features which I didn't try.

And that's pretty much all there is in the Home Beta currently. It's not bad for free but I'm not sure if I'll be spending much time in there. I would have much preferred if Sony had spent the money, time, and effort on something more useful like the NXE party system.

Monday, December 15, 2008

XCM XFPS 3.0 Sniper Plus (XBOX 360)




- Picked it for around $90 from play-asia.
- My primary goal was to get the x-arcade solo to work with my xbox 360 specifically for Super Street Fighter II Turbo HD Remix (and sf4 down the road). You can read here why there isn't a native 360 adapter for x-arcade.
- I had everything else required already: x-arcade solo with the playstation 2 adapter and an xbox 360 wired controller.
- Here is how it looks all hooked up:

sniper -> xbox 360 using usb
360 wired controller -> usb 1 on sniper
x-arcade ps2 adapter -> sniper on ps2 connector
x-arcade joystick -> x-arcade ps2 adapter using serial.
- Yeah that's a lot of cables, and the signal is getting converted a lot. The x-arcade stick outputs db9 serial, this then gets converted into ps2, and finally into xbox 360 using the sniper. This double conversion does actually work but maybe not perfectly.
- The wired 360 controller is there just to make the 360 think it has a certified controller attached. After the initial boot up, you can actually unplug the 360 controller.
- It works pretty well in ssf2 turbo hd remix. I think there might be a bit of lag sometimes due to the double conversion but I'm not positive. I can pull off several special moves in a row then all of a sudden I would miss several. It's hard for me to exactly pinpoint what was going on. It might be additional lag from all the conversion or it might be me. I'm pretty rusty at sf2 now, and I haven't used a joystick in a long time so maybe I'm just more comfortable with a pad instead. Eithery way something just felt off to me. I practiced in training mode for quite a while. I was actually more consistent with just the regular 360 d-pad.
- I also tried the joystick in a few classic arcade games like contra and galaga. It worked quite well. I can see my kids having fun with it just for the sake of having a big joystick and buttons to mash on.
- Switching to a ps2 game pad (I'm using a logitech wireless ps2 game pad here but of course the regular old dual shock 2 will work fine) seemed a bit more responsive for me. Granted, one level of conversion is now removed but this is something I'm not sure how to measure. It could be all in my head but subjectively it felt better than the x-arcade joystick as far as responsiveness goes.

- Finally I tried a keyboard and mouse with halo 3:

- First, I had a Logitech mx 3000 wireless desktop hooked up. Only the keyboard was recognized.
- Next, I tried a vx nano wireless mouse in the other usb port, no go, it kind of went crazy.
- Finally, I plugged in a wired mx518, and it seems to work. After adjusting the separate X and Y sensitivity dials, it's sort of playable. You can never really tune it in right. It never felt smooth or precise. It was quite jerky in motion and made me ill after a few minutes (this is with me finishing the single player campaign, then again in legendary co-op, then making captain online all on the gamepad without any motion sickness). Basically, it's worthless for keyboard/mouse play in fps.
- It's quite flexible in they way you can map the keyboard/mouse to any of the equivalent 360 controller buttons/sticks. When using a ps2 controller, the mapping is fixed but the defaults are fine. I even tried some geometry wars 2 with a ps2 controller just to make sure the analog sticks were mapped correctly. It all worked quite nicely. Mappings persist between power cycles.

- Turbo switches seem interesting. Can we say dual pistols on Left 4 Dead (can't try it yet though since my copy still hasn't arrived from amazon yet)?

Not recommended. It's overpriced. The keyboard/mouse is a joke. I would never use it on the 360 in place of the standard control pad, and I grew up on PC keyboard/mouse controls for fps. The ability to use a ps2 controller on the 360 is pretty spot on. I thought this functionality was probably the best and worked really well. Using the x-arcade joystick with the double conversion required was a bit more of a miss though still not bad. So as a ps2 controller adapter for the 360 I would say it would be worth maybe around $30. No way is it worth $90 (+ a wired 360 controller if you don't already have one) unless you really love your dual shock 2 that much. For a good sf2 controller on 360 I'm hoping the sf4 gamepad will be it when it is released in late February. For now I'm back to the regular 360 controller. I find I do better on the d-pad for ryu style characters and the analog stick on charge style characters.

Saturday, November 22, 2008

rcFeedMe - A Fully Automated Podcatcher



rcFeedMe.zip (v1.44 - 11/8/2011) (source is included)

rcFeedMe is now Open Source (Apache License, Version 2.0) and the latest source is located here :
https://bitbucket.org/arogan/rcfeedme/overview

- So I've been using Juice for a while as my podcatcher. It works ok most of the time but there were a few things that annoyed me: Sometimes downloads would just hang, no way to group feeds into different download directories, and sometimes something about a feed would change and all of the files would download. That last one might not be Juice's fault but still there are ways to solve this problem in the podcatcher.
- So I went looking to see if there was a better free alternative. Also, I'm one of those people who refuses to install itunes. I tried a few from this site:
http://www.podcatchermatrix.org/ but most of them had more issues than Juice with interfaces that seemed to make the whole process of configuring your feeds a chore.
- So I did what any programmer would do. I wrote my own. rcFeedMe is a podcatcher - basically it reads rss feeds and downloads them unattended all automatically on a schedule. It is NOT a rss reader. I use google reader for that. Once you set it up you shouldn't have to touch it anymore except when you want to add/remove feeds.
- Tip: If you find a show that only has an itunes feed and not a regular rss xml one read this article. I found it quite helpful.

Design goals/features:
- Quick and easy interface. It might not be that pretty but I wanted something that I could quickly enter settings for all aspects of the program.
- OPML import/export.
- Complete automation. Once setup, it just runs in the tray and checks the feeds for new downloads at an interval you set. No annoying popups or notifications. I just want it to silently do its thing. Downloads have to be as robust as possible and retry automatically if the download stalls.
- Maintain a history of every file downloaded so you will never get flooded with downloads when a feed changes or download something you've previously downloaded.
- Flexible system to determine where feed downloads are saved.
- Multi threaded with the ability to set the number of threads to use.
- Some basic abilities to sync to a mp3 player. I want to keep this program pretty focused on just downloading.
- Clean install. You just unzip the files and run so it's completely self contained and portable. All persisted data is stored in clear xml files.
- Source included

Developer Notes:
- Written in Visual Studio 2008 - c# targeting .net 3.5 framework. It took about a week to write the core functionality. It took another week to flesh out a few features and bug fixes.
- Utilizes Windows Communication Foundation (WCF) SyndicationFeed. I coded around their publish date parsing bug. Try it with ask a ninja and you'll see. SyndicationFeed isn't a very robust class and there were several feeds I had to massage the xml before it would load into a SyndicationFeed.
- I started with a pretty clean OO design but it broke down toward the end with me taking all sorts of shortcuts especially with presentation elements getting mixed in (mostly to help performance). This also means the memory footprint grew a bit too though cpu utilization is low.
- All persisted data is in clear xml files.
- Thread management is a bit of a mess. I'm sure there is a much better/cleaner way to do things.
- Overall life cycle of a file: First you subscribe to a feed (class Feed), I refresh that feed and get a list of all files (MediaFeed which is a keyed collection of Media; attribute on Feed). At this point in time I figure out what the filename will be and verify that a good link exists pointing to the file that will be downloaded. Next, the queue (class Queue which is a collection of Media) is built taking into account check keep counts and history. I then process the queue downloading all the files trying to spread download across different sites (this algorithm can be improved, it's very simplified right now). Once the entire queue is finished (or the user stops the downloads) I cleanup the queue. All successfully downloaded files are moved to History (collection of Media), all the ones stopped or errored are moved to errors (temporary collection of Media, never persisted to disk). Then I trim files based on keep count. It's a very safe and conservative trim. I walk the save paths resolved from Feeds (collection of Feed), I then search history by filename, if I find a match in history then it's considered for deletion based on save flag and keep count. Keyed collections were used instead of dictionaries because I needed serialization.
- I don't check free space anywhere so ummm yeah manage your disk space. The idea is keep count should keep space usage pretty constant.
- CleanupConfig.xml. This file is used to help cleanup the raw xml that causes issues with SyndicationFeed class. This has two sections in it. One is for search and replace, the other removes text between the start and end strings inclusive. In the future, as more problematic feeds are reported and fixed, hopefully I can just release an updated CleanupConfig.xml file instead of doing a new build. There is no gui for this file so if you want to manually edit it just use notepad.
- Other code used:
http://www.asp101.com/articles/christopher/filesystem/default.asp
http://www.brunofigueiredo.com/post/c-OPML-Parser.aspx (make sure you apply the fixes mentioned in the comments)
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=176890&SiteID=1 - DataGridView progress bar
http://www.codeproject.com/KB/grid/DataGridViewColumnOrder.aspx - Save DataGridView column widths and position. Modified to persist settings in appSettings instead of user.config to keep rcFeedMe portable.
http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx?fid=452379 - Checkbox in DataGridView column header
http://developer.novell.com/wiki/index.php/TagLib_Sharp - ID3 Tag Library
http://www.veryicon.com/pack/aqua-smiles/ (icons)
- Thanks to coolmoedee345 for helping with the testing who listens and watches more podcasts than I think is humanly possible which of course made him the ideal tester.


Requirements:
- Windows XP, Vista, or Windows 7 (I've tested in both 32bit and 64bit)
- .net framework 3.5

Quick Start:
- Import an opml file or enter the url for the feeds you are interested in.
- Update the path on the settings tab to where you want to save your downloads.
- Click Start.

Usage:
- All the labels on the settings tab and many headers on the grids have tooltip text. That should help clarify some things.
- Command line parameters:
"1" or "auto" - (without quotes) to start in automatic mode. This means the app will minimize and the scheduler will start. This is useful as a shortcut in your startup group.
"2" or "lite" - The same as 1 except it puts it into "lite mode" which uses less memory but doesn't let you interact much at all with the program. Memory usage will still be pretty high when it's actually processing the download queue, but I try to free up as much resources as possible when rcFeedMe is idle and waiting for the next scheduled run.
"3" or "once" - Run Once: It's just like 1 except after finishing the run it will automatically exit. Useful if you would rather schedule rcFeedMe with windows scheduler and not have it running in the tray all the time.
"4" or "hidden" - This is exactly like run once but you never see a window. The only thing you will see is the system tray icon while it is running. This should be a lot less annoying than run once. Note: The gui is completely disabled in this mode so double clicking on the system tray icon does nothing.
- Right click on the grids for additional functionality. You can multi select rows in most grids by clicking the white space to the left of the row. Hold down ctrl to select multiple rows, shift for ranges of rows, and click the square in the top left corner to select all rows.
- Grids can be sorted by clicking on the header of the column.
- It should use proxy information that is setup for IE automatically though I haven't tested this.
- While a file is in the process of being downloaded it will have an extension of .rcFeedMeTemp. This extension is removed once the file has successfully completed downloading.

Main Menu:
File | Import opml: Import an opml file. Feeds with a url that already exists in the grid will be skipped.
File | Export opml: Export feeds to an opml file.
About: Shows the current version and a link to this post.
Debug | Save Settings: Not usually needed since Refresh All feeds saves all settings. Settings are also automatically saved when you close the application.
Debug | Load Settings: Not usually needed since Refresh All feeds saves all settings. Settings are automatically loaded on application start up.
Debug | Dump Raw XML Feeds: If you have a feed giving you problems (no files showing up/ERROR status when refreshing) you might want a raw dump of the rss feed. This will save the file in the same directory as the rcFeedMe.exe. It also dumps a fixed version if it's a problematic feed that I had to massage a bit to get working.
Debug | Sync Count: Count how many files that need to be synced and display it on the Sync button as Sync (n) where n = number of files that still need to be synced.

Toolbar:
Start: Start the scheduler.
Stop: Stop the scheduler.
Save then Reload Settings: Click this if you changed something and want to save it immediately but don't want to refresh all the feeds.
Refresh All Feeds: Saves all Settings, re-loads all settings, and refreshes all feeds. This is the button you want to click after you've added/removed feeds.
Process All Feeds: Does a Refresh All feeds, builds the queue, and processes the queue. This is the same thing that the scheduler runs.
Sync: Syncs files to a path of your choice (usually to a mp3 player or something). Paths are defined just like Save Paths but instead use the Sync Path fields (in feeds, groups, and settings). Sync is really a one way copy from where the file was downloaded to the Sync Path. Once a file has been copied, it is flagged as Synced in History so it won't sync again even if you delete the file on the mp3 player. You can always uncheck Synced in the history if you want to sync the file again. One small difference is sync paths are created if they do not exist (this includes even base directories). After the downloads are finished it will count how many files that need to be synced and display it on the Sync button as Sync (n) where n = number of files that still need to be synced. This lets me know in the morning if I have new podcasts waiting for me to be synced to my mp3 player. You can also get a count immediately with the Sync Count menu item under Debug.
Search History: Type in the textbox any substring you want to search in your history on Feed Name, Title, and File Name.

Status bar:
- First area is just general information on the last action.
- The next grey label area is the current overall status of rcFeedMe.
Idle - not much is happening.
Feed - Feeds are in the process of being refreshed.
Queue - Queue is being processed. Files are being downloaded.
Sync - Files are being copied to your mp3 player.
You will see the word [Lite] next to the status if you are running in low memory usage Lite mode.
Depending on the status, certain functions might not be available.
- Progress Bar shows status of either the feeds refreshing or the download queue. Download progress is only updated every percentage change.
- The tray icon will show teeth while rcFeedMe is being fed (downloading). Actually, it's anytime it is not idle.

Feeds Tab:

At the top is a grid displaying all your rss feeds and a variety of parameters to customize how files are downloaded. At the bottom displays all the files associated with the feed you clicked on in the top grid. Note: You must click "Refresh All Feeds" before you will see anything in the lower grid.
- How the save path of a file is determined: If a path is specified at the feed level, then that exact path will be used. Next, if a group is specified, then the group path will be used as the base path, a sub directory with the feed name will be created in this base path, and then the file will be saved in that sub directory. Finally, if a feed has no save path defined, group is set to (None), then the Save Path on the Settings Tab will be used as the base path. The same sub directory logic is used as in the group scenario. Note: Sync Path follows the same logic.
- Please make sure all base directories are created first or the program will throw an error.

Feeds Grid (top):
- Name: The name of the feed. Please be careful when editing this field. It's best not to touch it once you've begun downloading files for the feed since I use feed name + file name as the key to determine if something has already been downloaded (history).
- Url: The address that points to the feed. If you enter this first and leave Name blank then it will try and fetch the name of the feed for you. It's not quite as robust as refreshing the feed so if this fails, try typing the feed name manually and then refreshing the feed. There is a chance it still might work.
- Group: Any groups defined on the group tab will be in this drop down. Assign this feed to a group or leave it set to (None).
- Keep Count: This number determines two things. 1) It determines the maximum number of possible files that can be downloaded for the feed. So if it is set to 5 then at most 5 of the most recent files will be downloaded for this feed. 2) It also determines the maximum number of shows to keep on your hard drive. So if you download the latest 5 files, then a new one shows up in the rss feed, then the new show will be downloaded and the oldest existing file will be deleted. This is the primary method of managing disk space. By specifying keep counts your disk space used shouldn't change much. Set it to 0 to disable the feed. Enter -1 if you want to download and keep everything. I've seen other podcatchers use number of days or something like that which I find inconvenient since different feeds publish new shows at different or irregular intervals.
- Include Extension: Pipe(|) delimited list of file extensions(include period(.)) to match against for downloads. Sometimes undesirable file types get included into the feed (say a .aspx or something) or the feed is a consolidated feed with the same show in different file formats (say wmv, mov, avi, etc). This lets you filter down the files to download by a list of extensions. Example: if you only want wmv files to download from the feed then enter ".wmv" (with the period but no quotes, search is case insensitive). If you wanted wmv and mov files then enter ".wmv|.mov".
- Include Text: pipe(|) delimited list of substrings that are compared to the filenames for download. This is similar to extension but is a substring search of the entire filename. If it finds a matches then the file will be downloaded. This is useful if a feed contains many different versions of the same show in the same file format but at different quality levels/bit rates. Example: a feed has Show01High.wmv,Show01Med.wmv,Show01Low.wmv. If you wanted just the high quality ones you would enter "High" (without the quotes, search is case insensitive).
- Save Path: Enter the complete path where the podcasts for this feed will be saved. This path overrides all other paths (groups and global settings). If you use this feature please make sure you specify a unique path here that is NOT shared with any other feed. Having more than one feed save to the same path will cause unpredictable results.
- Prepend Date? Prepend the Publish Date to filename. Useful to make the filenames unique or help with sorting. Date format used is YYYYMMDD so it sorts propery. If both Prepend Date and Prepend Title are checked, then Date comes first.
- Prepend Title?: Prepend title to filename. Useful to make the filenames unique if only a generic filename is used in the feed. Take a look at the GameTrailers feeds. All the filenames are just download.mp4. Checking this will take the title of the show and prepend it to the filename. So download.mp4 will become "show title - download.mp4".
- Sync Path: Just like save Path but defines where files are copied to when you click the Sync button.
- Sync?: Check if you want files from this feed to sync to your mp3 player.
- Apply Cache Fix?: Appends a fake query string to the end of the url when making the request for the feed. This guarantees a cached copy will not be used but also causes some sites to throw an error. Most sites don't need this. If you do check this, then do a refresh and make sure the feed still works. To be honest I'm not sure if this "fix" really helps anything. I notice on a few feeds (like hdtv podcast) where there is a bit of a lag before the latest show appears in the feed. What is odd is if you view the feed in a browser (and therefore the xslt is applied) you see the latest version of the rss feed. If you instead grab the raw xml (I use webClient but trying httpwebrequest doesn't make a difference) it's the previous version and takes a while before it's updated. If I use WebBrowser class then yeah I get the latest data but it's after the xslt is applied so it's html and no longer rss xml. It's pretty odd. It only happens on a few feeds, and it's not a big deal since the raw rss xml eventually does get updated. If any programmers out there can explain to me what is happening, why, and maybe how to fix it that would be great.
- Username: Enter a user name if the site requires login credentials.
- Password: Enter a password if the site requires login credentials. Once you save, this field will show only the encrypted version (I also save it encrypted in the feeds.xml file). Type over it to change it or just erase it if you no longer need a password.
- Priority: Used to help sort mp3's during playlist creation. See the playlist section below for more information. Leave it blank to exclude the podcast from the playlist.
- Decode?: Apply url decode to filename
- Prepend Short Date? Just like Prepend Date but a shorter format: M/D
- Post DL Exe: This command will be executed after every single media that is downloaded from this feed. You can also specify a .cmd batch file if you wish. This process is launched asynchronously when a download is completed successfully (user aborts and failures do not count). Do NOT use double quotes even if the path contains a space.
- Post DL Args: Include any arguments needed to run the above exe. Please use double quotes around anything that might contain spaces (even tokens).
- Pre Sync Exe: Like the post except this executes right before the copy is done during a sync. This is executed synchronously.
- Pre Sync Args: arguments for pre sync exe.
- Suppress Sync: This suppresses the actual copy command that Sync usually does but it still does all the other things that sync normally does like updating the sync flag in history. This is very useful if the pre sync exe will actually be doing the copying for you.

available substitution tokens:
%filename% - just the file name of what was downloaded
%fullname% - complete path and filename
%savepath% - where the file is located
%groupname% - group name (if one exists)
%syncpath% - sync path
%feedname% - feed name
%date% - publish date in the same format as prepend date (yyyymmdd)

example: I want my mp3's split into 20 min chunks when I sync to my usb thumb drive.
First, you need a command line utility that will split mp3's. I like mp3split.
Next, I would setup my feed as follows:
feed name: This is Only a Test
Sync path: d:\portableDrive
post dl exe: blank
post dl args: blank
pre sync exe: C:\Apps\mp3splt_2.4_i386\mp3splt.exe
pre sync args: -t 20.0 -d "%syncpath%\%feedname%" "%fullname%"
Suppress Sync: checked

After token substitution it would generate the following:
Pre Sync exe = C:\Apps\mp3splt_2.4_i386\mp3splt.exe
Pre Sync args = -t 20.0 -d "d:\portableDrive\This is Only a Test" "c:\podcasts\This is Only a Test\thisisonlyatest-90-20111103.mp3"

Notice how you can combine tokens but just be careful where you place your double quotes.
What this would do instead of just copying the mp3 to the sync path it would instead execute the above which would chop up the mp3 into 20min chunks and output them to the destination directory d:\portableDrive\This is Only a Test.

- Right Click menu lets you abort refreshing feeds.

Files Grid (bottom)
- Add to Queue: Manually add the file to the download queue. The file will be automatically flagged as "Keep". See History Tab for more information.
- In Queue?: Read only - checked if the file is already in the queue.
- Title: Show title. This is the text used in the filename if Prepend Title? was checked above.
- Summary: Show summary
- Publish Date: Date the show was published. This is the date used in determining the latest shows to download. By default the grid is sorted descending on this field.
- File Name: Filename that will be used when downloading and saving the file.
- Link: The url pointing to the actual file that will be downloaded.

Download Queue Tab:

- I attempt to spread the downloads across different feeds to help maximize speed and thread efficiency.
- Feed Name: Name of the feed.
- Title: Show Title
- Link: The url pointing to the actual file that will be downloaded.
- File Name: Complete path and filename of what is being downloaded and saved.
- Publish Date: Date the show was published.
- Status:
Queued - In the download queue but has not started downloading yet.
Downloading - Download is in progress.
Downloaded - File was downloaded successfully.
Error - File was not downloaded properly. Some sort of error occurred. Partially downloaded files in error status are automatically deleted.
Stopped - User right clicked on the Queue grid and selected "Stop All Downloads". Any downloads in progress will be stopped immediately and have this status. The partially downloaded file will be deleted.
Bytes - Number of bytes currently downloaded/Total Bytes.
Progress - % downloaded
Attempt - How many times rcFeedMe tried to download this file. Once attempts hits the download retry maximum (set in the Settings tab) then the file will be set to Error status.

Download Queue Context Sensitive Menu (right click):
- Build Queue: Not used often unless you want manual control over some of the steps that "Process All Feeds" does. Click this after doing a Refresh All Feeds. It will build the queue but not actually start downloading yet.
- Process Queue: Begins downloading the files in the queue.
- Stop all Downloads: Immediately stop all downloads and halts the processing of the queue.
- Remove Selected Rows: Remove the files from the download queue.
- Move Selected Rows to History. This is more for debug but it might come in handy. After build queue you can move rows from the queue to History. This will trick the program into thinking these files were already downloaded. Useful in some situations where you want to pre-populate the history. Maybe there is a specific show you just don't want to download.

Download History Tab:

- After the queue is completely finished processing, all successfully downloaded files are moved here. The history will continue to grow over time. It might be a good idea to trim it down once in a while by sorting by date and then selecting multiple rows of the oldest data and deleting it.
- I won't go through all the columns since I've already describe most of them by now. Three columns are editable on this grid: Title, File Name, and Keep?.
- I allow editing of Title and File Name since these combined is the primary key I use to determine if a show has already been downloaded. This is just in case somebody wants to tweak something in the history.
- Keep?: Checking this prevents rcFeedMe from deleting the file. This goes along with Keep Count back on the feed tab. Any files you added manually from the files grid on the feeds tab will have this already checked. It makes sense because you added the file manually (and not by the scheduling engine) so the scheduler shouldn't delete it. Kept shows are excluded from the keep count calculation.
- Right click | purge history: This will clear the entire history file (a backup is created though just in case). Useful if you want to reset and re-download
everything.
- Synced?: If checked it means the file has already been synced to your mp3 player so it won't get synced again in the future. I you wish to sync the file again for some reason just uncheck this box.
- Make sure you save any changes made before leaving this tab since this tab gets refreshed whenever you click on it.

Recent Errors Tab:

- After the queue is completely finished processing, all the files that failed to download are moved here. This only shows files that error out on the most recent run. The data in this tab is not persisted anywhere so if you close rcFeedMe and then restart it, it will be blank. If you want to see a running history of all the errors from this tab, please see Errors Log Tab.

Group Defaults Tab:

- Save Path: Specify the download path for the group. The groups you define here appear in the drop down on the Feeds tab.
- Sync Path: Default path to sync to for the group.
- Playlist Path: If a path is specified then a playlist will be created at the end of the batch run for all podcasts in this group with a priority specified.
- Playlist Cutoff Days: Go back this many days to figure out how many podcasts to include. This is based on the podcast publish date.

Settings Tab:

These are your global preferences.
- Frequency: This is how often the scheduler should refresh all feeds and download any new files. Default is 360 minutes (every 6 hrs).
- Default Save Path: If a feed doesn't have a path specified and group is set to none, then this path will be used as the base path. See Feeds Tab for a more detailed explanation of how the download path is determined for a file.
- Default Sync Path: If a feed doesn't have a path specified and group is set to none, then this path will be used as the base Sync path.
- Keep Count: Default value used to populate the Keep Count field on the feeds tab when importing an opml file. Default is 5. See Feeds Tab for more information.
- Threads used to Scan: Number of threads to use when refreshing the rss feeds. Default is 6. Maximum allowed is 16.
- Threads used to download: Number of threads to use when downloading files. I would recommend 2. Any higher and some sites limit the number of simultaneous downloads and could produce false failed downloads. I try to minimize this by spreading out simultaneous downloads across different feeds. Maximum allowed is 6.
- Scan Stall: Number of seconds that elapse of inactivity while a feed is being refreshed. If the feed refresh stalls for this many seconds, it will be considered an error.
- Download Stall: Number of seconds that elapse of inactivity while a file is being downloaded. If the download stalls for this many seconds, it will be considered an error.
- Scan Timeout: If the total time for a feed refresh takes longer than this many seconds, it is considered an error.
- Download Timeout: If the total time for a file download takes longer than this many seconds, it is considered an error.
- Scan Retry: When an error occurs during a feed refresh, retry this many times before giving up.
- Download Retry: When an error occurs during a file download, retry this many times before giving up.
- Time Zones (Advanced): Used to help parse Publish Date. Sometimes it helps to strip out the time zone.
- Date Formats (Advanced): Used to help parse Publish Date. Specify the .net Custom Date and Time Format string. see: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Log Tab:

- A very detailed log of everything that happens in the program. The log self trims so it won't grow in size forever. The log is refreshed every time you go to this tab or you can right click and refresh immediately. The log will grow until it hits 1.5MB. After that the oldest entries will be deleted and the log will be automatically trimmed down to 1MB. This cycle just keeps repeating. Log size check and trimming occurs when you process your queue.

Error Log Tab:

- Since the Recent Errors Tab isn't saved anywhere I decided to create a separate error log. The information is also buried in the complete log but this log only contains information that was in the recent errors tab. This log also self trims.

Playlist Creation
- This is a new feature I added basically to use with subsonic, isub, and my iphone and it's a new way for me to listen to podcasts on my commute without ever having to use itunes/sync again.
- This is all optional. You start by specifying a full path and filename in Group Defaults tab. So say I want a .m3u playlist generated for my audio podcasts. I would enter something like:
c:\subsonicPlaylists\AudioPodcasts.m3u.
For this to work properly with subsonic/iSub I setup in subsonic|settings|general|Playlist Folder to:
C:\subsonicPlaylists
- Next, you put in a playlist cutoffdays value in group defaults. This tells how far back to include podcasts. So if I use 14 that means only podcasts with a publish date within the last two weeks would be included in the playlist.
- Finally, on the feeds tab you need to give a priority number for each podcast in that group you want included in the playlist. Leave priority blank if you want that podcasts excluded from the playlist.
example:
The Instance - 5
GWJ - 10
Maximum PC - 15
TWIT - 20
I like to number by 5's so it's easier if I need to re-prioritize later.
- At the end of a process all feeds (which happens in any schedule run or run once) I generate the playlist as follows:
For any groups with a playlist path and cut off days defined, find all podcasts with a priority. I start with the lowest priority first. I get the most recent podcast (within cutoff days) and add that to the playlist first. Then I get the next lowest priority and the most recent podcast for that feed, and so on. Once I've walked all the feeds with priorities defined, I start over again at the top and pick up any remaining podcasts that fall within the cutoff days and throw them at the bottom of the playlist.
- NOTE: I retag the mp3 files when I do this with a short date: M/D-title. I have to do it b/c this is how I want to see it in iSub and it allows me the quickest way to scan for new podcasts from the feeds I care about the most. The original tag is written to the ID3 comment field with a prefix of [ORI].
- NOTE: Only file extensions with .mp3 are supported.
- Then in iSub I go to playlists|server and pick AudioPodcasts. With the bookmarking system in iSub this works out really well and lets me listen to podcasts on my commute but music while at the office.
- So what you end up with all of this is a constantly refreshing (however you schedule rcFeedMe to run) server playlist that I can hit with iSub, quickly glance over and see any new podcasts with the ones I care about most bubbling to the top of the list (instead of a strict latest date sort), all streaming without ever having to sync to my iPhone. I've been listening to podcasts this way for the last few weeks and it's been working great. Of course this helps if you have an unlimited data plan which I do.

Upgrading from a previous version
- Usually you only need to copy over the following files:
rcFeedMe.exe
rcCommmon.dll
gfoidl.DataGridView.dll
taglib-sharp.dll
cleanupconfig.xml (if you have added your own entries in this file you'll have to manually merge them)

Hopefully you find this program useful. Leave any questions or suggestions in the comments, and I'll try to respond.

UPDATE: If you have issues with a specific feed give http://feedvalidator.org/ a try. It's quite helpful in pointing out where the problem might be.

Version History:

- I've been making some updates to this release. It is now on version 1.44f. If you aren't running the latest version please re-download.
- Fixed a bug where you couldn't erase a playlist path from the groups tab.
- Known issue: adding a new feed by entering a url and them immediately checking any checkbox will throw an error. The work around is simply to either leave the row first or save your settings before checking any of the checkboxes.
- There is a new setting: Log duplicate errors. By default these are not logged since they are mostly harmless and just clutter up the log. This happens when a feed happens to list the exact same file twice.
- Maximum log size has been increased from 1.5 MB to 10 MB.
- Added 5 new columns to feeds: Post DL Exe, Post DL Args, Pre Sync Exe, Pre Sync Args, Suppress Sync. Please see the above section Feeds Tab for more details. This adds the ability to hook in your own post download process or pre sync process.
- Added new command line option 4 (or "hidden"). This is just like run once but you will never see a window (only the system tray icon).
- Made a preliminary fix to an obscure error when syncing (or getting sync count): "An item with the same key has already been added."
- Properly set status to idle before calling create play list to prevent the busy error during a batch run.
- NOTE: The source has been updated to visual studio 2010 (though it still targets the .net 3.5 framework).

v1.43 (8/22/2010)
- Added Url Decode option on filename
- Added ability to generate playlists. See above for more Information.
- Note: I now change last modified date to equal publish date after the file has been downloaded.

v1.42 (4/4/2010)
- Added a fix for EA podcast in the cleanupconfig.xml
- Added preliminary support for userid/password for sites that require it. I wasn't really able to really test it because I don't have any podcasts that require a login. See the Feeds Tab section above for more information.

v1.41 (11/5/09)
- This is mainly user interface tweaks. All checkbox columns now have a checkbox in the column header so you can easily toggle the checkboxes for all rows.
- All grid column positions and widths are now saved. Even the split location on the first tab is saved. All these settings are saved in rcFeedMe.exe.Config. So if you want to reset just delete the appSettings section.

v1.40 (11/2/09)
- added httpWebRequest useUnsafeHeaderParsing="true" to rcFeedMe.exe.config. This fixed an issue with a specific feed. You can read more about the issue here.
- cleanupconfig.xml is now a lot more flexible. You can now add fixes that only apply to a particular feed url instead of globally to all feeds. This allows me to add specific feed fixes without the risk of breaking some other feed. Just add the optional attribute feedUrl to either ReplaceStruct or RemoveStruct. If you leave feedUrl attribute off then it still applies globally.
- Added Restore to the right click menu on the tray icon. It does the same thing as double clicking the tray icon.

v1.39 (4/21/09)
- updated CleanupConfig.xml to handle another problem feed. Fixed a rare issue where if a filename differed only in case it would hang the feed refresh process.

v1.38 (2/22/09)
- Fixed a bug where I was never using DL stall time from the config (I was accidentally using scan stall). Also, rcFeedMe no longer shows up in the alt-tab list when minimized to the tray.

v1.37 (2/16/09)
- Fixed a problem with idle thumbs feed. Added better error logging when there is an xml parsing error. I now try and extract the xml fragment that was causing the problems and save that into the log.

v1.36 (1/27/09)
- Some feeds are missing the type attribute on the enclosure tag. I've added some code that should work around this issue.

v1.35 (1/11/09)
- added new Error Log tab. Anything that ever shows up in the Recent Errors tab is archived in this log. Sure the same information is also captured in the compete Log but this is easier to read if you just want to look at your failed downloads. This log also self trims.

v1.34 (1/7/09)
- added a size check. When media is finished downloading, I check received bytes against total bytes expected. If it received less then it is considered an error.
- latest CleanupConfig.xml is rolled into this release

v1.33 (12/12/08)
- fixed a tiny bug where I forgot to reset the tray icon tool tip text and form title after doing a sync.

v1.32 (12/11/08)
- Files that are too long are now trimmed down. This can happen if you prepend the Title and it happens to be a very long title. I've set maximum file name length to be 240. It will be less than this since I subtract out the full path. Any filenames that needed trimming will show up in the log.
- Fixed a bug when deleting rows out of the Groups tab.

v1.31 (12/10/08)
- Improved error messages in the log if a download fails.
- Sync Count now also displays in the window title and the tooltip text for the tray icon.

v1.30 (12/03/08)
- added a new feature: Sync Count. After the downloads are finished it will count how many files that need to be synced and display it on the Sync button as Sync (n) where n = number of files that still need to be synced. This lets me know in the morning if I have new podcasts waiting for me to be synced to my mp3 player. You can also get a count immediately with the Sync Count menu item under Debug.

v1.29 (12/03/08)
- fixed a bug introduced in the new feature in v1.27 and made worse in v1.28: Crash bug when editing existing feeds.

v1.28 (12/02/08)
- fixed a bug where if you had no group assigned to the feed, clicking add to queue button would cause the app to blow up.
- fixed a crash bug where feed name was null when it is trying to fetch the name.
- added a new xml file: CleanupConfig.xml. This file is used to help cleanup the raw xml that causes issues with SyndicationFeed class. This has two sections in it. One is for search and replace, the other removes text between the start and end strings inclusive. In the future, as more problematic feeds are reported and fixed, hopefully I can just release an updated CleanupConfig.xml file instead of doing a new build. There is no gui for this file so if you want to manually edit it just use notepad.

v1.27 (12/01/08)
- When subscribing to new feeds, if you enter the url first and leave the Name blank, then it will try and fetch the name of the feed for you.

v1.26 (11/24/08)
- fixed some problem feeds that use dc:date instead of pubDate tag in the rss xml.

v1.25 (11/21/2008)
- Initial public release