<?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; scripts</title>
	<atom:link href="http://blog.rom1v.com/tag/scripts/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>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>sed : changer de séparateur</title>
		<link>http://blog.rom1v.com/2008/09/sed-changer-de-separateur/</link>
		<comments>http://blog.rom1v.com/2008/09/sed-changer-de-separateur/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 15:03:00 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/2008/09/sed%c2%a0-changer-de-separateur/</guid>
		<description><![CDATA[Si vous effectuez quelques traitements simples en ligne de commande, vous connaissez forcément l&#8217;outil sed, et plus particulièrement la commande : sed 's/ancien/récent/' qui permet de remplacer ancien par récent : sed 's/ancien/récent/' &#60;&#60;&#60; 'ce système est ancien, voire très ancien' ce système est récent, voire très ancien Pour remplacer toutes les occurrences, on rajoute un [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous effectuez quelques traitements simples en ligne de commande, vous connaissez forcément l&#8217;outil <code>sed</code>, et plus particulièrement la commande :</p>
<pre>sed 's/ancien/récent/'</pre>
<p>qui permet de remplacer <code>ancien</code> par <code>récent</code> :</p>
<pre>sed 's/ancien/récent/' &lt;&lt;&lt; 'ce système est ancien, voire très ancien'
ce système est récent, voire très ancien</pre>
<p>Pour remplacer toutes les occurrences, on rajoute un <code>g</code> :</p>
<pre>sed 's/ancien/récent/g' &lt;&lt;&lt; 'ce système est ancien, voire très ancien'
ce système est récent, voire très récent</pre>
<p>Cependant, la syntaxe est assez lourde lorsqu&#8217;on veut remplacer des <code>/</code>, par exemple pour remplacer <code>/home/rom/sh/</code> par <code>/usr/bin/</code> :</p>
<pre>sed 's//home/rom/sh///usr/bin//' &lt;&lt;&lt; /home/rom/sh/myscript
/usr/bin/myscript</pre>
<p>Heureusement, il est possible de changer le séparateur, et très facilement : c&#8217;est simplement le caractère après le <code>s</code>, et on met ce que l&#8217;on veut :</p>
<pre>sed 's:/home/rom/sh:/usr/bin:' &lt;&lt;&lt; /home/rom/sh/myscript
/usr/bin/myscript</pre>
<pre>sed 's|/home/rom/sh|/usr/bin|' &lt;&lt;&lt; /home/rom/sh/myscript
/usr/bin/myscript</pre>
<p><em>(il suffit de backslasher le caractère qui sert de séparateur dans les tokens)</em></p>
<p>Allez, pour s&#8217;amuser :</p>
<pre>sed sachagena &lt;&lt;&lt; 'des choux'</pre>
<pre>sed subucu &lt;&lt;&lt; 'trop bon'</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2008/09/sed-changer-de-separateur/feed/</wfw:commentRss>
		<slash:comments>6</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>
		<item>
		<title>imagup : uploader une image en 2 clics</title>
		<link>http://blog.rom1v.com/2008/08/imagup-uploader-une-image-en-2-clics/</link>
		<comments>http://blog.rom1v.com/2008/08/imagup-uploader-une-image-en-2-clics/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 13:27: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[image]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/2008/08/imagup%c2%a0-uploader-une-image-en-2-clics/</guid>
		<description><![CDATA[J&#8217;ai écrit un petit script pour uploader en ligne de commande une image sur imagup, et récupérer le lien (pratique pour poster sur les forums). Voici comment l&#8217;utiliser : imagup monimage.jpg Les extensions jpg, jpeg, png et]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai écrit un petit script pour uploader en ligne de commande une image sur <a href="http://www.imagup.com/">imagup</a>, et récupérer le lien (pratique pour poster sur les forums).</p>
<p>Voici comment l&#8217;utiliser :</p>
<pre>imagup monimage.jpg</pre>
<p>Les extensions <strong>jpg</strong>, <strong>jpeg</strong>, <strong>png</strong> et <strong">gif</strong> sont autorisées.</p>
<p>Voici un exemple de résultat :</p>
<pre>$ imagup rom-avatar.png
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100 28706    0 14129  100 14577   3638   3754  0:00:03  0:00:03 --:--:--  5059
rom-avatar.png : http://uploads.imagup.com/05/1220023287_rom-avatar.png</pre>
<p>Il est possible d&#8217;uploader plusieurs images en une seule ligne :</p>
<pre>imagup image1.png image2.jpg</pre>
<p>Avec l&#8217;option <code>-open</code>, une fois l&#8217;image uploadée, elle est ouverte dans le navigateur par défaut.</p>
<p><a href="apt://curl">curl</a> doit être installé.</p>
<p>Voici le script :</p>
<pre>#!/bin/sh
# IMAGUP script
#
# 29th august 2008 - Romain Vimont (®om)
#
# Uploads images to www.imagup.com, and returns the http:// link.
#
# Syntax:
#   imagup [-open] fichier1 [fichier2 [...]]
#
# If -open is specified, the link is opened in the default associated program
# (the default browser).
#

# Syntax error detected
# Exits the program with return code 1.
syntax_error() {
    printf '%sn' "Syntaxe : $0 [-open] fichier1 [fichier2 [...]]" &gt;&amp;2
    exit 1
}

# Bad extension detected. Prints messages on stderr.
#
# $1: bad extension
bad_extension() {
    local extension="$1"
    printf '%sn' "Extension not supported: $extension" &gt;&amp;2
    printf '%sn' "Must be one of {png, jpg, jpeg, gif}." &gt;&amp;2
}

# Returns the canonical name of the file, from its (full) path.
#
# $1: (full) path of the file
# return: canonical name of the file
#
# example: get_filename 'a/b.c/d.e.f.jpg' returns 'd.e.f.jpg'
get_filename() {
    local path="$1"
    printf %s "$path" | grep -o '[^/]+$'
}

# Returns the radical of a filename (its name without the extension), from its
# (full) path.
#
# $1: (full) path of the file
# return: radical of the file
#
# example: get_radical 'a/b.c/d.e.f.jpg' returns 'd.e.f'
get_radical() {
    local path="$1"
    local filename="$(get_filename "$path")"
    printf %s "$filename" | sed 's/.[^.]*$//'
}

# Returns the extension of a file, from its (full) path.
#
# $1: (full) path of the file
# return: extension of the file
#
# example: get_extension 'a/b.c/d.e.f.jpg' returns 'jpg'
get_extension() {
    local path="$1"
    local filename="$(get_filename "$path")"
    printf %s "$filename" | grep -o '[^.]+$'
}

# Converts a String to lower case.
#
# $1: input text
# return: lower cased text
#
# example: to_lower_case 'AbCdE' returns 'abcde'
to_lower_case() {
    local text="$1"
    printf %s "$text" | tr -s [A-Z] [a-z]
}

# error when no arguments
[ $# -ge 1 ] || syntax_error

if [ "$1" = '-open' ]
then
    # -open is enabled
    open=true
    shift
    # should remain other arguments
    [ $# -ge 1 ] || syntax_error
fi

# for each argument (a file to upload)
for path
do
    extension=$(get_extension "$path")
    ext=$(to_lower_case "$extension")
    # extention must be one of {png, jpg, jpeg, gif}
    if [ "$ext" = png -o "$ext" = jpg -o "$ext" = jpeg -o "$ext" = gif ]
    then
        filename=$(get_filename "$path")
        radical=$(get_radical "$path")
        # uploads and gets the url back
        url=$(curl www.imagup.com -F
          "fichier=@$path;filename=$radical.$ext;type=image/$ext" |
        grep image-upload |
        grep -o "http://[[:alpha:]]+.imagup.com/[^"]+.(png|jpg|jpeg|gif)")
        if [ "$url" ]
        then
            # if it worked, prints the url
            printf '%sn' "$path : $url"
            # if -open is selected, open-it in the default application
            [ $open ] &amp;&amp; xdg-open "$url"
        else
            # it didn't work
            printf '%sn' "Problem while uploading $path" &gt;&amp;2
        fi
    else
        # file extension is bad
        bad_extension "$extension"
    fi
done</pre>
<p>Pour l&#8217;installer, copiez-le dans un fichier <code>/usr/bin/imagup</code> que vous rendez exécutable :</p>
<pre>gksudo gedit /usr/bin/imagup</pre>
<p>Faites un copier-coller du script, sauvez-le. Puis :</p>
<pre>sudo chmod 755 /usr/bin/imagup</pre>
<p>Une fois installé, vous pouvez également l&#8217;utiliser comme <a href="http://doc.ubuntu-fr.org/nautilus_scripts">script nautilus</a>. Mettez le script suivant dans <code>~/.gnome2/nautilus-script/imagup-wrapper</code> et rendez-le exécutable :</p>
<pre>#!/bin/sh
# nautilus IMAGUP script wrapper
#
# 29th august 2008 - Romain Vimont (®om)
#
# Needs "imagup" core script to be installed.
#

# Use only n as field separator
IFS='
'

# Calls imagup with all args
imagup -open $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS</pre>
<p>Ensuite, dans <strong>nautilus</strong>, il est possible d&#8217;envoyer l&#8217;image en cliquant sur Script → imagup-wrapper. Les images ainsi envoyées s&#8217;ouvriront dans le navigateur par défaut.</p>
<p>Cependant, en écrivant ce script, je me suis aperçu de trois problèmes dans <strong>nautilus</strong> : <a href="http://bugzilla.gnome.org/show_bug.cgi?id=549823">un problème de proxy</a>, <a href="http://bugzilla.gnome.org/show_bug.cgi?id=549816">un problème de vue liste</a> et <a href="http://bugzilla.gnome.org/show_bug.cgi?id=549910">un problème avec le lancement de scripts à partir du bureau</a>.</p>
<p>Les deux derniers problèmes sont contournés avec le script <strong>imagup-wrapper</strong> (le dernier script).</p>
<p>Si, au lieu d&#8217;appeler une fois <strong>imagup</strong> avec tous les arguments, on voulait l&#8217;appeler <em>n</em> fois avec un seul argument (utile lorsque le programme appeler ne boucle pas sur les arguments), on aurait pu utiliser :</p>
<pre>printf %s "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" |
while read -r arg
do
    imagup -open "$arg"
done</pre>
<p>ou encore :</p>
<pre>IFS='
'
for arg in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
    imagup -open "$arg"
done</pre>
<p>J&#8217;en ai profité pour écrire une section <a href="http://doc.ubuntu-fr.org/nautilus_scripts#les_pieges_a_eviter">les pièges à éviter</a> sur la doc ubuntu-fr de <strong>nautilus-scripts</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2008/08/imagup-uploader-une-image-en-2-clics/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Recompresser ses photos en masse de manière incrémentale</title>
		<link>http://blog.rom1v.com/2008/08/recompresser-ses-photos-en-masse-de-maniere-incrementale/</link>
		<comments>http://blog.rom1v.com/2008/08/recompresser-ses-photos-en-masse-de-maniere-incrementale/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 18:45:00 +0000</pubDate>
		<dc:creator>®om</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[puf]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.rom1v.com/2008/08/recompresser-ses-photos-en-masse-de-maniere-incrementale/</guid>
		<description><![CDATA[Mon appareil photo possède 3 réglages de &#171;&#160;qualité&#160;&#187; (niveau de compression JPEG) : fin normal économique Mais lorsque l&#8217;on choisit un réglage, les photos font à peu près toutes la même taille, qu&#8217;elles soient simples ou complexes. Par exemple, en réglage fin, leur taille est quasiment toujours comprise entre 2,8Mio et 2,9Mio. Or, une photo [...]]]></description>
			<content:encoded><![CDATA[<p>Mon appareil photo possède 3 réglages de &laquo;&nbsp;qualité&nbsp;&raquo; (niveau de compression JPEG) :</p>
<ul>
<li>fin</li>
<li>normal</li>
<li>économique</li>
</ul>
<p>Mais lorsque l&#8217;on choisit un réglage, les photos font à peu près toutes la même taille, qu&#8217;elles soient simples ou complexes. Par exemple, en réglage <em>fin</em>, leur taille est quasiment toujours comprise entre 2,8Mio et 2,9Mio.</p>
<p>Or, une photo uniforme devrait prendre beaucoup moins de place qu&#8217;une photo très complexe, avec beaucoup de contours.</p>
<p>D&#8217;ailleurs, on s&#8217;en rend compte lorsqu&#8217;on recompresse ces photos sur un ordinateur :<br />
<a href="http://blog.rom1v.com/wp-content/uploads/2008/08/photos-tree.png"><img src="http://blog.rom1v.com/wp-content/uploads/2008/08/photos-tree-184x300.png" alt="photos-tree" title="photos-tree" width="184" height="300" class="aligncenter size-medium wp-image-148" /></a></p>
<p>Sur cette capture d&#8217;écran, les photos contenues à la racine (les 5 dernières) sont les photos originales, prises par l&#8217;appareil photo.<br />
Les photos contenues dans les répertoires <em>convertXX</em> sont les photos converties avec :</p>
<pre>convert image.jpg -quality XX convertXX/image.jpg</pre>
<p>(<a href="apt://imagemagick">imagemagick</a> doit être installé)</p>
<p>On se rend compte que les photos ont une taille beaucoup plus variable, ce qui est une bonne chose. Sur l&#8217;ensemble de mes albums, j&#8217;ai des photos à 500Kio et d&#8217;autres à 1,8Mio : <strong>c&#8217;est la qualité finale de la photo qui est prise en compte</strong>, et non la taille à atteindre.</p>
<p>J&#8217;ai donc décidé de prendre les photos en qualité maximale sur l&#8217;appareil photo, et de les recompresser à l&#8217;importation.</p>
<p>J&#8217;utilise <a href="apt://digikam">digiKam</a> pour gérer mes photos, qui possède une fonctionnalité pour recompresser les photos (utilisant exacement le même algorithme que <strong>imagemagick</strong>).</p>
<p>Le problème, c&#8217;est que je veux éviter, par inattention, de recompresser plusieurs fois les mêmes photos (perte de qualité inutile). Par exemple, lorsqu&#8217;on importe les photos d&#8217;une carte mémoire, qu&#8217;on les recompresse, puis qu&#8217;on importe les photos d&#8217;une seconde carte mémoire, difficile de différencier les photos déjà recompressées des autres (pour les photos se trouvant dans le même dossier).</p>
<p>J&#8217;ai donc écrit un petit script, qui garde dans un fichier la liste des photos déjà recompressées, et qui compresse toutes celles qui ne sont pas présentes dans le fichier.</p>
<p>Ainsi, après une importation de photos, j&#8217;exécute le script, seules les nouvelles seront recompressés.</p>
<pre>#!/bin/sh
#
# Mogrifie tous les fichiers jpeg non encore mogrifiés (recompressés en jpeg)
#

# le fichier "mogrified" doit exister, si ce n'est pas le cas, faire
# touch mogrified" avant de lancer le script
if [ ! -f mogrified ]
then
    echo 'mogrified file not found.'
    exit 1
fi

# liste tous les fichiers .jpg dans les répertoires décrivant une année
# (2005, 2006...)
find -iname '*.jpg' | grep ^./20 | sort &gt; filelist &amp;&amp;

# supprime de cette liste tous les fichiers déjà mogrifiés
comm -23 filelist mogrified |
while read photo
do
    # mogrifie ces fichiers
    echo "$photo"
    mogrify -quality 90 "$photo"
done

# les fichiers mogrifiés sont maintenant les fichiers de la liste complète
mv filelist mogrified</pre>
<p>L&#8217;outil <strong>mogrify</strong> fait la même chose que <strong>convert</strong>, sauf qu&#8217;il modifie le fichier sur place (et écrase donc la source).</p>
<p><strong>Cela permet d&#8217;avoir un très bon rapport qualité/taille, sans provoquer des pertes visibles sur les photos très complexes, ni utiliser de l&#8217;espace inutilement sur les photos simples.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rom1v.com/2008/08/recompresser-ses-photos-en-masse-de-maniere-incrementale/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
