Journal L'image du jour Wikimedia en fond d’écran Sway

Posté par  . Licence CC By‑SA.
14
17
août
2023

Je viens de passer de i3 a sway et je souhaitais avoir un fond d’écran libre, changeant et joli. Je détaille ici comment je fais avec les images du jour de Wikimedia et Sway sous Debian 12.

Remarque: C'est une très vielle idée car je la suggérais déjà en 2017 pour une extension du projet Gnome.

Je copie le script javascript sous ~/.config/sway/script/wikimedia.js

/*
 * This script downloads the latest Wikimedia Commons picture of the day.
 * It requires nodejs and https
 */
const https = require('https');
const fs = require('fs');

const resolution = process.argv.at(2) || '1280px' // 1024px 2560px

const url = 'https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=atom';

const match1 = 'href="https://commons.wikimedia.org/wiki/Special'
const match2 = 'typeof="mw:File"'

const getUrl = (url) => {
    return new Promise((resolve) => {
        https.get(url, resp => {
            let data = ''
            resp.on('data', c => data += c)
            resp.on('end', () => {
                resolve(data)
            })
        })
    })
}

const download = (url, dest) => {
    return new Promise((resolve) => {
        const file = fs.createWriteStream(dest);
        https.get(url, resp => {
            resp.pipe(file);
            file.on('finish', () => file.close(resolve))
        })
    })
}

