J'essaie de télécharger une vidéo sur YouTube à l'aide de Google Apis Client Library pour Objective-C, J'utilise donnée ci-dessous le code mais il est continué à me donner cette erreur, j'ai essayé d'exécuter mon compte sur le projet YouTube Exemple de temps ici, il donne cette même erreur.
Quelqu'un peut-il me guider où est le problème. I Cochez la page YouTube Data API V3 est sur la page Services. P>
NSString *path = [[NSUserDefaults standardUserDefaults] objectForKey:@"MOVIEPATH"];
NSString *filename = [path lastPathComponent];
NSString *mimeType = [self MIMETypeForFilename:filename defaultMIMEType:@"video/mp4"];
NSError *eel=nil;
NSFileHandle *handle = [NSFileHandle fileHandleForReadingFromURL:[NSURL URLWithString:path] error:&eel];
NSLog(@"error is %@",eel);
if (!handle)
{
NSLog(@"Failed to open file for reading");
return;
}
GTLServiceYouTube *service = [[GTLServiceYouTube alloc] init];
service.authorizer = self.gTMOAuth2Authentication;
GTLUploadParameters *params = [GTLUploadParameters uploadParametersWithFileHandle:handle MIMEType:mimeType];
GTLYouTubeVideoSnippet *snippet = [GTLYouTubeVideoSnippet object];
snippet.title = @"Test title";
snippet.descriptionProperty = @"Test description";
snippet.tags = [NSArray arrayWithObjects:@"TestOne", @"TestTwo" ,nil];
snippet.categoryId = @"17";
GTLYouTubeVideoStatus *status = [GTLYouTubeVideoStatus object];
status.privacyStatus = @"private";
GTLYouTubeVideo *video2 = [GTLYouTubeVideo object];
video2.snippet = snippet;
video2.status = status;
GTLQueryYouTube *query = [GTLQueryYouTube queryForVideosInsertWithObject:video2 part:@"snippet,status" uploadParameters:params];
// Perform the upload
GTLServiceTicket *ticket = [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error)
{
if (error)
{
NSLog(@"ERROR: %@", error);
return;
}
NSLog(@"SUCCESS! %@; %@;", ticket, object);
}];
ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength)
{
NSLog(@"%lld / %lld", numberOfBytesRead, dataLength);
};
8 Réponses :
Désolé si je fais une hypothèse ici, mais j'avais la même erreur que vous, et il s'est avéré que la question était en réalité mon autorisateur. Assurez-vous que vous manipulez des erreurs avec authentification et appliquez l'AUTH au service Service.Autorizer CODE>. if (![self.youTubeAuth canAuthorize]) {
// ...
}
service.authorizer = auth;
Je suppose que vous devez activer l'API d'entraînement et conduire SDK à partir de l'onglet Services API P>
commuter les services pour le projet et réessayez. P>
Si les deux sont allumés, assurez-vous d'avoir défini "API_CONSOLE_PROJEJECT_ID": "xxxxxxxxxxxxxxxx" argument dans votre manifeste . p>
Les deux services sont sur?
Devrais-je activer Google Drive SDK et API-S pour le téléchargement YouTube aussi?
J'ai eu le même problème que vous (défaillance d'affirmation dans GTMHTTPUPLOadfetcher.m: 399) Tout en téléchargeant une vidéo sur YouTube. Je pose cela dans l'espoir de sauver quelqu'un d'autre quelques minutes de débogage.
Il s'est avéré que mon problème était un code ancien qui définit Apikey de GTLServiceYoutube dans Addition em> à l'utilisation de OAUTH2. DOH. P> {
"error": {
"code": 403,
"message": "Access Not Configured",
"data": [{
"domain": "usageLimits",
"reason": "accessNotConfigured",
"message": "Access Not Configured"
}]
},
"id": "gtl_1"
}
brillant. Set ApiKey à Nil corrige le problème. Merci moj
J'ai rencontré le même crash et découvrez une solution.
Il semble que le client reçoit également ce crash si la demande sous-jacente est une mauvaise demande, mais aucune information de réponse n'est explicitement fournie (mon autorisateur est valide et transmet le chèque avec la méthode Après avoir consulté la bibliothèque, j'ai découvert que définir le préprocesseur macro Les journaux sont stockés dans le dossier En cliquant sur ' journal de demande / réponse em>' Le journal suivant a été affiché dans mon cas. p> canaThorize code> comme RYANAN_IRL pointé sorti). strip_gtm_fetch_logging code > et en permettant la journalisation du httpfetcher code> quelque part dans le code p> gtmhttpdebuglogs code> à l'intérieur Le simulateur (quelque chose de similaire à / utilisateurs /
p> Response body: (201 bytes)
{
"id" : "gtl_1",
"error" : {
"message" : "Bad Request",
"code" : -32602,
"data" : [
{
"domain" : "youtube.video",
"reason" : "invalidTitle",
"locationType" : "other",
"location" : "body.snippet.title",
"message" : "Bad Request"
}
]
}
}
Comme je l'ai écrit, avec la ligne [gtmhttpfetcher Setloggingenabled: oui]; code>. Il suffit de le mettre dans l'application: DidfinishLanchingwithOptions: méthode dans l'Appdelegate.
@ALBERTEDODEBORTOLI Pouvez-vous partager l'endroit où vous avez ajouté ce code? Je suis confronté au même problème, mais la solution ne fonctionne pas. Pouvez-vous s'il vous plaît conseil?
Je l'ai trouvé d'ici, Google-YouTube -api-v3-iOS-App-Key-403-Error-Code P>
Fondamentalement, cela fonctionnera si nous utilisons une touche pour les applications de navigateur code> au lieu d'une touche pour iOS Apps code>. P>
Le problème était que je vous enregistre à partir d'un nouveau compte Gmail afin que je dois vous connecter au site YouTube et devez créer une chaîne avant que je puisse télécharger une vidéo sur YouTube. Alors maintenant, je peux télécharger des vidéos après avoir créé une chaîne YouTube. Mais comment puis-je gérer ce scénario pour d'autres utilisateurs, une idée p>
Je ne sais pas si quelqu'un a déjà trouvé la solution pour cela, mais voici ce que j'ai mis en œuvre (à Swift) pour éviter le crash de l'application: P>
première vérification de l'état de la chaîne YouTube à l'aide de: p>
Si la valeur du paramètre "ISLinked" n'est pas 0 dans la réponse, téléchargez uniquement la vidéo en utilisant p>
Sinon, demandez à l'utilisateur de relier d'abord le canal YouTube. P> gtlqueryyoyoutube.queryforcannelslistwithPart code> avec pièce définie sur "statut" p>
gtlqueryyoutube.queryforvideosinsertwithObject code> p>
GTLServiceYoutube * YouTube = [[GTLServiceYoutube Alloc] init]; youtube.apikey = @ "- My-Simple-API-Access-Key-"; // <- ligne fautive YouTube.Authorizer = [GTMOAUTHEVIEWCONTROLTOUCHTouch AuthorGoogleFromKeyChainforname: KeyChainitemname Clientide: Kyoutubeclientid ClientsCrêt: KyoutubeclientsCret]; P>
Il ne fonctionne pas sur le périphérique, il fonctionne sur simulateur
Ajouter un peu de code significatif
téléchargé mon code pour le téléchargement
Vous devrez peut-être définir des param .uploadlocessionURL = nil;
J'essaie exactement le même problème ici, j'essaie le service.Authorizer Solution ci-dessous, mais vous ne l'avez pas marqué comme une réponse. Avez-vous réussi à le faire fonctionner?
J'avais quitté ce travail et je n'avais pas vérifié, laissez-moi savoir si cela fonctionne pour vous alors je la marquerai comme une réponse correcte, merci
@Developer, je veux télécharger une vidéo avec une capacité de reprise. Pouvez-vous m'aider à ce sujet? (Je ne peux plus demander la question.) J'ai déjà fait le même code que le vôtre.
@Vats je n'avais pas fait de codage avec la capacité de reprise. Si vous aviez fait cela, veuillez laisser vos pensées dans les réponses