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 24/02/2012, à 14:25

Saturnin51

Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Bonjour,

j'ai récupéré sur un forum anglophone un script permettant d'afficher l'image astronomique du jour avec ses explications.
Après récupération de l'image et du texte, les deux sont mixés pour construire l'image finale.
Le problème est que le texte ne semble pas comporter de retour ligne. Aussi on ne voit que le début du texte sur une seule ligne qui déborde de l'écran.
Quelqu'un pourrait-il arranger cela ?
D'avance merci.

Le script :

#!/bin/sh  -xv
#
# downloads today's Astronomy Picture of the Day
# and sets it as wallpaper
#
# Adjust SCREEN_GEOMETRY for your needs
#
# Version 1.4
# A. Dominik, 19. Oct 2011

SCREEN_GEOMETRY="1366x768"
APOD_URL="http://apod.nasa.gov/apod/"
FILE_URL="http://apod.nasa.gov/apod/astropix.html"
ORIGINAL="raw.html"
ORI_NO_HEAD="raw-no-head.html"
IMAGE_URL="http://dummy.jpg"
IMAGE_NAME="dummy.jpg"

WALLPAPER_NAME="apod.png"
WALLPAPER_TEMP_NAME="temp.png"
WALLPAPER_TXT="apod.txt"

IMAGE_TITLE="dummy"
IMAGE_TITLE_FILE="title.txt"
IMAGE_EXPL="dummy"
IMAGE_EXPL_FILE="explanation.txt"

HOME_DIR=$HOME
WORK_DIR="${HOME}/.apod"

TEMP1="tempfile1"
TEMP2="tempfile2"

#
# Read config file:
#
. ${WORK_DIR}/apod-wallpaper.config

#
# Check for working dir:
if ! test -d $WORK_DIR
then
  echo "Directory $WORK_DIR not found"
  exit
fi

cd $WORK_DIR

#
# check for internet connection:
#
wget www.google.com

I_NET=$?

if ! test $I_NET -eq 0
then
  echo "No internet connection"
  exit
fi

#
# test for a filename to download
#
if test $# -gt 0
then
  FILE_URL="$1"
fi

#
# get html page
#
wget $FILE_URL -O $ORIGINAL

#
# extract image url
# extract image name
# and download hi-res image
#
IMAGE_URL=$(cat $ORIGINAL | grep 'href="image' | head -1 | \
                            sed 's/<a href="/  /g' | sed 's/"/ /g' | sed 's/>/ /g' |\
                            awk '{print( "http://apod.nasa.gov/" $1)}')

IMAGE_NAME=$(echo $IMAGE_URL | sed 's+/+ +g' | awk '{print( $NF)}' | sed 's/\"//g')

wget $IMAGE_URL -O $IMAGE_NAME

#
# extract title
# and remove html tags
#
# The following part of the code tries to find the lines in the APOD HTML
# page, that holds title and explanation.
# Due to slight changes of the file format, it may not work properly for
# all historic APOD pages.
#
# make files nice
# Some HTML tags lower:
#
cat $ORIGINAL | \
sed 's/<CENTER>/<center>/g;s/<\/CENTER>/<\/center>/g;s/<B>/<b>/g;s/<\/B>/<\/b>/g' > $TEMP1

# Add line breaks after center tags:
#
cat $TEMP1 | \
sed 's/<center><b>/<center>\n<b>/g' > $TEMP2

# Add line breaks after word Explanation:
#
cat $TEMP2 | \
sed 's/Explanation<\/b>/Explanation\n<\/b>/g;s/Explanation:<\/b>/Explanation:\n<\/b>/g;' > $TEMP1

# Remove page header
# del all up to image link
#
cat $TEMP1 | \
awk 'BEGIN {MOD = 0} { if (MOD==1) {print}; if ($0 ~ "href=\"image") {MOD = 1}}' | \
awk 'NR>2 { print }' > $ORI_NO_HEAD
 