(async () => {
    const data = await getUrl(url)
    const urls = data.split(/\n/).filter(l => l.includes(match1)).map(l => l.split(/"/)[5])
    const lastUrl = urls.slice(-1)[0]
    const data2 = await getUrl(lastUrl)
    const picUrl = data2.split(/\n/).filter(l => l.includes(match2)).map(l => l.split(/"/)[7])
    const picName = picUrl[0].slice(11)
    const picFullUrl = `https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/${picName}/${resolution}-${picName}`
    download(picFullUrl, '/tmp/wikimedia.jpg')
})()

Le but ici est donc d’exécuter le script ci-dessus au démarrage de Sway.

Remarque: il faut avoir nodejs installé. Surement sudo apt install nodejs

Si vous n'avez pas de ~/.config/sway/config, il faut d'abord en créer un cp /etc/sway/config ~/.config/sway/

Éditez ~/.config/sway/config, j'ai un script pour personnaliser ma barre horizontale:

bar {
    ...
    status_command ~/.config/sway/scripts/statusbar.sh
    ...
}

J'y ajoute la ligne de commande pour télécharger l'image et l'appliquer en fond d’écran. Je pense que ici, tout dépend de sa config Sway. Mon ~/.config/sway/scripts/statusbar.sh ressemble a ceci:

#!/bin/sh
node ~/.config/sway/scripts/wikimedia.js ; swaymsg 'output "*" background /tmp/wikimedia.jpg fill'
while true
do
    date_dakar="$(TZ="Africa/Dakar" date +'%Y-%m-%d')"
    date_and_time_paris="Paris $(TZ="Europe/Paris" date +'%H:%M')"
    date_and_time_dakar="Dakar $(TZ="Africa/Dakar" date +'%H:%M')"
    date_and_time_sf="San Francisco $(TZ="America/Los_Angeles" date +'%H:%M')"
    printf "%s %s, %s, %s\n" "$date_dakar" "$date_and_time_paris" "$date_and_time_dakar" "$date_and_time_sf"
    sleep 30
done

Remarque: Je dois substituer /home/user/.nvm/versions/node/v18.15.0/bin/node a node car j'utilise nvm pour installer nodejs.

  • # Pour ceux qui ne connaissent pas Sway

    Posté par  (site web personnel) . Évalué à 8.

    Si certains sont comme moi :
    Sur le site de Sway :
    Sway is a tiling Wayland compositor and a drop-in replacement for the i3 window manager for X11. It works with your existing i3 configuration and supports most of i3's features, plus a few extras.

    S'il y a un problème, il y a une solution; s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

  • # Mais pourquoi nodejs ?

    Posté par  . Évalué à 8. Dernière modification le 17 août 2023 à 09:47.

    Merci pour le journal.
    Pourquoi avoir utilisé nodejs ou un simple curl via bash/python aurait fait l'affaire ?

  • # Version python

    Posté par  . Évalué à 4.

    Une petite version python du script :

    import atoma, requests, bs4
    
    # be nice with wikimedia servers or you will get 403 erros.
    headers = {'User-Agent': 'ImageDuJourVisualizer/0.1 (https://linuxfr.org/users/tla47/journaux/l-image-du-jour-wikimedia-en-fond-d-ecran-sway)'}
    
    # fetch feed
    response = requests.get("https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=atom", headers=headers)
    feed = atoma.parse_atom_bytes(response.content)
    
    # entry of the day
    html = feed.entries[9].summary.value
    
    # picture uri
    parsed_html = bs4.BeautifulSoup(html, features="lxml")
    img = parsed_html.td.img.get("src")
    
    # save picture to file
    print("fetching %s" % (img))
    response = requests.get(img, headers=headers)
    with open('/tmp/wikimedia.jpg','wb') as pic:
        pic.write(response.content)

    À noter que potd feed renvoie une série d'image qui ne semble correspondre ni à l'image du jour (wikipédia francophone), ni à picture of the day (wikipedia anglophone).
    Quelqu'un sait comment spécifier le code de langue dans l'uri du feed ?

    N.B.: le script ne cherche pas à obtenir la meilleure résolution de l'image.

  • # Ne pas prendre ce qui suit comme une critique

    Posté par  . Évalué à 10.

    C'est amusant, je suis aussi sous Sway qui a remplacé XMonad sur mon bureau lors du passage à Wayland, sans regret. Et je n'utilise pas de fond d'écran. Pas que ce soit difficile ou ennuyeux, mais je n'en ai plus l'utilité, ou plutôt l'envie (ç'aurait déjà pu être le cas avec XMonad). Soit je me sers de mon ordi, et donc miracle des gestionnaires de fenêtres pavant les applications couvrent l'écran, soit je ne m'en sers pas et je le mets en veille. Fini les longs moments à choisir un fond d'écran qui rapidement me sort par les yeux, les applications utiles sont sur leurs bureaux et écrans respectifs, accessibles instantanément avec les raccourcis clavier configurés pour ça. Et si je n'ai rien à faire là, je vais ailleurs.

    C'était différent avec les autres sortes de gestionnaires de fenêtre qui montrent la plupart du temps au moins une partie du fond de l'écran. Mais même là je me contentais souvent d'une couleur de fond.

    • [^] # Re: Ne pas prendre ce qui suit comme une critique

      Posté par  (site web personnel) . Évalué à -1.

      Allez, je vais être un peu provoc, mais pour moi, ce commentaire est fondamentalement inutile (bien que je sois tout à fait d'accord le propos).

      • [^] # Re: Ne pas prendre ce qui suit comme une critique

        Posté par  . Évalué à 3.

        Moi je suis d'accord avec le commentaire racine et je demande quand est ce qu'on voit le fond d'écran d'un gestionnaire de fenêtres pavant ?

        https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

        • [^] # Re: Ne pas prendre ce qui suit comme une critique

          Posté par  (site web personnel) . Évalué à 6. Dernière modification le 17 août 2023 à 18:59.

          Avant d'avoir démarrer les applications par exemple ? Juste après en avoir fermé une ? Ces quelques secondes de cerveau disponible permettent d'observer une nouvelle image tous les jours, voire davantage si l'image est intéressante.

          En fait, ce qui serait bien avec ce script, c'est d'avoir un moyen d'afficher la légende ou le texte associé à l'image du jour.

          • [^] # Re: Ne pas prendre ce qui suit comme une critique

            Posté par  (Mastodon) . Évalué à 3.

            Et encore, si tu sais qu'il y a une application que tu vas ouvrir à tous les coups, pourquoi ne pas l'ouvrir automatiquement à l'ouverture de la session.

            Vous avez beaucoup de sessions ouverte sans avoir au moins une fenêtre de navigateur?

            À part un pc dédié à une tâche précise, genre écriture, MAO, contrôle de machines, et pour lesquelles on pourra mettre en autodémarrage une autre appli (pour justement éviter d'ouvrir le navigateur et procrastiner), je ne vois pas.

            • [^] # Re: Ne pas prendre ce qui suit comme une critique

              Posté par  . Évalué à 1.

              Perso, j'ai toujours les mêmes applis ouvertes par défaut (Workspace 1: terminal locaux, Workspace 2: terminaux distants, 3: navigateurs, 4: mails, etc.).

              Quand j'ai un usage qui sort de ces situations génériques (lancement un d'un jeux, ou d'une vidéo par exemple), je vais sur un autre workspace, vide, d'abord le 5 puis s'il est pris le 6, etc.

              Au moment du switch vers le nouveau workspace, le fond d'écran (ou son absence) est temporairement visible.

              Bon, j'ai beau en avoir pour plus d'une barre de fringues sur moi, je suis has-been, j'ai encore i3.

              Il faut probablement que je passe sous Wayland puis sous sway visiblement. Mais je ne pense pas que vais m'embêter à mettre un fond d'écran.

        • [^] # Re: Ne pas prendre ce qui suit comme une critique

          Posté par  . Évalué à 4.

          Avec des terminaux transparents, et on en voit des petits bouts si on utilise les options de "gap".

      • [^] # Re: Ne pas prendre ce qui suit comme une critique

        Posté par  . Évalué à 10.

        Je suis entièrement d'accord sur le fait que mon commentaire n'est pas d'une utilité folle, mais cependant pertinent quant au sujet. Je pars de l'idée qu'on est aussi là pour discuter et qu'il n'est nul besoin de se stresser.

        • [^] # Re: Ne pas prendre ce qui suit comme une critique

          Posté par  (site web personnel) . Évalué à 0.

          Bo, je ne vois pas en quoi mon texte semble stressé. Je voulais juste faire une petite pique, et troller un peu sur la question du pertinent, inutile.

          Bon, je vais développer mon point. Ce commentaire se présente comme n'étant pas une critique négative (je pense que c'en est une, mais de manière indirecte). Le point central de ce commentaire est : je n'en ai pas d'utilité. Pour être constructif (ou utile), ce commentaire aurait pu être formulé de manière à questionner l'intérêt d'un fond d'écran quand on utilise un gestionnaire de fenêtres en mode pavé. Là, l'auteur du commentaire sous-entend plutôt : si on regarde le fond d'écran, c'est qu'on ne fait rien, donc autant ne pas rester devant l'ordinateur.

          Bref, finalement il y a une critique sous-jacente de l'intérêt même de ce script, sans se présenter comme tel et sans comprendre l'intérêt d'un fond d'écran dans ce contexte.

          • [^] # Re: Ne pas prendre ce qui suit comme une critique

            Posté par  . Évalué à 7.

            Le troll n'est pas du tout mon activité favorite. En l'occurrence ce journal me donnait l'occasion d'exprimer mes goûts en matière d'interface utilisateur sans en aucune manière déprécier ceux de l'auteur.

            je n'en ai pas d'utilité

            Il y a une forme de récursivité dans cette remarque discrète et pourtant centrale. J'exprime moi-même mon point de vue sur les fonds d'écran en indiquant que je n'en ai pas d'utilité et tu ressens la nécessité d'exprimer le fait que tu ne ressens pas d'utilité à ce que je ne ressente pas d'utilité à un fond d'écran. Je pourrais étendre la chose en disant que je ne ressens pas d'utilité à ton commentaire, mais non ; si c'était le cas je n'écrirais pas cette réponse.

        • [^] # Re: Ne pas prendre ce qui suit comme une critique

          Posté par  . Évalué à 2.

          Je suis à-peu-près sûr qu'il parlait de son commentaire à lui en disant "ce commentaire est inutile", il ne faut pas le prendre pour toi !

          Pour ma part je me suis fait la même réflexion. Même sur Gnome en utilisant mes applications toujours en maximisé, je ne vois quasi jamais mon fond d'écran…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.