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
Webmakerij schreef op 18.09.2009 19:10

[...]
goed tijd voor actie
1) curl kan de content length zelf bepalen dus geef die liever maar niet mee!
2) ik zou die timeout niet meegeven
3) misschien kan je beter eerste je file nog even moooooven naar een echte locatie


Hmm, 2 en 3 kan ik doen geen probleem. Maar stap 1 snap ik dan niet helemaal. Want als ik content-lenth helemaal weg zet krijg ik nog steeds dezelfde error
Peter je Mocht 2 berichten plaatsen was na 42 uur geweest ;)
De melding is dat er geen lengte-header wordt meegestuurd.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld? 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.
Eddy Erkelens schreef op 23.09.2009 08:04
De melding is dat er geen lengte-header wordt meegestuurd.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld? 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.


Nee, want:
14.13 Content-Length

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
Content-Length = "Content-Length" ":" 1*DIGIT

An example is
Content-Length: 3495
Ik stuur al mijn request richting youtube, picassa zonder heel de content-length header. Gewoon niet opgeven en ik heb nergens last;

Doe eens met curl_getinfo je headers enzo opvragen.
Kan het zijn dat je:

CURLOPT_INFILESIZE nog moet gebruiken?

<?php
curl_setopt($ch, CURLOPT_INFILESIZE,$size);
?>

Ik zie hem namelijk wel in de HTTP header staan die size, dus dat moet goed zijn. Misschien moet je die nog aan de CURL gegevens/ opties meegeven. (misschien dat de volgorde wat uit (kan) maken, maar dat lijkt me eigenlijk niet)
maurice schreef op 23.09.2009 06:23
Peter je Mocht 2 berichten plaatsen was na 42 uur geweest ;)


Geen idee waar jij het over hebt, mja ik wink je wel terug ;)

Anyway
Eddy Erkelens schreef op 23.09.2009 08:04
De melding is dat er geen lengte-header wordt meegestuurd.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld?


Dan zou ik op zijn minste een error van google verwachten dat de size verkeerd is of iets dergelijks, op het moment krijg ik namelijk een error waarbij de hele content-length mist betreft google..

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


Webmakerij schreef op 23.09.2009 09:53
Ik stuur al mijn request richting youtube, picassa zonder heel de content-length header. Gewoon niet opgeven en ik heb nergens last;

Doe eens met curl_getinfo je headers enzo opvragen.


Wat voor requests zijn het? Bestanden ophalen of uploaden? Want ophalen lukt me wel, maar het uploaden is een rommel. (Als het een upload script is o.i.d. mag ik het dan heel misschien even koekeloeren hoe jij het in elkaar heb gezet :D)

By the way mijn curl_getinfo ziet er heel erg geweldig mooi uit :)

Array
(
[url] => http://gdata.youtube.com/action/GetUploadToken
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => 0
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0
[redirect_time] => 0
)

Robert_Deiman schreef op 23.09.2009 09:55
Kan het zijn dat je:

CURLOPT_INFILESIZE nog moet gebruiken?

<?php
curl_setopt($ch, CURLOPT_INFILESIZE,$size);
?>

Ik zie hem namelijk wel in de HTTP header staan die size, dus dat moet goed zijn. Misschien moet je die nog aan de CURL gegevens/ opties meegeven. (misschien dat de volgorde wat uit (kan) maken, maar dat lijkt me eigenlijk niet)


Net geprobeerd, geen verandering. In me wireshark zie ik wel dat het mooi verzonden word :( maar ik weet het niet of ik mis echt een belangerijke ding of google wil mij niet accepteren. Ik denk dat ik dit script ook eens in HTTP ga construeren hoewel ik al me hoop kwijt ben en geen zin meer heb... :P
Downloaden en uploaden en neem dat mag niet want het is gemaakt als commercieel product.

Overigens zeggen foutmeldingen van Google nooit zo heel veel. Zo krijg je bij Picasa de melding dat de geuploaden content is strijd is met de tos als je een verkeerde user id meegeeft.

Zet je wireshark of network monitor aan en kijk eens of er idd geen content-length wordt gestuurd.

Reageren