# del all up to 2nd center
cat $ORI_NO_HEAD | \
awk 'BEGIN {MOD = 0} { if (MOD==1) {print}; if ($0 ~ "<center>") {MOD = 1}}' > $TEMP1

# Extract line with title and
# trim title; i.e. remove html, trim and remove line breaks
#
cat $TEMP1 | awk 'NR==1 {print}' > $TEMP2
cat $TEMP2 | sed 's/<[^>]*>//g;s/^ *//g;s/ *$//g;s/ \{1,\}/ /g;s/[\n\r]/ /g' > $IMAGE_TITLE_FILE

cat $IMAGE_TITLE_FILE

#
# extract explanation
# and remove html tags
#
# del all up to 1st Explanation
#
cat $ORI_NO_HEAD | \
awk 'BEGIN {MOD = 0} { if (MOD==1) {print}; if ($0 ~ "Explanation") {MOD = 1}}' > $TEMP1

# del all from next center
cat $TEMP1 | \
awk 'BEGIN {MOD = 1} { if ($0 ~ "<center>") {MOD = 0}; if (MOD==1) {print}}' > $TEMP2

# remove html, line breaks and unneeded spaces:
#
cat $TEMP2 | tr '\012' ' ' |  tr '\015' ' ' | \
  sed 's/<[^>]*>//g;s/^ *//;s/ *$//;s/ \{1,\}/ /g' > $IMAGE_EXPL_FILE

cat $IMAGE_EXPL_FILE

#
# create annotated image with imagemagick
#
convert $IMAGE_NAME -resize ${SCREEN_GEOMETRY}^ $IMAGE_NAME
convert $IMAGE_NAME -gravity center -extent ${SCREEN_GEOMETRY}+0+0 $IMAGE_NAME

convert $IMAGE_NAME -fill white -pointsize 12 -gravity NorthWest -annotate +10+70 "@$IMAGE_EXPL_FILE" -pointsize 20 -annotate +30+30 "@$IMAGE_TITLE_FILE" $IMAGE_NAME

composite -gravity NorthEast -geometry +0+100 ubuntu-550.png $IMAGE_NAME $WALLPAPER_TEMP_NAME
if test -s $WALLPAPER_TEMP_NAME
then
  mv $WALLPAPER_TEMP_NAME $WALLPAPER_NAME
fi

#
# create text file with annotation:
#
IMAGE_ANNOTATION_TXT="${IMAGE_NAME}.txt"
echo "$IMAGE_NAME"         > $IMAGE_ANNOTATION_TXT
echo "\n Title: "         >> $IMAGE_ANNOTATION_TXT
cat $IMAGE_TITLE_FILE     >> $IMAGE_ANNOTATION_TXT
echo "\n Explanation: "   >> $IMAGE_ANNOTATION_TXT
cat $IMAGE_EXPL_FILE      >> $IMAGE_ANNOTATION_TXT

# Remove all temporary files:
#
rm -f $TEMP1 $TEMP2
rm -f $ORIGINAL $ORI_NO_HEAD
rm -f $IMAGE_TITLE_FILE $IMAGE_EXPL_FILE
rm -r $IMAGE_NAME $WALLPAPER_TEMP_NAME
mv $IMAGE_ANNOTATION_TXT $WALLPAPER_TXT
rm -f index.*

#
# Set as wallpaper (Gnome):
#
gconftool-2 -t str --set /usr/share/backgrounds/picture_filename "${WORK_DIR}/${WALLPAPER_NAME}"
mv /home/robert/.apod/apod.png /home/robert/Images/apod.png

Le fichier de configuration contient les lignes suivantes:

#
# Configuration for APOD wallpaper
#
SCREEN_GEOMETRY="1366x768"
#SCREEN_GEOMETRY="1920x1200"
#SCREEN_GEOMETRY="1280x800"
#SCREEN_GEOMETRY="1280x960
#SCREEN_GEOMETRY="1024x768"

Merci d'avance.

