2012-06-02 27 views
1

我試圖以編程方式上傳視頻到YouTube。我選擇使用Node.js來完成任務。Node.js YouTube API上傳無法轉換視頻

我得到一個XML響應以及一個HTTP狀態代碼201,我看到視頻出現在視頻管理器中,但是視頻總是顯示「失敗(無法轉換視頻文件)」信息。

我可以通過他們自己的頁面上傳自己的上傳器上傳文件,並且沒有問題。我只需要上傳到一個帳戶,因此我爲該帳戶設置了OAuth2並存儲了刷新令牌。刷新標記是硬編碼的,儘管我用下面的變量替換它。

刷新標記本身是否需要刷新?

我的代碼:

var qs = require('querystring'), 
https = require('https'), 
fs = require('fs'); 

var p_data = qs.stringify({ 
client_id: myClientID, 
client_secret: myClientSecret, 
refresh_token: refreshTokenForAccount, 
grant_type: 'refresh_token' 
}); 

var p_options = { 
host: 'accounts.google.com', 
port: '443', 
method: 'POST', 
path: '/o/oauth2/token', 
headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Content-Length': p_data.length, 
    'X-GData-Key': myDeveloperKey 
} 
}; 

var file_path = process.argv[1] || "video.mp4"; 

var json = ""; 

var p_req = https.request(p_options, function(resp){ 
resp.setEncoding('utf8'); 
resp.on('data', function(chunk){ 
    json += chunk; 
}); 
resp.on("end", function(){ 
    debugger; 
    var access_token = JSON.parse(json).access_token; 
    var title="test upload1", 
     description="Second attempt at an API video upload", 
     keywords="", 
     category="Comedy"; 
    var file_reader = fs.createReadStream(file_path, {encoding: 'binary'}); 
    var file_contents = ''; 
    file_reader.on('data', function(data) 
    { 
     file_contents += data; 
    }); 
    file_reader.on('end', function() 
    { 
     var xml = 
      '<?xml version="1.0"?>' + 
      '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">' + 
      ' <media:group>' + 
      '  <media:title type="plain">' + title + '</media:title>' + 
      '  <media:description type="plain">' + description + '</media:description>' + 
      '  <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">' + category + '</media:category>' + 
      '  <media:keywords>' + keywords + '</media:keywords>' + 
      ' </media:group>' + 
      '</entry>'; 

     var boundary = Math.random(); 
     var post_data = []; 
     var part = ''; 

     part = "--" + boundary + "\r\nContent-Type: application/atom+xml; charset=UTF-8\r\n\r\n" + xml + "\r\n"; 
     post_data.push(new Buffer(part, "utf8")); 

     part = "--" + boundary + "\r\nContent-Type: video/mp4\r\nContent-Transfer-Encoding: binary\r\n\r\n"; 
     post_data.push(new Buffer(part, 'utf8')); 
     post_data.push(new Buffer(file_contents, 'binary')); 
     post_data.push(new Buffer("\r\n--" + boundary + "--\r\n\r\n", 'utf8')); 

     var post_length = 0; 
     for(var i = 0; i < post_data.length; i++) 
     { 
      post_length += post_data[i].length; 
     } 
     var options = { 
      host: 'uploads.gdata.youtube.com', 
      port: 443, 
      path: '/feeds/api/users/default/uploads', 
      method: 'POST', 
      headers: { 
      'Authorization': 'Bearer ' + access_token, 
      'X-GData-Key': myDeveloperKey, 
      'Slug': 'video.mp4', 
      'Content-Type': 'multipart/related; boundary="' + boundary + '"', 
      'Content-Length': post_length, 
      'Connection': 'close' 
      } 
     } 

     var req = https.request(options, function(res) 
     { 
      res.setEncoding('utf8'); 
      console.dir(res.statusCode); 
      console.dir(res.headers); 

      var response = ''; 
      res.on('data', function(chunk) 
      { 
       response += chunk; 
      }); 
      res.on('end', function() 
      { 
       console.log("We got response: "); 
       console.log(response); 

      }); 
     }); 

     for (var i = 0; i < post_data.length; i++) 
     { 
      req.write(post_data[i]); 
     } 

     req.on('error', function(e) { 
      console.error(e); 
     }); 

     req.end(); 
    }); 
}); 
}); 

p_req.write(p_data); 
p_req.end(); 

回答

2

的問題是文件被上傳。 此行:var file_path = process.argv[1] || "video.mp4";應該已經var file_path = process.argv[2] || "video.mp4";

注意的argv []爲絕對路徑的腳本正在運行,argv的[]是傳遞給腳本的第一個命令行參數。

當然,YouTube將無法轉換「視頻」,它根本不是視頻,而是腳本正在運行。