Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Felipe Florindo

Função para download de vídeo do YouTube não funciona no servidor

Recommended Posts

Boa tarde a todos!

 

Bem, depois de muita pesquisa e dias de trabalho, criei uma função que força o download de vídeos do YouTube. Funcionou muito bem até eu enviar para o servidor de hospedagem.

 

No XAMPP, funcionou perfeitamente sem erros e nem bugs, já no servidor ele não aceita fazer o download do vídeo. Na minha impressão precisa dar alguma permissão no ".htaccess" já que não existe erros no código em si.

 

Por exemplo: se eu tentar abrir um link para assistir, o Chrome me retorna a mensagem "O acesso à página da web foi negado".

 

Na função ele disponibiliza o link direto vídeo e um botão para forçar o download.

 

Aqui o link da função: http://www.felipecds.net/videotube/

 

Ele faz a busca do vídeo e retorna as informações perfeitamente, o problema é só pra forçar o download pelo servidor, pois no XAMPP que uso como servidor de teste, o download inicia normalmente e baixa o vídeo completo.

 

Desde já agradeço pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa! Como disse, é porque acho que o problema é com permissão. Mas vai que não é né rsrs

ai o código:

 

index.php

<?php
include_once('curl.php');
if(isset($_GET['url_video']) != ""){$url_video = $_GET['url_video'];}else{$url_video = "";}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//BR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pt-BR" xml:lang="pt-BR">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>VídeoTube - Baixe vídeos do YouTube online gratuítamente sem programas</title>
		
		<meta content='Aqui você pode baixar vídeos diretamente do youtube, sem a necessidade de instalar nenhum programa em seu computador! Faça downloads de seus vídeos preferidos direto em seu computador, para poder assistir offline. Downloads de videos do youtube, download online de videos, download do youtube, baixar videos do youtube grátis.' name='description'/>
		<meta name="keywords" content="baixar videos, baixar videos do youtube,baixar youtube,baixar online youtube,baixar do youtube,download de videos do youtube,download online youtube,baixar video do youtube rapido" />
		<meta property="og:image" content="imagens/logo.png" />

		
		<link href="css/style.css" rel="stylesheet" type="text/css" media="screen"/>
		<script src="js/jquery.js" type="text/javascript"></script>
		<script src="js/geral.js" type="text/javascript"></script>
	</head>
	<body>
		<img style="display:none;" src="imagens/carregando.gif" border="0" />
		<div id="corpo">
			<div id="logo">
				<a href="/videotube"><img src="imagens/logo.png" border="0" /></a>
			</div>
			<div id="adsense">
				<span style="display:none;">Aqui você pode baixar vídeos diretamente do youtube, sem a necessidade de instalar nenhum programa em seu computador! Faça downloads de seus vídeos preferidos direto em seu computador, para poder assistir offline. Downloads de videos do youtube, download online de videos, download do youtube, baixar videos do youtube grátis.</span>
				<script type="text/javascript"><!--
					google_ad_client = "ca-pub-1308173363502947";
					google_ad_host = "pub-1556223355139109";
					/* Bloco 728x90 */
					google_ad_slot = "0269933210";
					google_ad_width = 728;
					google_ad_height = 90;
					//-->
				</script>
				<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
			</div>
			<div id="form">
				<form id="download" action="" method="get">
					<input type="text" class="url_video" name="url_video" id="url_video" placeholder="URL de vídeo do YouTube" value="<?php echo $url_video;?>" />
					<input class="bt_acao" type="submit" name="acao" id="acao" value="Baixar" onclick="carregando();" />
					<div id="ilustracao">
						<img id="imagem_video" src="imagens/bg_video.png" border="0" />
					</div>
					<div id="titulo"><b>Exemplo:</b> http://www.youtube.com/watch?v=yo36OOYf9cU</div>
				</form>
			</div>
			<div id="resultados">
			<?php $pagina_ok = true; include "busca.php"; ?>
			</div>
		</div>
	</body>
</html>

 

busca.php

