Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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é tongue
zenity-progress-screenshot.png.fr

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! big_smile

Hors ligne

#6 Le 10/05/2009, à 21:42

insolegeek

Re : Enregistreur de flash en cours de lecture (avec GUI)

Très bon programme wink

#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: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 wink

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)

wido a écrit :

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)

yannzbig a écrit :

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. wink

Et ici ce n'est pas sectaire quoique?!? lol

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 wink

#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 smile

merci de l'aide *edit* arf raté yann de 2 minutes roll

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 smile

#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