Dernière modification par Saturnin51 (Le 17/08/2012, à 17:55)

Hors ligne

#2 Le 25/02/2012, à 20:14

pode

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Tu peux rajouter une étape intermédiaire de formatage à l'aide de la commande fmt.

Par exemple avec les modifications suivantes (modifications affichées avec l'outil diff) :

$ diff -u astro.sh.orig astro.sh
--- astro.sh.orig    2012-02-25 19:00:50.236610861 +0100
+++ astro.sh    2012-02-25 19:02:56.277869989 +0100
@@ -145,7 +145,10 @@
     # remove html, line breaks and unneeded spaces:
     #
     cat $TEMP2 | tr '\012' ' ' |  tr '\015' ' ' | \
-      sed 's/<[^>]*>//g;s/^ *//;s/ *$//;s/ \{1,\}/ /g' > $IMAGE_EXPL_FILE
+      sed 's/<[^>]*>//g;s/^ *//;s/ *$//;s/ \{1,\}/ /g' > $TEMP1
+
+    # formatage pour texte long - limite de 250 ecrite en dur
+    fmt -w 250 $TEMP1 > $IMAGE_EXPL_FILE
 
     cat $IMAGE_EXPL_FILE

La coupure à 250 est à tester et éventuellement à adapter.

Si tu ne comprends pas la sortie de la commande diff, le plus simple est de :
1. Faire une sauvegarde de ton script
2. Recopier le résultat complet de la commande diff dans un fichier nommé astro.patch
3. Exécuter la commande suivante (en remplaçant nomDuScript.sh par le nom de ton script) :

patch -p0 nomDuScript.sh < astro.sh.patch 

Hors ligne

#3 Le 25/02/2012, à 23:10

Saturnin51

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Génial ! Résultat impeccable, j'en suis très heureux ! Merci beaucoup.

Sans vouloir abuser, pourrait-on faire en sorte que ce texte puisse être replier et déplier en cliquant sur un bouton, comme dans la version Windows ?

Dernière modification par Saturnin51 (Le 25/02/2012, à 23:17)

Hors ligne

#4 Le 26/02/2012, à 10:09

michcauch

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Bonjour,
Je suis intéressé pour utiliser ce script, peux-tu, s'il te plait en donner le mode d'emploi ?

Voici ce que j'ai fait (et qui ne fonctionne pas)
J'ai enregistré
   - le premier script (en modifiant les chemins selon ma configuration) sous le nom apod.sh
   - celui de pode sous le nom  astro.sh.patch
   - j'ai lancé selon le commande donnée par pode
Cela donne ceci avec un message d'erreur

michel@bureau-michel:~/bin$ patch -p0 apod.sh < astro.sh.patch
patching file apod.sh
Hunk #1 FAILED at 145.
1 out of 1 hunk FAILED -- saving rejects to file apod.sh.rej

de plus je ne sais pas que faire du fichier de configuration.

Merci d'avance pour tes explications.


Cordialement
Michel
___
Ubuntu 22.04 sur Clevo N141WU

Hors ligne

#5 Le 26/02/2012, à 11:29

Saturnin51

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Je n'ai pas su non plus utiliser la commande $diff ou le script (?). Aussi j'ai inséré manuellement la ligne de formatage (la ligne sed et la ligne fmt) dans le script directement.

Voici l'adresse ou trouver le package complet avec des explications d'installations :

script APoD

Hors ligne

#6 Le 26/02/2012, à 11:45

pode

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Saturnin51 a écrit :

pourrait-on faire en sorte que ce texte puisse être replier et déplier en cliquant sur un bouton, comme dans la version Windows ?

La commande convert a créé une image statique au format JPEG
Est-ce que c'est possible de faire ce que tu dis avec convert ou un autre outil, je ne sais pas.


michcauch a écrit :

   - j'ai lancé selon le commande donnée par pode
Cela donne ceci avec un message d'erreur

michel@bureau-michel:~/bin$ patch -p0 apod.sh < astro.sh.patch
patching file apod.sh
Hunk #1 FAILED at 145.
1 out of 1 hunk FAILED -- saving rejects to file apod.sh.rej

Pour ce qui est de la partie modifiée, l'utilisation de la commande patch est juste une possibilité, au cas où le résultat de la commande diff n'était pas compris.

La commande patch a échoué car tu as dû modifié le script de telle façon que, par exemple, les lignes sont décalées.
La ligne 145 du fichier, avant exécution de la commande patch, doit être la ligne :

# remove html, line breaks and unneeded spaces:

Sinon, sans passer par la commande patch, le but final est simplement de remplacer la ligne :

      sed 's/<[^>]*>//g;s/^ *//;s/ *$//;s/ \{1,\}/ /g' > $IMAGE_EXPL_FILE

par les lignes :

      sed 's/<[^>]*>//g;s/^ *//;s/ *$//;s/ \{1,\}/ /g' > $TEMP1

    # formatage pour texte long - limite de 250 ecrite en dur
    fmt -w 250 $TEMP1 > $IMAGE_EXPL_FILE
Saturnin51 a écrit :

Je n'ai pas su non plus utiliser la commande $diff ou le script (?). Aussi j'ai inséré manuellement la ligne de formatage (la ligne sed et la ligne fmt) dans le script directement.

Par convention, lorsqu'on donne des commandes à taper en ligne de commande, on met souvent un prompt en début de chaque ligne, pour faciliter la lecture (c'est notamment pratique quand on a des commandes très longues, pour voir rapidement où se trouve le début de chaque commande).
Par convention, pour un compte non root, on met souvent $ (ou %)
Par convention, pour le compte root, on met souvent #

