Télécharger les extensions Magento ⠠⠵

J'ai le bonheur de travailler avec Magento, et ça commence plutôt mal : impossible d'installer une extension via la belle interface pudroyeux 2.0 car je suis derrière un proxy et impossible de télécharger le paquet depuis le site.

Comme cela à le don de m'énerver, j'ai donc décidé d'aller fouiller au fin fond du downloader pour trouver l'URL de l'archive.

Toutes les données interessantes se trouvent dans le fichier downloader/lib/Mage/Connect/Rest.php.

La clés (en version 2.0) resemblent à une URL mais se décompose en deux parties, prenons comme exemple le module WishlistPlus dont la clés est http://connect20.magentocommerce.com/community/WishlistPlus :

Le point d'entrée est le fichier releases.xml, disponible à l'URL $channel/$package/releases.xml, qui recense les différentes versions sous la forme suivante :


<releases>
  <r>
    <v>1.0.1</v>
    <s>stable</s>
    <d>2011-02-08</d>
  </r>
  <r>
 
    <v>1.0.2</v>
    <s>stable</s>
    <d>2011-02-08</d>
  </r>
  <r>
    <v>1.0.2.1</v>
    <s>stable</s>
 
    <d>2011-02-08</d>
  </r>
  <r>
    <v>1.0.2.2</v>
    <s>stable</s>
    <d>2011-02-12</d>
  </r>
 
  <r>
    <v>1.0.2.3</v>
    <s>stable</s>
    <d>2011-02-27</d>
  </r>
</releases>
 

À partir du numéro de version, on en déduit simplement l'URL du paquet : $channel/$package/$version/$package-$version.tgz.

Du coup, un p'tit code rapide pour me trouver l'URL :

<?php
 
function usage($program) {
    die("usage: $program [-c channel] [-v version] package\n");
}
 
function dl_file($filename) {
    $context = null;
    $proxy = getenv('HTTP_PROXY');
 
    if(!empty($proxy)) {
        /** @FIXME HTTP_PROXY=tcp://127.0.0.1:8080 */
        $aContext = array(
            'http' => array(
                'proxy' => $proxy,
                'request_fulluri' => True,
            ),
        );
        $context = stream_context_create($aContext);
    }
    return file_get_contents($filename, false, $context);
}
 
function main($argc, $argv) {
    $channel = 'http://connect20.magentocommerce.com/community';
    $package = '';
    $version = '';
 
    if($argc > 1) {
        for($i = 1; $i < $argc-1; $i++) {
            switch($argv[$i]) {
            case '-v':
                $version = $argv[++$i];
            break;
            case '-c':
                $channel = $argv[++$i];
            break;
            default:
                usage($argv[0]);
            break;
            }
        }
 
        $package = $argv[$i];
 
        if(empty($version)) {
            $filename = "$channel/$package/releases.xml";
             $contents = dl_file("$channel/$package/releases.xml");
            if($contents !== false) {
                $xml = (array)simplexml_load_string($contents);
                /** @FIXME Sort elements */
                $version = $xml['r'][count($xml['r'])-1]->v;
            }
            else {
                die("$filename not found!\n");
            }
        }
 
        $filename = "$channel/$package/$version/$package-$version.tgz";
        print "$filename\n";
    }
    else {
        usage($argv[0]);
    }
}
 
main($argc, $argv);
 
 

Simplement utilisable avec wget pour télécharger l'archive :

$ HTTP_PROXY='tcp://127.0.0.1:8080' php magento_dl.php WishlistPlus | wget -i -
--2011-05-24 11:19:05--  http://connect20.magentocommerce.com/community/WishlistPlus/1.0.2.3/WishlistPlus-1.0.2.3.tgz
Connexion vers 127.0.0.1:8080...connecté.
requête Proxy transmise, en attente de la réponse...200 OK
Longueur: 6301 (6,2K) [application/x-gzip]
Sauvegarde en : «WishlistPlus-1.0.2.3.tgz»
 
100%[====================================================================================================================>] 6 301       --.-K/s   ds 0,1s
 
2011-05-24 11:19:06 (61,4 KB/s) - «WishlistPlus-1.0.2.3.tgz» sauvegardé [6301/6301]
 
Terminé --2011-05-24 11:19:06--
Téléchargé(s): 1 fichiers, 6,2K en 0,1s (61,4 KB/s)
 

Il reste deux petites corrections à effectuer :

Si le cœur vous en dit, libre à vous de faire un fork du projet magento-dl ;)

sanpi, le 2011-05-24T11:28:34+02:00
Faire un don