Hoi iedereen,

Ik ben bezig om een youtube api te gebruiken zonder Zend :))

Google zelf geeft een prachtige uitleg waar ik geen hol van snap omdat het niet wil werken :(
Uploading the video file

Het is me echter wel gelukt om een Authenticatie code op te vragen met een SID en een LSID code, maar het uploaden doet echt heel erg vaag en raar.

Mijn code tot nu:
<?php
[...]
function upload() {
$files = $_FILES;
$name = $files['file']['name'];
$type = $files['file']['type'];
$size = $files['file']['size'];
$tmp_nm = $files['file']['tmp_name'];

$data = array('name' => 'Foo', 'file' => '@'.$tmp_nm);

print_r($_POST);
print_r($_FILES);

echo 'Size '.$size;

$headers = array(
"Authorization: AuthSub token=".$this->auth,
"GData-Version: 2",
"X-GData-Key: key=".$this->dev_key,
"Content-length: ".$size,
"API_XML_request"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/action/GetUploadToken');
curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_REFERER,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($ch, CURLOPT_HEADER,0);

if($this->get_info)
{
$this->curlget_info($ch);
}
$output = curl_exec($ch);

print_r($output);

return $output;
}
[...]
?>

Output 1:

[ignore]
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => 0016.png [type] => image/png [tmp_name] => D:\wamp\tmp\php178D.tmp [error] => 0 [size] => 4216 ) ) Size 4216
[/ignore]
Google
Error

Length Required

POST requests require a Content-length header.


Output 2:

[ignore]
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => Film.wmv [type] => video/x-ms-wmv [tmp_name] => D:\wamp\tmp\php11D3.tmp [error] => 0 [size] => 96589 ) ) Size 96589
[/ignore]
Google
Error

Length Required

POST requests require a Content-length header.

Ik hoop dat iemand me ermee kan helpen
Ik heb het probleem geprobeerd te construeren in sockets en fsockopen.. maar nog steeds hetzelfde output :(

Sockets:
<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";


define('SERVER', $server);
define('PORT', 80);
define('PATH', $script);
define('_EOL', "\r\n");

$sock = socket_create(AF_INET, SOCK_STREAM, 0);
if (!$sock) {
echo 'Fatal error: Couldn\'t create socket';
exit;
}

if (!socket_connect($sock, SERVER, PORT)) {
echo 'Fatal error: Couldn\'t connect';
exit;
}


$request = null;
$request .= 'POST ' . PATH . ' HTTP/1.0' . _EOL;
$request .= 'Host: ' . SERVER . _EOL;
$request .= 'Authorization: AuthSub token="'.$this->auth.'"'. _EOL;
$request .= 'GData-Version: 2 '._EOL;
$request .= 'X-GData-Client: '.$this->sid._EOL;
$request .= 'X-GData-Key: key='.$this->dev_key._EOL;
$request .= 'Content-Length: 5' . _EOL;
$request .= 'Content-Type: application/atom+xml; charset=UTF-8'._EOL;
$request .= 'API_XML_request'._EOL;
$request .= 'Connection: close' . _EOL;
$request .= _EOL;

echo '<pre>';
print_r($request);
echo '</pre>';

if (!socket_send($sock, $request, strlen($request), 0)) {
echo 'Fatal error: Couldn\'t send request';
exit;
}

$output = null;
$buffer = null;
while (socket_recv($sock, $buffer, 1024, 0) != 0) {
$output .= $buffer;
}

print_r($output);
?>

Output:

HTTP/1.0 411
Length Required Content-Type: text/html;
charset=UTF-8
Content-Length: 1363
Date: Wed, 30 Sep 2009 13:38:57 GMT
Server: GFE/2.0 X-XSS-Protection: 0

Google Error
Length Required
POST requests require a Content-length header.


En fsockopen:
<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";

$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];

$headers= "POST ".$script." HTTP/1.1\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";

fwrite($sock, $headers);
fwrite($sock, $szParams);

$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}

print_r($output);
}
?>
zelfde output :((
Je definieert nu zelf je regeleinde, maar probeer het eens met PHP_EOL?
Nog steeds hetzelfde output :(

wat ik terug krijg:
HTTP/1.1
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0

Google
Error
Length Required
POST requests require a Content-length header.
Volgens mij heb ik hem:

API_XML_REQUEST moet je vervangen :P

Kijk eens naar het voorbeeld ;)
Hij geeft gewoon de error verkeerd aan...

Edit:
Er staat: This value contains an atom field with information about the video...
ok snap er niets van, Verklaar u nader a.u.b. :)
Peter schreef op 23.09.2009 12:12

[quote='Eddy Erkelens schreef op 23.09.2009 08:04']
Moet er niet een 'kb' achter oid?

Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.


Ik ben er bijna 2 weken mee bezig heb dat natuurlijk goed overgenomen, maar als je twijfels hebt.. Controleer dan maar voor mij :))
Link[/quote]

Dat kan ik dus inderdaad ook niet bevestigen. Het staat nergens bij. Vandaar dat het te proberen is.
Nu zie ik wel dat het in bytes moet, dus zal het wel zonder 'b' erachter zijn. Maar dat zal je ongetwijfeld geprobeerd hebben.
Peter schreef op 03.10.2009 18:11
Nog steeds hetzelfde output :(

wat ik terug krijg:
HTTP/1.1
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0

Google
Error
Length Required
POST requests require a Content-length header.


Dus... je geeft de HTTP-header mee.
En als je DIRECT daarna de length meegeeft (wat de code ook weergeeft)?
Dus:

<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";

$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];

$headers= "POST ".$script." HTTP/1.1\r\n";
// hier dus de lengte direct al, voor de rest!
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";

fwrite($sock, $headers);
fwrite($sock, $szParams);

$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}

print_r($output);
}
?>

Het is het proberen waard, toch?

Gelieve Niet Bumpen:

Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.

SanThe.

Reageren