Script PHP pour télécharger les videos sur Youtube

Ce script vous permet de trouver les urls des videos pour pouvoir les télécharger directement, il reste encore à améliorer pour pouvoir l’utiliser réellement en “production”.

Mon but était de voir comment Youtube se protégé contre le téléchargement et visiblement c’est facile à casser: seulement un token à rajouter en bout de chaîne

Le seul point qui me reste à voir c’est s’il y a une détection et un filtrage au niveau de la bande passante si on bourrine le truc, en bouclant sur le téléchargement par exemple :D, Etant donné de l’on passe outre le player, qui lui télécharge la vidéo au fur et à mesure du visionnement.

// On récupère le contenu html de la page
$html = file_get_contents('http://www.youtube.com/watch?v=9bZkp7q19f0');

// On récupère la chaine playerConfig qui nous intéresse
preg_match("/playerConfig = (.*?);/", $html, $playerConfig);

$playerConfig = json_decode( $playerConfig[1] );
// print_r($playerConfig); exit();

// On récupère titre (sa peut servir)
$title = $playerConfig->args->title;

// On récupère la chaine encodé avec les urls
$fsm = $playerConfig->args->url_encoded_fmt_stream_map;
$fsm = urldecode($fsm);
// print_r($fsm); exit();

// On récupère les urls des videos (dans tout les formats)
preg_match_all("/url=(.*?)\,/", $fsm, $urls);
$urls = $urls[1];

// On récupère les signatures
preg_match_all("/sig=(.*?)\&/", $fsm, $signatures);
$signatures = $signatures[1];

print_r($urls);
print_r($signatures);


if( count($urls) !=  count($signatures) ) {
    // On peut avoir des soucis dans ce cas là :)
}

foreach( $urls as $i => &$url ) {

    // On enlève ce qui nous intéresse pas
    if( $pos = stripos($url, ';') )
        $url = substr( $url, 0, $pos );

    // On ajoute la signature
    if( isset($signatures[$i]) )
                $url .= '&signature=' . $signatures[$i];
}

// et voila nos (belles) urls
print_r($urls); exit();

Si quelqu’un a des meilleurs regex je suis preneur, un meilleur algo même 😀