public IObservable <IReadOnlyList <SoundCloudSong> > GetSongsAsync(string searchTerm = null)
        {
            searchTerm = searchTerm ?? string.Empty;

            IObservable <IReadOnlyList <SoundCloudSong> > retrievalFunc = Observable.Defer(() =>
                                                                                           requestCache.GetOrFetchObject(BlobCacheKeys.GetKeyForSoundCloudCache(searchTerm), () =>
                                                                                                                         string.IsNullOrWhiteSpace(searchTerm) ? GetPopularSongs() : SearchSongs(searchTerm), DateTimeOffset.Now + CacheDuration));

            return(retrievalFunc.Catch <IReadOnlyList <SoundCloudSong>, Exception>(ex =>
                                                                                   Observable.Throw <IReadOnlyList <SoundCloudSong> >(new NetworkSongFinderException("SoundCloud search failed", ex)))
                   .Select(x => x.Where(y => y.IsStreamable || y.IsDownloadable).ToList())
                   .Do(SetupSongUrls));
        }