web-dev-qa-db-fra.com

Comment obtenir le lien redirector.googlevideo.com à partir d'une vidéo de Google Drive

J'ai un fichier vidéo google drive (comme https://drive.google.com/file/d/FILE_ID/view ) et je souhaite obtenir son lien redirector.googlevideo.com.

Comment des sites comme http://api.getlinkdrive.com/ le font-ils? J'ai essayé d'utiliser l'API REST de Google Drive (version 2 et version 3), mais je ne trouve toujours pas le moyen de le faire. De nombreux sites d'émissions de télévision et de films hébergent leur contenu sur Google Drive et utilisent cette URL "masquée" qui expire, de sorte que vous ne pouvez pas, par exemple, l'intégrer ailleurs.

Le plus proche que j'ai eu est d'aller à docs.google.com/get_video_info?docid=FILE_ID et d'obtenir les liens fmt_stream_map, mais cela ne renvoie pas le lien redirecteur dont j'ai besoin.

9
chenophucu

Il parle d'obtenir l'URL de Google Drive toutes les qualités en 360p, 480p, 720p, 1080p et convertir juste avant le/videoplayback en redirector.googlevideo.com et de le convertir en vidéo/mp4 pour la lecture dans JW Player script complet mais il a un problème mineur, il est interdit 403 et c’est à cause des modifications apportées par Google à l’API. Jetez un coup d’œil aux codes dans PHP et faites-moi savoir si quelqu'un peut le réparer, je posterai le texte intégral script plus tard. 

