j'ai rapidement jeter un œil a ton code (le nom m'a fait marrer): bon on est d'accord pour une PoC c'est bien mais ça risque d'en dissuader plus d'un =D.
Mes modestes conseils (qui son mes guidelines, vous aurez surement les votres) qui pourraient t'aider:
essaie de séparer la partie "lib" de la partie interface GTK et de la partie exécution de script pour commencer. Simplement tu peux faire un package fwomaj/ dans lequel tu crées 3 modules par exemple libfwomaj.py, cmd_scripts.py, gtk_ui.py ; En gros ça te permet si un jour tu veux faire un support en CLI d'ajouter un cli_ui.py qui utilisent tes popen de libfowmaj.py sans tout refaire.
libfwomaj.py : tu y mets toute tes fonctions ffmpeg, gstreamer, et mediainfo dans un premier temps, puis essaie de faire des objets et des mixin pour emballer/structurer le tout,
cmd_scripts.py : tu y mets la partie pour exécuter la ligne de commande (en gros ce que tu mettrais dans une fonction main (que tu n'as pas fait) ie: tes lignes 769-772) ce qui permet d'ajouter un parser, des options par défauts, bref la partie système,
gtk_ui.py : toute ta partie concernant gtk, décorrélée de toute ce que tu as mis dans les autres fichiers.
D'une façon générale, j'aurai fait un objet Fwomaj qui lui va réaliser le binding entre la video et ton interface. Par exemple je trouverai sympa d'avoir un truc du style:
classGtkUiFwomaj(...):def__init__(...):...self.mycheese=Fwomaj('my_video.avi')# puis tu initialises ton UI avec les fonctions & attributs de ton objet Fwomaj...
La classe Fwomaj te permettant de récupérer les infos via mediainfo, d'initialiser ton pipeline GStreamer, de faire ta waveline le tout sans être dépendant de GTK. Par exemple ça peut donner:
# Par exemple pour charger un nouveau fichier...defon_load_file(self,widget,filename):""" Load a file, either at startup or later. """deleteself.mycheese# some cleanupself.mycheese=Fwomaj(filename)# our new file...
A vérifier mais ce genre de truc te permet de virer le fichier png de ta waveline quand tu delete l'objet par exemple. Au niveau des UI faire le nettoyage c'est souvent le bordel, même si au départ je n'ai qu'une ligne, je fais une fonction ui_cleanup(...) en prévision du futur (NB: tu peux aussi t'en servir à l'init pour être sur d'avoir quelque chose de cohérent entre les états/variables/éléments de ton UI).
Ou encore ta classe WForm avec cette tête:
classWForm(object):@classmethoddefexecute(cls,cheese,wbox,style_provider,spinner,label):## ici cheese est un objet Fwomaj...label.set_text(' Generating WaveForm image for {}... '.format(cheese.name)unique_file=os.path.join(tempfile.gettempdir(),'fwomaj-{}.png'.format(time.time()))# on fait la wavelinecheese.do_waveline(unique_file)# la suite qui elle dépend des GObject...
C'est simple à comprendre, ça t'évite d'aller mettre en global ta commande, même si tu caches un peu la misère dans une classe =D.
Bref mes 2 copecs si tu as envie d'y re-travailler dessus pour l'améliorer. =)
# Improvements ?
Posté par Ezka . En réponse à la dépêche Sortie de Fwomaj 0.3. Évalué à 5.
Salut,
j'ai rapidement jeter un œil a ton code (le nom m'a fait marrer): bon on est d'accord pour une PoC c'est bien mais ça risque d'en dissuader plus d'un =D.
Mes modestes conseils (qui son mes guidelines, vous aurez surement les votres) qui pourraient t'aider:
essaie de séparer la partie "lib" de la partie interface GTK et de la partie exécution de script pour commencer. Simplement tu peux faire un package fwomaj/ dans lequel tu crées 3 modules par exemple libfwomaj.py, cmd_scripts.py, gtk_ui.py ; En gros ça te permet si un jour tu veux faire un support en CLI d'ajouter un cli_ui.py qui utilisent tes popen de libfowmaj.py sans tout refaire.
pour mediainfo tu peux utiliser le wrapper python PyMediainfo https://pymediainfo.readthedocs.io/en/latest/ ça t'évite d'aller ouvrir un popen pour récupérer les infos ;)
D'une façon générale, j'aurai fait un objet Fwomaj qui lui va réaliser le binding entre la video et ton interface. Par exemple je trouverai sympa d'avoir un truc du style:
La classe Fwomaj te permettant de récupérer les infos via mediainfo, d'initialiser ton pipeline GStreamer, de faire ta waveline le tout sans être dépendant de GTK. Par exemple ça peut donner:
A vérifier mais ce genre de truc te permet de virer le fichier png de ta waveline quand tu delete l'objet par exemple. Au niveau des UI faire le nettoyage c'est souvent le bordel, même si au départ je n'ai qu'une ligne, je fais une fonction ui_cleanup(...) en prévision du futur (NB: tu peux aussi t'en servir à l'init pour être sur d'avoir quelque chose de cohérent entre les états/variables/éléments de ton UI).
Ou encore ta classe WForm avec cette tête:
C'est simple à comprendre, ça t'évite d'aller mettre en global ta commande, même si tu caches un peu la misère dans une classe =D.
Bref mes 2 copecs si tu as envie d'y re-travailler dessus pour l'améliorer. =)