| 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.


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

I’ve not hidden my love affair for Netflix both as a consumer and as a Silverlight developer and how they’ve implemented the technology.  Long before the instant watch came to the desktop and the XBOX, there were a lot of folks wanting the Netflix experience on their Windows Media Center boxes and extenders.  One such person was Anthony Park (who is now with Netflix as of this writing), who picked up a the MyNetflix media center plugin a while back.

Well, today Netflix officially has a Media Center solution for their customers.  I just got done firing my media center machine up and started the process of getting Netflix on the box.  It showed up under the Program Library and I followed the minimal instructions to get it working…restarted Media Center (not the machine) and boom, done.  I love how the branded experience of their application matches their online app as well as their overall brand identity very well:

Netflix Media Center Login

After logging in, I’m able to view my Instant Queue, DVD Queue, genre’s and new releases. 

Netflix Media Center DVD Queue

Once I find a movie from one of the categories not in my queues, I can even add it at that point!  Nice!

Netflix Media Center Add to Queue

Once you choose to watch a movie through the experience, you’ll notice something familiar – yep, that’s Silverlight powering the playback of the Netflix Instant Watch feature in Media Center.  Nice.  This is a great continuum story for the platform and for Netflix to be able to re-use their platform and their custom implementations in various areas: online (browser), XBOX, and Media Center.  Very cool to see this.  I still think the coolest feature of Instant Watch is how all the experiences are synchronized…I can pause anywhere and pick up another medium (XBOX) and start where I left off – awesome.

NOTE: It looks like at this time it is Media Center for Vista only and Windows 7 RC machines are not enabled.  Additionally, I am guessing that the same licensing rules apply for the media content, so probably only US customers. 

Kudos to the Netflix team for enabling this feature and extending their reach to where (and how) people want to view their media.  If you want to figure out how to enable it on your media center machine, you can watch this video (just try to disregard the creepy mitten-wearing hands…odd): Get Netflix on your Media Center.

| Comments

Our team is working on a new design for the Silverlight Community Site and one of those aspects includes a new media experience for the online media/video portions of the Silverlight, Windows Client, and ASP.NET sites.  Today we rolled out the new experience first on the Windows Client community site.  It’s a subtle update but hopefully a welcome one.

The older experience was a basic playback experience and was a Silverlight 1.0 application.  This update brings a few new things, but primarily is a Silverlight 2 player with some fun features to engage the viewer.  We’ve added some new features:

  • Increased the viewing area – most usually went full-screen anyway, but now the default capability is larger for better initial viewing
  • Commenting feature in the media – the viewer can now add a comment in the timeline.
  • Sharing features – enabling emailing a link to the video from the player, also enabling embedding a video.

Like I said, it’s a subtle upgrade but we’re planning on expanding this in the future as well to list related videos and some other features.  Here’s a couple screenshots of the commenting feature:

in-line comment popup

As the timeline approaches a comment a small popup appears with the comment.  Navigation allows you to cycle through the timeline-based comments.  This feature can be turned off using the toggle to the right of the timeline.  To add a comment, you can hover over the timeline position marker and create a comment at that point.

adding comment in-line

Like I said, nothing earth shattering and yes, you’ve seen these features on other popular media sites before.  We liked them and wanted to bring them to our sites.  I just wanted to point out some of the newness to the site for Windows Client and what will be soon brought to the other online properties.  Try it out and tell us what you think.

| Comments

One of the things that we have heard in feedback is the need to surface more end-to-end samples.  While the atomic learning videos/samples are great as are more in-depth tutorials, there is still a desire to see how to package all these things up into a single application.  Seeing from start to finish helps absorb the learning process and see how these atomic things fit together and interoperate.

Today we added the “application corner” to the Silverlight community site.  Yes, I know the name is less than exciting, but hey I’m not a super cool marketing person with unlimited imagination!  The goal here is to provide an area with samples of more full-featured applications that put these different practices in implementation as applications.  No, this will not be an area for a multitude of media-only applications, although I think we will show some more full-featured media solutions as some examples.  This is something that I had talked about before in the forums and had been promising to people for a while and what got some people angry at me.  I could expand on the reasons for delays, but won’t as that doesn’t matter.  What matters to me is the initiative has started.

The goal of the Application Corner is to demonstrate various different types of line-of-business applications and techniques.

NOTE: I hate the term “line of business” – isn’t any application to any organization their line-of-business application?

Here’s my plan over the next short-term.  Ideally your feedback will help iterate the longer term:

    • AdventureOps – yes, people hate sample databases.  I’m not sure why.  They are full of data, have good relationships defined, etc.  I’m going to use AdventureWorks as the base for the first application (and perhaps more) as it has a good base of data and scenarios.  This first iteration of this application will be an attempt to create a Silverlight front-end dashboard for managing certain data (first just the HR system).  We’ll examine integrating with ASP.NET application services (part 1) and then look at techniques we can do today for page navigation and working with data services (part 2)
    • M-V-VM (and other patterns) – seems to be a popular pattern these days and we’ll explore writing an application that uses this pattern in Silverlight and what we can learn from it.  We’ll pull in experts from the community to demonstrate what they’ve done and provide samples.
    • Gaming – not on the gambling sense, but in the casual games sense.  What is a game loop, best practices for animation, etc.
    • Media – we’ve seen the Olympics, we’ve seen the original “Top Banana” site – how were these done, how can we use media in our applications effectively?
    • Continuum – how can you provide some application capabilities for Silverlight and bring them forward to a more full/rich client application?

So that’s the plan.  I know the part 1 of AdventureOps may be old hat to some of you Silverlight pros, but stick with me (and leave feedback).  I look forward to iterating on this section of the site for your benefit.  What do you want to see?

Be sure to subscribe to this blog for updates as the applications get added to the site!

| Comments

I received a comment regarding the new Expression Encoder SP1 Silverlight player templates and how they can be used within your own application.  Right now the templates appear to stand on their own.  That’s only because the output of an Encoder action will be an encoded file, the template you chose (XAP) and an HTML page to host the Silverlight player application.

But what if you already have an application and are trying to integrate media playback within it?  How can you take advantage of the Encoder templates, but just drop them in your existing application?  Let’s take a quick look.

Let’s say we have an existing application.  For the sake of this post, let’s just show some primitive controls and display a Button and TextBox within some StackPanel layouts:

   1: <UserControl
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     x:Class="ExPlayer.Page"
   5:     Width="640" Height="480" 
   6:     >
   8:     <Grid x:Name="LayoutRoot" Background="White">
   9:         <StackPanel Orientation="Horizontal">
  10:             <StackPanel Height="Auto" Width="309">
  11:                 <Button Content="Button"/>
  12:                 <TextBox Text="TextBox" TextWrapping="Wrap"/>
  13:             </StackPanel>
  14:             <StackPanel Height="Auto" Width="250" x:Name="MediaArea"/>
  15:         </StackPanel>
  16:     </Grid>
  17: </UserControl>

Now we want to add a media player using the Encoder templates to our application in the StackPanel labeled MediaArea.  First, we need to get the media player from the template as a control.  Easy enough since the source code for the Expression Encoder Silverlight 2 templates are included.  Browse to your install directory for Expression (usually C:\Program Files\Microsoft Expression\Encoder\Templates\en\) and pick the Silverlight 2 template you want to use.  NOTE: This is only for Silverlight 2 templates, so be sure not to get frustrated at me :-) -- you’ve been forewarned.  I’ll choose the SL2Standard template.  Notice within that folder there is also a Source folder.  Within there is an ExpressionPlayer folder and associated C# source code project.  Open that project in Visual Studio 2008.

Now build the project.  Done.  You now have a control you can use.  Here’s how we’ll do it.

Going back to our own application we need to add a reference to the ExpressionPlayer.dll and MediaPlayer.dll we just built.  Go ahead and do that in your Silverlight application by choosing Add Reference and then pointing to the assembly location.  Now we need to inform our XAML that we’ll be using this control.  Of course if you add these controls to your Visual Studio 2008 toolbox you can drag-and-drop them onto the XAML code surface and it will append the xmlns attribute for you, or we can add it ourself:

   1: <UserControl
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     x:Class="ExPlayer.Page"
   5:     Width="640" Height="480" 
   6:     xmlns:expression="clr-namespace:ExpressionMediaPlayer;assembly=ExpressionPlayer"
   7:     xmlns:ExpressionMediaPlayer="clr-namespace:ExpressionMediaPlayer;assembly=MediaPlayer"
   8:     >

I’ve called my namespace “expression” and “ExpressionMediaPlayer” and you can see I’ve pointed (actually Visual Studio’s Intellisense did it all for me) the namespace to the assembly I just referenced.  Now we can use the control.  Here’s the XAML for adding it to my application and adding a media file that is in my applicaiton:

   1: <UserControl
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     x:Class="ExPlayer.Page"
   5:     Width="640" Height="480" 
   6:     xmlns:expression="clr-namespace:ExpressionMediaPlayer;assembly=ExpressionPlayer"
   7:     xmlns:ExpressionMediaPlayer="clr-namespace:ExpressionMediaPlayer;assembly=MediaPlayer"
   8:     >
  10:     <Grid x:Name="LayoutRoot" Background="White">
  11:         <StackPanel Orientation="Horizontal">
  12:             <StackPanel Height="Auto" Width="309">
  13:                 <Button Content="Button"/>
  14:                 <TextBox Text="TextBox" TextWrapping="Wrap"/>
  15:             </StackPanel>
  16:             <StackPanel Height="Auto" Width="250" x:Name="MediaArea">
  17:                 <expression:ExpressionPlayer Width="242" Height="177">
  18:                     <expression:ExpressionPlayer.Playlist>
  19:                         <ExpressionMediaPlayer:PlaylistItem MediaUrl="Lake.wmv"/>
  20:                     </expression:ExpressionPlayer.Playlist>
  21:                 </expression:ExpressionPlayer>
  22:             </StackPanel>
  23:         </StackPanel>
  24:     </Grid>
  25: </UserControl>

Of course you can interact with it via code as well, but getting the control in your app is easy once you know these steps.  Now my application has a fully-functional media playback without me writing any code and being able to integrate it within my existing application.  I might want to change the style of course to fit my application’s experience, but dropping in a few style attributes wouldn’t be that difficult…and I an always make that a part of the Encoder template as well!  Here’s the “after” screenshot of it in play:

You get full functionality out of the player…with one exception.  I’ve noticed that the fullscreen option doesn’t act the same as if the player was the only app.  To be honest I haven’t looked at what it would take to do that,but remember that now the media player is a part of a bigger app and isn’t the application itself.  So “fullscreen” mode is a part of the container Silverlight application and not just the media player…something to watch out for if you expected your embedded media player now to automatically have the same fullscreen functionality.