#1 Le 10/05/2009, à 17:18
- yannzbig
Enregistreur de flash en cours de lecture (avec GUI)
EDIT: Ce script ne fonctionne pas avec la version 3 de Deezer
Bonjour à tous,
Voilà un petit prog très simple, écrit en python, pour enregister la musique ou les vidéos stockées dans le cache en cours de lecture sur Deezer par exemple.
Testé avec firefox et konqueror, sur Ubuntu et Kubuntu (intrepid et jaunty).
Pour l'utiliser, il suffit de cliquer sur 'enregister' pendant qu'on écoute sur Deezer, ou qu'on regarde une vidéo sur Youtube ou Dailymotion. Par défaut, le fichier est copié en mp3 dans le répertoire ~/FlashRecords.
Pour l'avoir, c'est simple:
1) créer un fichier "flash_recorder.py" sur son ordi contenant le code python ci-dessous.
2) autoriser le fichier à être exécuté (clique-droit sur le fichier, et cocher la case "autoriser le fichier à être exécuté" dans l'onglet "permissions').
3) installer les paquets "python-tk" (indispensable) et "ffmpeg" (pour profiter des options de conversion en mp3 et en avi):
> sudo apt-get install python-tk
> sudo apt-get install ffmpeg
Enjoy !
Et merci de me signaler les éventuels bugs.
Yann
Code de "flash_recorder.py":
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Version: 0 5
#Date: 18 may 2009
#==========================================================================================
# MODULES
#==========================================================================================
import Tkinter #GUI module
import tkFileDialog #GUI Dialog module
import tkMessageBox #GUI Errors/Warnings/Infos
import sys, os, glob # System interface
import shutil # Folder/Manipulation manager
import time # only for use of fonction 'sleep'
#==========================================================================================
# GLOBAL VARIABLES (may be modified by the user)
#==========================================================================================
OUTPUT_DIR_NAME = "FlashRecords" # default directory name for output files
MP3_BIT_RATE = 128 # bitrate for ffmpeg conversion in mp3
AVI_BIT_RATE = 400 # bitrate for ffmpeg conversion in avi
CACHE_DIR = "/tmp" # default directory where looking for temporary flash files (DO NOT MODIFY!!!)
#==========================================================================================
# GUI with Tkinter
#==========================================================================================
class simpleapp_tk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.grid()
#BUTTON 'Enregistrer'
Tkinter.Button(self,text=u"Enregistrer",command=self.OnButtonEnregistrer,fg='green').grid(row=1,column=1,sticky='S')
#BUTTON 'Quitter'
Tkinter.Button(self,text=u"Quitter",command=self.quit,fg='red').grid(row=1,column=2,sticky='S')
#ADD TWO CHECKBOX OPTIONS FOR MP3 AND AVI CONVERSION
self.var = Tkinter.StringVar()
self.var.set('convert') # default choice for mp3
self.var2 = Tkinter.StringVar()
self.var2.set('notconvert') # default choice for avi
def verifieEtat():
print "check " + str(self.var.get()) + " in mp3"
if self.var.get()=='convert': # force to uncheck "convert in avi"
self.var2.set('notconvert')
def verifieEtat2():
print "check " + str(self.var2.get()) + " in avi"
if self.var2.get()=='convert': # force to uncheck "convert in mp3"
self.var.set('notconvert')
self.checkbox = Tkinter.Checkbutton(self, variable=self.var, offvalue='notconvert',onvalue='convert',text=u'convertir en mp3',command=verifieEtat)
self.etat = Tkinter.Label(self)
self.checkbox.grid(column=1,row=3,columnspan=1)
self.checkbox2 = Tkinter.Checkbutton(self, variable=self.var2, offvalue='notconvert',onvalue='convert',text=u'convertir en avi',command=verifieEtat2)
self.etat2 = Tkinter.Label(self)
self.checkbox2.grid(column=2,row=3,columnspan=1)
#CHANGING LABEL LOG
self.labelVar = Tkinter.StringVar()
self.label = Tkinter.Label(self,textvariable=self.labelVar)
self.label.grid(row=5,column=1,columnspan=2,sticky='EW')
self.labelVar.set("")
#re-dimensioning
self.grid_columnconfigure(1,weight=1)
self.grid_columnconfigure(2,weight=1)
self.grid_rowconfigure(1,weight=1)
self.grid_rowconfigure(2,weight=1)
self.grid_rowconfigure(3,weight=1)
self.grid_rowconfigure(4,weight=1)
self.grid_rowconfigure(5,weight=1)
self.resizable(False,False)
#==========================================================================================
# START RECORDER:
# -ask the user where to copy the file (using a dialog box)
# -copy temporarily the first file 'Flash*' found in '/tmp'
# -the copy is made in 'OUTPUT_DIR_NAME' repertory
# -if checked, perform conversion using command 'ffmpeg'
# -rename output file
#==========================================================================================
def OnButtonEnregistrer(self):
#GUI LOG
self.labelVar.set(u"... début de l'enregistrement ...")
self.update()
#DEFINE OUTPUT DIRECTORY
output_dir = os.path.expanduser ("~" ) + "/" + OUTPUT_DIR_NAME # output directory path
#TEST IF OUTPUT_DIR HAS BEEN ALREADY CREATED. IF NOT, CREATE IT
if os.path.exists(output_dir)==False:
os.mkdir(output_dir)
print "creation du dossier " + output_dir
#GET FLV FILES LIST
flv_list = glob.glob( CACHE_DIR + "/Flash*")
#TEST IF THE LIST IS EMPTY. IF SO, WARN USER AND EXIT
try:
flv_file = flv_list[0]
except:
print "Aucun fichier flash en cours de lecture"
tkMessageBox.showwarning(title=u"Attention !",message=u"Aucun fichier flash en cours de lecture n'a été trouvé.\nIl faut commencer la lecture avant de cliquer sur 'Enregistrer'.")
self.labelVar.set(u"")
return
#GET PATHS AND NAMES
dir_flv = os.path.split(flv_file)[0]
name_flv = os.path.split(flv_file)[1]
path_flv = dir_flv + "/" + name_flv
#ASK USER THE OUTPUT FILE NAME
if self.var.get() == 'convert':
output_path = tkFileDialog.asksaveasfilename(parent=self.parent,initialdir=output_dir,initialfile=name_flv + '.mp3',title="Choisir un nom pour le fichier mp3")
elif self.var2.get() == 'convert':
output_path = tkFileDialog.asksaveasfilename(parent=self.parent,initialdir=output_dir,initialfile=name_flv + '.avi',title="Choisir un nom pour le fichier avi")
else:
output_path = tkFileDialog.asksaveasfilename(parent=self.parent,initialdir=output_dir,initialfile=name_flv + '.flv',title="Choisir un nom pour le fichier flv")
#STOP HERE IF the save was canceled by user (by cancelling dialog box). If so, return
if output_path=="":
print "action annulee"
self.labelVar.set(u"Annulé")
return
#GUI LOG
self.labelVar.set(u"... téléchargement en cours ...")
self.update()
#TEST FILE SIZE EVOLUTION
size1=0
size2=1
while(True):
if size1!=size2:
size1 = os.path.getsize(path_flv)
time.sleep(1.2)
size2 = os.path.getsize(path_flv)
else:
print "Le telechargement dans le cache est termine"
break
#TEST IF a file named 'output_path' already exists. If so, remove it before creating a new one
if os.path.isfile(output_path):
print "suppression du fichier obsolete"
os.remove(output_path)
#COPY flv file in 'output_dir'
shutil.copy( path_flv, output_dir )
print "copie du fichier flash dans ~/" + OUTPUT_DIR_NAME
#GET PATH for the copy of flv file
tmp_path = output_dir + "/" + name_flv # path of copied file flv
#GUI LOG
self.labelVar.set(u"... conversion en cours ...")
self.update()
#CONVERSIONS
commande = ""
if self.var.get() == 'convert': #convert in mp3 if checkbox is checked
commande = "ffmpeg -i " + tmp_path + " -y -ab " + str(MP3_BIT_RATE) + "k " + output_path
elif self.var2.get() == 'convert': #convert in avi if checkbox is checked
commande = "ffmpeg -i " + tmp_path + " -y -f avi -b " + str(AVI_BIT_RATE) + "k " + output_path
else: # no conversions, just rename output
commande = "cp " + tmp_path + " " + output_path
os.system(commande) # call system with string 'commande'
#DETECT PROBLEMS: ANALYSE OUTPUT FILE
if os.path.isfile(output_path)==False: # test output file non-existence, due to missing "ffmpeg" command
print "ffmpeg n'est probablement pas installe"
tkMessageBox.showwarning(title=u"Attention !",message=u"Le fichier n'a pas pu être converti. Vérifiez que le programme 'ffmpeg' a bien été installé.")
elif os.path.getsize(output_path)==0: #test output file size. Size zero means that mp3 codecs are missing
print "Il manque des codecs pour encoder le fichier"
os.remove(output_path)
tkMessageBox.showwarning(title=u"Attention !",message=u"Le fichier n'a pas pu être converti. Il est probable que 'ffmpeg' ne dispose pas des codecs nécessaires à l'encodage des mp3.")
#CLEAN TEMPORARY FILE
os.remove(tmp_path) # delete temporary copy of flv file
print "nettoyage des fichiers temporaires"
#GUI LOG
self.labelVar.set(u"Terminé")
self.update()
#================================================================================================
#LAUNCH LOOP
#================================================================================================
if __name__ == "__main__":
app = simpleapp_tk(None)
app.title('Flash Recorder by Yann')
app.minsize(330,85)
app.mainloop()
Dernière modification par yannzbig (Le 21/07/2009, à 17:59)
#2 Le 10/05/2009, à 20:24
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
Bonjour,
Excellent travail, il fonctionne sous archlinux avec opera.
le souci c'est une perte de taille du fichier de 3.6Mo ça passe à 1.7Mo
fichier à 3.6Mo:
Durée de 3:47
Démultiplexeur:lavfpref
Débit audio:125Kb/s
fichier à 1.7Mo:
Durée de 3:48
Démultiplexeur:audio
Débit audio:62Kb/s
Hors ligne
#3 Le 10/05/2009, à 20:49
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
après avoir cliquer sur enregistrer , la fenêtre est blanche , tu ne pourrais pas faire une animation un peu comme zenity, au début je pensais que c'était planté
Hors ligne
#4 Le 10/05/2009, à 20:51
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
Merci pour le retour !
J'ai re-édité le post initial, en modifiant la conversion en mp3 avec un meilleur taux (192kbit/s).
La fenêtre n'est pas blanche sous KDE, mais l'est avec GNOME. Je m'en occuperai bientôt.
Encore merci pour les commentaires !
Dernière modification par yannzbig (Le 11/05/2009, à 14:09)
#5 Le 10/05/2009, à 21:03
- yodaanneaux
Re : Enregistreur de flash en cours de lecture (avec GUI)
vraiment bien ton petit programme, il y a longtemps que je cherchais!
Hors ligne
#6 Le 10/05/2009, à 21:42
- insolegeek
Re : Enregistreur de flash en cours de lecture (avec GUI)
Très bon programme
#7 Le 11/05/2009, à 08:43
- thx_84
Re : Enregistreur de flash en cours de lecture (avec GUI)
merci pour ce script très utile!
pour la vidéo ça marche seulement sur youtube ou dailymotion?
ben, comme on fait pour signer sur l'ordi??? mince, je viens de ficher en l'air l'écran avec mon stylo...
Hors ligne
#8 Le 11/05/2009, à 09:15
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
tout ce que tu peux lire avec le flash (vidéo, audio) , le script récupére le fichier dans le dossier /tmp/ puis il le convertir avec ffmpeg.
Hors ligne
#9 Le 11/05/2009, à 11:11
- Sanael
Re : Enregistreur de flash en cours de lecture (avec GUI)
Coucou.
Ce petit script est très bien tel qu'il est, simple et efficace.
Toutefois, chez moi, la fenêtre est blanche pendant le téléchargement (mais pas l'encodage).
Et sinon, je trouve la qualité de l'encodage vidéo trop faible, est-ce qu'il y a un moyen (en modifiant le script en local) de l'augmenter ?
En tous cas, merci. (:
Muad'Dib il a les yeux bleus,
Les yeux bleus Muad'Dib il a.
Hors ligne
#10 Le 11/05/2009, à 14:49
- nicopatch
Re : Enregistreur de flash en cours de lecture (avec GUI)
merci beaucoup, c'est juste génial!
ça m'évitera d'neregistrer comme un débile avec mon enregistreur numérique, près des enceintes! :lol:
Hors ligne
#11 Le 11/05/2009, à 16:00
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
@ Sanael:
Je mettrais très bientôt le script à jour avec des variables globales faciles à modifier pour l'utilisateur (comme par exemple les bitrates pour l'encodage audio et vidéo).
En attendant, tu peux remplacer la ligne
commande = "ffmpeg -i " + tmp_path + " -f avi " + tmp_path + ".avi"
par
commande = "ffmpeg -i " + tmp_path + " -f avi -b 600k " + tmp_path + ".avi"
où 600 correspond au bitrate voulu (il est fixé par défaut à 200).
Merci à tous pour les commentaires!
ps: Je n'y connais rien en encodage, alors les conseils sur 'ffmpeg' sont bienvenus !
Dernière modification par yannzbig (Le 11/05/2009, à 19:20)
#12 Le 11/05/2009, à 16:17
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
quelques idées:
option d'encodage pour l'ipod,psp,... (vidéo)
activation ou pas de l'encodage de ffmpeg, juste un copié du fichier /tmp/ vers ~/FlashRecords.
paramètres d'encodage pour la psp:
#$i est le nom du fichier.
ffmpeg -i "$i" -threads 4 -r 29.97 -acodec libfaac -ab 128kb -ac 2 -ar 48000 -vcodec libx264 -level 21 -b 768kb -coder 1 -f psp -flags +loop -cmp +chroma -trellis 2 -partitions +parti4x4+partp8x8+partb8x8 -flags2 +mixed_refs -me_method umh -subq 6 -trellis 1 -refs 3 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -g 250 -s 480x272 "${i%.*}".mp4;
#creation d'une vignette.
ffmpeg -i "$i" -f image2 -ss 5 -vframes 1 -s 160x120 "${i%.*}".jpg
ancien Ipod:
ffmpeg -i input_file.avi -f mp4 -vcodec mpeg4 -maxrate 1000 -b 700 -qmin 3 -qmax 5 -bufsize 4096 -g 300 -acodec aac -ab 192 -s 320x240 -aspect 4:3 output_file.mov
les nouveaux Ipod:
ffmpeg -i input_file.avi -f mp4 -vcodec mpeg4 -maxrate 1000 -b 700 -qmin 3 -qmax 5 -bufsize 4096 -g 300 -acodec aac -ab 192 -s 320x240 -aspect 4:3 output_file.mp4
Dernière modification par wido (Le 11/05/2009, à 16:22)
Hors ligne
#13 Le 11/05/2009, à 16:46
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
Génial !
Merci pour ces excellentes idées !
#14 Le 11/05/2009, à 16:50
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
Tu pourrais mettre une version au début du listing, comme cela on verra la différence entre ceux que l'on a sauvergardé et la nouvelle version
Hors ligne
#15 Le 11/05/2009, à 21:25
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
Bonjour,
J'ai mis à jour le script (version 0 3), avec l'ajout de variables globales que l'utilisateur peut facilement modifier au début du script. Notamment les "bit rates" utilisés pendant l'encodage avec ffmpeg.
Par défaut, l'encodage mp3 se fait avec un bit rate de 64kb/s, et l'encodage avi se fait avec un bit rate de 200kb/s.
Merci encore pour vos commentaires !
#16 Le 11/05/2009, à 21:37
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
j'ai un souci à la ligne 179:
[wido@desktop ~]$ '/home/wido/Desktop/script_flash'
File "/home/wido/Desktop/script_flash", line 179
try
^
IndentationError: unexpected indent
[wido@desktop ~]$
Hors ligne
#17 Le 12/05/2009, à 08:53
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
Merci wido, c'est corrigé.
Tout marche impec, et ceux qui y tiennent peuvent facilement changer le bit rate pour les conversions en mp3 et avi, en modifiant les variables globales appropriées définies au début du script.
Je ne pense pas développer des options de conversions vidéos pour ipod/psp parce que:
1) je n'ai pas d'ipod ni de psp (difficile de faire des tests...)
2) Ce prog a pour vocation d'être hyper simple à utiliser. J'ai peur de le compliquer alors que 80% des utilisateurs ne se serviront pas de ces options (d'après moi...).
Par contre, j'aimerais bien l'adapter à Windows, car je connais beaucoup de gens intéressés. La seule chose à faire est de repérer le cache selon la version de Windows et le navigateur.... Toute aide est bienvenue !
Dernière modification par yannzbig (Le 12/05/2009, à 10:24)
#18 Le 12/05/2009, à 10:47
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
Pour info,j'ai essayé de capturer une vidéo (sous windows) classiquement dans le cache (firefox,IE,opera) rien y fait, il faut passer par un add-on de firefox.
http://www.papygeek.com/musique/telecha … tuitement/
Hors ligne
#19 Le 12/05/2009, à 22:06
- insolegeek
Re : Enregistreur de flash en cours de lecture (avec GUI)
Pour info,j'ai essayé de capturer une vidéo (sous windows) classiquement dans le cache (firefox,IE,opera) rien y fait, il faut passer par un add-on de firefox.
http://www.papygeek.com/musique/telecha … tuitement/
Sans vouloir faire le rabajoie... on parle pas de windows, mais d'ubuntu ici non?
#20 Le 12/05/2009, à 22:12
- wido
Re : Enregistreur de flash en cours de lecture (avec GUI)
Par contre, j'aimerais bien l'adapter à Windows, car je connais beaucoup de gens intéressés.
je lui ai simplement dit que le système existait sous firefox.
Et ici ce n'est pas sectaire quoique?!?
Dernière modification par wido (Le 12/05/2009, à 22:13)
Hors ligne
#21 Le 12/05/2009, à 22:21
- Grunt
Re : Enregistreur de flash en cours de lecture (avec GUI)
ça me rappelle un autre logiciel, ça..
http://forum.ubuntu-fr.org:80/viewtopic.php?id=311005
#22 Le 13/05/2009, à 00:05
- yannzbig
Re : Enregistreur de flash en cours de lecture (avec GUI)
Logiciel !!!
Je prends ça comme un compliment.
Sans avoir testé le logiciel en question, qui est sûrement très bien, mon prog est minimaliste, et c'est justement le but visé. L'ultra simplicité est un atout, à mon sens, plutôt qu'une usine à gaz.
@wido:
J'ai testé au boulot (XP + IE 6): les vidéos sont hyper faciles à copier dans le cache. Presque aussi facile que de les trouver dans /tmp sous debian.
Et si un addon de firefox peut le faire, c'est bien qu'il y a un moyen d'y arriver. J'ai testé 2 ou 3 addons, genre download helper, mais ça ne marche pas pour deezer ou alors quelque chose m'a échappé...
#23 Le 13/05/2009, à 00:07
- hastyle
Re : Enregistreur de flash en cours de lecture (avec GUI)
salut
on le copie ou le script en *.ty ? parce que je ne trouve pas, débutant inside
merci de l'aide *edit* arf raté yann de 2 minutes
Dernière modification par hastyle (Le 13/05/2009, à 00:39)
Hors ligne
#24 Le 13/05/2009, à 01:37
- Grunt
Re : Enregistreur de flash en cours de lecture (avec GUI)
@yannzbig:
L'autre est tout aussi minimaliste, tout autant écrit en python, et sert à télécharger le contenu diffusé pour RealPlayer.
Le parallèle était facile à faire
#25 Le 13/05/2009, à 07:58
- zest66
Re : Enregistreur de flash en cours de lecture (avec GUI)
bonjour,
quelqu'un peut il m'expliquer comment mettre en oeuvre ce script d'une façon explicite
j'ai installé pyton et ffmpeg
ensuite je fais quoi?
je fais un copié collé et?
d'avance merci
http://aber.over-blog.com/
Hors ligne