问题描述
我需要使用 APi 将视频上传到 youtube.在 Youtube API 中可以吗?
I need to upload video to youtube using APi.Is it possible in Youtube API?
请举个例子
推荐答案
这个例子直接取自 官方 YouTube 数据 API 文档,并展示了如何执行以下功能:
This example is taken directly from the official YouTube Data API documentation, and shows how to perform the following functions:
- 它使用 API 的 channels.list 方法检索经过身份验证的用户频道的频道名称和缩略图.
- 它使用可恢复上传协议处理将视频上传到 YouTube.
- 通过设置part参数值为status,使用API的videos.list方法轮询上传视频的上传处理状态.
/*
Copyright 2015 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
var signinCallback = function (result){
if(result.access_token) {
var uploadVideo = new UploadVideo();
uploadVideo.ready(result.access_token);
}
};
var STATUS_POLLING_INTERVAL_MILLIS = 60 * 1000; // One minute.
/**
* YouTube video uploader class
*
* @constructor
*/
var UploadVideo = function() {
/**
* The array of tags for the new YouTube video.
*
* @attribute tags
* @type Array.<string>
* @default ['google-cors-upload']
*/
this.tags = ['youtube-cors-upload'];
/**
* The numeric YouTube
* [category id](https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.videoCategories.list?part=snippet®ionCode=us).
*
* @attribute categoryId
* @type number
* @default 22
*/
this.categoryId = 22;
/**
* The id of the new video.
*
* @attribute videoId
* @type string
* @default ''
*/
this.videoId = '';
this.uploadStartTime = 0;
};
UploadVideo.prototype.ready = function(accessToken) {
this.accessToken = accessToken;
this.gapi = gapi;
this.authenticated = true;
this.gapi.client.request({
path: '/youtube/v3/channels',
params: {
part: 'snippet',
mine: true
},
callback: function(response) {
if (response.error) {
console.log(response.error.message);
} else {
$('#channel-name').text(response.items[0].snippet.title);
$('#channel-thumbnail').attr('src', response.items[0].snippet.thumbnails.default.url);
$('.pre-sign-in').hide();
$('.post-sign-in').show();
}
}.bind(this)
});
$('#button').on("click", this.handleUploadClicked.bind(this));
};
/**
* Uploads a video file to YouTube.
*
* @method uploadFile
* @param {object} file File object corresponding to the video to upload.
*/
UploadVideo.prototype.uploadFile = function(file) {
var metadata = {
snippet: {
title: $('#title').val(),
description: $('#description').text(),
tags: this.tags,
categoryId: this.categoryId
},
status: {
privacyStatus: $('#privacy-status option:selected').text()
}
};
var uploader = new MediaUploader({
baseUrl: 'https://www.googleapis.com/upload/youtube/v3/videos',
file: file,
token: this.accessToken,
metadata: metadata,
params: {
part: Object.keys(metadata).join(',')
},
onError: function(data) {
var message = data;
// Assuming the error is raised by the YouTube API, data will be
// a JSON string with error.message set. That may not be the
// only time onError will be raised, though.
try {
var errorResponse = JSON.parse(data);
message = errorResponse.error.message;
} finally {
alert(message);
}
}.bind(this),
onProgress: function(data) {
var currentTime = Date.now();
var bytesUploaded = data.loaded;
var totalBytes = data.total;
// The times are in millis, so we need to divide by 1000 to get seconds.
var bytesPerSecond = bytesUploaded / ((currentTime - this.uploadStartTime) / 1000);
var estimatedSecondsRemaining = (totalBytes - bytesUploaded) / bytesPerSecond;
var percentageComplete = (bytesUploaded * 100) / totalBytes;
$('#upload-progress').attr({
value: bytesUploaded,
max: totalBytes
});
$('#percent-transferred').text(percentageComplete);
$('#bytes-transferred').text(bytesUploaded);
$('#total-bytes').text(totalBytes);
$('.during-upload').show();
}.bind(this),
onComplete: function(data) {
var uploadResponse = JSON.parse(data);
this.videoId = uploadResponse.id;
$('#video-id').text(this.videoId);
$('.post-upload').show();
this.pollForVideoStatus();
}.bind(this)
});
// This won't correspond to the *exact* start of the upload, but it should be close enough.
this.uploadStartTime = Date.now();
uploader.upload();
};
UploadVideo.prototype.handleUploadClicked = function() {
$('#button').attr('disabled', true);
this.uploadFile($('#file').get(0).files[0]);
};
UploadVideo.prototype.pollForVideoStatus = function() {
this.gapi.client.request({
path: '/youtube/v3/videos',
params: {
part: 'status,player',
id: this.videoId
},
callback: function(response) {
if (response.error) {
// The status polling failed.
console.log(response.error.message);
setTimeout(this.pollForVideoStatus.bind(this), STATUS_POLLING_INTERVAL_MILLIS);
} else {
var uploadStatus = response.items[0].status.uploadStatus;
switch (uploadStatus) {
// This is a non-final status, so we need to poll again.
case 'uploaded':
$('#post-upload-status').append('<li>Upload status: ' + uploadStatus + '</li>');
setTimeout(this.pollForVideoStatus.bind(this), STATUS_POLLING_INTERVAL_MILLIS);
break;
// The video was successfully transcoded and is available.
case 'processed':
$('#player').append(response.items[0].player.embedHtml);
$('#post-upload-status').append('<li>Final status.</li>');
break;
// All other statuses indicate a permanent transcoding failure.
default:
$('#post-upload-status').append('<li>Transcoding failed.</li>');
break;
}
}
}.bind(this)
});
};
相关的HTML, 和 JavaScript 文件(定义 MediaUploader 类).
The associated HTML, CSS and JavaScript file (defining the MediaUploader class).
可以在这里找到完整的 Fiddle.按照这些步骤创建项目并替换YOUR_CLIENT_ID_HERE
在 Fiddle 中使用项目中相应的客户端 ID.
A complete Fiddle can be found here. Follow these steps to create a project and replace YOUR_CLIENT_ID_HERE
in the Fiddle with the corresponding client id from the project.
关于 AngularJS,看看 this question 帮助您开始为 Angular 构建服务.
Regarding AngularJS, take a look at this question to help you get started building a service for Angular.
这篇关于使用 Javascript 在 Youtube APi 中上传视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!