<?php
if(isset($pagina_ok) && (isset($_REQUEST['acao']) == 'Baixar' || isset($_REQUEST['acao']) == 'redireciona')){
	$resolucao[5]['formato'] = 'FLV'; $resolucao[5]['resolucao'] = '240p';
	$resolucao[6]['formato'] = 'FLV'; $resolucao[6]['resolucao'] = '270p';
	$resolucao[13]['formato'] = '3GP'; $resolucao[13]['resolucao'] = 'N/I';
	$resolucao[17]['formato'] = '3GP'; $resolucao[17]['resolucao'] = '144p';
	$resolucao[18]['formato'] = 'MP4'; $resolucao[18]['resolucao'] = '270p/360p';
	$resolucao[22]['formato'] = 'MP4'; $resolucao[22]['resolucao'] = '720p';
	$resolucao[34]['formato'] = 'FLV'; $resolucao[34]['resolucao'] = '360p';
	$resolucao[35]['formato'] = 'FLV'; $resolucao[35]['resolucao'] = '480p';
	$resolucao[36]['formato'] = '3GP'; $resolucao[36]['resolucao'] = '240p';
	$resolucao[37]['formato'] = 'MP4'; $resolucao[37]['resolucao'] = '1080p';
	$resolucao[38]['formato'] = 'MP4'; $resolucao[38]['resolucao'] = '3072p';
	$resolucao[43]['formato'] = 'WebM'; $resolucao[43]['resolucao'] = '360p';
	$resolucao[44]['formato'] = 'WebM'; $resolucao[44]['resolucao'] = '480p';
	$resolucao[45]['formato'] = 'WebM'; $resolucao[45]['resolucao'] = '720p';
	$resolucao[46]['formato'] = 'WebM'; $resolucao[46]['resolucao'] = '1080p';
	$resolucao[82]['formato'] = 'MP4'; $resolucao[82]['resolucao'] = '360p';
	$resolucao[83]['formato'] = 'MP4'; $resolucao[83]['resolucao'] = '240p';
	$resolucao[84]['formato'] = 'MP4'; $resolucao[84]['resolucao'] = '720p';
	$resolucao[85]['formato'] = 'MP4'; $resolucao[85]['resolucao'] = '520p';
	$resolucao[100]['formato'] = 'WebM'; $resolucao[100]['resolucao'] = '360p';
	$resolucao[101]['formato'] = 'WebM'; $resolucao[101]['resolucao'] = '360p';
	$resolucao[102]['formato'] = 'WebM'; $resolucao[102]['resolucao'] = '720p';
	$resolucao[120]['formato'] = 'FLV'; $resolucao[120]['resolucao'] = '720p';
	
	if(!$url_video){
		echo '<script>msgErro("<span>Insira uma URL do YouTube.</span>");</script>';
	} else {
		$url_video = str_replace(' ', '', $url_video);
		$resultados = array();
		$teste_url = @fopen($url_video, "r");
		if(!$teste_url){
			echo '<script>msgErro("<span>A URL informada não existe, ou é inválida.</span>");</script>';
		} else {
			$youtube_teste = strpos($url_video, 'youtube');
			if($youtube_teste === false){
				echo '<script>msgErro("<span>A URL informada não pertence ao YouTube.</span>");</script>';
			} else {
				$youtube_teste = strpos($url_video, 'v=');
				if($youtube_teste === false){
					echo '<script>msgErro("<span>OA URL informada é inválida.</span>");</script>';
				} else {
					$id_img1 = explode("v=", $url_video);
					$id_img2 = explode("&", $id_img1[1]);
					$id_imagem_video = $id_img2[0];
					$id_video = $id_imagem_video;
					$ilustracao = "http://img.youtube.com/vi/".$id_imagem_video."/0.jpg";
					
					$ch = curl_init();
					curl_setopt ($ch, CURLOPT_URL, $url_video);
					curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
					ob_start();
					curl_exec($ch); 
					curl_close($ch);
					$file_contents = ob_get_contents();
					ob_end_clean();
					if(preg_match('/<title>([^<]++)/', $file_contents, $matches) == FALSE){
						$titulo = "Erro ao resgatar o titulo do YouTube";
					} else {
						$titulo = $matches[1];
						$titulo = str_replace(' - YouTube', '', $titulo);
					}
					echo '<script>msgOk("'.$titulo.'", "'.$ilustracao.'");</script>';
					
					/*** FUNÇÃO ***/
					
					if(isset($_REQUEST['acao'])){
						$acao = $_REQUEST['acao'];
					} else {
						$acao = 'redireciona';
					}
					$video_info = 'http://www.youtube.com/get_video_info?&video_id='. $id_video;
					$video_info = curlGet($video_info);

					parse_str($video_info);

					if(isset($url_encoded_fmt_stream_map)) {
						$formatos_array = explode(',',$url_encoded_fmt_stream_map);
					} else {
						echo '<script>msgErro("<span>Nenhum formato de vídeo encontrado para download.</span>");</script>';
						exit;
					}
					if (count($formatos_array) == 0) {
						echo '<script>msgErro("<span>Você inseriu a URL correta?</span>");</script>';
						exit;
					}
					$avail_formato[] = '';
					$i = 0;
					foreach($formatos_array as $nome_formato){
						parse_str($nome_formato);
						$avail_formato[$i]['itag'] = $itag;
						$avail_formato[$i]['quality'] = $quality;
						$type = explode(';',$type);
						$avail_formato[$i]['type'] = $type[0];
						$avail_formato[$i]['url'] = urldecode($url) . '&signature=' . $sig;
						parse_str(urldecode($url));
						$avail_formato[$i]['expires'] = date("d/m/Y", $expire)." às ".date("H:i:s", $expire);
						$avail_formato[$i]['ipbits'] = $ipbits;
						$avail_formato[$i]['ip'] = $ip;
						$i++;
					}
					if($acao == 'Baixar'){
						echo '<div id="topo_lista">Lista de formatos disponíveis. Selecione um e clique em "Baixar vídeo".</div>';
						echo '<div id="lista">';
						echo '<div id="serv" style="font:bold 12px Arial;color:#000000;background:#f1f1f1;">';
						echo '<div class="formato">Formato</div><div class="resolucao">Resolução</div><div class="qualidade">Qualidade</div><div class="tamanho">Tamanho</div>';
						echo '<div style="clear:both;"></div></div>';
						for($i = 0; $i < count($avail_formato); $i++){
							if($avail_formato[$i]['type'] == 'video/webm'){
								$formato = 'WebM';
							} else {
								if($avail_formato[$i]['type'] == 'video/x-flv'){
									$formato = 'FLV';
								} else {
									if($avail_formato[$i]['type'] == 'video/mp4'){
										$formato = 'MP4';
									} else {
										if($avail_formato[$i]['type'] == 'video/3gpp'){
											$formato = '3GP';
										} else {
											$formato = $avail_formato[$i]['type'];
										}
									}
								}
							}
							if($avail_formato[$i]['quality'] == 'highres'){
								$qualidade = 'Alta / Super HD';
							} else {
								if($avail_formato[$i]['quality'] == 'hd1080' || $avail_formato[$i]['quality'] == 'hd720'){
									$qualidade = 'Alta / HD';
								} else {
									if($avail_formato[$i]['quality'] == 'large'){
										$qualidade = 'Alta';
									} else {
										if($avail_formato[$i]['quality'] == 'medium'){
											$qualidade = 'Média';
										} else {
											if($avail_formato[$i]['quality'] == 'small'){
												$qualidade = 'Baixa';
											} else {
												$qualidade = $avail_formato[$i]['quality'];
											}
										}
									}
								}
							}
							$id_itag = $avail_formato[$i]['itag'];
							echo '<div id="serv">';
							echo '<div class="formato"><a href="'.$avail_formato[$i]['url'].'" target="_blank">'.$resolucao[$id_itag]['formato'].'</a></div><div class="resolucao">'.$resolucao[$id_itag]['resolucao'].'</div><div class="qualidade">'.$qualidade.'</div><div class="tamanho">'.TamanhoArquivo(get_size($avail_formato[$i]['url'])).'</div><div class="baixar"><a href="download.php?tipo='.$avail_formato[$i]['type'].'&titulo='.urlencode($titulo).'&codigo='.base64_encode($avail_formato[$i]['url']).'" target="_blank">Baixar vídeo</a></div>';
							echo '<div style="clear:both;"></div></div>';
						}
						echo '</div>';
						echo '<div class="info1">Os links expiram em '. $avail_formato[0]['expires'] .'</div>';
						echo '<div class="info2">Para baixar, clique com o botão direito do mouse sobre o formato do vídeo e selecione a opção "Salvar como" ou, clique em "Baixar vídeo" para o download iniciar. O IP do servidor é '.$avail_formato[0]['ip'].'. O endereço de IP possui '.$avail_formato[0]['ipbits'].' bits. Note que quando os endereços de IP de 8 bits são usados​​, os links para download podem falhar.</div>';
					} else {
						$nome_formato = $_REQUEST['formato'];
						$target_formato = '';
						switch($nome_formato){
							case "best":
								$target_formato = array('38', '37', '46', '22', '45', '35', '44', '34', '18', '43', '6', '5', '17', '13');
								break;
							case "free":
								$target_formato = array('38', '46', '37', '45', '22', '44', '35', '43', '34', '18', '6', '5', '17', '13');
								break;
							case "ipad":
								$target_formato = array('37','22','18','17');
								break;
							default:
								if (is_numeric($nome_formato)) {
									$target_formato[] = $nome_formato;
								} else {
									$target_formato = array('38', '37', '46', '22', '45', '35', '44', '34', '18', '43', '6', '5', '17', '13');
								}
							break;
						}
						$melhor_formato = '';
						for ($i=0; $i < count($target_formato); $i++) {
							for ($j=0; $j < count ($avail_formato); $j++) {
								if($target_formato[$i] == $avail_formato[$j]['itag']) {
									$melhor_formato = $j;
									break 2;
								}
							}
						}
						$redireciona_url = $avail_formato[$melhor_formato]['url'];
						$content_type = $avail_formato[$melhor_formato]['type'];
						header("Location: ".$redireciona_url);
					}
					/*** FIM FUNÇÃO ***/
				}
			}
		}
	}
}
?>

 

