Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[debutant] pbm boucle for

15 réponses
Avatar
Brice
Bonjour

Je suis complètement débutant en python et je rencontre un problème avec
une boucle for et un waitpid. En fait je cherche à programmer un plugin
pour quodlibet (pour ceux qui connaissent sous linux), pour pouvoir
graver une liste de lecture.

Les opérations que je souhaite effectuer sont les suivantes:

-copie des fichiers musicaux dans un répertoire temporaire
-décompression en wav avec mplayer
-normalisation des niveaux sonores
-gravage ave cdrecord


Pour celà j'ai fait la bidouille suivante:


import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")
for song in songs:
copy_dir="/tmp/cd_QL/"
shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))
p=os.system("mplayer -ao pcm:file=/tmp/cd_QL
/$(ls /tmp/cd_QL|wc -l).wav /tmp/cd_QL/%s &" % file.replace(' ' ,'_'))
p.waitpid()
# os.system("cd /tmp/cd_QL/ && normalize -m *.wav && cdrecord -v
-eject -pad -audio *.wav &")



class DAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')

class TAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')





Le but à terme est aussi de pouvoir graver en dao ou tao.

Mon pbm est le suivant: la boucle "for (root, dirs, files) in
os.walk('/tmp/cd_QL')" ne boucle pas! en effet, seul le premier fichier
de ma liste de lecture est copié et converti en wave... La suppression
des espaces se passe sans problème.

Question subsidiaire: je souhaite utiliser des n° pour les fichiers
wave, de manière à garder l'ordre de ma playlist, pour celà, il me
faudrait des n° à 2 chiffres et là ma solution n'est pas bonne...


Merci!
--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"

10 réponses

1 2
Avatar
Brice
Bonjour

mon plugin a quelque peu évolué et j'espère en arriver au bout.

voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")
for song in songs:
copy_dir="/tmp/cd_QL/"
shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))
name = os.system("ls /tmp/cd_QL|wc -l")
# name = int(name)
# print name
os.system("mplayer -ao pcm:file=/tmp/cd_QL/%s.wav
/tmp/cd_QL/%s && rm /tmp/cd_QL/%s &" % (name,file.replace(' '
,'_'),file.replace(' ','_')))
# os.system("cd /tmp/cd_QL/ && normalize -m *.wav && cdrecord -v
# -eject -pad -audio *.wav &")



class DAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')

class TAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')



de manière a avoir des noms de fichiers en wave sous forme de n° je me
suis dit que j'allais commencer à partir de 10, or mon code ne marche
pas! le print name me donne un truc comme:

1
10
2
10
3
10
....


de plus même j'aimerais trouver le moyen d'attendre la fin de mplayer
avant de passer au fichier suivant, mais je trouve rien.


Une idée?


Merci
--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"
Avatar
Bruno Desthuilliers
Brice wrote:
Bonjour

mon plugin a quelque peu évolué et j'espère en arriver au bout.

voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")


Tu utilises plusieurs fois ce chemin. Il serait préférable d'en faire
une constante symbolique.

for song in songs:
copy_dir="/tmp/cd_QL/"


ce n'est pas la peine de redéfinir le même binding à chaque itération.

shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))


Attention, tu es encore dans la boucle sur songs. Ca veux dire que pour
*chaque* entrée dans songs, tu recommences tout ce traitement. Es-tu sûr
que ce soit nécessaire ? AMHA tu devrais commencer par revoir ton algo,
et effectuer une décomposition fonctionnelle pour éviter de te mélanger
les pinceaux.


(snip le reste pour le moment)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Brice
On 2006-10-23, Bruno Desthuilliers wrote:
Brice wrote:
Bonjour

mon plugin a quelque peu évolué et j'espère en arriver au bout.

voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")


Tu utilises plusieurs fois ce chemin. Il serait préférable d'en faire
une constante symbolique.

for song in songs:
copy_dir="/tmp/cd_QL/"


ce n'est pas la peine de redéfinir le même binding à chaque itération.


je suis d'accord là dessus et je l'ai mis avant le for song in songs.


shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))


