<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>®om&#039;s blog &#187; video</title>
	<atom:link href="http://blog.rom1v.com/tag/video/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rom1v.com</link>
	<description>Un blog libre</description>
	<lastBuildDate>Sun, 05 Sep 2010 17:23:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Pluzz.fr : France Televisions lance son service de TV de rattrapage non lisible</title>
		<link>http://blog.rom1v.com/2010/07/pluzz-fr-france-televisions-lance-son-service-de-tv-de-rattrapage-non-lisible/</link>
		<comments>http://blog.rom1v.com/2010/07/pluzz-fr-france-televisions-lance-son-service-de-tv-de-rattrapage-non-lisible/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 14:57:11 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Humeur]]></category>
		<category><![CDATA[Outils]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[drm]]></category>
		<category><![CDATA[format]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/?p=1669</guid>
		<description><![CDATA[Le 5 juillet (hier donc), France Télévisions a lancé son service de télévision de rattrapage, qui ne permet pas de lire les vidéos. À moins d&#8217;accepter d&#8217;installer un système d&#8217;exploitation particulier avec un logiciel particulier (propriétaires évidemment). C&#8217;est comme s&#8217;ils diffusaient leurs émissions uniquement pour les utilisateurs équipés d&#8217;une TV Sony ou Philips, et pas [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.rom1v.com/wp-content/uploads/2010/07/france_televisions.jpg"><img src="http://blog.rom1v.com/wp-content/uploads/2010/07/france_televisions.jpg" alt="" title="france_televisions" width="300" height="155" class="alignright size-full wp-image-1675" /></a></p>
<p>Le 5 juillet (hier donc), <em>France Télévisions</em> <a href="http://linuxfr.org/~fabiensk/29918.html">a lancé</a> son service de télévision de rattrapage, <strong>qui ne permet pas de lire les vidéos</strong>. À moins d&#8217;accepter d&#8217;installer un système d&#8217;exploitation particulier avec un logiciel particulier (propriétaires évidemment). C&#8217;est comme s&#8217;ils diffusaient leurs émissions uniquement pour les utilisateurs équipés d&#8217;une TV Sony ou Philips, et pas pour les autres… <em>France Télévisions</em> a simplement oublié que c&#8217;était un avant tout un <strong>service public</strong>.</p>
<h2>Formats</h2>
<p>La lecture des vidéos nécessite soit <em>Windows Media Player</em>, soit <em>Silverlight</em>. C&#8217;est dommage, il aurait été préférable que leur site soit du web, accessible à tous.</p>
<p>En plus de cela, les vidéos sont diffusées dans le format fermé WMV. Certaines contiennent même des DRM. Les DRM, pour rappel, c&#8217;est ce qui empêche les utilisateurs de lire le contenu proposé. Certains prétendent que ça permet d&#8217;empêcher la copie&nbsp;; ce n&#8217;est pas totalement faux&nbsp;: quand on ne peut pas lire le contenu on ne peut pas le copier. Une autre technique plus efficace serait de ne pas le publier du tout.</p>
<p><strong>En numérique, tout ce qui est lisible est copiable. Par contraposée, tout ce qui n&#8217;est pas copiable n&#8217;est pas lisible.</strong></p>
<h2>Outil d&#8217;accès</h2>
<p>Comme <em>France Télévisions</em> n&#8217;a pas fait son boulot d&#8217;<a href="http://fr.wikipedia.org/wiki/Interop%C3%A9rabilit%C3%A9">interopérabilité</a>, et qu&#8217;a priori chacun a droit d&#8217;accéder à ce service (public!), nous sommes obligés de nous débrouiller par nous-mêmes.</p>
<p>J&#8217;ai donc écrit un petit script <em>bash</em> qui permet d&#8217;accéder relativement simplement à <em>Pluzz</em> à partir d&#8217;un système libre (où VLC doit être installé, testé sur <em>Ubuntu 10.04</em>). Pour l&#8217;utiliser, rendez-vous sur <a href="http://www.pluzz.fr">Pluzz.fr</a>, cliquez sur l&#8217;émission de votre choix, et copier l&#8217;adresse de la page (par exemple <code>http://www.pluzz.fr/jt-20h.html</code>).</p>
<p>Ensuite, pour lire la vidéo, tapez&nbsp;:</p>
<pre>pluzz play http://www.pluzz.fr/jt-20h.html</pre>
<p>Pour l&#8217;enregistrer (bah oui, tout ce qui est lisible est enregistrable)&nbsp;:</p>
<pre>pluzz record http://www.pluzz.fr/jt-20h.html</pre>
<p>Si vous voulez simplement l&#8217;url du flux&nbsp;:</p>
<pre>pluzz url http://www.pluzz.fr/jt-20h.html</pre>
<p>Ceci ne fonctionnera que pour les vidéos sans DRM&nbsp;: les vidéos avec DRM ne sont pas lisibles.</p>
<h2>Script</h2>
<p><em><strong>EDIT 11/07/2010&nbsp;:</strong><br />
J&#8217;ai mis à jour le script avec une version 0.2, qui gère également les flux en <code>mp4</code> (<a href="apt://flvstreamer">flvstreamer</a> doit être installé).<br />
L&#8217;historique des scripts est disponible <a href="http://dl.rom1v.com/pluzz/">ici</a> (au cas où une régression poserait problème).</em></p>
<p>Voici le script (sous licence <a href="http://sam.zoy.org/wtfpl/">wtfpl</a>), à sauvegarder en tant que fichier exécutable <code>/usr/local/bin/pluzz</code> <em>(uniquement si vous comprenez ce que vous faites)</em>&nbsp;:</p>
<pre>#!/bin/bash
# Script pour utiliser pluzz.fr
# v0.2 (11 juillet 2010)

if [ $# != 2 ]
then
    printf "Syntaxe: $0 [url|play|record] http://www.pluzz.fr/...\n" >&#038;2
    exit 1
fi
command="$1"
url="$2"

if [ "$command" != 'url' -a "$command" != 'play' -a "$command" != 'record' ]
then
    printf "Command must be 'url', 'play' or 'record', not '$command'\n" >&#038;2
    exit 2
fi

video_page_url=$(wget -qO- "$url" | grep -o 'http://info.francetelevisions.fr/?id-video=[^"]\+')
stream_url_part2=$(wget -qO- "$video_page_url" | grep urls-url-video | sed 's/.*content="\(.*\)".*/\1/')
ext=${stream_url_part2##*.}

if [ "$ext" = 'wmv' ]
then
    stream_url_part1='mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/cappuccino/production/publication'
elif [ "$ext" = 'mp4' ]
then
    stream_url_part1='rtmp://videozones-rtmp.francetv.fr/ondemand/mp4:cappuccino/publication'
else
    printf "Extension not managed : '$ext'\n" >&#038;2
    exit 3
fi

stream_url="$stream_url_part1/$stream_url_part2"

if [ "$command" = "url" ]
then
    printf "$stream_url\n"
elif [ "$command" = "play" ]
then
    if [ "$ext" = 'wmv' ]
    then
        vlc "$stream_url"
    else
        flvstreamer -r "$stream_url" | vlc -
    fi
elif [ "$command" = "record" ]
then
    output_file=${stream_url##*/}
    printf "Recording to $output_file...\n"
    if [ "$ext" = 'wmv' ]
    then
        vlc "$stream_url" ":sout=#std{access=file,mux=asf,dst=$output_file}"
    else
        flvstreamer -r "$stream_url" -o "$output_file"
    fi
fi</pre>
<p><em><strong>EDIT 11/07/2010&nbsp;:</strong> Le plus simple est de créer un fichier <code>pluzz</code> dans le dossier personnel, d&#8217;y recopier le script ci-dessus, et d&#8217;exécuter&nbsp;:</em></p>
<pre>sudo install pluzz /usr/local/bin</pre>
<h2>Conclusion</h2>
<p>Après s&#8217;être déjà fait remarqué par leur <a href="http://www.numerama.com/magazine/15230-la-detestable-exclusivite-de-france-televisions-sur-orange-va-prendre-fin.html">exclusivité avec Orange</a>, j&#8217;espère que <em>France Télévisions</em> acceptera un jour de permettre l&#8217;accès à tous à la télévision de rattrapage.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2010/07/pluzz-fr-france-televisions-lance-son-service-de-tv-de-rattrapage-non-lisible/feed/</wfw:commentRss>
		<slash:comments>84</slash:comments>
		</item>
		<item>
		<title>Agréger différentes sources de VOD en OGG/Theora</title>
		<link>http://blog.rom1v.com/2010/04/aggreger-differentes-sources-de-vod-en-oggtheora/</link>
		<comments>http://blog.rom1v.com/2010/04/aggreger-differentes-sources-de-vod-en-oggtheora/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 18:58:08 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/?p=1341</guid>
		<description><![CDATA[Pour mes flux RSS, j&#8217;utilise l&#8217;outil tt-rss installé sur mon serveur, qui récupère régulièrement tous les flux auxquels je suis abonné. Le but de ce billet est de mettre en place un mécanisme similaire qui s&#8217;applique aux sources de vidéo à la demande (pas forcément prévues pour être agrégées), et qui les convertit dans le [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.rom1v.com/wp-content/uploads/2010/03/oggtheora.png"><img src="http://blog.rom1v.com/wp-content/uploads/2010/03/oggtheora.png" alt="" title="oggtheora" width="150" height="100" class="alignright size-full wp-image-1317" /></a></p>
<p>Pour mes flux RSS, j&#8217;utilise l&#8217;outil <a href="http://tt-rss.org">tt-rss</a> installé sur mon serveur, qui récupère régulièrement tous les flux auxquels je suis abonné.</p>
<p>Le but de ce billet est de mettre en place un mécanisme similaire qui s&#8217;applique aux sources de vidéo à la demande (pas forcément prévues pour être agrégées), et qui les convertit dans le format ouvert OGG/Theora (dans un répertoire rendu accessible par un serveur web tel qu&#8217;<em>Apache</em>), tout en parallélisant au maximum les différentes actions afin que le temps total de récupération soit minimal.</p>
<p>En particulier, il faut éviter de télécharger la première vidéo, puis de l&#8217;encoder, d&#8217;attendre que l&#8217;encodage soit terminé pour télécharger la seconde vidéo… Et si plusieurs CPU sont disponibles sur la machine, il faut donner un encodage à chaque processeur (l&#8217;encodeur <em>theora</em> ne sachant pas paralléliser l&#8217;encodage d&#8217;une seule vidéo).</p>
<h2>Architecture</h2>
<p>Pour cela, il y a donc 2 parties bien distinctes&nbsp;:</p>
<ul>
<li>un <strong>serveur d&#8217;encodage</strong>, qui s&#8217;occupe du démarrage et de la parallélisation des encodages&nbsp;;</li>
<li>des <strong>programmes de récupération</strong> <em>brute</em> pour chaque source de flux, qui demandent au serveur d&#8217;encodage de s&#8217;occuper de la conversion des fichiers récupérés.</li>
</ul>
<h2>Serveur d&#8217;encodage</h2>
<h3>Principe</h3>
<p>Le serveur d&#8217;encodage gère plusieurs processus <em>ouvriers</em> (dans l&#8217;idéal, il faut configurer pour avoir autant de processus que de CPU sur la machine). Il attend de nouvelles tâches, et les transmets aux ouvriers disponibles, qui s&#8217;occupent de l&#8217;encodage. Si aucun ouvrier n&#8217;est disponible, il attend qu&#8217;un se libère.</p>
<h3>Implémentation</h3>
<p>Les demandes d&#8217;encodage se font grâce à un <em>named pipe</em> (aussi appelé FIFO), un fichier un peu spécial créé avec <code>mkfifo</code>. Chaque ligne représente une tâche. Concrètement, une tâche est décrite par les paramètres à passer à <code>ffmpeg2theora</code> (l&#8217;encodeur <em>theora</em>), séparés par un séparateur (j&#8217;ai choisi «&nbsp;<code>|</code>&nbsp;», qui a peu de chance d&#8217;être utilisé dans un nom de fichier). <em>Pour les puristes, je vous mets au défi d&#8217;utiliser comme séparateur <code>\0</code>, tout en conservant le mécanisme de file d&#8217;attente dans un fichier.</em></p>
<p>Un démon récupère les nouvelles lignes ajoutées au fichier, et les transmet une à une aux ouvriers. Chaque ouvrier recrée le tableau des arguments en redécoupant la ligne suivant le séparateur choisi, et le passe en paramètre de <code>ffmpeg2theora</code> (en y ajoutant toujours <code>--nice 19</code> pour n&#8217;utiliser que le CPU disponible, sans ralentir d&#8217;autres programmes en cours d&#8217;exécution).</p>
<h4>Démon</h4>
<p>Voici le programme démon (adapter le nombre de CPU)&nbsp;:<br />
<code>/usr/sbin/ffmpeg2theora-laterd</code></p>
<pre>#!/bin/bash
CPU=2
TASKS=/tmp/ffmpeg2theora-tasks
[ -p "$TASKS" ] || mkfifo "$TASKS" -m 666
tail -f "$TASKS" | xargs -I{} -P "$CPU" ffmpeg2theora-later-job {}</pre>
<p>Ce script fait donc exécuter par les ouvriers le programme <code>ffmpeg2theora-later-job</code> pour chacune des tâches, dont voici le code&nbsp;:<br />
<code>/usr/sbin/ffmpeg2theora-later-job</code></p>
<pre>#!/bin/bash
IFS='|' read -a args &lt;&lt;&lt; "$1"
echo "executing: ffmpeg2theora ${args[@]} --nice 19"
ffmpeg2theora "${args[@]}" --nice 19</pre>
<p><em>Je vous conseille de prendre la dernière version de <a href="http://v2v.cc/~j/ffmpeg2theora/">ffmpeg2theora</a>, actuellement celle des dépôts est assez ancienne.</em></p>
<p>Le démon est à lancer une fois (et une seule&nbsp;!), au démarrage du système par exemple (une solution est de l&#8217;ajouter dans <code>/etc/rc.local</code>).</p>
<h4>Client</h4>
<p>Les clients (les programmes qui veulent demander un encodage) doivent appeler <code>ffmpeg2theora-later</code>, qui s&#8217;occupe d&#8217;écrire les paramètres séparés par «&nbsp;<code>|</code>&nbsp;» dans le FIFO&nbsp;:<br />
<code>/usr/bin/ffmpeg2theora-later</code></p>
<pre>#!/bin/bash
printf '|%s' "$@" | cut -c2- > /tmp/ffmpeg2theora-tasks</pre>
<p>Son utilisation est extrêmement proche de <code>ffmpeg2theora</code> (évidemment, puisqu&#8217;il se contente de lui transmettre ses paramètres), à ceci près que les chemins doivent être absolus (puisque le démon ne sait pas à partir de quel répertoire la demande d&#8217;encodage a été effectuée).</p>
<p>Ainsi, là où on aurait utilisé, à partir de <code>/tmp</code>&nbsp;:</p>
<pre>ffmpeg2theora file.avi -o file.ogv -x 400 -y 300 -v 8 -a 3</pre>
<p>on peut appeler&nbsp;:</p>
<pre>ffmpeg2theora-later /tmp/file.avi -o /tmp/file.ogv -x 400 -y 300 -v 8 -a 3</pre>
<h2>Programmes de récupération</h2>
<h3>Principe</h3>
<p>Les programmes de récupération font ce qui est nécessaire pour récupérer les vidéo à télécharger. Plusieurs outils sont bien utiles pour cela&nbsp;:</p>
<ul>
<li><code>wget</code> si le fichier est disponible en <em>HTTP</em> (mais c&#8217;est rare)&nbsp;;</li>
<li><code>flvstreamer</code> pour récupérer les vidéos diffusées en <em>Flash</em> avec des liens en <code>rtmp://</code> (anciennement <code>rtmpdump</code>, je vous recommande <a href="http://lkcl.net/rtmp/">le message</a> adressé à <em>Adobe</em> de la part du développeur originel)&nbsp;;</li>
<li><code>mimms</code> pour récupérer les vidéos diffusées en <em>WMV</em> avec des liens en <code>mms://</code>.</li>
</ul>
<p>Pensez bien à ouvrir les ports nécessaires pour récupérer les vidéos (1935 par défaut pour les liens RTMP, 1755 pour MMS…).</p>
<h3>Implémentation</h3>
<p>Afin de rendre un peu indépendants les répertoires manipulés, j&#8217;ai décidé de créer un script <code>vodget</code> qui appelle les programmes de récupération avec 2 paramètres&nbsp;:</p>
<ol>
<li>le répertoire de téléchargement&nbsp;;</li>
<li>le répertoire destination.</li>
</ol>
<p><code>/usr/bin/vodget</code></p>
<pre>#!/bin/bash
scripts_dir=/var/lib/vodget
script="$scripts_dir/$1"
download_dir=/tmp/vodget
target_dir=/var/www/vod
$script "$download_dir" "$target_dir"</pre>
<p>Les programmes de récupération sont stockés dans <code>/var/lib/vodget</code>.</p>
<h4>Exemple</h4>
<p>Voici un exemple qui récupère les guignols de l&#8217;info (Canal+)&nbsp;:<br />
<code>/var/lib/vodget/guignols</code></p>
<pre>#!/bin/bash
category=guignols
download_dir="$1/$category"
target_dir="$2/$category"
mkdir -p "$download_dir"
mkdir -p "$target_dir"
wget -O- http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/search/guignols | grep -o 'rtmp://[^&lt;]\+.mp4' | while read url
do
    filename="$(echo "$url" | sed 's/.*\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\).*/20\1-\2-\3/')"
    if [ ! -f "$target_dir/$filename.ogv" ]
    then
        flvstreamer -r "$url" -o "$download_dir/$filename.mp4"
        touch "$target_dir/$filename.ogv"
        ffmpeg2theora-later "$download_dir/$filename.mp4" -o "$target_dir/$filename.ogv" -v8 -a3
    fi
done</pre>
<p>Cet exemple est une implémentation qui a l&#8217;avantage d&#8217;être très courte, vous pouvez aussi adapter <a href="http://forum.ubuntu-fr.org/viewtopic.php?id=346586">des versions plus évoluées</a> pour qu&#8217;elles utilisent <code>ffmpeg2theora-later</code>.</p>
<p>Un simple appel à&nbsp;:</p>
<pre>vodget guignols</pre>
<p>récupèrera les nouveaux épisodes et les encodera en OGG/Theora.</p>
<p>Il ne restera plus qu&#8217;à se rendre sur la page HTTP pointant sur le répertoire des vidéos avec <a href="http://mozilla-europe.org/fr/firefox/">un navigateur</a> qui supporte le HTML5 et le codec OGG/Theora, pour pouvoir regarder les vidéos ainsi récupérées&nbsp;:</p>
<p><a href="http://blog.rom1v.com/wp-content/uploads/2010/04/vod-guignols.png"><img src="http://blog.rom1v.com/wp-content/uploads/2010/04/vod-guignols-300x193.png" alt="" title="vod-guignols" width="300" height="193" class="aligncenter size-medium wp-image-1375" /></a></p>
<p><em>Bien sûr, les vidéos récupérées qui ne sont pas sous licence libre sont à usage personnel. Cela permet de regarder en VOD les épisodes dans un format ouvert, qui ne nécessite pas de programme propriétaire, ces vidéos ne doivent pas être placées sur un serveur public.</em></p>
<h3>Démarrage programmé</h3>
<p>Pour automatiser tout cela, il est possible de programmer périodiquement la récupération des nouvelles vidéos grâce à <a href="http://doc.ubuntu-fr.org/cron">cron</a>. Pour cela&nbsp;:</p>
<pre>crontab -e</pre>
<p>et ajouter la ligne <em>qui-va-bien</em>. Par exemple, pour récupérer les nouveaux épisodes des guignols tous les jours à 23 heures&nbsp;:</p>
<pre>00 23 * * * vodget guignols</pre>
<h2>Améliorations</h2>
<p>Techniquement, il faudrait gérer le démon par un script <em>init.d</em>, mais ça n&#8217;est pas si simple (si on arrête le service alors qu&#8217;une vidéo est en cours d&#8217;encodage et qu&#8217;on le redémarre, le nombre de CPU à utiliser ne sera plus respecté…).</p>
<p>Si vous êtes motivés, il est également possible de faire un beau site qui permette de regarder les vidéos en VOD, plutôt qu&#8217;une page qui liste simplement les fichiers récupérés.</p>
<h2>Conclusion</h2>
<p>Les différentes vidéos que je suis susceptible de regarder en VOD (que je ne regardais pas avant) sont maintenant disponibles sur mon serveur, lisible directement par mon navigateur.</p>
<p>On peut imaginer de nombreuses sources à agréger&nbsp;:</p>
<ul>
<li>les sites de VOD des chaînes de télévision (Canal+, France5, M6…)&nbsp;;</li>
<li>des bandes-annonces cinéma&nbsp;;</li>
<li>des chaînes enregistrées en direct avec la TV sur ADSL&nbsp;;</li>
<li>le flux de l&#8217;Assemblée Nationale ou du Sénat&nbsp;;</li>
<li>…</li>
</ul>
<p>Bien sûr, on aimerait mieux que les différentes sources fournissent des flux RSS pointant vers leurs vidéos, qu&#8217;ils diffuseraient eux-même en OGG/Theora. Mais on peut toujours attendre…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2010/04/aggreger-differentes-sources-de-vod-en-oggtheora/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Vidéo OGG Theora sur HTTPS (dans Firefox) : configurer Apache</title>
		<link>http://blog.rom1v.com/2010/03/video-ogg-theora-sur-https-dans-firefox-configurer-apache/</link>
		<comments>http://blog.rom1v.com/2010/03/video-ogg-theora-sur-https-dans-firefox-configurer-apache/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 22:43:52 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[theora]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/?p=1307</guid>
		<description><![CDATA[Tout le monde a entendu parler de la balise &#60;video/&#62;, la nouveauté la plus médiatisée d&#8217;HTML5. Le format vidéo à utiliser sur le web fait polémique (Theora ou H264) à cause de brevets logiciels, toujours bien présents dès il s&#8217;agit de freiner l&#8217;innovation. Une situation qu&#8217;à mon avis seul Google peut résoudre. Mais ce n&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.rom1v.com/wp-content/uploads/2010/03/oggtheora.png"><img src="http://blog.rom1v.com/wp-content/uploads/2010/03/oggtheora.png" alt="" title="oggtheora" width="150" height="100" class="alignright size-full wp-image-1317" /></a><br />
Tout le monde a entendu parler de la balise <code>&lt;video/&gt;</code>, la nouveauté la plus médiatisée d&#8217;HTML5. Le format vidéo à utiliser sur le web fait polémique (<a href="http://standblog.org/blog/post/2010/01/26/Video-Theora-ou-H264">Theora ou H264</a>) à cause de brevets logiciels, toujours bien présents dès il s&#8217;agit de freiner l&#8217;innovation. Une situation qu&#8217;à mon avis <a href="http://www.fsf.org/blogs/community/google-free-on2-vp8-for-youtube">seul Google peut résoudre</a>. Mais ce n&#8217;est pas l&#8217;objet de ce billet, pour l&#8217;instant, le format, c&#8217;est <em>OGG Theora</em>. Il suffit de placer un fichier <code>ogv</code> quelque part sur un serveur, et <em>Firefox</em> sait la lire.</p>
<p>Un problème survient cependant dès qu&#8217;on veut y accéder sur HTTPS plutôt qu&#8217;HTTP&nbsp;: on ne peut pas <em>seeker</em> dans la vidéo (c&#8217;est-à-dire qu&#8217;on ne peut pas déplacer le curseur pour se positionner à n&#8217;importe quel endroit), et on ne connaît pas sa durée totale.</p>
<p>Quelle différence entre l&#8217;accès en HTTP et HTTPS?</p>
<p>En HTTP, on reçoit la taille du fichier vidéo&nbsp;:</p>
<pre>$ curl --compressed -I http://.../video.ogv
HTTP/1.1 200 OK
Server: Apache
…
Content-Length: 26959501
Content-Type: video/ogg</pre>
<p>En HTTPS, on ne la reçoit pas, car le flux est compressé en <em>gzip</em>.</p>
<pre>$ curl --compressed -k -I https://.../video.ogv
HTTP/1.1 200 OK
Server: Apache
…
Content-Encoding: gzip
Content-Type: video/ogg</pre>
<p><em>(<code>-k</code> permet d&#8217;autoriser l&#8217;utilisation d&#8217;un certificat SSL non reconnu)</em></p>
<p>C&#8217;est la source du problème. Pourquoi ce comportement différent par défaut entre HTTP et HTTPS, je n&#8217;en sais rien (si quelqu&#8217;un peut m&#8217;éclairer…).</p>
<p>Par contre, il est très facile de désactiver la compression pour certains types de fichiers, comme les images ou les vidéos (compression qui n&#8217;a de toute façon aucun intérêt ces fichiers sont déjà compressés).</p>
<p>Pour cela, il suffit de rajouter une ligne dans <code>/etc/apache2/mods-available/deflate.conf</code>&nbsp;:</p>
<pre>SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ogg|oga|ogv)$ no-gzip dont-vary</pre>
<p>et de recharger <em>Apache</em>&nbsp;:</p>
<pre>sudo service apache reload</pre>
<p>Et maintenant, ça fonctionne correctement sur HTTPS&nbsp;:</p>
<pre>$ curl --compressed -k -I https://.../video.ogv
HTTP/1.1 200 OK
Server: Apache
…
Content-Length: 26959501
Content-Type: video/ogg</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2010/03/video-ogg-theora-sur-https-dans-firefox-configurer-apache/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>pspxconv : script d&#8217;encodage de vidéos pour PSP</title>
		<link>http://blog.rom1v.com/2008/10/pspxconv-script-dencodage-de-videos-pour-psp/</link>
		<comments>http://blog.rom1v.com/2008/10/pspxconv-script-dencodage-de-videos-pour-psp/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 17:37:00 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[psp]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/2008/10/pspxconv%c2%a0-script-dencodage-de-videos-pour-psp/</guid>
		<description><![CDATA[J&#8217;ai récemment acheté une PSP, et je voulais pouvoir encoder mes vidéos facilement, avec les réglages que je voulais. J&#8217;ai donc écrit un script. Il s&#8217;utilise comme ceci : pspxconv fichier.avi fichier.mp4 500 si l&#8217;on veut convertir un .avi en .mp4 lisible par la PSP avec un bitrate vidéo de 500Kbps (pour l&#8217;instant le bitrate [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai récemment acheté une PSP, et je voulais pouvoir encoder mes vidéos facilement, avec les réglages que je voulais. J&#8217;ai donc écrit un script.</p>
<p><a href="http://blog.rom1v.com/wp-content/uploads/2008/10/psp.png"><img src="http://blog.rom1v.com/wp-content/uploads/2008/10/psp-300x180.png" alt="psp" title="psp" width="300" height="180" class="aligncenter size-medium wp-image-227" /></a></p>
<p>Il s&#8217;utilise comme ceci :</p>
<pre>pspxconv fichier.avi fichier.mp4 500</pre>
<p>si l&#8217;on veut convertir un <code>.avi</code> en <code>.mp4</code> lisible par la PSP avec un bitrate vidéo de 500Kbps (pour l&#8217;instant le bitrate audio est fixé à 96).</p>
<p>Il est également possible de définir une qualité constante plutôt qu&#8217;un bitrate moyen (préférable pour <em>-hurry</em> et <em>-afap</em>) :</p>
<pre>pspxconv fichier.avi fichier.mp4 q20 -hurry</pre>
<p>Plusieurs <em>presets</em> de qualité sont disponibles :</p>
<ul>
<li><code>-afap</code> : as fast as possible (le plus rapidement possible) ; 1 seule pass en <strong>mpeg4</strong>, en 320×240, j&#8217;obtiens 190fps ;</li>
<li><code>-hurry</code> : 1 seule passe, en <strong>x264</strong>, en 480×272, meilleure qualité, j&#8217;ai environ 95fps ;</li>
<li><code>-std</code> (standard) : 2 pass, qualité normale (réglage à privilégier si on n&#8217;a pas de contraintes particulières), environ 55fps ;</li>
<li><code>-hq</code> : 2 pass, qualité un peu supérieure, environ 38 fps ;</li>
<li><code>-vhq</code> : extra haute qualité (inutile), environ 23 fps.</li>
</ul>
<p>On peut aussi rajouter des options de mencoder :<br />
<code>pspxconv fichier.avi fichier.mp4 500 -std -ss 10 -endpos 100</code><br />
n&#8217;encodera que de 10s à 110s.</p>
<pre>pspxconv fichier.avi fichier.mp4 500 -std -audiofile fichier.mp3</pre>
<p>encodera la vidéo <code>.avi</code> en utilisant la bande son <code>.mp3</code>.</p>
<p>Ce qu&#8217;il reste à améliorer (votre aide est la bienvenue) :</p>
<ul>
<li>possibilité d&#8217;utiliser plusieurs processeurs à 100% en <code>-afap</code> (même si on met plusieurs threads, 1 seul est à 100%)</li>
<li>possibilité de choisir à partir d&#8217;un <code>.mkv</code> la piste audio et la piste de sous-titres à utiliser et incruster.</li>
</ul>
<p>Voici le script :</p>
<pre>#!/bin/sh
# pspxconv : video encoding script for PSP
#
# 28th october 2008 - Romain Vimont (®om)
#
# v0.4 (25th june 2009)
#
# Converts input video and audio to mp4 { x264|mpeg4 + faac }, accepted by PSP.
#
# Syntax:
#   pspxconv input_file output_mp4 video_bitrate [quality_preset]
#     [mencoder_options [...]]
#
# video_bitrate can be an integer, or can define a quantifier if it starts
#   with q : q19.5 for example.
#
# quality_preset must be one of :
#   -afap : as fast as possible (poor quality mpeg4, 1 pass, fastest)
#   -hurry : (default) quite fast (poor quality, x264, 1 pass, fast)
#   -std :  standard quality (good quality, normal)
#   -hq  : high quality (very good quality, slow)
#   -vhq : very high quality (best quality, very slow)
#
# mencoder_options are appended to command line of mencoder call.
# For example :
#   -ss 10 -endpos 56 : trim the video from 10s to 66s.
#
# (of course, there are no options -afap, -hurry, -std, -hq nor -vhq)
#

# Syntax error detected.
# Exits the program with return code 1.
syntax_error() {
    printf '%s%s\n' "Syntaxe : $0 input_file output_mp4 video_bitrate " \
      '[quality_preset] [mencoder_options [...]]' >&#038;2
    exit 1
}

# Indicates whether the argument represents an integer.
#
# $1: value to test
# return: the integer if the argument represents an integer, an empty string if
#   it doesn't
is_integer() {
    local value="$1"
    printf %s "$1" | grep -o "^[[:digit:]]\+$"
}

# Returns the quantification value if the bitrate represents such a value.
#
# $1: value to test
# return: the value if the argument represents a quantifier, an empty string if
#   it doesn't
get_q_value() {
    local value="$1"
    printf %s "$1" | grep -o "^q[[:digit:]]\+\(\.[[:digit:]]\+\)\?$" | cut -c2-
}

# Gets a unique id, based on the clock (seconds + nanoseconds).
#
# return: unique id
uid() {
    date +'%s%N'
}

# Indicates whether the encoder must use x264 codec.
#
# $1: preset
# return: 'yes' if it must use it, nothing otherwise
use_x264() {
    local preset="$1"
    if [ "$preset" != '-afap' ]
    then
        printf 'yes'
    fi
}

# Returns the x264opts command line arguments for the selected preset.
#
# $1: preset
# return: command line arguments
x264_preset() {
    local preset="$1"
    local common='global_header:threads=auto'
#vbv_maxrate=1536:vbv_bufsize=2000:level_idc=30
    local common_q="$common:bframes=1:b_adapt:b_pyramid:weight_b:trellis=2"
    local q_value=$(get_q_value "$q")
    if [ "$q_value" ]
    then
        printf "crf=$q_value:"
    else
        printf "bitrate=$q:"
    fi
    case "$preset" in
    '-hurry') printf "$common:me=dia:subq=1" ;;
    '-std')  printf "$common_q" ;;
    '-hq')   printf "$common_q:me=umh:subq=6" ;;
    '-vhq')  printf "$common_q:me=esa:subq=7" ;;
    esac
}

# Returns the lavcopts command line arguments for the selected preset.
#
# return: command line arguments
mpeg4_preset() {
    local q_value=$(get_q_value "$q" | sed 's/\..*$//')
    if [ "$q_value" ]
    then
        printf "vqscale=$q_value:"
    else
        printf "vbitrate=$q:"
    fi
    printf 'aglobal=1:vglobal=1'
}

# Indicates whether the preset needs 2 passes.
#
# $1: preset
# return: '2' if the selected preset have 2 passes, nothing otherwise
two_passes_preset() {
    local preset="$1"
    if [ "$preset" != '-afap' -a "$preset" != '-hurry' ]
    then
        printf 2
    fi
}

# Indicates the scale selected for the preset.
#
# $1: preset
# return: width:height scaling
scale_preset() {
    local preset="$1"
    case "$preset" in
    '-afap')  printf 'dsize=320:240:0:16,scale=0:0' ;;
    *)        printf 'dsize=480:272:0:16,scale=0:0'
    esac
}

# error when less than 3 arguments
[ $# -ge 3 ] || syntax_error

# reads the arguments
in="$1"; shift
out="$1"; shift
q="$1"; shift

# audio bitrate
ab=96

# input file must exist
if [ ! -f "$in" ]
then
    printf '%s\n' "Input file doesn't exist : $in" >&#038;2
    exit 2
fi

# bitrate value must be integer or quantifier
if [ ! "$(is_integer "$q")" -a ! "$(get_q_value "$q")" ]
then
    printf '%s\n' "Bitrate value must be integer : $bitrate" >&#038;2
    exit 3
fi

# gets a unique filename, in order to avoid collisions when encoding two video
# at the same time
uid=$(uid)
tmp_log=$(printf '%s' "/tmp/$uid.log")

# chooses the quality preset
quality='-hurry'
if [ "$1" = '-afap' -o "$1" = '-hurry' -o "$1" = '-std' -o "$1" = '-hq' \
  -o "$1" = '-vhq' ]
then
    quality="$1"
    shift
fi

vf=$(scale_preset "$quality")

if [ $(use_x264 "$quality") ]
then
    # gets the x264 options
    opts=$(x264_preset $quality)
    if [ $(two_passes_preset "$quality") ]
    then
        # encodes the first pass
        mencoder "$in" -o /dev/null -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts:pass=1" \
        -vf "$vf" -nosound $@ &#038;&#038;

        # encodes the second pass
        mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts:pass=2" \
        -vf "$vf" -oac faac \
        -faacopts br=$ab:raw=yes:object=2 $@ &#038;&#038;

        exit 0
    else
        # encodes the unique pass
        mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
        "$tmp_log" -ovc x264 -x264encopts "$opts" \
        -vf "$vf" -oac faac \
        -faacopts br=$ab:raw=yes:object=2 $@ &#038;&#038;

        exit 0
    fi
else
    # encodes the unique pass
    mencoder "$in" -o "$out" -of lavf -lavfopts format=mp4 -passlogfile \
    "$tmp_log" -ovc lavc -lavcopts $(mpeg4_preset) -vf "$vf" -oac faac \
    -faacopts br=$ab:raw=yes:object=2 $@ &#038;&#038;

    exit 0
fi</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2008/10/pspxconv-script-dencodage-de-videos-pour-psp/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>screex264 : réencodez vos captures d&#8217;écran vidéos (screencasts) sous Ubuntu</title>
		<link>http://blog.rom1v.com/2008/09/screex264-reencodez-vos-captures-decran-videos-screencasts-sous-ubuntu/</link>
		<comments>http://blog.rom1v.com/2008/09/screex264-reencodez-vos-captures-decran-videos-screencasts-sous-ubuntu/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 09:11:00 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Outils]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/2008/09/screex264%c2%a0-reencodez-vos-captures-decran-videos-screencasts-sous-ubuntu/</guid>
		<description><![CDATA[Vous connaissez sans doute l&#8217;outil gtk-recordmydesktop, qui permet de faire une capture vidéo (un screencast) de votre écran. Pour obtenir une bonne qualité, dans les options vidéos, il faut vérifier que &#171;&#160;compression nulle&#160;&#187; est bien sur l&#8217;option &#171;&#160;Activé&#160;&#187; (malheureusement, la compression à la volée utilisée provoque quand même une légère perte de qualité). Mais une [...]]]></description>
			<content:encoded><![CDATA[<p>Vous connaissez sans doute l&#8217;outil <a href="apt://gtk-recordmydesktop">gtk-recordmydesktop</a>, qui permet de faire une capture vidéo (un screencast) de votre écran.</p>
<p>Pour obtenir une bonne qualité, dans les options vidéos, il faut vérifier que &laquo;&nbsp;compression nulle&nbsp;&raquo; est bien sur l&#8217;option &laquo;&nbsp;Activé&nbsp;&raquo; (malheureusement, la compression à la volée utilisée provoque quand même une légère perte de qualité).</p>
<p>Mais une telle vidéo prend un peu de place. Je vous propose donc de la réencoder, dans le format <a href="http://fr.wikipedia.org/wiki/X264">x264</a> (issu du projet VideoLAN, ayant donné naissance à VLC), multiplexé dans le conteneur <a href="http://fr.wikipedia.org/wiki/Matroska">MKV</a>.</p>
<p>Le fichier ainsi généré sera lisible par exemple avec <a href="apt://vlc">VLC</a>.</p>
<p>Disons-le tout de suite, le <strong>x264</strong> est actuellement LE meilleur codec de compression vidéo, proposant un rapport qualité/taille impressionnant. Le <strong>mkv</strong> permet, par exemple, de contenir une piste vidéo, plusieurs pistes audio dans différentes langues, des sous-titres, des chapitres, des pièces jointes… Ici, ce qui nous intéresse, c&#8217;est qu&#8217;il est libre, et qu&#8217;à contenu égal, il prend moins de place que les autres conteneurs (l&#8217;overhead est quasi-nul).</p>
<p>Voici comment utiliser le script.</p>
<p>Pour encoder la vidéo <code>mavideo.ogg</code> en <code>mavideo.mkv</code>, avec un débit de 400Kbps :</p>
<pre>screex264 mavideo.ogg mavideo.mkv 400</pre>
<p>Pour encoder la vidéo <code>mavideo.ogg</code> en <code>mavideo.mkv</code>, avec un débit de 400Kbps avec une meilleure qualité (plus lent) :</p>
<pre>screex264 mavideo.ogg mavideo.mkv 400 -hq</pre>
<p>Pour encoder la vidéo <code>mavideo.ogg</code> en <code>mavideo.mkv</code>, avec un débit de 400Kbps avec une qualité maximale (très lent) :</p>
<pre>screex264 mavideo.ogg mavideo.mkv 400 -vhq</pre>
<p>Il est également possible d&#8217;utiliser n&#8217;importe quels paramètres de mencoder.<br />
Ainsi, pour encoder la vidéo <code>mavideo.ogg</code> en <code>mavideo.mkv</code>, avec un débit de 400Kbps, à partir de la 10e seconde et pour une durée de 20 secondes :</p>
<pre>screex264 mavideo.ogg mavideo.mkv 400 -ss 10 -endpos 20</pre>
<p>Ce script peut également permettre à réencoder les petites vidéos enregistrées grâce à un appareil photo, et diviser leur taille d&#8217;un facteur 15.</p>
<p>Passons donc aux choses sérieuses. Tout d&#8217;abord, ce script nécessite <a href="apt://x264,mencoder,mkvtoolnix">x264, mencoder et mkvtoolnix</a> pour fonctionner.</p>
<pre>#!/bin/sh
# screex264 : screencast encoding script
#
# 11th september 2008 - Romain Vimont (®om)
#
# v0.2 (26th june 2009)
#
# Converts input video (ignoring audio) to x264 video, muxed in mkv.
#
# Syntax:
#   screex264 input_file output_mkv bitrate [quality_preset]
#     [mencoder_options [...]]
#
# quality_preset must be one of :
#   -std : (default) standard quality (good quality, normal)
#   -hq  : high quality (very good quality, slow)
#   -vhq : very high quality (best quality, very slow)
#
# mencoder_options are appended to command line of mencoder call.
# For example :
#   -ss 10 -endpos 56 : trim the video from 10s to 66s.
#
# (of course, there are no options -std, -hq nor -vhq)
#

# Syntax error detected.
# Exits the program with return code 1.
syntax_error() {
   printf '%s%sn' "Syntaxe : $0 input_file output_mkv bitrate "
     '[quality_preset] [mencoder_options [...]]' &gt;&amp;2
   exit 1
}

# Indicates whether the argument represents an integer.
# Returns the integer if the argument represents an integer, an empty string if
#   it doesn't.
#
# $1: value to test
is_integer() {
   local value="$1"
   printf %s "$1" | grep -o "^[[:digit:]]+$"
}

# Gets a unique id, based on the clock (seconds + nanoseconds).
# Returns a unique id.
uid() {
   date +'%s%N'
}

# Returns the command line arguments for the selected preset.
#
# $1: preset
# return: command line arguments
x264_preset() {
   local preset="$1"
   case "$preset" in
   '-std')
       printf '%s%s%s' "bitrate=$bitrate:frameref=8:mixed_refs:"
         "bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:"
         "me=hex:subq=5:trellis=2:threads=auto" ;;
   '-hq')
       printf '%s%s%s' "bitrate=$bitrate:frameref=16:mixed_refs:"
         "bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:"
         "me=umh:subq=6:trellis=2:threads=auto" ;;
   '-vhq')
       printf '%s%s%s' "bitrate=$bitrate:frameref=16:mixed_refs:"
         "bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:"
         "me=esa:subq=7:trellis=2:threads=auto" ;;
   *)
       printf '%s%sn' 'Quality preset must be one of {-std,-hq,-vhq} : '
         "$preset" &gt;&amp;2
       exit 4
   esac
}

# error when less than 3 arguments
[ $# -ge 3 ] || syntax_error

# reads the arguments
in=$1; shift
out=$1; shift
bitrate=$1; shift

# input file must exist
if [ ! -f "$in" ]
then
   printf '%sn' "Input file doesn't exist : $in" &gt;&amp;2
   exit 2
fi

# bitrate value must be integer
if [ ! $(is_integer "$bitrate") ]
then
   printf '%sn' "Bitrate value must be integer : $bitrate" &gt;&amp;2
   exit 3
fi

# choose the quality preset
quality='-std'
if [ "$1" = '-std' -o "$1" = '-hq' -o "$1" = '-vhq' ]
then
   quality="$1"
   shift
fi

# gets the x264 options
opts=$(x264_preset $quality)

# gets a unique filename, in order to avoid collisions when encoding two video
# at the same time
uid=$(uid)
tmp_x264=$(printf '%s' "/tmp/$uid.avi")
tmp_log=$(printf '%s' "/tmp/$uid.log")

# encodes the first pass
mencoder "$in" -o /dev/null -passlogfile $tmp_log -ovc x264 -x264encopts
 "$opts:pass=1" -nosound $@ &amp;&amp;

# encodes the second pass
mencoder "$in" -o $tmp_x264 -passlogfile $tmp_log -ovc x264 -x264encopts
 "$opts:pass=2" -nosound $@ &amp;&amp;

# muxes the result in a mkv
mkvmerge -o "$out" -d 0 -A -S "$tmp_x264" --track-order 0:0</pre>
<p>Pour l&#8217;installer, copiez-le dans un fichier <code>/usr/bin/screex264</code> que vous rendez exécutable :</p>
<pre>gksudo gedit /usr/bin/screex264</pre>
<p>Faites un copier-coller du script, sauvez-le. Puis :</p>
<pre>sudo chmod 755 /usr/bin/screex264</pre>
<p>Vous pouvez maintenant faire chauffer le processeur !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2008/09/screex264-reencodez-vos-captures-decran-videos-screencasts-sous-ubuntu/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