function Drive($link) {
    $url = urldecode($link);
    $get = curl1($url);
    $data = explode(',["fmt_stream_map","', $get);
    $data = explode('"]', $data[1]);
    $data = str_replace(array('\u003d', '\u0026'), array('=', '&'), $data[0]);
    $data = explode(',', $data);
    asort($data);
    foreach($data as $list) {
        $data2 = explode('|', $list);
        if($data2[0] == 37) {$q1080p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}    // 1080P
        if($data2[0] == 22) {$q720p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 720P
        if($data2[0] == 59) {$q480p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 480P
        if($data2[0] == 18) {$q360p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 360P
    }
    $js[0][0] = "$q1080p";
    $js[0][1] = "$q720p";
    $js[0][2] = "$q480p";
    $js[0][3] = "$q360p";
    $js[1][0] = "1080P";
    $js[1][1] = "720P";
    $js[1][2] = "480P";
    $js[1][3] = "360P";
    return $js;     
}
if ($jw[0][0] != "") {
    echo('{file: "'.urldecode($jw[0][0]).'",type: "video/mp4",label: "'.urldecode($jw[1][0]).'"},');
}
if ($jw[0][1] != "") {
    echo('{file: "'.urldecode($jw[0][1]).'",type: "video/mp4",label: "'.urldecode($jw[1][1]).'"},');
}   
if ($jw[0][2] != "") {
    echo('{file: "'.urldecode($jw[0][2]).'",type: "video/mp4",label: "'.urldecode($jw[1][2]).'"},');
}   
if ($jw[0][3] != "") {
    echo('{file: "'.urldecode($jw[0][3]).'",type: "video/mp4",label: "'.urldecode($jw[1][3]).'"},');
}

J'ai implémenté un meilleur algorithme de la réponse précédente.

function curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, $return);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

function Drive($id) {
    $o = [];
    $url = "https://docs.google.com/get_video_info?docid=$id";
    $get = curl($url);

    parse_str($get, $out);
    $data = explode(",", $out["fmt_stream_map"]);

    foreach($data as $d) {
        switch ((int)substr($d, 0, 2)) {
            case 18:
                $r = "360P";
                break;
            case 22:
                $r = "720P";
                break;
            case 37:
                $r = "1080P";
                break;
            case 59:
                $r = "480P";
                break;
            default:
                break;
        }
        $o[$r] = substr(preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com", $d), 3);
    }
    ksort($o);
    return $o;
}
$jw = Drive(FILE_ID_HERE);

foreach ($jw as $k => $r) {
    echo json_encode(array("file"=> $r, "type"=> "video/mp4", "label"=> $k))."\n";
}
1
bckps7336

Je suis à peu près sûr que cela a été demandé il y a longtemps, mais je pense pouvoir vous mettre sur la voie qui mène à ce que vous voulez. Ce que vous allez faire, c'est donc aller dans Paramètres Google Photos et cochez l'option permettant à vos vidéos insérées dans le lecteur d'être affichées dans des photos. Revenir à Google Photos et sélectionnez la vidéo que vous souhaitez un lien direct. Faites un clic droit sur la vignette et copiez le lien. Il devrait quelque chose comme https://lh3.googleusercontent.com/[long string]=w1278-h719-k-no. La dernière partie, =w1278-h719-k-no, lui donne une petite modification en =m22. Il générera automatiquement un lien pour vous. J'espère que ça va bien pour vous.

Edit: Désolé, pas exactement un lien de redirection de googlevideo, mais ça marche!

Edit: Après un peu plus d’expérimentation, j’ai compris que le réglage sur =m15 vous donne un lien plus long. Cela fonctionne aussi bien que le premier. Changer le nombre après la m vous donnera différentes résolutions. Donc, vous pouvez expérimenter avec cela.

EditL Très bien. Après encore plus d’expérimentation, j’ai mis en ligne deux vidéos différentes, l’une à conduire et l’autre sur des photos. J'ai eu le lien lh3.googleusercontent.com pour chacun d'eux et leurs liens vidéo directs. Celui du lecteur était hébergé sur r3---something.googleusercontent.com et celui de photos était hébergé sur r5--something.googlevideo.com. Et je me suis dit que si je remplaçais le r5--something par redirector? Je suis allé le faire, et bien, que savez-vous! Ça a marché! Et c’est ainsi que vous obtenez un lien redirector.googlevideo.com. MAIS, je ne sais toujours pas comment api.getlinkdrive.com peut obtenir un lien redirector.googlevideo.com. Puisque les liens générés par Google sont spécifiques à l’IP, cela signifie que cela fonctionnerait pour api.getlinkdrive.com, puisqu’il le demandait avec sa propre IP, mais pas pour un autre utilisateur, avec une IP différente.

Edit: J'ai oublié de mentionner cela, mais je suis sûr que certaines personnes ont remarqué que certains liens de redirection ne sont pas lh3.googleusercontent.com, mais 3.bp.blogspot.com. Eh bien, les domaines suivants peuvent remplacer lh3.googleusercontent.com;

  • lh3.googleusercontent.com
  • lh4.googleusercontent.com
  • lh5.googleusercontent.com
  • lh6.googleusercontent.com
  • 1.bp.blogspot.com
  • 2.bp.blogspot.com
  • 3.bp.blogspot.com
0
CB49

Le code PHP ne fonctionnera pas ici et même sans signification, car il renverra le résultat pour le côté serveur.

Ceci est mon code Javascript/Ajax . Malheureusement, vous devez utiliser Extension de contrôle d'accès-Autoriser-Origine dans le navigateur Chrome . Veuillez tout d'abord voir cette capture d'écran de la fenêtre de la console.

<!DOCTYPE html>
<html>
   <head>
      <script src="https://code.jquery.com/jquery-3.2.1.min.js"  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="  crossorigin="anonymous"></script>
      <script src="https://content.jwplatform.com/libraries/YOUR-JW-PLAYER-LICENSE-KEY.js"></script>
   </head>

   <body>
      <p id="urls"></p>
      <div id="myElement"></div>
   </body>

   <script>
      var docid = "0B4Mn0g4wWmQ1ZThycVhOcDJQc2c";
      var api_url = "https://docs.google.com/get_video_info";
      var ans = {};
      var url = "";

      getGoogleVideoUrl();

      function getGoogleVideoUrl(){
        $.ajax({
          url: api_url,
          type: "get",
          data: { 
            docid: docid,
          },
          success: function(response) {
            //
            // get value of which key is 'fmt_stream_map'.
            //
            var fmt_stream_map = getQueryVariable(response, 'fmt_stream_map');
            //
            // split my comma
            //
            var maps = fmt_stream_map.split("%2C");
            //
            // loop all links, 
            //  
            var purl = "";          
            for (x in maps) {
                var res = decodeURIComponent(decodeURIComponent(maps[x])).split('|');
                // purl = res[1].replace(new RegExp("/\/[^\/]+\.google\.com/", 'g'),"//redirector.googlevideo.com/");
                // purl = res[1].replace(new RegExp("\.google\.com/", 'g'),".googlevideo.com/");

                purl = res[1];
                //.replace(/.c.docs.google.com/g,".googlevideo.com")
                //.replace(/app=Explorer/g,"app=storage")
                //.replace(/key=ck2/g,"key=cms1")
                //.replace(/&cp=/g,"&api=")
                //.replace(/,cp&/g,',api&')
                //.replace(/,cp,/g,',api,')
                //.replace(/=cp,/g,'=api,')
                //.replace(/&sparams=/g,'&cms_redirect=yes&sparams=');

                switch (parseInt(res[0])) {
                case 5:
                    quality = 'Low Quality, 240p, FLV, 400x240';
                    break;
                case 17:
                    quality = 'Low Quality, 144p, 3GP, 0x0';
                    break;
                case 18:
                    quality = 'Medium Quality, 360p, MP4, 480x360';
                    break;
                case 22:
                    quality = 'High Quality, 720p, MP4, 1280x720';
                    break;
                case 34:
                    quality = 'Medium Quality, 360p, FLV, 640x360';
                    break;
                case 35:
                    quality = 'Standard Definition, 480p, FLV, 854x480';
                    break;
                case 36:
                    quality = 'Low Quality, 240p, 3GP, 0x0';
                    break;
                case 37:
                    quality = 'Full High Quality, 1080p, MP4, 1920x1080';
                    break;
                case 38:
                    quality = 'Original Definition, MP4, 4096x3072';
                    break;
                case 43:
                    quality = 'Medium Quality, 360p, WebM, 640x360';
                    break;
                case 44:
                    quality = 'Standard Definition, 480p, WebM, 854x480';
                    break;
                case 45:
                    quality = 'High Quality, 720p, WebM, 1280x720';
                    break;
                case 46:
                    quality = 'Full High Quality, 1080p, WebM, 1280x720';
                    break;
                case 82:
                    quality = 'Medium Quality 3D, 360p, MP4, 640x360';
                    break;
                case 84:
                    quality = 'High Quality 3D, 720p, MP4, 1280x720';
                    break;
                case 102:
                    quality = 'Medium Quality 3D, 360p, WebM, 640x360';
                    break;
                case 104:
                    quality =  'High Quality 3D, 720p, WebM, 1280x720';
                    break;
                default:
                    quality =  'transcoded (unknown) quality';
                    break;
                }
                ans[quality] = purl;
            }
             console.log(ans);
             $('#urls').html(JSON.stringify(ans));

             url  = ans[Object.keys(ans)[0]];
             build_player();

          },
          error: function(xhr) {
            //Do Something to handle error
          }
        });
      }



      function build_player(){
        var playerInstance = jwplayer("myElement");
        playerInstance.setup({
            file: url,
            type: "mp4",
            width: 800 , 
            height: 600,
        }); 
      }

      function getQueryVariable(query, variable) {
          var vars = query.split('&');
          for (var i = 0; i < vars.length; i++) {
              var pair = vars[i].split('=');
              if (decodeURIComponent(pair[0]) == variable) {
                  //return decodeURIComponent(pair[1]);
                  return pair[1];
              }
          }
          console.log('Query variable %s not found', variable);
          return "";
      }

   </script>
</html>

Ce code fonctionne fondamentalement, mais ne joue pas dans le composant jwplayer.

Toutefois, si vous entrez cette URL, " https://docs.google.com/get_video_info?docid=0B4Mn0g4wWmQ1ZThycVhOcDJQc2c ", directement dans le navigateur Chrome, obtenez le fichier JSON, analysez-le manuellement, utilisez l'une des URL correspondantes, Code comme l'URL du fichier jwplayer, il fonctionne parfaitement bien qu'il contienne la balise "app = Explorer".

Je ne sais pas pourquoi cela se produit .. J'ai donc essayé de comparer 2 liens et certains paramètres sont différents. Le premier est du code ci-dessus et ne fonctionne pas, le deuxième fichier JSON directement et fonctionne.)

ei=hJ5yWaHCKYXb-wWona2YBA
ei=KZ5yWZSkK4aFqgXAwpoo

susci=o-AC34EOoA1Wst0Heh0U_bP9epqR8K9s4UBhwlqmsxKZKwAOA
susci=o-AH82qbGL8BcWQ3BPybbvZyuNBiDd2Uasz4J0ZNXJCZwobPje

expire=1500698308
expire=1500698217

cp=QVNFUkdfV1NOSVhOOnhwOWFybUloWXNX
cp=QVNFUkdfV1JPSFhOOmpURGRUeUt3eVpv

signature=3D306FD9D9ADA683D313AABDFE057B608A6F2A39.8BB3A9C321B6BEAC8D1D5AEED2F25511DF97CE2B
signature=2C2465BDFC4D9CCFD0D4A42F38BAEF44D55AFDF1.A916937113445ABB90D18B3AE89600729CFADDE6

Pourquoi le premier ne fonctionne-t-il pas alors que le second fonctionne? ... Une idée de cela?

0
Lin