download.php

<?php
include_once('curl.php');
if(empty($_GET['tipo']) OR empty($_GET['codigo'])){
	header('Content-Type: text/html; charset=utf-8');
	exit('Sinal de download inválido');
}

$mime = filter_var($_GET['tipo']);
$ext  = str_replace(array('/', 'x-'), '', strstr($mime, '/'));
$url  = base64_decode(filter_var($_GET['codigo']));
$name = urldecode($_GET['titulo']). '.' .$ext; 

if ($url){
	if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE){
		header('Content-Length: '.get_size(base64_decode($_GET['codigo'])));
		header('Content-Type: "' . $mime . '"');
		header('Content-Type: text/html; charset=utf-8');
		header('Content-Disposition: attachment; filename="' . $name . '"');
		header('Expires: 0');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		header("Content-Transfer-Encoding: binary");
		header('Pragma: public');
		
	} else {
		header('Content-Length: '.get_size(base64_decode($_GET['codigo'])));
		header('Content-Type: "' . $mime . '"');
		header('Content-Type: text/html; charset=utf-8');
		header('Content-Disposition: attachment; filename="' . $name . '"');
		header("Content-Transfer-Encoding: binary");
		header('Expires: 0');
		header('Pragma: no-cache');
	}
	readfile($url);
	exit;
}
header('Content-Type: text/html; charset=utf-8');
exit('Arquivo não encontrado');
?>

 