Attention, tu es encore dans la boucle sur songs. Ca veux dire que pour
*chaque* entrée dans songs, tu recommences tout ce traitement. Es-tu sûr
que ce soit nécessaire ? AMHA tu devrais commencer par revoir ton algo,
et effectuer une décomposition fonctionnelle pour éviter de te mélanger
les pinceaux.



il me semble que c'est nécessaire! en fait je veux copier un morceau,
enlever les espaces dans le nom du fichier, le convertir ensuite en wave
et donner à ce fichier un n° et ensuite passer au song suivant. Il est
nécessaire de faire comme ça pour garder l'ordre de ma playlist que je
veux graver!

Par contre il est vrai que les 2 boucles for l'une à la suite sont
lourdes mais je ne sais pas comment faire pour éviter cela.

De plus l'autre problème qui se pose c'est que comme c'est programmé
pour l'instant, l'algo n'attend pas la fin de mplayer pour passer au
song suivant donc tous les wave ont le même n°...


(snip le reste pour le moment)




merci

--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"


Avatar
Bruno Desthuilliers
Brice wrote:
On 2006-10-23, Bruno Desthuilliers wrote:
Brice wrote:
Bonjour

mon plugin a quelque peu évolué et j'espère en arriver au bout.

voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")
Tu utilises plusieurs fois ce chemin. Il serait préférable d'en faire

une constante symbolique.

for song in songs:
copy_dir="/tmp/cd_QL/"
ce n'est pas la peine de redéfinir le même binding à chaque itération.



je suis d'accord là dessus et je l'ai mis avant le for song in songs.

shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))
Attention, tu es encore dans la boucle sur songs. Ca veux dire que pour

*chaque* entrée dans songs, tu recommences tout ce traitement. Es-tu sûr
que ce soit nécessaire ? AMHA tu devrais commencer par revoir ton algo,
et effectuer une décomposition fonctionnelle pour éviter de te mélanger
les pinceaux.



il me semble que c'est nécessaire!


Il y a peut-être certaines infos qui me manquent, mais pour ce je vois
et comprends de ton code, ta seconde boucle renomme *tous* les fichiers
du répertoire de destination (/tmp/cd_QL) pour *chaque* fichier source.

En pseudocode, tu fais:

pour chaque fichier source:
copier le fichier source dans le répertoire destination
pour chaque fichier dans le répertoire destination:
renommer le fichier
# etc...


en fait je veux copier un morceau,
enlever les espaces dans le nom du fichier,


Ce que tu peux faire *avant* la copie:

destdir = "/some/path"
convert_cmd = """
mplayer -ao pcm:file=%(destpath)s %(sourcepath)s && rm %(sourcepath)s &
"""

def convert(sourcepath, destpath):
cmd = convert_cmd % dict(
sourcepath=sourcepath,
destpathÞstpath
)
os.system(cmd)

def rename(filename):
return filename.replace(' ', '_')


def main():
os.mkdir(destdir)

for num, song in enumerate(songs):
oldname = song['~filename']
newpath = os.path.join(destdir, rename(oldname))
shutil.copy(oldname, newpath)
wavename = os"%03d.wav" % num
convert(newpath, wavename)

if __name__ == '__main__':
main()

NB : non testé et sans aucune garantie !-)

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
Brice
Merci pour ton aide! Au final le plugin marche bien! en voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin


convert_cmd = """mplayer -ao pcm:file=%(destpath)s %(sourcepath)s && rm
%(sourcepath)s &"""
def convert(sourcepath, destpath):
cmd = convert_cmd %
dict(sourcepath=sourcepath,destpathÞstpath)
os.system(cmd)

class DAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')
PLUGIN_DESC = 'Burn CD w/o blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -dao -pad -audio *.wav && rm -rf /tmp/cd_QL &")




class TAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')
PLUGIN_DESC = 'Burn CD with blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -pad -audio *.wav && rm -rf /tmp/cd_QL &")




Bon c'est un peu lourd de répéter 2 fois 99% du code mais je ne sais pas
comment faire autrement...

De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini... mais ça
marche donc -;)

--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"
Avatar
Bruno Desthuilliers
Brice wrote:
Merci pour ton aide! Au final le plugin marche bien! en voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin


convert_cmd = """mplayer -ao pcm:file=%(destpath)s %(sourcepath)s && rm
%(sourcepath)s &"""
def convert(sourcepath, destpath):
cmd = convert_cmd %
dict(sourcepath=sourcepath,destpathÞstpath)
os.system(cmd)

class DAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')
PLUGIN_DESC = 'Burn CD w/o blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -dao -pad -audio *.wav && rm -rf /tmp/cd_QL &")



Bon, je vois que tu sais copier-coller, mais que tu n'a pas fait
beaucoup d'effort pour comprendre l'idée générale...

A ton avis, pourquoi est-ce que je déclare une variable pour le chemin
du répertoire temporaire et une variable pour la commande mplayer ? Et
pourquoi j'isole l'appel à cette dernière dans une fonction ? (NB : au
passage, tel que je l'ai fait, c'est encore du Q&D...)



class TAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')
PLUGIN_DESC = 'Burn CD with blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -pad -audio *.wav && rm -rf /tmp/cd_QL &")




Bon c'est un peu lourd de répéter 2 fois 99% du code


Non ?

mais je ne sais pas
comment faire autrement...


Questions:
1/ quelles sont les parties communes et les parties qui diffèrent
2/ à quoi servent les fonctions et l'héritage ?

De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system. Si tu veux un appel bloquant, des
communications avec les processus appelé etc, il y a d'autres modules
pour ça (se référer au FameuxManuel(tm)).

mais ça
marche donc -;)


Mouais... On peut aussi voire ça comme ça.


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Brice
On 2006-10-23, Bruno Desthuilliers wrote:
Brice wrote:
Merci pour ton aide! Au final le plugin marche bien! en voici le code:

import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin


convert_cmd = """mplayer -ao pcm:file=%(destpath)s %(sourcepath)s && rm
%(sourcepath)s &"""
def convert(sourcepath, destpath):
cmd = convert_cmd %
dict(sourcepath=sourcepath,destpathÞstpath)
os.system(cmd)

class DAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')
PLUGIN_DESC = 'Burn CD w/o blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -dao -pad -audio *.wav && rm -rf /tmp/cd_QL &")



Bon, je vois que tu sais copier-coller, mais que tu n'a pas fait
beaucoup d'effort pour comprendre l'idée générale...


atta, je suis d'accord avec toi, y'a bcp de copier coller mais l'idée
générale, je l'ai comprise et j'ai adapté ce que tu avais écrit à mes
besoins (dans de faibles proportions je l'avoue)


A ton avis, pourquoi est-ce que je déclare une variable pour le chemin
du répertoire temporaire et une variable pour la commande mplayer ? Et
pourquoi j'isole l'appel à cette dernière dans une fonction ? (NB : au
passage, tel que je l'ai fait, c'est encore du Q&D...)



ok ok, je sais que l'utilisation des vars permet un code plus léger mais
dans mon cas de l'appel os.system, j'avoue m'y retrouver nettement en
voyant le path et non pas une variable, dans les tous les cas c'est un
truc que je vais changer



class TAO(SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')
PLUGIN_DESC = 'Burn CD with blanks.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert
files in wave files.").run()
else:
destdir = "/tmp/cd_QL/"
os.mkdir(destdir)
for num, song in enumerate(songs):
oldname = song['~filename']
newname = ("%03d" % num)
newpath = os.path.join(destdir, newname)
shutil.copy(oldname, newpath)
wavename = ("%03d.wav" % num)
wavepath = os.path.join(destdir,
wavename)
convert(newpath, wavepath)
os.system("cd /tmp/cd_QL/ && normalize -m *.wav
&& cdrecord -v -eject -pad -audio *.wav && rm -rf /tmp/cd_QL &")




Bon c'est un peu lourd de répéter 2 fois 99% du code


Non ?



SI

mais je ne sais pas
comment faire autrement...


Questions:
1/ quelles sont les parties communes et les parties qui diffèrent
2/ à quoi servent les fonctions et l'héritage ?



1/ une simple commande, la dernière. Pour info j'ai essayé de fixer la
valeur d'une var en fonction de "quelle" plugin était appelé (cf. les
codes précédents avec classDAO et classTAO) malheureusement il faut plus
pour fixer cette var et mes connaissances étant celles d'un mec ayant à
peu près 2-3 h de python...

2/ pas compris le truc (je suis pas un bon programmeur de surcroit)


De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system. Si tu veux un appel bloquant, des
communications avec les processus appelé etc, il y a d'autres modules
pour ça (se référer au FameuxManuel(tm)).



je cherche, je cherche. Je me demande si os.spawn peut faire
quelque chose pour moi mais n'en suis point sur.

mais ça
marche donc -;)


Mouais... On peut aussi voire ça comme ça.



Je suis d'accor avec ta remarque. Le truc est d'abord pour moi d'avoir
un plugin qui marche et ensuite de faire quelque chose de propre car
dans l'intervalle, je peux utiliser mon code tout sale ce qui est mieux
que ne rien pouvoir utiliser!

Merci pour ton aide en tout cas!


--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"


Avatar
Bruno Desthuilliers
On 2006-10-23, Bruno Desthuilliers wrote:

Brice wrote:

Merci pour ton aide! Au final le plugin marche bien! en voici le code:

(snip)




Bon, je vois que tu sais copier-coller, mais que tu n'a pas fait
beaucoup d'effort pour comprendre l'idée générale...



atta, je suis d'accord avec toi, y'a bcp de copier coller mais l'idée
générale, je l'ai comprise et j'ai adapté


s/adapté/copié-collé/

Escroc !-)

ce que tu avais écrit à mes
besoins (dans de faibles proportions je l'avoue)


A ton avis, pourquoi est-ce que je déclare une variable pour le chemin
du répertoire temporaire et une variable pour la commande mplayer ? Et
pourquoi j'isole l'appel à cette dernière dans une fonction ? (NB : au
passage, tel que je l'ai fait, c'est encore du Q&D...)



ok ok, je sais que l'utilisation des vars permet un code plus léger


Plus "léger", je ne sais pas. Plus maintenable, par contre, c'est une
certitude absolue.

mais
dans mon cas de l'appel os.system, j'avoue m'y retrouver nettement en
voyant le path et non pas une variable,


Et le jour où tu dois changer le path, tu en oublie nécessairement un.
Et en ce qui concerne la lisibilité, déchiffrer trois instruction shell
dans une chaine Python, c'est moyen...

dans les tous les cas c'est un
truc que je vais changer



(snip)

Bon c'est un peu lourd de répéter 2 fois 99% du code


Non ?

SI



mais je ne sais pas
comment faire autrement...


Questions:
1/ quelles sont les parties communes et les parties qui diffèrent
2/ à quoi servent les fonctions et l'héritage ?




1/ une simple commande, la dernière. Pour info j'ai essayé de fixer la
valeur d'une var en fonction de "quelle" plugin était appelé (cf. les
codes précédents avec classDAO et classTAO) malheureusement il faut plus
pour fixer cette var et mes connaissances étant celles d'un mec ayant à
peu près 2-3 h de python...


Et combien en programmation dans d'autres langages ? Python est un des
langages les plus faciles à démarrer.


2/ pas compris le truc (je suis pas un bon programmeur de surcroit)


Moi non plus, mais je me soigne...

De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system.



Correction : après lecture de la doc, je n'en suis plus si sûr. Anyway,
regarde du côté de subprocess...


mais ça
marche donc -;)


Mouais... On peut aussi voire ça comme ça.




Je suis d'accor avec ta remarque. Le truc est d'abord pour moi d'avoir
un plugin qui marche et ensuite de faire quelque chose de propre


Le problème est que quand on laisse la saleté s'accumuler, ça devient
beaucoup plus dur de nettoyer...

Merci pour ton aide en tout cas!

Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas

testé of course...):

class _Base(SongsMenuPlugin):
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

# XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
# en meme temps, is vont se marcher sur les pieds...
destdir = "/tmp/cd_QL/"

