# [astuce] les vidéos thumbnails dans nautilus avec mplayer

## razer

Bon...

J'aime pas trop totem, il crashe pas mal, lit pas tjrs tout bien, gstreamer j'en parle mm pas...

Mais j'aime bien les aperçus de vidéos dans nautilus, que je le lit pour le reste avec mplayer, qui est je pense de loin le meilleur.

Or j'ai pas trouvé de système autre que totem-thumbnailer et gst. Donc j'ai commencé à travailler sur un thumbnailer utilisant mplayer. Il est bêta de chez bêta, mais je peux déjà vous en faire profiter.

Il nécessite mplayer biensur, et imagemagick. Désolé j'ai pas encore fait l'ebuild pour les dépendances   :Confused: 

```

#!/bin/bash

input=$(echo "$1" |sed -e 's/file:\/\///'|sed -e 's/%20/ /g')

mplayer -really-quiet -vo png -z 5 -frames 1 -nosound "$input" >/dev/null 2>&1

convert -geometry 128x96 00000001.png "$2"

rm 00000001.png

```

Je suis ennuyé par 2 choses :

je cherche un moyen plus léger pour faire un resize de png que imagemagick

Enfin et surtout nautilus envoie les args en UTF avec un file:// devant. Pour le file://, c'est facile avec sed, mais convertir tous les caractères accentués correctement bonjour l'angoisse....

Donc pour l'instant :

çà ne fonctionne pas avec les fichiers aux caractères accentués (é,à, ù...)

