#1 Le 18/07/2014, à 00:08
- Troödon
Script.sh pour copier des vidéos dans tmpfs
Salut, j'ai fais un script bash permettant de copier des fichiers vidéo dans la ram.
Les raisons sont simples, moins de bruit, de chaleur, durée de vie, économie d'énergie ...
Bien que fonctionnel, je bloque sur certains points.
Donc dans l'ordre:
tmpfs
Dans mon script, le disque créé s'appelle ram.
#!/bin/bash
FILE=`echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS`
RAM=/media/ram
#ICON=
paplay /usr/share/sounds/freedesktop/stereo/device-added.oga
notify-send -i /usr/share/icons/gnome/scalable/actions/document-save-symbolic.svg "$FILE" "est en cours de transfert dans la RAM."
rm -r -f /media/ram/* && cp -uR "$FILE" "$RAM"
notify-send -i /usr/share/icons/gnome/scalable/actions/media-playback-start-symbolic.svg "Début de la séance." "Bon visionnage."
for uri in "$RAM"; do DISPLAY=:0.0 totem --fullscreen "$uri"
done
exit
Et maintenant les questions:
Dans la notification, le "$FILE" affiche l'adresse complète. Comment faire pour qu'elle affiche seulement le nom du film ?
Malheureusement, la lecture du fichier ne commence qu'une fois la copie terminé. Comment y remédier ?
Comment faire pour ouvrir la vidéo sur l'écran secondaire ? En mode bureau étendu.
Et pourquoi le totem --fullscreen ne fonctionne pas !
J'attends impatiemment vos conseils. Merci
Hors ligne
#2 Le 18/07/2014, à 01:21
- compte supprimé
Re : Script.sh pour copier des vidéos dans tmpfs
Dans la notification, le "$FILE" affiche l'adresse complète. Comment faire pour qu'elle affiche seulement le nom du film ?
La notification affiche ce que tu lui demande d'afficher, en l'occurence $FILE qui comprend le chemin.Utilise la commande basename qui t'extrait juste le nom sans le chemin.
Malheureusement, la lecture du fichier ne commence qu'une fois la copie terminé. Comment y remédier ?
C'est normal, tu attends que le fichier soit téléchargé, tu le copies dans le ramdisk et tu ne lance totem qu'après.Avec quoi télécharges tu tes fichiers ?
Parce que tu pourrais directement les télécharger dans ton ramdisk et lancer totem sur le fichier directement, comme ça pas besoin de copier le fichier et donc d'attendre la fin du téléchargement.
De plus, pourquoi ne pas télécharger directement dans tmp qui est lui aussi en tmpfs ??
Un :
df -h
devrait te le confirmer.
Dernière modification par sogyam (Le 18/07/2014, à 01:22)
#3 Le 18/07/2014, à 02:18
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
De plus, pourquoi ne pas télécharger directement dans tmp qui est lui aussi en tmpfs ??
Comment est-ce que tu sais que mon tmp est en tmpfs ? Il me semble que c'est pas le cas par défaut puisque je l'ai manuellement ajouté au fstab.
Mettre /tmp en tmpfs
C'est le but même de tmpfs à l'origine !
pour ce faire il suffit d'ajouter au fichier texte /etc/fstab la ligne:
tmpfs /tmp tmpfs defaults,size=32M 0 0
Cette modification est effective au prochain démarrage.
Ensuite, j'ai préféré faire comme ça car je peux faire un rm sans aucuns risques et vu que je l'utilise dans un cas bien précis, je peux attribuer une très grande quantité de ram en sachant qu'il n'y aura pas de copie en swap et donc les disques dur seront mis en veille au bout de 5 minutes d'inactivité.
Et:
C'est normal, tu attends que le fichier soit téléchargé, tu le copies dans le ramdisk et tu ne lance totem qu'après.Avec quoi télécharges tu tes fichiers ?
Mes fichiers sont des dvd-rip multilingues ac3 situés dans un disque dur externe. (le tout ayant préalablement été soumis à la taxe sur la copie privée. Bien sûr !!!)
Hors ligne
#4 Le 18/07/2014, à 15:47
- compte supprimé
Re : Script.sh pour copier des vidéos dans tmpfs
Comment est-ce que tu sais que mon tmp est en tmpfs ? Il me semble que c'est pas le cas par défaut puisque je l'ai manuellement ajouté au fstab
Et bien, j'ai regardé sur la 13.10 et il était monté par défaut en tmpfs, mais en regardant sous ma sid, je me suis aperçu que contrairement, à il y a peu de temps, ils avaient fait machine arrière et ne montent plus tmp en tmpfs par défaut, donc au temps pour moi, il est fort probable que ce soit le cas pour la 14.04 (il faudrait que je migre ...).C'est distro et version dépendant.
D'ailleurs, éditer /etc/default/tmpfs donne légèrement plus de souplesse que d'utiliser fstab pour monter tmp en tmpfs.
C'est vrai que si tes fichiers sont très gros, utiliser /tmp est une mauvaise idée.
Je croyais que ta latence était due à un téléchargement.Utilise rsync pour le transfert de tes fichiers (il y a peut être mieux, mais c'est ce que j'ai déjà utiliser)
car il crée un fichier temporaire lisible.
Du style :
rsync -av --del --inplace /chemin/vers/mavideo/surledisqueUSB/video.mp4 /media/ram/ & totem /media/ram/video.mp4
regardes le man de rsync, pour faire exactement ce que tu veux.
Dernière modification par sogyam (Le 18/07/2014, à 15:49)
#5 Le 18/07/2014, à 16:50
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Yo, merci oh grand gagnant du mois.
En plus d'être un voyant t'es perspicace, j'avoue, j'utilise la version 14.04 et j'aime ça.
La commande fonctionne
rsync -av --del --inplace "$FILE" "$RAM" & for uri in "$RAM"; do DISPLAY=:0.0 totem --fullscreen "$uri"
Mais celle ci aussi
cp -uR "$FILE" "$RAM" & for uri in "$RAM"; do DISPLAY=:0.0 totem --fullscreen "$uri"
Donc je pense que je vais rester sur un basique cp à moins qu'il y ai un réel intérêt à utiliser rsync ?
Au passage j'ai eu beau lire le man mais que veulent dire
av :
del :
inplace :
Et aussi : Pourquoi est-ce que la taille du fichier ne s’additionne pas dans le moniteur système ?
Dernière modification par Troödon (Le 18/07/2014, à 17:09)
Hors ligne
#6 Le 18/07/2014, à 18:16
- compte supprimé
Re : Script.sh pour copier des vidéos dans tmpfs
C'est vrai qu'elle marche sur usb ta commande (j'avais testé le cp entre 2 partitions de mon disque et là c'est down).Ça m'apprendra à ne pas tester en situation réelle ...
Vu ce que tu veux faire je ne sais pas si tu as beaucoup d'avantage à utiliser rsync :
-il effacera lui même les fichiers avec les bonnes options.
-Si ton disque pour une raison x ou y, a un moment de faiblesse et coupe la copie, il reprendra là où il s'est arrêté sans reprendre depuis le debut.
+ plein d'autre options dont le fait de gérer la copie incrémentale en réseau si tu veux upgrader ton script, etc ...
Mais est ce vraiment nécessaire ? c'est à toi de juger ! http://doc.ubuntu-fr.org/rsync
Et aussi : Pourquoi est-ce que la taille du fichier ne s’additionne pas dans le moniteur système ?
Peut être parce que la mémoire utilisée par tmpfs est considérée comme une mémoire cache et n'est donc pas vue comme réellement allouée.
Dernière modification par sogyam (Le 22/07/2014, à 07:55)
#7 Le 21/07/2014, à 20:41
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Salut, merci de ton aide. J'ai donc adopté rsync :
rsync -a --inplace "$FILE" "$RAM"
mais maintenant je bloque sur un autre truc, comment peut on dire à rsync de tester l'espace disque restant avant la copie ?
Dernière modification par Troödon (Le 21/07/2014, à 22:58)
Hors ligne
#8 Le 24/07/2014, à 11:34
- compte supprimé
Re : Script.sh pour copier des vidéos dans tmpfs
Tu le fait toi même, du genre (avec resultat en Ko):
df -k "$RAM" | tail -1 | awk '{print $4}'
après la fin de la copie d'un fichier.
(l'option --sync pourrrait être utile, à voir)
#9 Le 26/07/2014, à 08:24
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Merci merci, j'ai donc procédé ainsi :
FILE=`echo -n $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS`
RAM=/media/ram
PLAYER=totem
SIZE=$(du -k "$FILE" | cut -f1 )
SPACE=$(df -k "$RAM" | tail -1 | cut -d " " -f29 )
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
TEST=$(( $SIZE + $SPACE ))
if [ "$SIZE" -ge "$SPACE" ] ; then
paplay /usr/share/sounds/freedesktop/stereo/device-added.oga & notify-send -i /usr/share/icons/gnome/scalable/actions/document-save-symbolic.svg "KO"
DISPLAY=:0.0 "$PLAYER" --fullscreen "$FILE"
else
paplay /usr/share/sounds/freedesktop/stereo/device-added.oga & notify-send -i /usr/share/icons/gnome/scalable/actions/document-save-symbolic.svg "OK"
#rsync -a --inplace "$FILE" "$RAM" & cd "$RAM" ; for uri in "$RAM" ; do DISPLAY=:0.0 "$PLAYER" --fullscreen "$uri"
fi
exit
Le calcul est bien effectué (quoi je pense, la variable test me permet de vérifier), mais je sais pas pourquoi ça bloque au niveau du else.
Quand je désactive le :
sync -a --inplace "$FILE" "$RAM" & cd "$RAM" ; for uri in "$RAM" ; do DISPLAY=:0.0 "$PLAYER" --fullscreen "$uri"
J'ai les notifications Ok et KO fonctionnelles mais une fois le # enlevé, rien ne va plus. Mais pourquoi donc ???
Hors ligne
#10 Le 26/07/2014, à 08:51
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
Bonjour,
Il manque le done à la fin de la ligne rsync...
Hors ligne
#11 Le 26/07/2014, à 11:16
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Merci @pingouinux, ça roule.
Pour finaliser, j'aimerais bien :
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
ICON=????/poster.jpg
1 - utiliser la variable obtenue par $LENGTH avce sleep
2 - utiliser l'image poster.jpg présente dans le dossier sélectionné.
paplay $AUDIO & notify-send -i $ICON "OK"
rsync -a --inplace "$FILE" "$RAM" & cd "$RAM" ; for uri in "$RAM" ; do DISPLAY=:0.0 "$PLAYER" --fullscreen "$uri" & sleep 5 ; "$PLAYER" --quit & xset dpms force standby ; rm -r -f "$RAM"
Hors ligne
#12 Le 26/07/2014, à 11:40
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
1 - utiliser la variable obtenue par $LENGTH avce sleep
Est-ce tout simplement ceci que tu veux ?
sleep $LENGTH
Il serait étonnant que l'on ne puisse pas simplifier le calcul de LENGTH. À quoi ressemble la sortie de ffmpeg ?
Hors ligne
#13 Le 26/07/2014, à 11:47
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Malheureusement, le sleep $LENGTH ne fonctionne pas, ce qui suit s'exécute immédiatement.
C'est vrai que dans le code précédemment donné, j'avais mis 5 pour valider la ligne complète.
sleep $LENGTH
est différent de :
sleep "$LENGTH"
??? en quoi ?
ffmpeg -i '/mon fichier' 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//
00:00:05.59
Dernière modification par Troödon (Le 26/07/2014, à 11:51)
Hors ligne
#14 Le 26/07/2014, à 12:14
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
La commande sleep attendant une valeur numérique, $LENGTH et "$LENGTH" seront ici équivalents
Si LENGTH vaut réellement 00:00:05.59, la commande sleep $LENGTH donne un message d'erreur et rend la main immédiatement
Je te demandais le retour de
ffmpeg -i '/mon fichier' 2>&1
du moins la ligne contenant Duration
ffmpeg -i '/mon fichier' 2>&1 | grep "Duration"
Hors ligne
#15 Le 26/07/2014, à 12:17
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Merci, la voici :
Duration: 00:00:05.59, start: 0.000000, bitrate: 7 kb/s
Il me faut la sortir sans les ":" peut-être ?
Dernière modification par Troödon (Le 26/07/2014, à 12:18)
Hors ligne
#16 Le 26/07/2014, à 12:28
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
Avec la ligne que tu montres en #15, ta commande en #13 renvoie 0.000000, et non 00:00:05.59.
Hors ligne
#17 Le 26/07/2014, à 12:43
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Bizarre ?!
ffmpeg -i "$FILE" 2>&1 | grep "Duration"
Duration: 00:00:05.59, start: 0.000000, bitrate: 7 kb/s
ffmpeg -i "$FILE" 2>&1 | grep "Duration" | cut -d ' ' -f 4
00:00:05.59,
(Par contre un cut -d ' ' -f 6 me renvoie 0.000000,)
ffmpeg -i "$FILE" 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
00:00:05.59
C'est vrai que 1 et 2 ne renvoient rien.
Dernière modification par Troödon (Le 26/07/2014, à 12:53)
Hors ligne
#18 Le 26/07/2014, à 12:56
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
C'est parce qu'il y a 2 espaces en tête de la ligne en #17, et pas en #15.
Si tu veux ne récupérer que les secondes (05.59) :
ffmpeg -i "$FILE" 2>&1 | sed -nr '/^Duration:/s/([^:]+:){3}([^,]+).*/\2/p'
Si les heures et minutes ont des valeurs non nulles, c'est un peu plus compliqué, mais faisable.
Ajouté : Voici, sachant que eval est une commande potentiellement dangereuse
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | sed -nr '/^Duration:/s/[^:]+: ([^:]+):([^:]+):([^,]+).*/$(bc -l <<<"(\1*60+\2)*60+\3")/p')
eval sleep $LENGTH
Dernière modification par pingouinux (Le 26/07/2014, à 13:08)
Hors ligne
#19 Le 26/07/2014, à 13:07
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Non, ça ne fonctionne pas. Cette commande ne renvoie rien.
En plus, étant donné que c'est pour regarder des films... mais 0 ne sont pas utiles, quoi tout dépend de sleep.
Hors ligne
#20 Le 26/07/2014, à 13:11
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
Ah oui, évidemment, Duration n'est plus en tête de ligne :
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | sed -nr '/^ *Duration:/s/[^:]+: ([^:]+):([^:]+):([^,]+).*/$(bc -l <<<"(\1*60+\2)*60+\3")/p')
eval sleep $LENGTH
Édité :
On peut se passer du eval
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | sed -nr '/^ *Duration:/s/[^:]+: ([^:]+):([^:]+):([^,]+).*/echo "(\1*60+\2)*60+\3"|bc -l/ep')
sleep $LENGTH
Dernière modification par pingouinux (Le 26/07/2014, à 13:24)
Hors ligne
#21 Le 26/07/2014, à 13:31
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Ça fonctionne parfaitement bien merci beaucoup
Tout cela aurait été beaucoup plus simple si totem ou vlc proposaient une option "quitter à la fin du la lecture".
Et vu que tu maîtrise tu peux me dire comment lui faire ça stp #11
Édit : NON, eval est indispensable.
Dernière modification par Troödon (Le 26/07/2014, à 13:34)
Hors ligne
#22 Le 26/07/2014, à 13:41
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
Édit : NON, eval est indispensable.
Pas avec la seconde commande en #20, normalement.
Que donne
LENGTH=$(ffmpeg -i "$FILE" 2>&1 | sed -nr '/^ *Duration:/s/[^:]+: ([^:]+):([^:]+):([^,]+).*/echo "(\1*60+\2)*60+\3"|bc -l/ep')
echo $LENGTH
Hors ligne
#23 Le 26/07/2014, à 13:53
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
Elle fonctionne aussi. C'est vrai que les différences entre les deux lignes sautent aux yeux ^^.
Pour le echo, je sais pas comment l'avoir dans un terminal mais je le fait sortir dans une notification (je sais pas si c'est pareil, mais j'imagine que oui).
5.59
et avec la première ligne fonctionnelle nécessitant eval :
$(bc -l <<<"(00*60+00)*60+05.59")
Hors ligne
#24 Le 26/07/2014, à 14:01
- pingouinux
Re : Script.sh pour copier des vidéos dans tmpfs
Ça confirme que eval est inutile avec la seconde commande en #20.
Hors ligne
#25 Le 26/07/2014, à 14:03
- Troödon
Re : Script.sh pour copier des vidéos dans tmpfs
J'ai pas tout pigé mais je confirme. Merci encore.
Édit : bonne journée
Dernière modification par Troödon (Le 26/07/2014, à 14:07)
Hors ligne