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 09/11/2011, à 23:03

RegisBurin

[résolu]Fermer le lecteur à la fin du film ?

Salut tous

J'ai préparé une session pour ma fille (2 ans et demi big_smile ) et j'ai bricolé un truc en python qui affiche des thumbnails (faits à la mimine sous gimp) des films qu'elle peut voir. Au clic, ça les lance dans totem en plein écran, à la fermeture, ça relance le script et ainsi de suite jusqu'à ce qu'on le tue par l'icône ou par echap.

Voilà le truc, piteusement pompé du "script-quitter" de cette page, et adapté sans aucune notion de python sad juste un peu de logique et plein d'essais:
1320868754.png

#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk, os

####################################################
##        variables 
####################################################

## Lien vers le fond d'ecran
IMG_FILE = '$HOME/.scripts/panneau_da/img/fond0.png'

## Jouer Arctic Tale
CMD_ART = 'totem --fullscreen "$HOME/Videos/Arctic Tale.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer Big Buck Bunny
CMD_BBB = 'totem --fullscreen "$HOME/Videos/Big Buck Bunny.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer Kung Fu Panda
CMD_KFP = 'totem --fullscreen "$HOME/Videos/Kung-Fu Panda.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer La citadelle assiégée
CMD_LCA = 'totem --fullscreen "$HOME/Videos/La Citadelle Assiégée.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer Raiponce
CMD_RAI = 'totem --fullscreen "$HOME/Videos/Raiponce.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer Rio
CMD_RIO = 'totem --fullscreen "$HOME/Videos/Rio.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

## Jouer Wall-e
CMD_WAL = 'totem --fullscreen "$HOME/Videos/Walle-E.avi" && $HOME/.scripts/panneau_da/panneau_da.py'

####################################################
##        debut du script 
####################################################


class MyApp():
    def __init__(self):
        
        self.window = gtk.Window()        
        self.window.set_title("panneau dessins anim")
        self.window.connect("destroy", self.doquit)
        self.window.connect("key-press-event", self.onkeypress)
        self.window.set_size_request(620,200)
        self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
        self.window.set_decorated(False)
        self.window.set_position(gtk.WIN_POS_CENTER)
        
        self.mainpanel = gtk.Fixed()
        self.window.add(self.mainpanel)
        
        self.screen_x , self.screen_y = gtk.gdk.screen_width(), gtk.gdk.screen_height()

        x = ( self.screen_x / 2 ) - ( 140 * 7 / 2 ) - 30
        y = ( self.screen_y / 2 ) - 100

        self.bt_tab = []
        ## 1st Line
        self.add_bouton("application-exit", x+1080, y-435, "Quitter")
        self.add_bouton("art", x+30, y+30, "Arctic Tale")
        self.add_bouton("bbb", x+170, y+30, "Big Buck Bunny")
        self.add_bouton("kfp", x+310, y+30, "Kung Fu Panda")
        self.add_bouton("lca", x+450, y+30, "La Citadelle Assiégée")
        self.add_bouton("rai", x+590, y+30, "Raiponce")
        self.add_bouton("rio", x+730, y+30, "Rio")
        self.add_bouton("wal", x+870, y+30, "Wall-E")
        
        self.set_background()
        self.bt_tab[3].grab_focus()             

    def set_background(self):
        pixbuf = gtk.gdk.pixbuf_new_from_file(IMG_FILE)
        pixbuf = pixbuf.scale_simple(gtk.gdk.screen_width(), gtk.gdk.screen_height(), gtk.gdk.INTERP_BILINEAR)
        pixmap, mask = pixbuf.render_pixmap_and_mask()
        self.window.set_app_paintable(True)
        self.window.resize(self.screen_x, self.screen_y)
        self.window.realize()
        self.window.window.set_back_pixmap(pixmap, False)
        self.window.move(0,0)
        del pixbuf
        del pixmap

    def add_bouton(self, icon, x, y, info):
        image = gtk.Image()
        image.set_from_file("img/" + icon + ".png")
        image.show()
        bouton = gtk.Button()
        bouton.set_relief(gtk.RELIEF_NONE)
        bouton.set_focus_on_click(False)
        bouton.set_border_width(0)
        #bouton.set_property('can-focus', False)
        bouton.add(image)
        tooltips = gtk.Tooltips()
        tooltips.set_tip(bouton, str(info))
        bouton.show()
        self.mainpanel.put(bouton, x,y)
        bouton.connect("clicked", self.clic_bouton, icon)
        self.bt_tab.append(bouton)

    # Cette fonction est invoquee quand on clique sur un bouton.
    def clic_bouton(self, widget, data=None):
        if (data=='art'):
            os.system(CMD_ART)

        elif (data=='bbb'):
            os.system(CMD_BBB)

        elif (data=='kfp'):
            os.system(CMD_KFP)

        elif (data=='lca'):
            os.system(CMD_LCA)

        elif (data=='rai'):
            os.system(CMD_RAI)

        elif (data=='rio'):
            os.system(CMD_RIO)

        elif (data=='wal'):
            os.system(CMD_WAL)

        self.doquit()           

    def onkeypress(self, widget=None, event=None, data=None):
        if event.keyval == gtk.keysyms.Escape:
            self.doquit() 
    
    def doquit(self, widget=None, data=None):
        gtk.main_quit()

    def run(self):
        self.window.show_all()
        gtk.main()

#-------------------------
if __name__ == "__main__":
#-------------------------
    ## need to change directory
    SRC_PATH = os.path.dirname( os.path.realpath( __file__ ) )
    os.chdir(SRC_PATH)
    app = MyApp()
    app.run()