Il faut améliorer le rendu en prenant une partie centrale de la vidéo (pour l'instant il thumb le début) : çà je pense pouvoir faire...

Enfin pour l'essayer, copier/coller le script qqupart (exemple : /usr/bin/mplayer-thumb, avec le chmod +x), puis éditer les clés dans gconf-editor :

```
desktop -> gnome -> thumbnailers -> video/*

command mplayer-thumb %u %o
```

Je ferais quand çà sera au point les keys correctes.

----------

## SKBo

Bonsoir,

Je suis passé par là et j'ai trouvé l'idée excellente, donc j'ai commencé par ton petit script et j'ai retravaillé le tout pour en faire un truc un peu plus complexe. C'est en perl (je sais c'est mal, mais il est quand même en strict, donc c'est moins mal), normalement il gère correctement les accents, et dans l'ensemble, je l'ai testé sur une floppée de fichiers sans avoir de problèmes notables.

Ça n'utilise rien d'autre que mplayer, il faut une version qui supporte le -identify (toutes les versions récentes le font normalement), et il ne faut pas spécifier de really-quiet dans /etc/mplayer.conf (ailleurs j'ai pas essayé, ça se peut que ça marche), sinon mplayer n'affiche pas les informations du -identify (c'est idiot, et même en -verbose, il veut rien savoir...).

L'idée est la suivante, mplayer récupère les informations sur le fichier lors d'un premier passage, puis on calcule quel endroit lire (y'a une variable qui permet de spécifier quel pourcentage choisir) et quelle taille utiliser en fonction de ce qui est passé en paramètres ; mplayer lance la lecture sur une dizaine de frames (10 semble être une bonne valeur, certains fichiers ne passaient pas en dessous, et là encore, j'en ai 2 qui ne marchent pas très bien). Sur la dizaine d'images récupérées, le script récupère la plus grosse car c'est celle qui comportera dans la majorité des cas le plus de changements, et donc sera le plus susceptible d'être attrayante en petit format.

Maintenant, j'aimerai bien changer 2 3 comportements hasardeux. Pour l'instant, je n'ai pas trouvé comment dire à mplayer de stocker les fichiers générés ailleurs que dans le répertoire de l'utilisateur et/ou sous un autre nom que 0000xxx.png (ça fait vraiment moche de voir tous les fichiers apparaître lorsqu'une image est récupérée).

J'aimerai bien aussi que mplayer n'ai à récupérer qu'une seule image et qu'elle soit directement exploitable (genre prendre la prochaine keyframe), mais je sais pas non plus lui dire.

Enfin, pour rester dans l'esprit gentoo, j'aimerai bien passer ce script en python, mais vu que j'en ai jamais fait, je laisse le soin à d'autres de le faire (ou bien vous pouvez toujours attendre que je m'y mette  :Wink: ).

Et maintenant le script :

```
#!/usr/bin/perl

use strict;

my $percent = 20;

my $size = -1;

my $in = $ARGV[0];

my $out = $ARGV[1];

if($#ARGV < 1 or $#ARGV > 2) {

        die("Bad arguments:\tmplayer-thumbnail in out [size]\n");

}

if($#ARGV == 2) {

        $size = $ARGV[2];

}

$in =~ s/file:\/\///i;

$in =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;

my $infos = `mplayer -noaspect -noautosub -nortc -identify -vo null -nosound -frames 1 "$in" 2>/dev/null | grep ^ID`;

if($infos =~ m/ID_VIDEO_WIDTH=(\d+)/) {

        my $x = $1;

        if($infos =~ m/ID_LENGTH=(\d+)/) {

                my $t = $1;

                my $xy = "";

                if($size > 0 and $x > 8) {

                        $xy = "-zoom -xy $size";

                }

                $t = int($percent*$t/100);

                system("mplayer -really-quiet -noaspect -noautosub -nortc -vo png -z 5 -nosound -ss $t -frames 10 $xy \"$in\" >/dev/null 2>&1");

                system("mv `ls 000000*.png -S --color=never | head -n 1` $out");

                system("rm 000000*.png -f");

        }

}

```

Voilà voilà, amusez-vous bien, et hésitez pas à modifier et faire part de vos découvertes  :Razz: ...

----------

## razer

Super, çà fait plaisir que mon idée suive son cours... Ces aperçus sont bien pratiques, c'est ennuyeux d'être obligé d'installer totem/xine ou totem/gstreamer rien que pour çà...

Je vais essayer ton script, peut être légèrement le modifier, çà me permettra de me familiariser avec le perl que je n'utilise jamais, merci !

----------

## cdemers

Ma petite contribution.  C'est en bash avec mplayer, c'est pas encore parfait, mais ca fonctionne dans la plus part des cas.  Idealement, il faudrait utiliser mktemp et restreindre le PATH, mais bon, c'est fonctionel.

```

#!/bin/bash

input=$(echo "$1" |sed -e 's/file:\/\///'|sed -e 's/%20/ /g'|sed -e 's/%2520/%20/g')

cd /tmp

mplayer -really-quiet -vo png -z 5 -frames 3 -ss 4 -nosound "$input" >/dev/null 2>&1

convert -geometry 128x96 00000002.png "$2"

# delete the temporary files (proofs :-), this code is big but it's just fine for testing.

let count=0

while [ $count -le 4 ]; do

  fname="0000000$count.png"

  if [ -e $fname ]; then

    rm $fname

  fi

  let count=count+1

done

```

Une autre version, plus un concept qu'une version, mais celui-la affiche un tiling de quatres (key) frames du video dans un meme thumbnail.  C'est bcp trop lent pour etre utilise par tout le monde, mais si ca peut generer des idees...

```

cd /tmp

mplayer -really-quiet -vf framestep=I -vo png -z 5 -frames 600 -ss 4 -nosound "$input" >/dev/null 2>&1

convert \( 00000001.png 00000002.png +append \) \( 00000003.png 00000004.png +append \) -append -geometry 128x96  "$2"

```

Have fun!

----------

## kernelsensei

@cdemers: merci pour cette contribution, et bienvenue sur le forum  :Very Happy: 

----------

## bi3l

Une version un  peu optimisée:

appel à sh (sous linux, ça ne fait aucune différence, mais sous d'autres systèmes, c'est vachement moins lourd)

appel à un unique sed pour normaliser le nom du fichier

mplayer redimensionne l'image tout seul (-vf scale); plus besoin d'imagemagick

 *Quote:*   

> #!/bin/sh
> 
> input=`echo "$1" | sed -e 's,file://,,; s,%20, ,g; s,%2520,%20,g'`
> 
> cd /tmp
> ...

 

Pour l'encodage des caractères, c'est un peu plus compliqué. On peut utiliser iconv, mais il faut connaitre l'encodage des noms des fichiers et ça je ne sais pas si c'est uniquement dépendant de l'encodage du système et pas aussi un peu du type de partition.

----------

## GentooUser@Clubic

Je sais pas pourquoi mais aucun de vos scripts ne marchent chez moi   :Sad: 

1: Je met le script dans /usr/local/bin  

2: Je chmod +x dessu

3: J'edite la cle gconf /desktop/gnome/thumbnailers/video@mpeg/command pour apeller le script avec les bon paramètres mais les vidéos gardent leurs icônes standard

Une idée ?

----------

## bi3l

Assure-toi de ne pas t'être trompé dans le nom de l'exécutable ni dans ceux des paramètres et leur ordre:

 *Quote:*   

> /usr/local/bin/mplayer-thumb %u %o

 

Tu dois mettre ça dans toutes les entrées video@... de la branche /apps/desktop/gnome/thumbnailers.

Vérifie que l'extension correspond bien au contenu des fichiers video. Tu peux essayer de te double-clicker sur le fichier, nautilus te diras s'il pense que le contenu et l'extension diffèrent.

Si rien ne marche, tu peux tenter de te déloger puis te reloger, on sait jamais.

----------

## GentooUser@Clubic

J'ai tout tenté mais rien a faire   :Mad: 

j'ai ajouté echo -e "\a" au script ça bippe pas quand je rentre dans un dossier avec des vidéos, donc le PB est au niveau de nautilus   :Sad: 

EDIT: bon ça viens de mon user j'ai essayé en root ça marche

----------

## razer

 *GentooUser@Clubic wrote:*   

> J'ai tout tenté mais rien a faire  
> 
> j'ai ajouté echo -e "\a" au script ça bippe pas quand je rentre dans un dossier avec des vidéos, donc le PB est au niveau de nautilus  
> 
> EDIT: bon ça viens de mon user j'ai essayé en root ça marche

 

Edite ton fichier ~.gnome/mime-info/user.keys et commente les lignes "icon_filename" relatives aux types mime de video

----------

## GentooUser@Clubic

J'ai pas de fichier ~.gnome/mime-info/user.keys

Les thumbnails son crées pour les vidéos que j'ajoute ou renomme mais pas pour les fichiers existant.

Je vais ouvrir un topic a part pour ce problème parce que ici c'est plutôt pour parler du script lui même, et puis j'ai le problème aussi avec totem-thumbnailer et gst-thumb.

----------

## GentooUser@Clubic

Bon problème résolu (voir mon topic)   :Very Happy: 

Pour le problème avec les accents ce serai plus simple a résoudre en Python mais ça poserai pas des PB de performances ?

L'idéal serai de faire le truc en C (je pense que gnome-VFS fourni une fonction pour décoder les URI) mais ce serait plus du script  :Laughing: 

Au passage un truc bizarre : pour des vidéos qui ne contiennent pas d'accent, dont l'extension correspond au type et qui passent très bien avec mplayer la création de la miniature échoue une explication ?

----------

## razer

 *GentooUser@Clubic wrote:*   

> Bon problème résolu 
> 
> Au passage un truc bizarre : pour des vidéos qui ne contiennent pas d'accent, dont l'extension correspond au type et qui passent très bien avec mplayer la création de la miniature échoue une explication ?

 

(Réponse à côté : mal lu mais je laisse quand même car interressant je trouve)

Oui : la gestion "à la windows" des types de fichier dans gnome, qui privilégie l'extention du fichier sur le "magic number" permettant de définir son type par le contenu (header)... Une belle bêtise je trouve  :Sad: 

Conséquence : tu vires l'extension ".avi" le fichier est considéré comme une video, par contre tu remplaces par ".zip" et çà devient une archive... C'est nul je trouve...

(Après relecture)

Je n'ai pas rencontré ce problème... Pour diagnostiquer essaie de lancer le script en direct, et regarde si çà génère bien une image png... Histoire de savoir si çà vient de nautilus ou du script/mplayer

----------

## GentooUser@Clubic

J'ai détecté d'où vient le PB, pour certaines vidéos la commande

```
mplayer -nocache -nosound -zoom -vo png -z 5 -vf scale=128:96 -frames 2 -sstep 1 -ss 4 
```

 ne crée qu'un fichier 00000001.png

j'ai donc un peut modifié le script 

```
#!/bin/sh

input=`echo "$1" | sed -e 's,file://,,; s,%20, ,g; s,%2520,%20,g'`

cd /tmp

mplayer -nocache -nosound -zoom -vo png -z 5 -vf scale=128:96 -frames 2 -sstep 1 -ss 4 "$input" > /dev/null 2>&1

cd $OLDPWD

if [ -e "/tmp/00000002.png" ] ; then

  mv "/tmp/00000002.png" "$2"

else

  mv "/tmp/00000001.png" "$2"

fi

  rm -f "/tmp/0000000?.png"

```

J'ai encore des PB avec quelques vidéos mais je vais voir  

 :Smile: 

Après je verrais si je peut pas résoudre le PB d'accent en faisant un script python, je débute vraiment en python mais j'ai déjà codé une fonction de ce style (en fait j'ai fait une fonction qui fait l'inverse elle encode un path en URI gnome-vfs  :Laughing:  )

----------

## GentooUser@Clubic

Voila ma version en python

J'utilise la fonction urllib.unquote pour les accents et ça marche très bien chez moi (j'ai "fr_FR.UTF8" comme locale)

```
#!/usr/bin/python

import os

import sys

import glob

import shutil

import urllib

def clean () :

  files = glob.glob ( "/tmp/0000000?.png" )

  for file in files :

    os.remove( file )

input_file = urllib.unquote ( sys.argv[ 1 ] ).replace ( "file://", '', 1 ).replace ( "\"", "\\\"")

output_file = sys.argv[ 2 ]

mplayer_cmd = "mplayer -nocache -nosound -zoom -vo png -z 5 -vf scale=128:96 -frames 2 -sstep 1 -ss 4 \"" + input_file + "\" > /dev/null 2>&1"

oldpwd      = os.getcwd()

clean ()

os.chdir ( "/tmp" )

os.system ( mplayer_cmd )

os.chdir ( oldpwd )

if os.path.exists ( "/tmp/00000002.png" ) :

  shutil.move ( "/tmp/00000002.png", output_file )

elif os.path.exists ( "/tmp/00000001.png" ) :

  shutil.move ( "/tmp/00000001.png", output_file )

else :

  print (" ERREUR miniature non crée ")

  print ( input_file )

  print ( output_file )

clean()
```

 C'est mon deuxième script en python si y'a des erreurs vous me le dites  :Smile: 

Y'a encore un PB pour certaines vidéos aucune miniature n'est crée par mplayer, sauf si on augmentes de très beaucoup la valeur du paramètre "-frames" ce qui nuit enormement aux performances.Last edited by GentooUser@Clubic on Fri Jan 14, 2005 3:37 pm; edited 4 times in total

----------

## bi3l

 *GentooUser@Clubic wrote:*   

> J'utilise la fonction urllib.unquote pour les accents et ça marche très bien chez moi (j'ai "fr_FR.UTF8" comme locale)

 

Je ne suis pas un pro de python, mais il ne me semble pas que la fonction unquote ait un quelconque rapport avec les accents. Elle va juste convertir les séquences de caractères échappées %xx en leur équivalent non échappé. Par exemple, %7 va être converti en ~.

 *GentooUser@Clubic wrote:*   

> Y'a encore un PB pour certaines vidéos aucune miniature n'est crée par mplayer, sauf si on augmentes de très beaucoup la valeur du paramètre "-frames" ce qui nuit enormement aux performances.

 

Tu pourrais poster quelque part une petite video avec laquelle le script rencontre un problème ?

----------

## GentooUser@Clubic

Pour les accents tu as raison mais le problème est la justement, nautilus envoi le chemin de la vidéo au thumbnailer sous la forme d'une uri gnome-vfs, donc tous les caractères accentués son représenté sous la forme %XX, comme mplayer ne gère pas les uri gnome-vfs il faut utiliser la fonction unquote pour retrouver un path correct.

Pour les vidéos j'ai toujours pas accès a mon FTP wanadoo, donc difficile d'en poster une, y'a ces vidéos http://www.gainax.co.jp/hills/anno/animetion.html mais avec il plante dessus sur une erreur de segmentation "classique" (mais qui ne se produit pas pendant la lecture "normale" de la vidéo) chez moi donc ça recrée pas le bug des images crées qu'a partir de la xxxxème frame.

EDIT: j'ai un peut modifié mon script (correction du bugs, mais il est plus lourd).

----------

