# [mplayer] astuce pour qu'il soit moins verbeux

## scout

mplayer je le trouve trop verbeux donc j'ai écrit un petit wrapper en ruby:

```
#!/usr/bin/ruby

array=ARGV.collect { |str| str.dump } 

io=IO.popen("mplayer #{array.join(' ')}")

io.sync=true

$stdout.sync=true

def putout(str)

        if str=~/^Playing|^Joue|\r/ then

                print str

        end

end

buffer=''

while char = io.getc do

        buffer+=char.chr

        if char.chr=="\n" or char.chr=="\r" then

                putout buffer

                buffer=''

        end

end
```

[EDIT]le script est commenté plus bas dans le thread[/EDIT]

ça donne ça maintenant:

```
geoffrey@scout> meuhplayer zik/*

MMX2 supported but disabled

Can't open '/home/geoffrey/.mplayer/codecs.conf': Aucun fichier ou répertoire de ce type

Can't open input config file /home/geoffrey/.mplayer/input.conf: Aucun fichier ou répertoire de ce type

Playing zik/Benny_Benassi_-_Hit_my_heart.mp3.

Playing zik/Daft Punk - 04 - Da Funk.mp3.

Playing zik/Desireless - Voyage Voyage (short).mp3.

Playing zik/laurent wolf calinda.mp3.

Playing zik/Laurent Wolf - Eye Of The Tiger.mp3.

Playing zik/Laurent Wolf - Saxo (Club Mix).mp3.
```

plus le petit décomptage des secondes en temps réel, que je n'arrive pas à copier-coller ici ...

----------

## 3.1415

t'en as pas un aussi pour empecher gmplayer d'ouvrir 4 fenetres pour te dire qu'il s'est crashe?  :Wink: 

----------

## sireyessire

joli, scout. mais moi je l'aime verbeux mon mplayer  :Very Happy: 

----------

## jpwalker

C'est très intressant tout ça  :Wink:  Serait-il possible d'avoir quelques commentaires dans ton code  :Rolling Eyes:  stp (oui moi pas très intelligent donc...) lol !

Merci  :Very Happy: 

----------

## sireyessire

je sais pas j'ai jamais fait de ruby mais en gros ça doit donner qqch comme

 *Quote:*   

> #!/usr/bin/ruby
> 
> /* récupère les arguments passés au script */
> 
> array=ARGV.collect { |str| str.dump } 
> ...

 

et on réinitialise le buffer après l'appel à putout.

donc dans le buffer il n'y a pas plsu qu'une ligne  :Very Happy: 

attention jai mis le format de commentaires C mais c'est pas sûr que ça marche comme commentaire en ruby. Puis scout dis nous si je me fourvois complétement ou pas  :Laughing: 

----------

## Sleeper