convert_cmd = "mplayer -ao pcm:file=%(dest)s %(source)s"
normalize_cmd = "normalize -m %(path)s/*.wav"
burn_cmd = "cdrecord -v -eject %(flags)s -pad -audio %(path)s/*.wav"
burn_flags = ''

def plugin_songs(self, songs):
if not self.check_mplayer():
return

self.setup()
try:
try:
for num, song in enumerate(songs):
self.makewav(song, num)
self.normalize()
self.burn()
except Exception, e:
ErrorMessage(
None,
"Unknown error",
"An error occured while processing files:n%s." % e
).run()
finally:
self.teardown()

def check_mplayer(self):
if not util.iscommand("mplayer"):
ErrorMessage(
None,
"Mplayer not found",
"Mplayer is used to convert files in wave files."
).run()
return False
return True

def setup(self):
os.mkdir(self.destdir)

def makewav(self, song, num):
source = song['~filename']
dest = os.path.join(self.destdir, "%03d.wav" % num)
cmd = self.convert_cmd % dict(source=source, destÞst)
os.system(cmd)

def normalize(self):
os.system(self.normalize_cmd % dict(path=self.destdir))

def burn(self):
flags = self.burn_flags
cmd = self.burn_cmd % dict(path=self.destdir, flags=flags)
os.system(cmd)

def teardown(self):
shutil.rmtree(self.destir)


class DAO(_Base):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')
PLUGIN_DESC = 'Burn CD w/o blanks.'
burn_flags = '-dao'


class TAO(_Base):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')
PLUGIN_DESC = 'Burn CD with blanks.'

# on exporte seulement ces deux classes
__all__ = ['DAO', 'TAO']



Avatar
Brice
On 2006-10-24, Bruno Desthuilliers wrote:
On 2006-10-23, Bruno Desthuilliers wrote:

Brice wrote:

Merci pour ton aide! Au final le plugin marche bien! en voici le code:

(snip)




Bon, je vois que tu sais copier-coller, mais que tu n'a pas fait
beaucoup d'effort pour comprendre l'idée générale...



atta, je suis d'accord avec toi, y'a bcp de copier coller mais l'idée
générale, je l'ai comprise et j'ai adapté


s/adapté/copié-collé/

Escroc !-)



nan!!


(snip)

De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system.



Correction : après lecture de la doc, je n'en suis plus si sûr. Anyway,
regarde du côté de subprocess...


correction: en fait les mplayer étaient lancés à la suite car la
commande comportait un & à la fin. Ils sont lancés l'un après l'autre
sans cet &; ce qui induit le problème suivant: je perd la main sur
quodlibet (le soft pour lequel est fait le plugin) tant que le plugin
n'a pas fini de s'exécuter!


sinon j'ai des bases de programmation en pascal et en c (qques cours en
école) mais je ne suis pas un fan de programmation qui ne me sert
qu'à améliorer l'ergonomie de mon environnement! donc je maîtrise plus
les script bash qu'autre chose!



mais ça
marche donc -;)


Mouais... On peut aussi voire ça comme ça.




Je suis d'accor avec ta remarque. Le truc est d'abord pour moi d'avoir
un plugin qui marche et ensuite de faire quelque chose de propre


Le problème est que quand on laisse la saleté s'accumuler, ça devient
beaucoup plus dur de nettoyer...

Merci pour ton aide en tout cas!

Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas

testé of course...):



presque sans faute! Seule correction:



source = song['~filename'].replace(" ","_").replace("'","'")

et non

source = song['~filename']

pour les noms de fichiers!

Maintenant il faut que je creuse pour trouver un moyen de lancer les
commandes en arrière plan les unes après les autres!


class _Base(SongsMenuPlugin):
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

# XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
# en meme temps, is vont se marcher sur les pieds...
destdir = "/tmp/cd_QL/"

convert_cmd = "mplayer -ao pcm:file=%(dest)s %(source)s"
normalize_cmd = "normalize -m %(path)s/*.wav"
burn_cmd = "cdrecord -v -eject %(flags)s -pad -audio %(path)s/*.wav"
burn_flags = ''

def plugin_songs(self, songs):
if not self.check_mplayer():
return

