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

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.

Documentation Ubuntu a écrit :

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

Troödon a écrit :

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

Troödon a écrit :

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 smile

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

notify-send a écrit :

5.59

et avec la première ligne fonctionnelle nécessitant eval :

notify-send a écrit :

$(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