Hors ligne

#7 Le 26/02/2012, à 16:27

Saturnin51

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

Merci encore une fois pour ta disponibilité et tes explications. J'avais pratiqué Linux il y a bien longtemps et je constate que cela a bien évolué, en bien !

Hors ligne

#8 Le 06/03/2012, à 04:24

Watael

Re : Script pour afficher l'image du jour APoD sur le bureau. [Terminé]

salut,

une version allégée du script de Andreas Dominik

#!/bin/bash
#set -x

ping -c1 google.com &>/dev/null || { echo "pas de connexion internet :("; exit 1;} 

declare -A img
destRep="/tmp"
tmpFile="/tmp/astropix.html"
addr="http://apod.nasa.gov/apod/astropix.html"

wget "$addr" -qO "$tmpFile"

img[addr]="${addr%/*}/$(sed -n 's/^<a href="\(image[^"]*\)".*/\1/p' "$tmpFile")"

if [ "${img[addr]}" != "${addr%/*}/" ]
then
   img[title]=$(sed -n '/<b>.*<br>/{s/<[^>]*>\( \|$\)//gp;q}' "$tmpFile")
   img[DL]="$destRep/${img[addr]##*/}"

   wget "${img[addr]}" -qO "${img[DL]}"

   img[comment]=$(sed -n '/Explanation:/,/<p>/{s/<[^>]*>//g;s/<[^$]*//g;/^<.*/d;s/^[^>]*>//g;/^$/d;p}' /tmp/astropix.html | fmt -w150)
   img[geom]="1280x1024"

   convert "${img[DL]}" -resize ${img[geom]}^ \
                        -gravity center -extent ${img[geom]}+0+0 \
                        -fill white \
                        -gravity NorthWest \
                        -pointsize 20 \
                        -annotate +30+30 "${img[title]}" \
                        -pointsize 12 \
                        -annotate +10+70 "${img[comment]}" "${img[DL]}"

   gconftool-2 -t str --set /usr/share/backgrounds/picture_filename "${img[DL]}"
else
   echo "Allo Houston ? Nous avons un problème !"
fi

mais aujourd'hui ça ne fonctionne pas : le site fait un lien vers une vidéo sur youtube.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne