Wednesday, October 22, 2008

ooTunes, internet radio, last.fm, and airtunes

A recent request from a potential ooTunes user was whether ooTunes could be used to listen to windows media streams in iTunes, so that the audio could be played on their home stereo using airtunes (and the apple airport express).  Well, I'd been meaning to make a way to listen to a stream from ooTunes remotely but in iTunes, which would solve that issue, so I spent some time last night doing just that.  

Basically, you click the little "info" link* (the  at the beginning of the track in ooTunes), then click the "Play in iTunes" link which will download a .pls playlist which can be opened in iTunes to play that stream!

The latest version of ooTunes will let you listen to any of the internet radio stations compatible with ooTunes right through iTunes (even remotely) so you can pipe them to your stereo connected by Airtunes!

In fact, it will probably even let you listen to whatever stations you want (this includes last.fm streams, internet radio, etc.) on your appleTV as well (though I don't have one to test it on!).  If you have one, test it out and let me know if it works or not!

* You may also see the little "$" link there in the top corner.  That's so you can search for the lowest price on that song or album, if you were interested in buying it.  One day I hope to have that working with the currently playing song on a station, but the makers of that technology have been pretty unresponsive to requests from a little guy to license it.  Just FYI.

Tuesday, October 21, 2008

Some bugs fixed...

I finally took some time to fix some longstanding issues with ooTunes.  The biggest one is that now you can tell ooTunes to use a local address when you're on the same network as your ooTunes server... which is a) much faster and b) should work with routers that are dumb and can't connect to a local computer using a remote address).  It's off by default but if ooTunes detects that your router isn't working with local addresses, it's turned on automatically.  You can manually turn it on/off on the "remote access" preference page.  There are also some optimizations to speed up logging in, and more info about your current ip (both local and remote) on the "remote access" preference page.  If nothing else  I hope it will prevent lots of support emails asking "why can I connect from my iPhone, but not locally"? 

Create Genius Playlists in iTunes on the go using ooTunes ... thank you Applescript

I've been taking a break from the pain of getting a firewall-avoiding/live-video-playing ooTunes iPhone app finished to spend some time on the ooTunes Media Server.  I've fixed a number of longstanding bugs and added a few new features.

One major new feature is that (as promised) I've finally added Genius Playlist creation to ooTunes!  What this means is that when you're listening to a song on random in ooTunes, and you decide that you want to make a Genius playlist from it, it's as easy as dragging that track to the "Genius" playlist.  Well, I say it's "that easy", but that's not exactly correct (and it wasn't trivial to get working):

Caveat Emptor -- or six
  1. This is currently only working in a regular browser (not on the iPhone yet).
  2. This only works on Mac's (sorry PC, you've had a rough couple of years, I know).
  3. This only works on Mac's when you turn on "User interface scripting" also known as "Support for Assistive Devices"... 
  4. It requires iTunes to be brought to the front and may even have message boxes popup in iTunes on your ooTunes server computer.
  5. It may not work on non-english versions of iTunes. 
  6. You have to already have the track in your iTunes library, and "Genius" has to be updated since that track was added.

So why all the caveats?
1. Because I haven't come up with a clean way to do drag/drop on the iPhone like I can in a regular browser
2. I have to use AppleScript to create the Genius Playlist in iTunes, there's no equivalent commands for the windows COM interface to iTunes.
3 and 4. There is no menu command or shortcut key or AppleScript Library entry in iTunes to allow access to the "Start Genius" feature of iTunes... it's almost like... oh, I don't know... Apple DOESN'T WANT YOU TO BE ABLE TO DO THIS?!?... so it's fragile (could stop working with the next version of iTunes) and annoying (the Applescript has to simulate clicking a mouse on the button, which means iTunes has to be at the front, and a message box may appear if the track can't be used to create a Genius playlist).  
5. The button can't be found by anything but name so it's not going to work for other languages unless "Start Genius" is never translated to your language in iTunes.
6. Unfortunately, you can't create a genius playlist from any old song... I was hoping to make it so you could find music you DO own that's similar to music you DON'T own (ie, from pandora, last.fm, seeqpod, radio, etc.)  But you simply can't.  You must have the track in your iTunes library already, and you have to do the "Update Genius" after adding any new tracks, if you want them to work with the Genius Playlists.

So, there you go, I've made good on my promise, now try it out (although you can't in the demo cause I don't have enough legal tracks there for iTunes to make any suggestions... sorry!)

So there you have it, it'll only get better (hopefully).

Oh, and so no-one has to reinvent the wheel, here's a download of the applescript ooTunes uses (more or less).  Feel free to do what you like with it but, but please leave the comments in there and the copyright notice with the link to this post! 


(*

(C) Steven Woolley 2008, as part of ooTunes Media Server (see ootunes.com)

  

How to create an Genius Playlist in iTunes using applescript.  More info and issues discussed here:

http://ootunes.blogspot.com/2008/10/create-genius-playlists-in-itunes-on-go.html 

Feel free to use this code however you'd like, but please keep this comment intact so I hear feedback, etc., since I'd like to hear about updates, improvements, suggestions, etc. 

*)


set pid to "4B62C662B53FFB94" -- set this to your track's persistent id... or use some other method to get your "seed" track


set app_name to "iTunes"

tell application "iTunes"

try

with timeout of 10 seconds -- don't want to hang forever if, for instance, iTunes has a dialog box already open

set cur_track to (first track of playlist named "Music" whose persistent ID is pid)

reveal cur_track

end timeout

on error theError

return "Can't find track!"

end try

end tell


tell application "System Events"

tell process app_name -- this needs Assistive Devices support enabled see: System Preferences -> Universal Access -> "Enable access for assistive devices"

try

set b to first button of window app_name whose help is "Start Genius." -- that's about the only way to get the "Start Genius" button, but it will break on non-english versions (I'm guessing)

tell application "iTunes"

activate

end tell

click b

with timeout of 1 second -- this is a hack to "test" if the "can't create genius playlist..." dialog opened.  If it does, we'll timeout (hopefully) and then close the dialog so it doesn't freeze future applescript interaction

tell application "iTunes"

activate

end tell

end timeout

return ""

on error theError

if theError is "iTunes got an error: AppleEvent timed out." then

key code 36 -- close the dialog 

return "Can't create genius list from that track!"

end if

return theError

end try

end tell

return "Error creating genius playlist!"

end tell

Friday, October 10, 2008

Why you can not play live video on the iPhone

The question I and many others have about the iPhone is: 

Can we make it play live video?  

I'm not talking about prerecorded video (that's doable, and really easy, ooTunes does that already, along with tons of other apps, including the youtube app).  Also, I'm talking about this in the context of an officially released app in the app store, built using the iPhone SDK.  The problem has already been solved using the jailbreak toolchain, but doesn't work for official apps because of 3 and 5 below, and 4 below is still very applicable. 

I'd be ecstatic if someone would prove me wrong on any of this... so put in your comments, please!

So, nothing's impossible, but it's extraordinarily difficult for the following reasons:

  1. There is nothing built in to the iPhone to handle true rtsp streaming
  2. The only formats available to be played on the built in video player are .mov, x264 or mpeg4 all of which require a frame index in the moov atom at the beginning in order to be played as they're downloaded.  Unfortunately, for a live stream such information is simply not available until the encoding is finished.
  3. Should you desire to build your own video player, the SDK doesn't give access to the private frameworks that apple uses for video decoding or the raw framebuffer that a player would need to have fast display.  There are workarounds (that are suboptimal) but no one can show source thanks to the developer NDA that is still in effect. (technically this comment is probably out of line, though I've gleaned it from reading/searching the web, NOT from the sdk). 
  4. Without proper hardware optimized methods, you're going to be a battery hog, and probably limited in resolution.
  5. Now, imagining that all of the above is somehow overcome (which I am sure it has been by some)... now the question is: "Will apple accept your app into the store?"  It is against the terms of most (if not all) service provider's agreements to stream live anything (and video isn't going to be low bandwidth).

So, the options are:
  • Figure out a way to encode live video with predictable metadata (fixed frame boundaries and packet sizes)
  • Write your own video player from scratch to decode whatever type of stream you want (remember 3, 4 and 5 above)
  • File feature enhancements and otherwise petition Apple in hopes that they'll add support for RTSP or change their SDK to allow for this.
  • Encode in short snippets and try to play them back to back seamlessly, with no breaks... this way you almost have live video (delayed by the amount of time to encode and start playing a single snippet).
  • Give up on it?

So for ooTunes, I've learned the hard way all of the above.  My latest efforts have been in porting the ogg theora video codec.  I've gotten as far as decoding, but can't yet display fast enough due to 3 and 4 above.  It's questionable due to 5 whether it's even worth anyone's efforts.

Hope that helps someone, and I also hope that someone can prove me wrong on some of the negative stuff above. 

Wednesday, October 1, 2008

Woohoo! Apple finally drops NDA on iPhone development!

See mac rumors note here:
Apple Drops iPhone Non Disclosure Agreement (NDA)

This is a wonderful thing for ooTunes!  I'm about halfway to getting video working (live video that is) but one of the libraries needed didn't have source available due to the NDA.  Now I don't have to reinvent the wheel!  Example code will be much more available, etc.  now if only I had 26 hours a day!  

Had to say something... after the meanish stuff I've said in the past.