Principe

Chaque slide de la présentation est disponible sous la forme d'un fichier SWF. Après différents essais infructueux, j'ai finalement réussi à créer une image à partir de chacun d'eux au moyen de la commande swfdec-thumbnailer, fournie par le projet swfdec, et que vous trouverez dans votre Debian favorite dans le paquet swfdec-gnome. Le reste n'est qu'un jeu de geek:

  • parser la page contenant la présentation pour trouver l'adresse du fichier XML contenant la liste des slides (j'ai trouvé l'url à appeler dans le script GreaseMonkey Slideshare Downloader de Irfan Ahmad, qu'il en soit remercié);
  • récupérer le XML et le parser;
  • passer chacun des slides à la moulinette de swfdec-thumbnailer pour en faire une image;
  • il ne reste plus qu'à insérer le résultat dans un squelette de présentation S5;
  • pour ne pas stocker les images, je les encode en base 64 et passe le résultat directement à la balise img.

Ce qui nous donne:

<?php
$doc = new DOMDocument();
@$doc->loadHTMLFile(urldecode($_REQUEST["f"]));
$doc->getElementsByTagName("title")->item(0)->nodeValue;
$xpath = new DOMXPath($doc);
$query = '//link[@name="media_presentation"]';
$entries = $xpath->query($query);
parse_str(parse_url($entries->item(0)->getAttribute('href'), PHP_URL_QUERY), $params);
$doc = new DOMDocument();
$doc->load(sprintf('http://s3.amazonaws.com/slideshare/%s.xml', $params['doc']));
$slides = $doc->getElementsByTagName('Slide');
$res = "";
foreach ($slides as $slide){
        $fileIn=tempnam(sys_get_temp_dir(), 'tb-');
        $fileOut=tempnam(sys_get_temp_dir(), 'tb-');
        file_put_contents($fileIn, file_get_contents($slide->getAttribute('Src')));
        passthru(sprintf('/usr/bin/swfdec-thumbnailer -s 800 %s %s 2>/dev/null', $fileIn, $fileOut));
        $res .= sprintf('<div class="slide"><img src="data:image/png;base64,%s" /></div>', base64_encode(file_get_contents($fileOut)));
        unlink($fileIn);
        unlink($fileOut);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?=$title;?></title>
<meta name="defaultView" content="slideshow" />
<meta name="controlVis" content="hidden" />
<link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" />
<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
<script src="ui/default/slides.js" type="text/javascript"></script>
</head>
<body>
<div class="layout">
<div id="controls"><!-- DO NOT EDIT --></div>
<div id="currentSlide"><!-- DO NOT EDIT --></div>
<div id="header"></div>
<div id="footer">
</div>
</div>
<div class="presentation">
<?=$res;?>
</div>
</body>
</html>

Il ne reste plus qu'à appeler le script en lui passant l'url de la présentation à convertir. Par exemple:

http://localhost/labo/swfdec.php?f=http://www.slideshare.net/terraces/a-brief-introduction-to-sioc-and-moat

Désolé pour ce billet est un peu expéditif, mais je ne voulais pas me coucher trop tard pour être en forme ce ouikende pour pouvoir coder :)