Pour l'instant, ça fait super bien le boulot, sauf qu'elle est encore un peu petite pour, à la fin du film, appuyer sur échap + cliquer sur la croix de fermeture (procédure trop longue, trop d'interactions... alors alt+F4, n'en parlons pas big_smile ). Donc elle m'appelle chaque fois pour fermer le lecteur.

Je ne trouve pas d'astuce pour le refermer automatiquement lorsque le film se termine.

Je sais récupérer la durée total, et je pourrais insérer un sleep [durée] && totem --quitdans les commandes, mais c'est tout naze, si elle met le film en pause (oui, ça, elle sait faire... elle l'a repérée la barre d'espace) ça plante le truc avant la fin...

Je ne sais pas par ou chercher...? Scruter l"en-cours de lecture" pour tuer totem lorsque la durée est atteinte... comment? avec quels outils? autre chose...?

Et au passage, si vous avez des conseils ou des remarques pour le présent script... je suis preneur smile

Par exemple, pour le placement des éléments dans la page, il me semble que je pourris l'utilité première du script qui permet l'adaptabilité à de nombreuses résolutions. Là, j'ai adapté à tâtons le placement du bouton "quitter" pour une seule résolution de 1680x1050... bref, pas propre.

Merci d'avance

@+

Dernière modification par RegisBurin (Le 12/11/2011, à 00:04)


Config (M-AUDIO Delta44/Wacom CTH661-Phone ZTE OpenC-FFOS2.1) | BabyBox[WIP]
Moi sur le web / Moi, IRL mais sur le web / Ma maison sur le web

Hors ligne

#2 Le 10/11/2011, à 17:52

VinsS

Re : [résolu]Fermer le lecteur à la fin du film ?

Salut,

Le man de Totem ne fait pas description de retours, sinon je t'aurais conseillé d'utiliser subprocess.Popen() à la place de os.cmd().
Ce qui n'empêche pas de tester, bien sûr.

Ce que tu peux faire, c'est lancer un timer dans un thread et le mettre en pause en même temps que le film.

Ca doit pouvoir se faire simplement.


Vincent
Oqapy      Qarte      PaQager

Hors ligne

#3 Le 10/11/2011, à 19:20

demonipuch

Re : [résolu]Fermer le lecteur à la fin du film ?

Bonjour

Pourquoi ne pas utiliser vlc avec l'option --play-and-exit??

Hors ligne

#4 Le 10/11/2011, à 21:34

RegisBurin

Re : [résolu]Fermer le lecteur à la fin du film ?

demonipuch a écrit :

Bonjour

Pourquoi ne pas utiliser vlc avec l'option --play-and-exit??

Hé bah voilà... PEBKAC carractérisé ! (pour être raccord avec ta signure)

J'avais l'intuition depuis le début que vlc m'offrirais ce genre de solution, faut dire que la manpage est tellement longue...

Merci à toi, je teste et d'ici demain je passe en [résolu]

@VinsS
Merci à toi pour les propositions, je potasserais ça aussi

@+


Config (M-AUDIO Delta44/Wacom CTH661-Phone ZTE OpenC-FFOS2.1) | BabyBox[WIP]
Moi sur le web / Moi, IRL mais sur le web / Ma maison sur le web

Hors ligne

#5 Le 11/11/2011, à 00:41

AnsuzPeorth

Re : [résolu]Fermer le lecteur à la fin du film ?

Bjr,
Il y avait aussi mplayer (il quitte qd c'est fini) en passant par une commande system. Il y a aussi gstreamer en ligne de commande (gst-launch-0.10, il quitte aussi tout seul).
Tu peux aussi, vu que tu code en python, importer la lib gstreamer, et faire ton lecteur dans ton code.
Il y a aussi un api python pour vlc.


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#6 Le 11/11/2011, à 09:39

RegisBurin

Re : [résolu]Fermer le lecteur à la fin du film ?

AnsuzPeorth a écrit :

Bjr,
Il y avait aussi mplayer (il quitte qd c'est fini) en passant par une commande system. Il y a aussi gstreamer en ligne de commande (gst-launch-0.10, il quitte aussi tout seul).
Tu peux aussi, vu que tu code en python, importer la lib gstreamer, et faire ton lecteur dans ton code.
Il y a aussi un api python pour vlc.

Merci beaucoup pour toutes ces pistes big_smile (notamment l'intégration du player dans le script qui est intéressante)

Je vais potasser tout ça, je tiendrais au jus de la solution.

@+


Config (M-AUDIO Delta44/Wacom CTH661-Phone ZTE OpenC-FFOS2.1) | BabyBox[WIP]
Moi sur le web / Moi, IRL mais sur le web / Ma maison sur le web

Hors ligne

#7 Le 11/11/2011, à 13:11

AnsuzPeorth

Re : [résolu]Fermer le lecteur à la fin du film ?

Pour l'utilisation de gstreamer, tu peux look le code de gmediafinder. D'ici peu, gmediafinder embarquera des API pour gst, vlc et mplayer, donc tu auras toutes les possibilités.


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#8 Le 12/11/2011, à 00:03

RegisBurin

Re : [résolu]Fermer le lecteur à la fin du film ?

AnsuzPeorth a écrit :

Pour l'utilisation de gstreamer, tu peux look le code de gmediafinder. D'ici peu, gmediafinder embarquera des API pour gst, vlc et mplayer, donc tu auras toutes les possibilités.

Merci à toi et à tous pour les infos et les pistes. J'ai pour l'instant opté pour la solution la plus simple et évidente (via vlc).

En attendant je lis à propos de ce qui a pu être proposé, mais je me concentre sur le python.

Je passe donc en résolu.

Encore merci

@+


Config (M-AUDIO Delta44/Wacom CTH661-Phone ZTE OpenC-FFOS2.1) | BabyBox[WIP]
Moi sur le web / Moi, IRL mais sur le web / Ma maison sur le web

Hors ligne