| Comments

I’ve never been so frustrated with a piece of software as I have been with iTunes lately.

NOTE: Yes, I work for Microsoft.  Yes I’m aware they make the Zune.  I’ve got years invested in hardware with iPods, and until someone makes an OEM integration kit as good as what I have, I can’t switch.  Truth be told, from a portable device player, I *do* think the Zune is better.  But let’s just leave that out of this argument for now.

In my home there are roughly 4 iPods floating around.  We have a library of over 5,000 songs both popular and not that are in our digital library.  That digital library is mostly MP3s, mixed with some iTunes purchased songs (although not since Amazon MP3 began).  That library sits on a shared drive on my Windows Home Server so it can be accessed through various streaming means (Home Server streams to iTunes software, XBOX, etc.).

Also in my home are roughly 6 computers ranging from desktop to laptops (mostly laptops).  These are used between my wife and myself (and one for the kids).

We all listen to music on our devices and via our machines.  We all want to listen to the same library, create our custom playlists and have them available everywhere.  We all want to be able to sync on whatever computer we want, but we’ll settle to be tied to one that you can pair with.

iTunes…sucks.

Yes, I’m looking at you iTunes.  I’m aware of the other options like Songbird, etc. but frankly I haven’t tried them out yet.  If you have and they will solve my woes, can you share your experiences?

Why does iTunes suck?  Easy…

  • It assumes 1 user/1 computer – the “library” is a local and static library unless the user interacts with it.  What I mean by this is it does not have the ability to monitor folders (like pretty much every other software out there for media does).  I want to point my iTunes library to my server share and whenever I add music to it via other computers, that other ‘libraries’ will be aware of it and just add it to my local library.
  • Portability sucks – try to transfer your iTunes library to another computer.  I dare you.  Navigate through all the Apple support suggestions and hacks online.  Frankly unless you are Mac to Mac migrating, it is not easy for a healthy configured library.
  • Not informative – one of my biggest issues is that when I configure the library to be a mapped drive (let’s say M:), if M: is not available for some reason, iTunes decides on it’s own without telling me that it is going to switch the library back to the local volume/hard drive.  Any future action (i.e., iTunes purchasing, Amazon purchasing, etc.) now doesn’t save to my server library.  WTF?!  Can you at least tell me: Hey user, that location you set for your library, ‘M:’ is not available right now…what would you like us to do.  Stop moving it around for me.
  • Home Sharing – what is this supposed to be again?  I thought this would save me.  I could have at least one place that would be the library and home share to other clients who could then use this feature to sync.  Um, nope.  This is basically the sharing they already had except with a new name.  Worthless.

I wish the iTunes team would put in their lab 3 iPods and 4 computers with 2 users and a library stored on the server.  Work toward making your software work in that environment as seamless as it does with 1 user and I’ll be happy.  Until then I have to navigate your changes and try my best to explain to my wife why the music we bough on the desktop is not on her laptop until she adds it to the library that is already mapped to the network share where the music already exists.  Yeah, that’s what I though.

| Comments

In a recent Twitter conversation I was having with Peter Laudati, it reminded me of another problem I’ve been having with iTunes and wondering why it isn’t working this way. 

First, here’s my setup (and logic):

    • I have one server (Windows Server 2008) at my house that manages my backup, music, photos, etc. (no it is not a Windows Home Server (yet)).
    • I have a public share there with Everyone read/write priveleges called “music” and it is shared out an accessible.
    • In each client computer I have iTunes installed at, I change the Library location to the mapped drive which is pointing to the share indicated above.
    • All is well.
    • Whenever new music is added in a CLIENT machine, it is added to the server (because the library is pointing there) and added to only that local client’s iTunes library – this is the problem Peter and I were discussing, the fact that iTunes doesn’t “monitor” folders to update it’s Library – you have to help it understand by adding.  Royal suck. (FYI, Windows Media Player has been able to monitor folders for about 9 years now.)

So that’s the setup.  Any activity in iTunes now basically uses this server as the storage…this includes podcast subscriptions.  This is all fine.  Until I want iTunes to actually honor my settings.  Here’s what I’m talking about:

As you can see in this image above, my settings say to keep “all unplayed episodes” but also as you can see, episodes that are played (as indicated by the lack of blue dot) are still there.  I’ve refreshed, I’ve ran the “updated podcast” function on the feed(s), etc.  Nothing…all played episodes are persisted.

So, dear Apple fans/experts/geniuses, why is this?  Is this because my Library is a network share?  Can iTunes not handle the fact that it isn’t stored locally?  I will point out that if I manually delete them via iTunes, it does, in fact, delete – so it isn’t a permission thing.  I’d love to take this to the ‘Genius Bar’ but obviously with a dependency on my network share it won’t be of much help.

If anyone knows the solution to this or the problem with getting iTunes to manually update libraries by monitoring folders, I’m all ears.

Yes, I’m aware that Songbird, and others are out there, but they have yet to appeal to me in their other features.

| Comments

while preparing for the code trip, we have several 'on-board' needs.  one of which is a quick method to get our content encoded for consumption by devices and frameworks (i.e., silverlight).  we want a smooth method so that we aren't boggled down with multiple tools opening and changing settings, cutting and pasting, etc.

so, inspired by my colleagues post about using workflow to automate, i set about the task.  we're going to be making several assumptions along our production, one of which is we know we'll have multiple video/audio sources and that there *will* be some post-edit being done.  but once we have that post edit completed, we'll want all videos to feel similar (size, quality, etc.) and encoded for multiple uses.  i've pretty much decided that there really are 3 formats that would suffice the world: WMV, MP4, MP3.  if we get all of these, we can accommodate most.  here's how i justify that:

    • WMV: we'll have standard (4:3) and widescreen (16:9) format for viewing offline as well as online via silverlight (we'll be using the widescreen online most likely).  we'll also have a Zune formatted version for quick updating.
    • MP4: itunes, ipod, mac viewing in both standard and widescreen formats
    • MP3: audio format beloved by all

so the first step is to tackle the how.  if you don't know, expression encoder has a command-line interface.  this is especially helpful for a few things, namely our batch processing (you can also save job files and send in a job to the command-line interface quickly).  so the first thing i did was wrap the input parameters into a windows workflow foundation activity.  luckily michael did a lot of this for me in his webcast :-).  it basically abstracts all the possible input parameters and enables you to optionally send them into the activity:

for the mp4 encoding i'm using a piece of software that also has an command-line interface.  this one isn't as flexible so given my two known encoding types i'm pretty much hard-wiring in some of the settings and only enabling the size parameters for alteration.

mp3 version -- let's get to that later.

now that i have my activities (one for WMV, one for MP4) in an activity library, i'm ready for a client tool.  for our purposes, we don't need a fancy GUI tool, so i settled for a command-line interface.  in my client i added a sequential workflow and then added my activities.  i re-used the WMV activity 3 times to alter the different settings and then use the output of them to feed into my MP4 activity (used twice).  the resulting visual workflow looks like this:

the input to the command line looks for a source WMV file, title, description, author, album.  these input parameters are sent as named parameters to the workflow activity:

var namedArguments = new Dictionary<string, object>();

namedArguments.Add("SourceFilename", args[0]);
namedArguments.Add("Title", args[1]);
namedArguments.Add("Description", args[2]);
namedArguments.Add("Author", args[3]);
namedArguments.Add("Album", args[4]);

which are then mapped to properties of the activities:

the activity libraries also expose a few other properties that i'm passing in to my commands.  for example, i want each video to have a bumper intro and then an icon overlay in the right location.  i'm able to pass in these parameters which then map to expression encoder properties.  i'm also able to tell it to make sure to letterbox content that isn't native 16:9 aspect ratio for the standard format encodings.  the result of these activities is that i have three WMV files appropriate for my use.  expression encoder also generates thumbnail images of a frame in each video.  i've not much use for them, so i added the last workflow code to simply clean up the jpeg images generate (delete them) from the output directory.

one problem i had was that expression encoder exposes a lot of properties but not for metadata individually.  i wanted to embed the appropriate metadata for the WMV files for the title, description, etc.  luckily there is one input parameter for encoder that i can append to my other custom ones, and that is "/Preset" which enables me to provide certain presets that will be passed in and here is where it allows me to make metadata a part of that preset.  the input parameter looks for a literal xml file so i have to create one.  i added the template as a resource in my project:

<?xml version="1.0" encoding="utf-8"?>
<Preset>
  <MediaFiles>
    <Metadata>
          <Item
            Name="Title"
            Value="{0}" />
          <Item
            Name="Author"
            Value="{1}" />
          <Item
            Name="Copyright"
            Value="2008, Microsoft" />
          <Item
            Name="WM/MediaCredits"
            Value="{2}" />
          <Item
            Name="Description"
            Value="{3}" />
          <Item
            Name="WM/AlbumArtist"
            Value="{4}" />
          <Item
            Name="WM/AlbumTitle"
            Value="{4}" />
          <Item
            Name="WM/Genre"
            Value="Podcast" />
          <Item
            Name="WM/Year"
            Value="{5}" />
        </Metadata>
  </MediaFiles>
</Preset>

and then when the user executes the command-line interface, i take their input, merge it with the xml here and output a temporary xml file that is then passed into the named parameter dictionary for the workflow activity.  when no longer needed it is cleaned up (on the workflow completed event handler).  now my WMV file is complete with formats and metadata.

for the MP4 format i chose to use the resulting output of the WMV file and do a single pass there.  the settings for the tool weren't ideal for adding overlays, etc. so using the resulting WMV file and same bitrates i'm just passing in the resulting WMV and creating two MP4 formats.  boom.  done.  the metadata actually *was* parameters i could send into this tool, so it was easy to ensure that metadata was in there.

now, on to the MP3 format.  sigh.  what i need is a tool that will enable me an WMV or MP4 input and extract the audio-only track into an MP3 file.  i found all sorts of tools that will do this, but none that can be automated from a command-line.  this is my last resulting automation problem for now.  if anyone has tips on how to do this, i'll send you a prize :-).

now on to decisions.  while we'll have several formats to offer viewers, we also want to have feeds with enclosures for readers.  that brings us to a decision.  podcast formats for enclosures only enable one enclosure.  so, dear reader, what do we choose?  i figure we offer a WMV, MP4 and MP3 feed uniquely...but then which format do we supply?  is this a lame question?  the widescreen will be the best quality, but will it render okay on all devices/readers?  what do you choose?

anyhow, a fun little project i finished (except for the MP3 -- prize awaiting) and thought i'd share how it is accomplished.  one little command "encodepipe.exe <file> <title> <desc> <author> <album>" and a few short minutes later i have all the formats i need.  the next step is to automate upload to a content delivery network so i don't have to pick and choose uploading!

we just posted the schedule for our trip, so if you want to subscribe to the feed to be notified when we'll start putting out some content, that would be cool.  real-time updates via twitter as well.  see you on the road!

| Comments

for some reason my xbox live wasn't connecting for the longest time, which is fine as sadly i rarely use it.  but with my new love for guitar hero 3, i wanted to see if there were any new/free tracks i could download.  i suspect my problems are with using OpenDNS as since i started using them i noticed the problem.  anyhow, it started working again so i was able to take a look.

i noticed a free 'holiday' track of we three kings that was available for download.  it's a pretty good track for GH3 as well as a nice twist on a holiday classic.  after playing it i wanted to see if the guitar track itself was available for download on iTunes (i think it is great how the GH3 site integrated with iTunes so people could immediately navigate to the tracks on the game).

well, it wasn't available, but i researched and found the composer's site, steve ouimette.  what is interesting to find out is he's the same composer who created 7 other tracks for GH3 that you would have thought were just created by the original artists.  from steve's site i learned that he created: Rock You Like A Hurricane, School’s Out, Barracuda, Talk Dirty To Me, Cities On Flame With Rock And Roll, Hit Me With Your Best Shot, and Mississippi Queen, and the electric version of The Devil Went Down To Georgia.

in a QA post he talks about TDWDTG track...i particularly like the question of "Isn’t it blasphemy to destroy a classic song like TDWDTG?"  interesting stuff to learn about some of the history behind the music of games, etc.  glad to have found steve's site.  reminds me of some of the discussions with steve ball and the audio behind operating systems...but admittedly this is funner.

| Comments

i'm very frustrated now.  the title says it all.  let me explain my scenario, tell you how i found out the problem and give you the suggested workaround from apple.

the setup

i have a few phones laying around, and being the gadget geek i am, i do have an iphone that i've been using lately.  my setup consists of syncing my iphone to my pc laptop for contacts/calendering and to my macbook for music/photos/movies/podcasts.  it is a simple setup really, and allows me to keep my work machine for work (i don't have music or anything on my work machine) and my home machine attached to my media storage libraries, etc. 

everything was running smoothly even though it is quite annoying to cable sync -- i wish over-the-air was possible.

my situation

i missed an appointment the other day.  i was on the road and didn't get an alert.  it wasn't a terribly important appointment (meeting a friend for lunch), but still i was embarrassed.  my memory is not that of an elephant and i rely on technology to keep my sane.  when i returned to my laptop i noticed that my appointment was on my calendar, but it wasn't synced to my phone.  weird.  i began investigating.

i did a few tests.  i restored the phone to factory default.  i did a one-way force sync on calendars.  i synced under a new profile.  i re-installed itunes.  i did everything the troubleshooting steps said to do, which by the way included an arrogant statement of basically asking me to uninstall any other add-on that i might have and that the itunes helper should be the only add-on enabledto work.  alas, a few appointments were still not syncing.  and then i looked closer and noticed a trend.

the appointments that were not syncing were meeting requests sent from other people.

i first thought 'holy crap, no meeting requests from other people at all are being synced' but that was not the case.  i could isolate it to meeting requests from other people but it was so sporadic that it was driving me insane.  so i began to research as best i can and then i resorted to calling support...something i did not want to do, but even us techies must admit we need help...and i exhausted all my knowledge.

i called support and was told the wait time was 5 minutes.  after a few minutes i was disconnected.  argh.  immediately my phone rang though and it was apple support apologizing for the disconnect and wanting to continue the case.  very good customer service!