A part le style des commentaires (faut utiliser le # comme en perl) ca va ...

Un p'tit truc pour scout pourquoi :

 *Quote:*   

> 
> 
> /* récupère les arguments passés au script */
> 
> array=ARGV.collect { |str| str.dump } 
> ...

 

et pas 

```
io=IO.popen("mplayer " + ARGV.join(' '))
```

----------

## sireyessire

 *Sleeper wrote:*   

> A part le style des commentaires (faut utiliser le # comme en perl) ca va ...
> 
> 

 

cool, j'étais donc assez réveillé, bon je prends note pour le #  :Very Happy: 

----------

## scout

 *Sleeper wrote:*   

> A part le style des commentaires (faut utiliser le # comme en perl) ca va ...
> 
> Un p'tit truc pour scout pourquoi :
> 
>  *Quote:*   /* récupère les arguments passés au script */
> ...

 

Quand tu as des noms de fichiers avec des espaces ou d'autres caractères spéciaux interprétés par bash, ça ne marche pas en faisant ARGV.join(' '). le coup du dump ça permet de mettre chaque nom de fichier entre guillements ou d'échapper les caractères qui ne passeraient pas sinon

(dans la première version du script, j'avais fait une fonction qui remplaçait les espaces des noms de fichiers par des "\ " et les parenthèses par des "\(" , etc ... mais c'était plus compliqué et ça marchait moins bien)

[EDIT] bon vl'a mes commentaires:

```
#!/usr/bin/ruby

# on prépare les arguments à passer à mplayer

# dump met entre guillemets les noms de fichiers contenant des espaces

array=ARGV.collect { |str| str.dump } 

# on lance mplayer

io=IO.popen("mplayer #{array.join(' ')}")

# on travaille avec mplayer et avec la sortie standard en syncrone

# sinon les entrées/sorties sont bufferisées et le défilement des secondes

# n'est pas fluide

io.sync=true

$stdout.sync=true

# cette fonction affiche les lignes commençant par Playing

# ou celles contenant un retour chariot, c'est à dire celles

# qui affichent les nombres de secondes

def putout(str)

        if str=~/^Playing|\r/ then

                print str

        end

end

# on lit la sortie rendue par mplayer octet par octet et pas ligne par ligne

# en effet lorsque mplayer affiche les petites secondes

# qui défilent, il envoie des retours chariots pour revenir en

# début de ligne, mais pas de retour à la ligne.

buffer=''

while char = io.getc do

        buffer+=char.chr

        if char.chr=="\n" or char.chr=="\r" then

                putout buffer

                buffer=''

        end

end
```

@sireyesire: oué donc le seul truc c'est que la regexp c'est "ou ça commence par Playlist, ou ça contient un \r, c'est le seul truc où tes commentaires ne collent pas parfaitement  avec la réalité des choses  :Razz: 

nan sans blague t'avait tout compris le script, même le gag de la syncro que j'avais eu du mal à trouver  :Smile: 

----------

## sireyessire

 *scout wrote:*   

> 
> 
> @sireyesire: oué donc le seul truc c'est que la regexp c'est "ou ça commence par Playlist, ou ça contient un \r, c'est le seul truc où tes commentaires ne collent pas parfaitement  avec la réalité des choses 
> 
> nan sans blague t'avait tout compris le script, même le gag de la syncro que j'avais eu du mal à trouver 

 

ah oui dans les regexp | c'est le ou, j'ai tellement l'habitude que ce soit || que fatalement...

Oui, j'ai été huge, mais c'est parce qu'il est clair ce prog  :Wink: 

----------

## 3.1415

hé ho stop les amis y'a la tete ki va bientot exploser!

----------

## Celeborn

bah ça dépend... question fondamentale : c'est quoi qui explose en premier ? les chevilles ou la tête ?   :Razz: 

----------

## Sleeper

 *scout wrote:*   

> 
> 
> Quand tu as des noms de fichiers avec des espaces ou d'autres caractères spéciaux interprétés par bash, ça ne marche pas en faisant ARGV.join(' '). le coup du dump ça permet de mettre chaque nom de fichier entre guillements ou d'échapper les caractères qui ne passeraient pas sinon
> 
> (dans la première version du script, j'avais fait une fonction qui remplaçait les espaces des noms de fichiers par des "\ " et les parenthèses par des "\(" , etc ... mais c'était plus compliqué et ça marchait moins bien)
> ...

 

A ouaip ... j'y avais pas pense ... et ca alors:

```
io=IO.popen("mplayer " + ARGV.map{|s| '"' + s + '"'}.join(' '))
```

Ca marche pas ??  :Wink: 

----------

## scout

 *Sleeper wrote:*   

> et ca alors:
> 
> ```
> io=IO.popen("mplayer " + ARGV.map{|s| '"' + s + '"'}.join(' '))
> ```
> ...

 

Et non ça ne marche pas ... si le nom d'un des fichiers contient un guillemet "   :Razz: 

il est vraiment très fort ce dump il échappe le caractère " si besoin est, j'ai découvert ça en cherchant un contre exemple à ta méthode !

Comme quoi yoyo a raison, "La connaissance s'accroît quand on la partage"  :Smile: 

----------

## Sleeper

 *scout wrote:*   

> 
> 
> Et non ça ne marche pas ... si le nom d'un des fichiers contient un guillemet "  
> 
> il est vraiment très fort ce dump il échappe le caractère " si besoin est, j'ai découvert ça en cherchant un contre exemple à ta méthode !
> ...

 

Arghhh  :Wink:  Alors finalement tu as raison, un :

```
io=IO.popen("mplayer " + ARGV.map{|s| s.dump}.join(' '))
```

est necessaire  :Wink: 

 *Quote:*   

> 
> 
> Comme quoi yoyo a raison, "La connaissance s'accroît quand on la partage" 

 

C'est d'ailleurs ce qui la rend interessante  :Wink: 

----------

