4

こんにちは、xcode で google-api ライブラリを使用して YouTube API からチャンネル オブジェクトをフェッチしようとしています。これは私が使用しているコードです:

    //youtubeService type is GTLServiceYouTube
    youtubeService = [[GTLServiceYouTube alloc] init];
    youtubeService.shouldFetchNextPages = YES;
    //auth is the object from the authentication callback 
    youtubeService.authorizer = auth;
    videoQuery = [GTLQueryYouTube 
    queryForChannelsListWithPart:@"RayWilliamJohnson"];
    videoQuery.maxResults = 20;

    youtubeTicket = [youtubeService executeQuery:videoQuery completionHandler:
^(GTLServiceTicket *ticket, id channel, NSError *error) {
                NSLog(@" %@ ", error.description);
                NSLog(@"WIN! : %@ ", channel);
                }];

これまでのところ、このエラーが発生しています:

エラー Domain=com.google.GTLJSONRPCErrorDomain Code=-32602 「操作を完了できませんでした。(RayWilliamJohnson)」 UserInfo=0x7532c40 {error=RayWilliamJohnson、GTLStructuredError=GTLErrorObject 0x7533d30: {メッセージ:"RayWilliamJohnson" コード:-32602 データ: [1]}、NSLocalizedFailureReason=(RayWilliamJohnson)}

何がこのエラーをスローしているのか分かりますか?

助けてくれてありがとう!

編集:単に「存在しない」クラスのドキュメントを読みました:P。同じアプローチに従う他の例も確認しました。

Edit2 :わかりました、次の変更を試しましたが、どれも機能しませんでした:(、クエリエクスプローラーで同じ例を使用して機能しました。

videoQuery.maxResults = 20;
videoQuery.q = @"RayWilliamJohnson";
videoQuery.type = @"channel";

/*tried setting the part without calling the query 
 method on GTLQueryYoutube but that did not work videoQuery.part = @"id";*/

videoQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id"];
//fetching only 20 items.
youtubeTicket = [youtubeService executeQuery:videoQuery completionHandler:
^(GTLServiceTicket *ticket, id channel, NSError *error) {
    NSLog(@" %@ ", error.description);
    NSLog(@"WIN! : %@ ", channel);
    }];

エラーは少し異なります。フィルターを指定したにもかかわらず指定していないということです。

Error Domain=com.google.GTLJSONRPCErrorDomain Code=-32602 "The operation couldn’t be completed. (No filter selected.)" UserInfo=0x8870250 {error=No filter selected., GTLStructuredError=GTLErrorObject 0x88707f0: {message:"No filter selected." code:-32602 data:[1]}, NSLocalizedFailureReason=(No filter selected.)}

Edit3 :わかりましたいくつか変更しました。最初に、単にそれらを削除するパラメーターを設定した後にクエリを初期化していたという愚かな間違いを犯していました。コードは次のようになります。

        youtubeService.authorizer = auth;
        videoQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id"];
        videoQuery.maxResults = 1;
        videoQuery.q = @"RayWilliamJohnson";
        videoQuery.type = @"channel";


        youtubeTicket = [youtubeService executeQuery:videoQuery
                         completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannel *channel,
                                             NSError *error) {
            NSLog(@" %@ ", error.description);
            NSLog(@"WIN! : %@ ", channel.description);
            }];

しかし、「フィルターが指定されていません」というエラーがまだ表示されます。これは、変数がどちらの方法でも設定されていないことを意味します...

Edit4:これを行うことができた非常に多くの金髪の瞬間の後、わかりました。それは私が初期化していたクエリオブジェクトでし。機能したコードは次のようになります。

youtubeService.authorizer = auth;       
videoQuery = [GTLQueryYouTube queryForSearchListWithPart:@"id"];
videoQuery.maxResults = 1;
videoQuery.q = @"RayWilliamJohnson";      
youtubeTicket = [youtubeService executeQuery:videoQuery
         completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannel *channel,
            NSError *error) {
            NSLog(@" %@ ", error.description);
            NSLog(@"WIN! : %@ ", channel.description);
            }];

そしてこの結果を提供しました:

2012-12-12 00:17:21.315 テスト[13099:c07] (ヌル) 2012-12-12 00:17:21.316 テスト[13099:c07] 勝つ! : GTLYouTubeSearchListResponse 0x727f6d0: {pageInfo:{totalResults,resultsPerPage} etag:""bm4JOKyioI0quSqrxEnI8H7snE4/A2tE7ag9HxUC5HxeD2vDlGNg5iM"" nextPageToken:"CAEQAA" kind:"youtube#searchListResponse" items:[1]}

助けてくれてありがとうジェフ

4

3 に答える 3

2
service = [[GTLServiceYouTube alloc] init];
service.shouldFetchNextPages = YES;
service.retryEnabled = YES;
service.APIKey = @"xxxxxxxx";

GTLQueryYouTube *query = [GTLQueryYouTube queryForSearchListWithPart:@"id,snippet"];
query.maxResults = 15;
query.q = YOUR_SEARCH_TEXT;
query.fields = @"items(id,snippet)";
query.order = @"viewCount";

[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
    if (!error) {
        for (GTLYouTubeVideoListResponse *videoInfo in object) {
            [youtubeList addObject:videoInfo.JSON];
        }
        NSLog(@"youtubeList count %lu",(unsigned long)youtubeList.count);
        NSLog(@"youtubeList %@",youtubeList);
        [self.tableView reloadData];
    } else {
        NSLog(@"%@", error);
    }
    -- i'm test this currently for pagination --
    GTLYouTubePlaylistItemListResponse *playlistItems = object;
    NSLog(@"playlistItems.nextPageToken %@",playlistItems.nextPageToken);
    NSLog(@"playlistItems.prevPageToken %@",playlistItems.prevPageToken);
    if(playlistItems.nextPageToken) {
        NSLog(@"new page!!!");
        query.pageToken = playlistItems.nextPageToken;
        [self requestYoutubeVideo:withText];
    } else {
        NSLog(@"No more pages");
    }
}];

`

于 2015-06-23T13:13:39.283 に答える
2

私は Objective-C プログラマーではないので、コードの変更方法について具体的にアドバイスすることはできませんが、一般的な問題は次のとおりです。

https://developers.google.com/youtube/v3/docs/channels/listに記載されている YouTube Data API v3channels.list()メソッドを呼び出しているようです

1 つの必須パラメーターは です。これが、メソッドが 1 つのパラメーターとして受け取るpartものだと思います。ドキュメントで説明されているように、またはのようなものに設定する必要があります。ueryForChannelsListWithPart()partidid,contentDetails

次に、追加のパラメーターを追加して、情報を取得しようとしているチャネルを API に伝える必要があります。さまざまなオプションは、ドキュメントの「フィルター」セクションにリストされています。

channels.list()API の v3 は、呼び出しで従来の YouTube ユーザー名を指定することをサポートしていません。id情報を取得するチャンネルの YouTube チャンネル ID に対応するパラメーターを受け取ります。これらは通常 の形式で、チャネル IDUC...の場合は です。(これは呼び出しで確認できます。API Explorer を使用した例を次に示します。)RayWilliamJohnsonUCGt7X90Au6BV8rf49BiM6Dgsearch.list()

channels.list() メソッドは実際には動画のリストを返さないことに注意してください。特定のチャンネルの最新の動画を取得する場合は、channels.list()呼び出しを行って対応するアップロード プレイリスト ID をcontentDetailsパーツか​​ら取得してから、playlistItems.list()呼び出しを行ってそのアップロード プレイリスト内の動画を取得する必要があります。Pythonでこれを行う例はありますが、Objective-C でのエンドツーエンドの例はまだありません。

于 2012-12-11T22:08:15.940 に答える
1

IDでチャンネルを見つける方法を探している人は、これを使用してください

GTLServiceYouTube *youTubeService = [[GTLServiceYouTube alloc] init];
youTubeService.APIKey = @"<YOUR_API_KEY>";

GTLQueryYouTube *channelsQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id,snippet,brandingSettings,contentDetails,invideoPromotion,statistics,status,topicDetails"];
channelsQuery.identifier = @"<CHANNEL_ID>";

[youTubeService executeQuery:channelsQuery completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannelListResponse *channelListResponse, NSError *error) {
    if (error == nil) {
        if (channelListResponse.items.count > 0) {
            GTLYouTubeChannel *channel = channelListResponse.items.firstObject;
            NSLog(@"Got youtube channel - %@", channel);
        } else {
            NSLog(@"Cannot find channels with id %@", channelsQuery.identifier);
        }
    } else {
        NSLog(@"Cannot get youtube channels - %@", error);
    }
}];
于 2014-06-15T14:10:08.427 に答える