Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

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 24/08/2019, à 17:28

Aze

[RESOLU] Fermer vlc et le relancer quand un changement a lieu

Bien le bonjour/bonsoir

J'espère être dans la bonne section x:
N'étant qu'un pur novice en shell, j'ai fait quelques recherches et essayer diverses solutions que je m'efforcerais d'énumérer ci-dessous le plus clairement possible.

Mon but est de lancer vlc au démarrage avec quelques arguments et, pour liste de lecture, quelques fichiers se trouvant dans un répertoire précis et sujet à modifications.
Pour lancer vlc et le fermer une fois qu'un changement aura lieu dans le répertoire contenant les vidéos, j'ai essayé de procéder ainsi :

vlc --loop -f /home/azmerhos/Bureau/Media/*

#LS1=Media présent au démarrage. LS2 sert à vérifier si un changement a eu lieu dans le répertoire.

LS1=$(ls /home/azmerhos/Bureau/Media/*)
LS2=$(ls /home/azmerhos/Bureau/Media/*)

	while LS1=LS2
	do
	sleep 60
	LS2=$(ls /home/azmerhos/Media/*)
	done
#!Quand une modification aura lieu dans le répertoire alors kill vlc et fermer le script qui sera relancé dans les 60 secondes qui suivent.
	killall vlc

Malheureusement, cela ne semble pas fonctionner puisqu'en supprimant une vidéo du dossier vlc continu comme si de rien n'était (sauf au moment de visionner le fichier supprimé. Ce qui est normal)
Il faut aussi savoir que j'avais essayé de passer par un if auparavant, mais j'ai trouvé le tant que plus simple et adapté au résultat souhaité.

Comme j'ai eu l'impression de ne pas pouvoir mettre la partie de lancement et celle de vérification dans le même script, j'utilise un autre script qui, lui, sera appelé toute les minutes afin de vérifier si vlc est lancé et, s'il ne l'ai pas, appelé le script ci-dessus. Il ressemble actuellement à ceci :

 if [ -n "$( pidof VLC  )" ] 
 then echo "Vlc tourne"
 else sh /home/azmerhos/Play.sh 
 fi

Il ne semble pas fonctionner également (le echo était juste pour vérifier s'il fonctionné) Je ne vais pas vous mentir, j'ai réutilisé un script que j'ai trouvé sur internet et légèrement modifié mais j'en comprends la majeure partie. Les seules choses que je ne comprends pas sont l'argument (-n) et la présence du symbole $.
J'ai également essayé en me servant de grep et en me servant du résultat de la commande killall -CHLD vlc mais sans succès.

Ma question est donc la suivante : Auriez-vous une idée de la manière dont je pourrais réaliser ce que je souhaite et même, peut-être, de le simplifier (car je suppose qu'il y a encore plus simple) ?

Merci d'avance de m'accorder de votre temps ainsi que de me fournir votre aide.

Dernière modification par Aze (Le 17/09/2019, à 21:27)

Hors ligne

#2 Le 24/08/2019, à 20:32

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Salut,

n'utilise pas ls pour ça, en cas d'espace, ça fout la merde...
Perso je ferai un truc comme ça :

# Boucle infinie
while true
do
    # Variable liste qui contient les fichiers meme des sous dossiers sans problème d'espace
    mapfile -d '' -t Fichiers1 < <(find "$HOME/Bureau/Media/" -type f -print0)

    # Boucle forçant vlc à fermer avant de le lancer
    while pidof vlc
    do
        killall vlc
        sleep 2
    done

    # On lance vlc en fond
    vlc --loop -f /home/azmerhos/Bureau/Media/* &

    # Sous-boucle infinie
    while true
    do
        # Variable liste qui contient les fichiers meme des sous dossiers sans problème d'espace
        mapfile -d '' -t Fichiers2 < <(find "$HOME/Bureau/Media/" -type f -print0)

        # Si les listing sont different, on casse la sous boucle, ce qui va avoir pour effet de recommencer la boucle principal, donc relistage des fichiers, kill de vlc et son relancement
        [[ ${Fichiers1[@]} != ${Fichiers2[@]} ]] && break

        sleep 60
    done
done

Une boucle infinie qui relance vlc.

tu peux ajouter une vérification du genre :

[[ -e "/tmp/vlc-stop" ]] && exit

pour arrêter le script juste en créant manuellement un fichier /tmp/vlc-stop.
Il suffit de le mettre dans la sous boucle.

A toi de t'amuser avec find pour faire des trucs plus précis.

Attention à ton incrémentation, c'est trop difficile à lire alors qu'il n'y a que quelques lignes...

En espérant que cela t'aide...

EDIT :
Il y a plus simple que :

        for file in "/home/azmerhos/Bureau/Media/"*
        do
            Fichiers2+=("${file}")
        done

mais je ne sais plus trop...
retrouvé smile

mapfile -t Fichiers1 < <(find "/home/azmerhos/Bureau/Media/" -type f) 

ou

IFS=$'\n' y=($(find "/home/azmerhos/Bureau/Media/" -type f))

bien que

IFS=$'\n' y=($(ls "/home/azmerhos/Bureau/Media/"*))

fonctionne, il ne faut pas trop utiliser ls pour ça...

Dernière modification par Hizoka (Le 25/08/2019, à 10:14)

Hors ligne

#3 Le 24/08/2019, à 21:51

melixgaro

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Salut,

Hizoka, je pense que ton script restera bloqué lors du lancement de vlc et la boucle qui suit (celle qui surveille le dossier) ne s'exécutera pas quand elle se doit.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#4 Le 25/08/2019, à 00:03

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

et avec :

vlc --loop -f /home/azmerhos/Bureau/Media/* &

?

Hors ligne

#5 Le 25/08/2019, à 00:09

melixgaro

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

oui, sans doute.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#6 Le 25/08/2019, à 00:13

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Oui, je confirme, ça fonctionne, je viens de tester

Hors ligne

#7 Le 25/08/2019, à 03:57

Watael

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

grrr!

mapfile -d '' -t Fichiers2 < <(find "$HOME/Bureau/Media/" -type f -print0)

eval, c'est mal.

Hors ligne

#8 Le 25/08/2019, à 10:13

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Merci Watael de limiter encore les risques avec des noms de fichiers comportant des caractères non affichable ou saut de ligne.

Je mets à jour mon propre script qui utilise mapfile smile

Dernière modification par Hizoka (Le 25/08/2019, à 10:13)

Hors ligne

#9 Le 25/08/2019, à 11:28

Aze

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Merci beaucoup pour votre aide ! Mais il y a quelques choses que je ne comprends pas. En fait, c'est la parti mapfile que je ne comprends pas vraiment ^^"

Je ne connais pas du tout mapfile et, de ce que j'ai pu en voir, ça m'a l'air vachement complexe. Je pense avoir compris à quoi sert le -t. Mais, pour ce qui est du reste, hormis le -print0 je suis perdu x:

Je ne pense pas que j'aurais besoin de modifier le find, il devrait amplement faire l'affaire ici.

Je me demande aussi par simple curiosité ce que change la présence du & à la fin de la ligne de lancement de vlc.

Je n'étais pas sûr qu'on puisse faire des boucles de ce genre mais je le saurais pour la suite.

Voilà, c'est à peu près tout. Encore merci pour votre aide et merci d'avance pour vos explications smile

Hors ligne

#10 Le 25/08/2019, à 14:47

MicP

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Bonjour

Pour visualiser la description de la commande mapfile du bash

man --pager='less -p "mapfile \["' bash

Hors ligne

#11 Le 25/08/2019, à 19:11

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

mapfile te sert à créer un tableau assez facilement.

il peut être remplacé par d'autres commandes mais je trouve celle-ci relativement simple sans avoir à faire de boucle ou à modifier l'IFS.

Il contient la liste des fichiers avec 1 fichier = 1 valeur
${Fichiers1[0]} contient le nom du 1er fichier même si celui-ci contient des espaces ou saut de ligne dans son nom.
${Fichiers1[@]}  représente tous les fichiers de ta liste.

le -print0 du find sert à virer les caractères non imprimables ou saut de ligne et ajoute un null à la fin de ligne.
sur le mapfile, en utilisant -d '', il utilisera les null comme séparateur et non plus le saut de ligne.
Ainsi, on évite tout problème lié au noms de fichiers.
Même si dans ton cas, on s'en fiche vu qu'on ne fait que comparer 2 listes de fichiers... enfin autant bien faire.

Si tu ne mets pas & en fin de commande, il attend que celle-ci soit terminée avant de passer à la suite du script... dans ton cas, il te faudrait fermer vlc manuellement...
Ce qui n'aurait plus d’intérêt.
Du coup, on lance vlc en tache de fond et ainsi le script continue.

Un peu de lecture :
http://www.tldp.org/LDP/abs/html/abs-guide.html
et la version française qui date de 2012 : https://abs.traduc.org/abs-fr/

J’espère ne pas avoir dit de bêtise...

Hors ligne

#12 Le 25/08/2019, à 20:04

Watael

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

MicP :

help mapfile

KISS!
wink

Dernière modification par Watael (Le 25/08/2019, à 20:04)


eval, c'est mal.

Hors ligne

#13 Le 25/08/2019, à 23:53

MicP

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Ah ouai ! d'accord,
mais moi, j'étais plutôt parti sur un tout autre principe :
lol "Pourquoi chercher à simplifier les choses alors qu'il est si simple de les compliquer." lol

=======
Merci Watael

Plus sérieusement, il va me falloir apprendre à ne pas l'oublier cette si efficace commande help

Dernière modification par MicP (Le 25/08/2019, à 23:55)

Hors ligne

#14 Le 27/08/2019, à 17:45

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Si c'est bon, ajoute [Résolu] à ton titre.

Hors ligne

#15 Le 17/09/2019, à 16:00

Aze

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Désolé de reprendre seulement maintenant la conversation. Mais, j'ai essayer un peu de mon côté et en fait au moindre edit dans le dossier Media vlc se ferme mais ne se relance pas. Et sans intervention de ma part vlc se ferme après environ 1min x:

Autre chose, au lancement du script j'ai aussi "Play.sh: 15: Play.sh: Syntax error: redirection unexpected" une idée de ce qui en est la cause ? (sachant que j'ai repris le script de Hizoka et juste edit le chemin vers Media)

Dernière modification par Aze (Le 17/09/2019, à 16:02)

Hors ligne

#16 Le 17/09/2019, à 16:12

Watael

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

il faut utiliser /bin/bash; pas /bin/sh


eval, c'est mal.

Hors ligne

#17 Le 17/09/2019, à 16:29

Aze

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Il se ferme quand même à la minute pile de l'heure de l'ordinateur et sans intervention de ma part x:

Dernière modification par Aze (Le 17/09/2019, à 16:46)

Hors ligne

#18 Le 17/09/2019, à 20:07

Watael

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

hmm.

tu peux nous faire un copier/coller de l'exécution de

/bin/bash -x ./tonScript

?


eval, c'est mal.

Hors ligne

#19 Le 17/09/2019, à 20:16

Aze

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

azmerhos@Kiki-le-laptop:~$ /bin/bash -x test.bash
+ true
+ mapfile -d '' -t Fichiers1
++ find /home/azmerhos/Bureau/Media/ -type f -print0
+ pidof vlc
+ true
+ mapfile -d '' -t Fichiers2
+ vlc --loop -f /home/azmerhos/Bureau/Media/1.mp4 /home/azmerhos/Bureau/Media/2.3gp
++ find /home/azmerhos/Bureau/Media/ -type f -print0
+ [[ /home/azmerhos/Bureau/Media/2.3gp /home/azmerhos/Bureau/Media/1.mp4 != /home/azmerhos/Bureau/Media/2.3gp /home/azmerhos/Bureau/Media/1.mp4 ]]
+ sleep 60
VLC media player 3.0.7 Vetinari (revision 3.0.7-0-g86cee31)
[0000000000d66400] main libvlc: Lancement de vlc avec l'interface par défaut. Utiliser « cvlc » pour démarrer VLC sans interface.
Qt: Session management error: None of the authentication protocols specified are supported
libva info: VA-API version 0.39.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /snap/vlc/1049/usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
[00007fc8c4c95dc0] avcodec decoder: Using Intel i965 driver for Intel(R) Skylake - 1.7.0 for hardware decoding
QObject::~QObject: Timers cannot be stopped from another thread 

La dernière ligne représente le moment où il se ferme. Le script réagi bien au changement de fichier dans le dossier au passage mais la même chose fini par se produire

Hors ligne

#20 Le 17/09/2019, à 20:43

Watael

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

vlc se lance correctement depuis la ligne de commande ?


eval, c'est mal.

Hors ligne

#21 Le 17/09/2019, à 21:21

Aze

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Ok j'ai trouvé. En fait j'avais juste zappé de retiré un script de test et il venait s'enclencher toutes les minutes pour fermer vlc x: J'pense que c'est bon donc je vais passer le sujet en résolu. Merci beaucoup pour votre aide à tous ^^

Hors ligne

#22 Hier à 11:59

Postmortem

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Salut,

Petite suggestion. Plutôt qu'un script avec une boucle infinie, pourquoi ne pas utiliser incrond ?

man incrond a écrit :

       The  inotify  cron  daemon  (incrond)  is a daemon which monitors filesystem events and executes commands defined in system and user
       tables. It's use is generally similar to cron(8).

Ça permettrait de déclencher un script seulement sur création d'un fichier dans le répertoire voulu.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#23 Hier à 18:22

Hizoka

Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu

Parce que je ne connaissais pas alors que ça peut être super pratique !
Merci smile

Hors ligne