Upload và play file mp3 với Google Drive SDK

1. Enable Google Drive API

Truy cập đến link này , sau đó tạo hoặc chọn 1 project có sẵn và click continue

Screen Shot 2016-12-14 at 11.47.00 AM.png

Ở trang Add credentials to your project, chọn Cancel.

Ở trang Credential, chọn Tab OAuth consent screen, chọn Email addressProduct name. Nhấn Save.

Qua lại Tab Credentials, click Create credentials và chọn OAuth client ID.

Screen Shot 2016-12-14 at 3.00.23 PM.png

Chọn iOStên, bundle ID và nhấn Create

Screen Shot 2016-12-14 at 3.01.21 PM.png

Sau đó API sẽ cung cấp cho chúng ta 1 clientID dùng để truy cập sau này.

2. Install Google SDK và kết nối đến tài khoản Google

Trong bài hướng dẫn này, mình sẽ bỏ qua phần install Google SDK và tính năng đăng nhập đến tài khoản Google. Các bạn có thể tham khảo tại đây

3. Get danh sách nhạc

Đầu tiên, bạn cần kéo các file nhạc mp3 vào project

Screen Shot 2016-11-09 at 9.27.35 PM.png

Khi đã thêm các bài nhạc vào project, khi project được build, các bài nhạc này sẽ có trong app của bạn trên device. Bạn cần gọi hàm để lấy chúng ra từ device local.

    musicPaths = [NSMutableArray new];

    NSString * resourcePath = [[NSBundle mainBundle] resourcePath];
    NSError * error;
    NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:resourcePath error:&error];

    for (NSString *item in directoryContents){
        if ([[item pathExtension] isEqualToString:@"mp3"]) {

            SongUploadObj *obj = [SongUploadObj new];
            obj.filename = item;
            obj.path = [NSString stringWithFormat:@"%@/%@",resourcePath,item];
            [musicPaths addObject:obj];
        }
    }

Mỗi object được thêm vào list sẽ chứa tênđường dẫn của mp3 file.

4. Upload mp3 file

GTLServiceDrive là cổng kết nối đến Google Drive khi bạn đã link đến tài khoản.

Your View Controller

#import "GTLDrive.h"

@interface YourViewController ()
@property (nonatomic, strong) GTLServiceDrive *service;
@end
...

- (void)viewDidLoad {
    [super viewDidLoad];

    self.service = [[GTLServiceDrive alloc] init];
    self.service.authorizer = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName clientID:kClientID clientSecret:nil];

}

Các files trong Drive API được hiện thị bởi class GTLDriveFile bao gồm metadata và các thuộc tính file trên Drive. Nội dung của file phải được fetch về hoặc upload lên.

Để upload file, bạn cần chỉ định metadata cho GTLDriveFile và content cho GTLUploadParameters

    NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:obj.path];
    GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithFileHandle:file MIMEType:@"audio/"];

    GTLDriveFile *metadata = [GTLDriveFile object];
    metadata.name = obj.filename;

    GTLQueryDrive *query = [GTLQueryDrive queryForFilesCreateWithObject:metadata uploadParameters:uploadParameters];

    GTLServiceTicket *ticket = [self.service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFile *updatedFile, NSError *error) {

    }];

Khi upload finish thì trả ra 1 block với GTLDriveFile nếu success hoặc 1 NSError nếu fail.

Khi excute 1 query sẽ tương ứng với 1 GTLServiceTicket được tạo ra. Dựa vào ticket này bạn có thể lấy được progress upload trong khi upload.

[ticket setUploadProgressBlock:^(GTLServiceTicket *ticket, unsigned long long totalBytesWritten, unsigned long long totalBytesExpectedToWrite) {
   NSLog(@"totalBytesWritten=%llu totalBytesExpectedToWrite=%llu", totalBytesWritten, totalBytesExpectedToWrite);
   }];

Chú ý:

  • Để upload 1 file vào 1 folder, bạn cần tạo folder trước khi upload file.
  • Các file trên Drive có thể trùng tên nhưng được phân biệt bởi identifier

5. Play mp3 file được upload

Sau khi upload succes sẽ trả về 1 file upload. Từ file này ta đã có thể play stream. Lưu ý bạn cần phải truyền vào identifier của file và accessToken khi kết nối đến API.

    GTMOAuth2Authentication *author = self.service.authorizer;
    NSString *strURL = [NSString stringWithFormat:@"https://www.googleapis.com/drive/v3/files/%@?alt=media&access_token=%@",data.identifier, author.accessToken];
    MPMoviePlayerViewController* vc = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:strURL]];
    vc.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
    vc.moviePlayer.shouldAutoplay = YES;
    [self presentMoviePlayerViewControllerAnimated:vc];
    [vc.moviePlayer play];