2012-11-07 24 views
9

मैं यहां बताए अनुसार, एक वीडियो PHP में कर्ल के साथ यूट्यूब एपीआई v3 का उपयोग कर अपलोड होगा: https://developers.google.com/youtube/v3/docs/videos/insertकर्ल और एपीआई v3 का उपयोग कर

मैंने इस समारोह

function uploadVideo($file, $title, $description, $tags, $categoryId, $privacy) 
{ 
    $token = getToken(); // Tested function to retrieve the correct AuthToken 

    $video->snippet['title']   = $title; 
    $video->snippet['description'] = $description; 
    $video->snippet['categoryId'] = $categoryId; 
    $video->snippet['tags']   = $tags; // array 
    $video->snippet['privacyStatus'] = $privacy; 
    $res = json_encode($video); 

    $parms = array(
     'part' => 'snippet', 
     'file' => '@'.$_SERVER['DOCUMENT_ROOT'].'/complete/path/to/'.$file 
     'video' => $res 
    ); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/youtube/v3/videos'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $parms); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$token['access_token'])); 
    $return = json_decode(curl_exec($ch)); 
    curl_close($ch); 

    return $return; 
} 

लेकिन यह यह

stdClass Object 
(
    [error] => stdClass Object 
     (
      [errors] => Array 
       (
        [0] => stdClass Object 
         (
          [domain] => global 
          [reason] => badContent 
          [message] => Unsupported content with type: application/octet-stream 
         ) 

       ) 

      [code] => 400 
      [message] => Unsupported content with type: application/octet-stream 
     ) 

) 

फ़ाइल एक एमपी 4 है।

कोई भी मदद कर सकता है?

उत्तर

0

दुर्भाग्य से, हम पीएचपी उपलब्ध से यूट्यूब API v3 के अपलोड का एक विशिष्ट उदाहरण अभी तक नहीं है, लेकिन मेरी सामान्य सलाह है:

  • उपयोग cURL के बजाय PHP client library
  • ड्राइव एपीआई के लिए this example पर अपना कोड बेस करें। चूंकि यूट्यूब एपीआई v3 अन्य Google एपीआई के साथ एक आम एपीआई इंफ्रास्ट्रक्चर साझा करता है, फाइलों को अपलोड करने जैसी चीजों को करने के लिए उदाहरण विभिन्न सेवाओं में बहुत समान होना चाहिए।
  • किसी विशिष्ट मेटाडेटा के लिए Python example पर एक नज़र डालें जिसे YouTube v3 अपलोड में सेट करने की आवश्यकता है।

सामान्य तौर पर, गलत बातें अपने cURL कोड के साथ का एक बहुत देखते हैं, और मैं सभी कदम यह इसे ठीक करने के ले जाएगा के माध्यम से चल नहीं सकता, जैसा कि मैं का उपयोग कर PHP क्लाइंट लाइब्रेरी एक बेहतर है लगता है विकल्प। यदि आप आश्वस्त हैं कि आप curl का उपयोग करना चाहते हैं तो मैं विशिष्ट मार्गदर्शन प्रदान करने के लिए किसी और को स्थगित कर दूंगा।

+0

धन्यवाद! मेरा प्रयास कुछ हल्का बनाना था, लेकिन मैं आधिकारिक Google लाइब्रेरी – genna

+0

को Google_YoutubeService.php में आज़माउंगा, मुझे उस सम्मिलित विधि को कॉल करने के लिए कोई फ़ंक्शन नहीं मिल रहा है जिसकी मुझे आवश्यकता है। सभी विधियां लिस्टिंग के लिए हैं (चैनल, प्लेलिस्ट, वीडियो ..) मुझे लाइब्रेरी के एक नए संस्करण की प्रतीक्षा करनी है? – genna

+0

मैंने – genna

16

अद्यतन संस्करण: अब कस्टम अपलोड यूआरएल और अपलोड प्रक्रिया के साथ मेटाडेटा भेजना।

  1. , एक कस्टम अपलोड स्थान हासिल

    सबसे पहले करने के लिए एक अपलोड यूआरएल के लिए एक पोस्ट अनुरोध बनाने:

    "https://www.googleapis.com/upload/youtube/v3/videos" 
    

    आप 2 हेडर भेजने की आवश्यकता होगी पूरी प्रक्रिया 2 अनुरोधों की आवश्यकता है:

    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" 
    "Content-type": "application/json" 
    

    आप 3 मानकों भेजने की जरूरत है:

    "uploadType": "resumable" 
    "part": "snippet, status" 
    "key": {YOUR_API_KEY} 
    

    और तुम अनुरोध शरीर में वीडियो के लिए मेटाडाटा भेजने की आवश्यकता होगी:

    { 
         "snippet": { 
          "title": {VIDEO TITLE}, 
          "description": {VIDEO DESCRIPTION}, 
          "tags": [{TAGS LIST}], 
          "categoryId": {YOUTUBE CATEGORY ID} 
         }, 
         "status": { 
          "privacyStatus": {"public", "unlisted" OR "private"} 
         } 
        } 
    

    इस अनुरोध को आप हेडर में एक "स्थान" क्षेत्र के साथ जवाब मिल जाना चाहिए से।

  2. फ़ाइल भेजने के लिए कस्टम स्थान पर POST।

    अपलोड करने के लिए आप 1 हेडर की जरूरत है:

    "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" 
    

    और अपने डेटा/संस्था के रूप में फ़ाइल भेजें।

