#1 Le 24/08/2019, à 16: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, à 20:27)
Hors ligne
#2 Le 24/08/2019, à 19: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é
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, à 09:14)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 24/08/2019, à 20: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 24/08/2019, à 23:03
- Hizoka
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
et avec :
vlc --loop -f /home/azmerhos/Bureau/Media/* &
?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 24/08/2019, à 23: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 24/08/2019, à 23:13
- Hizoka
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
Oui, je confirme, ça fonctionne, je viens de tester
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 25/08/2019, à 02: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)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 25/08/2019, à 09: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
Dernière modification par Hizoka (Le 25/08/2019, à 09:13)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#9 Le 25/08/2019, à 10: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
Hors ligne
#10 Le 25/08/2019, à 13: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, à 18: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...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 25/08/2019, à 19:04
- Watael
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
MicP :
help mapfile
KISS!
Dernière modification par Watael (Le 25/08/2019, à 19:04)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 25/08/2019, à 22: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 :
"Pourquoi chercher à simplifier les choses alors qu'il est si simple de les compliquer."
=======
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, à 22:55)
Hors ligne
#14 Le 27/08/2019, à 16:45
- Hizoka
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
Si c'est bon, ajoute [Résolu] à ton titre.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 17/09/2019, à 15: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, à 15:02)
Hors ligne
#16 Le 17/09/2019, à 15:12
- Watael
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
il faut utiliser /bin/bash; pas /bin/sh
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 17/09/2019, à 15: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, à 15:46)
Hors ligne
#18 Le 17/09/2019, à 19: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
?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#19 Le 17/09/2019, à 19: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, à 19:43
- Watael
Re : [RESOLU] Fermer vlc et le relancer quand un changement a lieu
vlc se lance correctement depuis la ligne de commande ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#21 Le 17/09/2019, à 20: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 Le 18/09/2019, à 10: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 ?
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 Le 18/09/2019, à 17: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
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne