Filesize von remote Datei ermitteln

vandamp

Erfahrenes Mitglied
Hallo,

habe da ein kleines Problem welches mich quält.
Ich versuche die Dateigröße von YouTube-Videos zu ermitteln.

Habe es mittlerweile schon auf ein paar arten versucht, leider klappt es nicht bekommen entweder -1 oder eine Fehlermeldung zurück .

variante 1(die billige)
PHP:
ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9');
echo filesize("http://v7.lscache7.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dYRVlSVl9FSkNNOF9RTFpB&fexp=906324%2C901801&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1290978000&key=yt1&signature=2C67A89B9040AC109D5352028D9D58C741A5FEC1.43AA29318C2FA5CF46D2A3E0916C8E1EE1E38341&factor=1.25&id=8568eb3135971f6f");
Ergibt leider einen stat failed error.

Variante 2(curl)
PHP:
$url = "http://v7.lscache7.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dYRVlTVl9FSkNNOF9RTVpJ&fexp=906324%2C901801&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1290988800&key=yt1&signature=92CF4E0DB03330098833631BFFEB1656C0061D0A.A3274FEECBDC66FD14BDA5E53FBAB8FF45B3989C&factor=1.25&id=8568eb3135971f6f&";   
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE);
curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE);

$chGetSizeInfo = curl_getinfo($ch);
curl_close($ch);
var_dump($chGetSizeInfo);
hier kommt zwar ein großes Array, aber download_content_length"] führt leider zu float(-1)

Variante 3(die aufwändige)
PHP:
$test =remote_file_size("http://v7.lscache7.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dYRVlSVl9FSkNNOF9RTFpB&fexp=906324%2C901801&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1290978000&key=yt1&signature=2C67A89B9040AC109D5352028D9D58C741A5FEC1.43AA29318C2FA5CF46D2A3E0916C8E1EE1E38341&factor=1.25&id=8568eb3135971f6f");
echo '<br> test '.$test.'<br><br>';
function remote_file_size ($url){ 
	$head = ""; 
	$url_p = parse_url($url); 
	$host = $url_p["host"]; 
	if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$host)){
		// a domain name was given, not an IP
		$ip=gethostbyname($host);
		if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$ip)){
			//domain could not be resolved
			return -1;
		}
	}
	$port = intval($url_p["port"]); 
	if(!$port) $port=80;
	$path = $url_p["path"]; 
	//echo "Getting " . $host . ":" . $port . $path . " ...";

	$fp = fsockopen($host, $port, $errno, $errstr, 20); 
	if(!$fp) { 
		return false; 
		} else { 
		fputs($fp, "HEAD "  . $url  . " HTTP/1.1\r\n"); 
		fputs($fp, "HOST: " . $host . "\r\n"); 
		fputs($fp, "User-Agent: http://www.example.com/my_application\r\n");
		fputs($fp, "Connection: close\r\n\r\n"); 
		$headers = ""; 
		while (!feof($fp)) { 
			$headers .= fgets ($fp, 128); 
			} 
		} 
	fclose ($fp); 
	//echo $errno .": " . $errstr . "<br />";
	$return = -2; 
	$arr_headers = explode("\n", $headers); 
	// echo "HTTP headers for <a href='" . $url . "'>..." . substr($url,strlen($url)-20). "</a>:";
	// echo "<div class='http_headers'>";
	foreach($arr_headers as $header) { 
		// if (trim($header)) echo trim($header) . "<br />";
		$s1 = "HTTP/1.1"; 
		$s2 = "Content-Length: "; 
		$s3 = "Location: "; 
		if(substr(strtolower ($header), 0, strlen($s1)) == strtolower($s1)) $status = substr($header, strlen($s1)); 
		if(substr(strtolower ($header), 0, strlen($s2)) == strtolower($s2)) $size   = substr($header, strlen($s2));  
		if(substr(strtolower ($header), 0, strlen($s3)) == strtolower($s3)) $newurl = substr($header, strlen($s3));  
		} 
	// echo "</div>";
	if(intval($size) > 0) {
		$return=intval($size);
	} else {
		$return=$status;
	}
	// echo intval($status) .": [" . $newurl . "]<br />";
	if (intval($status)==302 && strlen($newurl) > 0) {
		// 302 redirect: get HTTP HEAD of new URL
		$return=remote_file_size($newurl);
	}
	return $return; 
}

Google bringt leider auch keine Lösung, die Youtube-api liefert auch nicht die Dateigröße.
Es muss irgendwie funktionieren, wenn man sich so video converter Seiten anschaut, dort ist ja immer eine Fortschrittsanzeige, um diese zu erstellen wird doch die Dateigröße benötigt.
Vielleicht hat sich ja hier schon mal jemand damit beschäftigt wär echt nice.
 
Man könnte vielleicht die etwas geschummelte Variante nehmen, bei welcher man die Auflösung und die Dauer einer Sequenz ermitteln und diese dann mit einem vorher durch manuelles Herunterladen erfahrenen Faktor multipliziert. So würde ich es zumindest lösen, wenn ich nicht weiter wüsste. Ist zumindest ein Näherungswert.
 
hmm, danke für die Antwort.

also das mit er Auflösung und mit einer Sequenz könnte klappen.
Wie meinst du, "diese dann mit einem vorher durch manuelles Herunterladen erfahrenen Faktor multipliziert". Wie sollte an diesen Faktor kommen?

Ein näherungswert wäre ja schon ok.
 
Ganz einfach: du versuchst es einfach mal selber, also du versuchst wie lange es bei dir dauert, wenn du es auf deinen Rechner runterlädst, am besten mehrmals, dann natürlich bei verschiedenen Auflösungen und misst dabei die Zeit. Daraus kannst du dann einen Durchschnittswert ermitteln.
 
Soweit ich mich erinnern kann ist die maximale Bitrate bei youtube ~2MBit, kann also zwischen 0 und 2MBit variieren UND youtube gibt die Datenrate nur vor, wenn die Videodatei aufgrund falschen Codecs transkodiert werden muß. Ist die Datei schon im richtigen Format, wird Nix geändert und die Datenrate des Erstellers wird übernommen. Und jener kann seine Datei mit 200kBit/Video und 128kBit Audio kodiert haben oder auch 600kBit Video und 64kBit Audio. Will lediglich sagen, die Schätzung ist so grob, dass sie Nix wert ist.

ABER:
eine 320x240 Datei wird (wenn sie transkodiert wird) bei ~250kBit landen.
eine 640x480 Datei bei ~300kBit.
in HQ dann grob *2.
etc pp (Das Netz weiss mehr)

Tatsache ist auch, die reelle Filesize hast Du erst, wenn Du es runtergeladen hast. Eine andere Möglichkeit gibt es nicht - und ich gehe davon aus, dass das nicht der Sinn der Sache ist.

Links:
http://www.homevideo101.com/creating-videos-for-youtube/
http://blog.jimmyr.com/High_Quality_on_Youtube_11_2008.php
http://adterrasperaspera.com/blog/2010/05/24/approximate-youtube-bitrates

mfg chmee
 
Zurück