self.setup()
try:
try:
for num, song in enumerate(songs):
self.makewav(song, num)
self.normalize()
self.burn()
except Exception, e:
ErrorMessage(
None,
"Unknown error",
"An error occured while processing files:n%s." % e
).run()
finally:
self.teardown()

def check_mplayer(self):
if not util.iscommand("mplayer"):
ErrorMessage(
None,
"Mplayer not found",
"Mplayer is used to convert files in wave files."
).run()
return False
return True

def setup(self):
os.mkdir(self.destdir)

def makewav(self, song, num):
source = song['~filename']
dest = os.path.join(self.destdir, "%03d.wav" % num)
cmd = self.convert_cmd % dict(source=source, destÞst)
os.system(cmd)

def normalize(self):
os.system(self.normalize_cmd % dict(path=self.destdir))

def burn(self):
flags = self.burn_flags
cmd = self.burn_cmd % dict(path=self.destdir, flags=flags)
os.system(cmd)

def teardown(self):
shutil.rmtree(self.destir)


class DAO(_Base):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')
PLUGIN_DESC = 'Burn CD w/o blanks.'
burn_flags = '-dao'


class TAO(_Base):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')
PLUGIN_DESC = 'Burn CD with blanks.'

# on exporte seulement ces deux classes
__all__ = ['DAO', 'TAO']




--
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"




Avatar
Bruno Desthuilliers
On 2006-10-24, Bruno Desthuilliers wrote:


(snip)


atta, je suis d'accord avec toi, y'a bcp de copier coller mais l'idée
générale, je l'ai comprise et j'ai adapté


s/adapté/copié-collé/

Escroc !-)


nan!!



Si si, j'insiste - mais ce n'est pas une insulte !-)


De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system.



Correction : après lecture de la doc, je n'en suis plus si sûr. Anyway,
regarde du côté de subprocess...



correction: en fait les mplayer étaient lancés à la suite car la
commande comportait un & à la fin.


Lalala... Effectivement, ça m'avait échappé. C'est souvent le problème
quand on embarque un langage dans un autre - d'où l'intérêt, dans ce
cas, de bien "encapsuler" ces commandes pour que le reste du code en
soit exempt...

(snip)

sinon j'ai des bases de programmation en pascal et en c (qques cours en
école) mais je ne suis pas un fan de programmation qui ne me sert
qu'à améliorer l'ergonomie de mon environnement!


Bon, c'est sûr qu'on n'a pas la même approche, là !-)
En ce qui me concerne, si tu veux, un ordinateur n'a d'intérêt que pour
1. programmmer
2. dire des c...^Mdiscuter de programmation sur usenet
3. lire de la doc sur des langages ou des technos
4. programmer

J'ai même pas de carte son, c'est te dire...

donc je maîtrise plus
les script bash qu'autre chose!


Ce qui d'une part n'est pas si trivial que ça, et d'autre part est bien
plus puissant qu'on ne le pense souvent (Unix faisait déjà de la prog
par composants bien avant que ça ne devienne le buzz du jour).

Personnellement, je mets généralement moins de temps à hacker un
bricolage en Python qu'à lire les man pages et réussir à pondre un
script shell qui tienne la route. J'essaie de me soigner, mais j'ai
encore du travail...

(snip)
Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas
testé of course...):


presque sans faute! Seule correction:

source = song['~filename'].replace(" ","_").replace("'","'")

et non

source = song['~filename']

pour les noms de fichiers!


Sinon, ça tourne ?
(si oui, tu me dois une bière...)

Maintenant il faut que je creuse pour trouver un moyen de lancer les
commandes en arrière plan les unes après les autres!


Tu disais plus haut (dans ce que j'ai snippé) que "détacher" la commande
(avec le & à la fin) te faisait perdre la main sur Quodlibet pendant ce
temps ?

class _Base(SongsMenuPlugin):
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

# XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
# en meme temps, is vont se marcher sur les pieds...
destdir = "/tmp/cd_QL/"



Ah, oui - ça c'est un truc à corriger. Si ton plugin n'est supposé
tourner que sous *n*x, peut-être regarer du côté de os.tmpnam() pour
créer un sous-répertoire par instance du plugin...





1 2