Question

I am trying to get itunes song previews to play in my app. I have found some other questions like this but none of the solutions have worked for me. I am already signed up with the Affiliate program that apple has. Here are some of the things I have tried:

This got me the itunes preview URL that I am trying

     NSUInteger numberOfResults = 200;
     NSString *searchString = @"AC/DC";

     NSString *encodedSearchString = [searchString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     NSString *finalSearchString = [NSString stringWithFormat:@"https://itunes.apple.com/search?term=%@&entity=song&limit=%u",encodedSearchString,numberOfResults];

     NSURL *searchURL = [NSURL URLWithString:finalSearchString];

     dispatch_queue_t iTunesQueryQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,  kNilOptions);

     dispatch_async(iTunesQueryQueue, ^{

         NSError *error = nil;
         NSData *data = [[NSData alloc] initWithContentsOfURL:searchURL options:NSDataReadingUncached error:&error];

         if (data && !error) {
             NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

             NSArray *array = [JSON objectForKey:@"results"];
             NSLog(@"Array is:%@",array);

         }
     });

This plays nothing

    NSURL *url = [NSURL URLWithString:[_backgroundPreviewList objectAtIndex:randomPreview]];

    NSData *_objectData = [NSData dataWithContentsOfURL:url];
    NSError *error;

    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:_objectData error:&error];
    audioPlayer.numberOfLoops = 0;
    audioPlayer.volume = 1.0f;
    [audioPlayer prepareToPlay];

    if (audioPlayer == nil)
    {
        NSLog(@"%@", [error description]);
    }
    else
    {
        [audioPlayer play];
    }

This also played nothing

    AVPlayer* aPlayer = [AVPlayer playerWithURL:url];
    [aPlayer play];

I even tried this that didn't work

    MPMoviePlayerController* player = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [player play];

If anyone has done this can they let me know how to play the songs.

Was it helpful?

Solution 2

I have got it working. One of the things I changed is I took that specific class out of ARC to make sure things were staying around. Here is the code I am using now

    NSURL *url = [NSURL URLWithString:@"URL"];

    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL:url];
    NSLog(@"The url is: %@", url);
    if(_player)
    {
        [_player release];
    }
    _player = [[AVPlayer playerWithPlayerItem:playerItem] retain];

    [_player play];

    _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;

Where _player is an AVPlayer object

OTHER TIPS

This is released and working using MPMoviePlayerController, which I believe is the recommended approach for the streaming previews. Depending on what you are trying to do, you might have to work through some steps to enable play in the background. Good luck. p.s. if you get the AVPlayer working there are more docs available with solutions for background play see Technical QA doc 1668 from Apple

{

self.songPreview = [[MPMoviePlayerController alloc] init];

self.songPreview.movieSourceType = MPMovieSourceTypeStreaming;

/// set your URL from wherever you are getting it

[self.songPreview setContentURL:self.previewArtWorkButton.currentPreviewURL];
[self.view addSubview:self.songPreview.view];

/// i have set this next property to hidden because i am controlling volume and play programmatically

[self.songPreview.view setHidden:YES];

/// i have this next property set to No because I am using another trigger to play the /// song and not auto play after the buffering has completed

[self.songPreview setShouldAutoplay:NO];

[self.songPreview prepareToPlay];

}

/// later i call the play method

[self.songPreview play];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top