Rapide hack pour visualiser une présentation slideshare avec S5
Par Clochix le vendredi 17 avril 2009, 01:59 - Technoweb - Lien permanent
Je signalais dans un billet récent mon énervement à l'encontre du site de partage de présentations slideshare qui utilise la technologie propriétaire Flash pour afficher ses diaporamas, alors que des solutions libres et ouvertes existent. C'est d'autant plus gênant qu'à l'heure actuelle aucun des lecteurs flash libres que j'ai essayés n'arrive à afficher correctement le site. J'ai donc écrit un petit hack pour me permettre de regarder malgré tout les diaporamas au moyen de l'excellente bibliothèque S5 d'Eric Meyer.
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-thumbnailerpour 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 