curl.php

<?php
error_reporting(0);
ini_set("display_errors", 0);

function curlGet($URL) {
    $ch = curl_init();
    $timeout = 3;
    curl_setopt( $ch , CURLOPT_URL , $URL );
    curl_setopt( $ch , CURLOPT_RETURNTRANSFER , 1 );
    curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT , $timeout );
    $tmp = curl_exec( $ch );
    curl_close( $ch );
    return $tmp;
}  
function get_location($url) {
	$my_ch = curl_init();
	curl_setopt($my_ch, CURLOPT_URL,$url);
	curl_setopt($my_ch, CURLOPT_HEADER,         true);
	curl_setopt($my_ch, CURLOPT_NOBODY,         true);
	curl_setopt($my_ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($my_ch, CURLOPT_TIMEOUT,        10);
	$r = curl_exec($my_ch);
	 foreach(explode("\n", $r) as $header) {
		if(strpos($header, 'Location: ') === 0) {
			return trim(substr($header,10)); 
		}
	 }
	return '';
}
function get_size($url) {
	$my_ch = curl_init();
	curl_setopt($my_ch, CURLOPT_URL,$url);
	curl_setopt($my_ch, CURLOPT_HEADER,         true);
	curl_setopt($my_ch, CURLOPT_NOBODY,         true);
	curl_setopt($my_ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($my_ch, CURLOPT_TIMEOUT,        10);
	$r = curl_exec($my_ch);
	 foreach(explode("\n", $r) as $header) {
		if(strpos($header, 'Content-Length:') === 0) {
			return trim(substr($header,16)); 
		}
	 }
	return '';
}
function get_description($url) {
	$fullpage = curlGet($url);
	$dom = new DOMDocument();
	@$dom->loadHTML($fullpage);
	$xpath = new DOMXPath($dom); 
	$tags = $xpath->query('//div[@class="info-description-body"]');
	foreach ($tags as $tag) {
		$my_description .= (trim($tag->nodeValue));
	}
	return utf8_decode($my_description);
}
function TamanhoArquivo($cFile){
	if ($cFile<=0) {
		return 'N/I';
	} else {
		if ($cFile<1024) {
			$valor = round(($cFile), 2);
			return number_format($valor, 2, ',', '.').' bytes';
		} else {
			if ($cFile<pow(1024,2)){
				$valor = round(($cFile/1024), 2);
				return number_format($valor, 2, ',', '.').' KB';
			} else {
				if ($cFile<pow(1024,3)){
					$valor = round($cFile/pow(1024,2), 2);
					return number_format($valor, 2, ',', '.').' MB';
				} else {
					if ($cFile<pow(1024,4)){
						$valor = round($cFile/pow(1024,3), 2);
						return number_format($valor, 2, ',', '.').' GB';
					}
				}
			}
		}
	}
}
?>

 

.htaccess

# intercept request for index
RewriteEngine On
RewriteRule ^index.mp4$ index.php

Desculpa pelos mega espaços, mas é que no meu editor os espaços não ficam desse tamanho e me ajuda a me organizar e encontrar mais fácil os códigos!

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

DOWNLOAD.PHP

 

Este é o erro que recebo ao tentar baixar:

 

Sinal de download inválido

 

Aqui:

 

<?php
include_once('curl.php');
if(empty($_GET['tipo']) OR empty($_GET['codigo'])){
	header('Content-Type: text/html; charset=utf-8');
	exit('Sinal de download inválido');
}
/* ... */

Verifique as variáveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso eu já verifiquei, mas o que eu não entendo é que usando meu servidor de teste (XAMPP), o download inicia normalmente de todos os links, essa mensagem só aparece e o download não inicia no servidor (SolusHost), como se precisasse de alguma permissão.

 

Na coluna "Formato", também tem um link, se clicar nele ele direciona para a url do vídeo. No Chrome aparece a mensagem ""O acesso à página da web foi negado", por isso minha suspeita de alguma permissão no arquivo htaccess é necessária, ou sei lá.

 

Nunca pedi ajuda em fóruns, mas dessa vez é foi o jeito porque isso ta me quebrando a cabeça. Já testei milhares de alternativas, tanto que ainda nem fechei os olhos desde ontem.

 

PS.: Também testei no servidor da HomeHost, e lá ocorria o mesmo erro e outro que a função não conseguia ler as informações do vídeo, mas isso eu resolvi mudando alguns parâmetros no .htaccess, mas o outro permaneceu.

 

 

Mais alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte, descobri a causa de não está dando pra fazer o download dos vídeos. Só não sei como resolver ou se é possível.

 

Vou explicar o problema que está ocorrendo...

 

No meu servidor local (XAMPP) o download acontece normalmente de qualquer vídeo. logo após eu ter enviado os arquivos pro servidor me surgiu o problema e depois de muita analise descobri que o servidor está bloqueando o download.

 

Pelo que sei, o Youtube gera um código (token) com o ip da máquina e joga no link de download. No script ele captura esse codigo dentro do próprio site do Youtube. Quando a gente clica pra baixar ele verifica se o ip do código gerado, é o mesmo do ip da maquina que está baixando, se for igual ele baixa, se não for, ele bloqueia.

 

Então: O servidor gera os dados com o IP, então quando vou baixar, ele compara com o IP da minha máquina e então vai ser sempre diferente.

 

Foi o que entendi. Agora preciso que ele burle esse IP pra sempre fazer o download, só não sei como.

 

Aqui um dos links gerados:

http://r6---sn-mv-q4fe.c.youtube.com/videoplayback?key=yt1&ms=au&sparams=cp,id,ip,ipbits,itag,ratebypass,source,upn,expire&mv=u&upn=pBDosJazZj4&source=youtube&fexp=907725,934501,935002,914072,916612,921047,928201,901208,929123,929915,929906,929907,929125,929127,925714,929917,929919,931202,912512,912515,912521,906838,904488,906840,931910,931913,932227,904830,919373,933701,904122,900816,909421,912711&mt=1372206765&cp=U0hWR1JNV19NU0NONl9KR0FHOjJvREo2aUtQOHc3&ip=74.63.197.146&itag=38&newshard=yes&expire=1372229689&ratebypass=yes&sver=3&id=ca8dfa38e61ff5c5&ipbits=8&signature=C3B1B8B4DCE7DBDE4000BAF4D9054492882BE64F.7C609B5374A64ADEA8768CDBE2022D9452FD84B6

O ip encontrado foi: 74.63.197.146 que é do servidor :s

 

espero que tenham alguma idéia

 

Grato desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.