i explained the situation to the agent and he began to search.  he pointed me to a knowledge base article explaining the problem and asked me to read it and if i'd follow the steps while he held on.  after browsing it i immediately saw this was not going to end well for me.

the problem (confirmed)

turns out that itunes/iphone will only sync calendar items that are explicitly of a certain message class (IPM.Appointment).

a message class is basically a template.  there are defaults and then developers who create add-ons can inherit from those templates and provide added functionality.

after following the steps i could see that the two appointments that i was testing with indeed were of type "IPM.Appointment.Location" and that i immediately realized my issue. 

the agent explained that i'd have to manually alter the message class type to get them to sync. 

what?!

he further explained that this was a problem in outlook and i should contact microsoft.  um yeah, i really don't think it is a problem with outlook.  the template is the same.  i then discovered that what is happening here had nothing to do with MY add-ins, but rather the add-ins installed on the meeting organizer.  the ".Location" is indicative that someone has installed the Live Maps add-in for outlook.  it adds value to the appointment template.  but what is happening for me is that when THAT PERSON sends me a meeting request, it uses their template.  i as the end user don't see that of course (unless i follow the proposed apple steps) and thus i'm left baffled.  since i cannot control what someone sending me has on their computer, i, the apple end user am screwed.

i was then pointed to a microsoft knowledge base article explaining how to alter the message class.  okay, so let me get this straight...you want me to change my view in outlook to identify these items, then create a VBScript application to change them?  or better yet, USE A WORD DOC TO CHANGE OUTLOOK ITEMS (shame on microsoft for this one, yes that is actually the recommendation and provided template).  clearly none of this is passing the mother-in-law test.  i'm tech savvy and understand all this, but let us put this into layman situations. 

see jane.  see jane have an appointment.  see it on jane's calendar.  see jane sync.  no appointment.  see jane verify appointment exists on her calendar.  see jane confused why it is not syncing and no errors or warnings presented.

see dick.  see dick ignore that an item is on a calendar and not alert the user that there might be items that didn't sync because their developers are too lazy to figure out it is a base template and they can still get the information.  apple, don't be a dick.

so my workflow now suggested by apple went from: plug in iphone and sync to plug in iphone; sync; scan calendar to see what didn't sync; see items not syncing and verify their message class; change message class using a word doc; re-sync.  holy flippin poo man.  this is ridiculous.  seriously.  people write bad software (microsoft is not immune to this either), but when you see a problem and hear complaints, rectify it please.

the solution

sadly, the process in the word doc actually works well.  i just couldn't see myself using a word doc to do this all the time.  i took a cue from scott hanselman and took the vba code in the word doc and just imported it into an overall outlook macro.  here's what i did.

first:  download the word doc -- as lame as that implementation is, the code is already there for you with a good analyze tool as well.

second:  open the doc and get to the visual basic editor (developer tab...if you don't see this you'll have to change your office settings to show the developer tab).  in the editor expand the forms section and choose export to file:

third:  open outlook and go to the tools menu, then choose macros.  create a macro (type a name and click create):

forth:  right click on the project and choose import file...point to the form you exported in step 2 above.  it should import no problems (or at least 'worked on my machine'):

fifth:  in the subroutine for the macro add this code (this assumes you kept the same form name):

frmMessageClass.Show

i implemented the rest by customizing my toolbar and pointing to the macro, so now i have a button on my toolbar that i can run:

and when i run it i get the functionality i need:

note in the picture above there is an 'analyze' button -- i highly recommend you use this first if you are having this problem.  the result of analyze will show you what is in the dialog to the right of it (i already cleaned mine up so it only shows the good stuff) and if you had any non IPM.Appointment items, they would show here...then you could clean them up.  the screenshot above shows the setting you would want (make sure it says "IPM.Appointment" and not the default of this tool "IPM.Appointment." [note trailing dot] -- i fixed this in my macro code after import and you could too).

when you run the tool it will change things appropriately and you can resync.  if you use this tool you will not need to change your views, etc. as recommended by the apple article.  so if you are running into this problem, make your voice heard.  add your comments to this thread, vote this thread useful and see if we can get support people to listen.  you can also submit a bug report (as i did) to the iphone feedback area.

i'm sure there will be some that argue this isn't a bug.  i'll vehemently disagree...as those arguing that will be geeks that understand the technical situation.  step back and put yourself in an end user shoe's -- you see it on your calendar and it ain't syncing -- and no errors.  i think even the tech would admit that hey, even if it is by design, you should alert the user to what didn't get synced and why.  the solution should be fairly simple.  instead of:

if (messageClass == "IPM.Appointment")

do

if (messageClass.contains("IPM.Appointment") {
  try {
    // sync and ensure elements are there
  }
  catch {
    // log to file to alert user after done
  }
}

c'mon apple, fix this.