यदि आप के माध्यम से कैसे अपने ग्राहक से काम करता है आप वे पुन: प्रयास करने की सलाह देते हैं देखेंगे यदि आप कोड 500, 502, 503, या 504. की त्रुटियों लौटा दिए जाते हैं जाहिर है आप पुनः और एक के बीच एक प्रतीक्षा अवधि होती है चाहता हूँ पढ़ रीट्रीज़ की अधिकतम संख्या। यह हर बार मेरे सिस्टम में काम करता है, हालांकि मैं curl के बजाय अजगर & urllib2 का उपयोग कर रहा हूं।

इसके अलावा, क्योंकि कस्टम अपलोड स्थान इस संस्करण पुन: प्रारंभ योग्य सक्षम अपलोड किया जाता है, हालांकि मुझे लगता है कि जरूरत के लिए अभी तक की

,।

+1

I पोस्ट अपलोड अनुरोध के साथ पैरामीटर सेट करने में भी समस्या थी, क्या आपने अभी भी मेटा डेटा अपलोड करने और अपडेट करने के लिए 2 अनुरोधों का उपयोग किया था? – hsafarya

+0

अब मैं नहीं हूं। मैंने इसके लिए अपनी विधि को और अधिक स्थिर करने के लिए बदल दिया है और मैं अपनी विधि को नई विधि में संपादित कर दूंगा। –

+0

इस नई विधि पर कोई अपडेट? – Mikepote

0

एक अजगर स्क्रिप्ट:

# categoryId is '1' for Film & Animation 
# to fetch all categories: https://www.googleapis.com/youtube/v3/videoCategories?part=snippet&regionCode={2 chars region code}&key={app key} 
meta = {'snippet': {'categoryId': '1', 
    'description': description, 
    'tags': ['any tag'], 
    'title': your_title}, 
    'status': {'privacyStatus': 'private' if private else 'public'}} 

param = {'key': {GOOGLE_API_KEY}, 
     'part': 'snippet,status', 
     'uploadType': 'resumable'} 

headers = {'Authorization': 'Bearer {}'.format(token), 
      'Content-type': 'application/json'} 

#get location url 
retries = 0 
retries_count = 1 
while retries <= retries_count: 
    requset = requests.request('POST', 'https://www.googleapis.com/upload/youtube/v3/videos',headers=headers,params=param,data=json.dumps(meta)) 
    if requset.status_code in [500,503]: 
     retries += 1 
    break 

if requset.status_code != 200: 
    #do something 

location = requset.headers['location'] 

file_data = open(file_name, 'rb').read() 

headers = {'Authorization': 'Bearer {}'.format(token)} 

#upload your video 
retries = 0 
retries_count = 1 
while retries <= retries_count: 
    requset = requests.request('POST', location,headers=headers,data=file_data) 
    if requset.status_code in [500,503]: 
     retries += 1 
    break 

if requset.status_code != 200: 
    #do something 

# get youtube id 
cont = json.loads(requset.content)    
youtube_id = cont['id'] 
0

मैं निम्नलिखित खोल स्क्रिप्ट का उपयोग कर YouTube पर मेरा चैनल पर कोई वीडियो अपलोड करने में सक्षम है।

#!/bin/sh 

# Upload the given video file to your YouTube channel. 

cid_base_url="apps.googleusercontent.com" 
client_id="<YOUR_CLIENT_ID>.$cid_base_url" 
client_secret="<YOUR_CLIENT_SECRET>" 
refresh_token="<YOUR_REFRESH_TOKEN>" 
token_url="https://accounts.google.com/o/oauth2/token" 
api_base_url="https://www.googleapis.com/upload/youtube/v3" 
api_url="$api_base_url/videos?uploadType=resumable&part=snippet" 

access_token=$(curl -H "Content-Type: application/x-www-form-urlencoded" -d refresh_token="$refresh_token" -d client_id="$client_id" -d client_secret="$client_secret" -d grant_type="refresh_token" $token_url|awk -F '"' '/access/{print $4}') 

auth_header="Authorization: Bearer $access_token" 
upload_url=$(curl -I -X POST -H "$auth_header" "$api_url"|awk -F ' |\r' '/loc/{print $2}'); curl -v -X POST --data-binary "@$1" -H "$auth_header" "$upload_url" 

अपनी कस्टम चर मान पाने के लिए this समान प्रश्न का संदर्भ लें।