Почитал я недавно про скрипт на PowerShell, который ставил фотки со спутника обоями на рабочий стол. Погуглив, не нашёл реализации под linux — коя ниже.



Возможные проблемы


По мелочи: сервер не всегда загружает изображения прямо совсем новые, так что есть шанс наткнуться на пустоту. Поэтому в скрипте я получаю фотки прошлого дня: nowday=$(date +%d -d -1day)

UPD: пофикшено, проблема была в ненастроеном часовом поясе.

Сервер загружает новый пак фотографий раз в десять минут и требует округления времени до десятков. Поэтому

nowtime=$(date +%H%M | sed -r 's/.$//')
nowtime=$nowtime"000"


Особые проблемы тут в одном месте: в установке обоев на рабочий стол.

Для xfce4


Общий синтаксис


xfconf-query -c xfce4-desktop -p %desktoppath% -s %image%

Получение параметров


Открываешь /home/user/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml

Предположим, что там что-то типа:

<channel name="xfce4-desktop" version="1.0">
  <property name="backdrop" type="empty">
    <property name="screen0" type="empty">
      <property name="monitorVGA-0" type="empty">
        <property name="workspace0" type="empty">
          <property name="color-style" type="int" value="2"/>
          <property name="image-style" type="int" value="5"/>
          <property name="last-image" type="string" value="/home/user/pictures/my_standart_wallpaper.png"/>
        </property>
      </property>
    </property>
  </property>
</channel>

Значит, вместо %desktoppath% надо указать /backdrop/screen0/monitorVGA-0/workspace0/last-image

Ну, а %image% — полный путь к файлу нового изображения.

Другие X-системы


?

Код


Код на bash
Спасибо за фиксы Self_Perfection и SleepingLion

github
# This script get images from himawari8 sputnik, combine it with imagemagick and set result as wallpaper. Works with xfce, gnome, i3
# ./earthwallpaper <resolution>
# <resolution> can be 4, 8, 16 or 20 : bigger number - better resolution. Default is 4
# Deps: imagemagick wget
# github: https://github.com/snowinmars/scripts/blob/master/earth_wallpaper.sh
# e-mail: marcor@yandex.ru

#!/bin/bash

delay=900 # seconds

while true
do
	echo $DESKTOP_SESSION
	width=550
	numblocks=${1:-4}
	xsystem=${2:-xfce4}
	level=$numblocks'd' #Level can be 4d, 8d, 16d, 20d
	
	timestamp=$(date -d -4hours +%Y/%m/%d/%H%M | sed -r 's/.$/000/') # delay is for timezone
	
	username=$(getent passwd $UID | sed -e 's/\:.*//')
	workdir="/home/"$username"/.earthwallpaper"

	if [ ! -d $workdir ]; then
		mkdir -p $workdir
	fi

	cd $workdir

	site="http://himawari8-dl.nict.go.jp/himawari8/img/D531106"

	url="$site/$level/$width/$timestamp"

		for (( i=0; i<=$numblocks-1; ++i))
		do
		    for (( j=0; j<=$numblocks-1; ++j))
			do
				sourceurl="$url"$(printf '_%d_%d.png' "$i" "$j")
				#sourceurl="$url$dash$i$dash$j.png"
				#desturl="$url$dash"
				desturl="piece_"$numblocks"_"$(printf '%02d_%02d.png' "$i" "$j")
				echo Downloading $sourceurl to $desturl
			    wget $sourceurl -O $workdir/$desturl
			done
			convert -append piece_$numblocks*_*.png img_$numblocks"_"$(printf '%02d' "$i").png
			rm piece_$numblocks*_*.png
		done
	convert +append img_$numblocks"_"*.png "out_"$numblocks".png"
	rm img_$numblocks"_"*.png

	# if it isn't working - write me on e-mail
	case $DESKTOP_SESSION in
		"xfce") 
			xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitorVGA-0/workspace0/last-image -s $workdir/out_$numblocks.png 
		;;
		"gnome")
			gconftool-2 -t str -s /desktop/gnome/background/picture_filename $workdir/out_$numblocks.png
		;;
		"i3")
			feh --bg-scale ~/Pictures/image.jpg # set
			echo "exec feh --bg-scale ~/Pictures/image.jpg" >> ~/.config/i3/config # set for autoload
		;;
		*)
			echo Unknown graphical system, can\'t set wallpaper. You can do it manually from $workdir
		;;
	esac

	echo Done, waiting $delay seconds
	sleep $delay
done


Похожее


С авторами не связывался, но, думаю, в открытый доступ они это не просто так грузили.

Комментарии (29)


  1. Self_Perfection
    09.02.2016 13:24
    +1

    Это что за позорище у вас в скрипте?

    nowtime=$(date +%H%M | sed -r 's/.$//')
    nowtime=$nowtime"000"
    nowyear=$(date +%Y)
    nowmonth=$(date +%m)
    nowday=$(date +%d -d -1day)
    ...
    url="$site/$level/$width/$nowyear/$nowmonth/$nowday/$nowtime"
    

    Что будет 1 марта? nowday будет вычислен в предыдущий день — 29 (февраля). А вот месяц и год будут браться без сдвига времени, получим в итоге timestamp для 29 марта, для которого фото ещё, вестимо, нет.

    И удручающе неффективно, куча лишних форков, когда можно сделать всё за раз:

    timestamp=$(date -d -1day +%Y/%m/%d/%H%M | sed -r 's/.$/000/')
    ...
    url="$site/$level/$width/$timestamp"
    


    Ваш скрипт уже достаточно велик, чтобы имело смысл создать под него репу, чтоб слать туда пулреквесты.


    1. marcor
      09.02.2016 16:44

      Ну, я решил, что бог с ним… Пофиксил кодом от SleepingLion


  1. shweew
    09.02.2016 13:28

    Как то странно, пишете

    Для xfce4

    xfconf-query -c xfce4-desktop....

    потом:
    Другие X-системы
    и опять в скрипте
    ...xfconf-query -c xfce4-desktop...

    Что значит «Другие X-системы»?


    1. shweew
      09.02.2016 13:33

      Вставьте уж тогда проверку, если хфце, то так, если гном, то такая команда, если кеды, то сякая…


      1. marcor
        09.02.2016 16:47

        Я ток «за», но мне не на чем проверить работоспособность команд.


        1. shweew
          09.02.2016 16:58

          Для гнома работает:

          gconftool-2 -t str -s /desktop/gnome/background/picture_filename $workdir/out_$numblocks.png
          

          KDE под рукой нет проверить.


          1. shweew
            09.02.2016 17:08

            Гномовские переменные на всякий случай:

            DESKTOP_SESSION=gnome
            GDMSESSION=gnome
            WINDOWMANAGER=/usr/bin/gnome
            


            1. shweew
              09.02.2016 17:18

              … Погуглив, не нашёл реализации под linux...

              В статье на которую Вы ссылаетесь есть ссылка на баш-скрипт.
              Не проверял на сколько он рабочий, но есть.


              1. marcor
                09.02.2016 17:56

                А, вчера не было. Эх, ладно, сообщество быстро)


  1. SleepingLion
    09.02.2016 13:35
    +1

    Pullrequest:
    Fixed: Корректная сборка больших разрешений (16d, 20d);
    Fixed: Поправлена работа по первым числам каждого месяца;
    Added: Возможность указания размера обоев из коммандной строки (например script.sh 8 — чб 4400x4400).

    Code
    #!/bin/bash
    
    delay=900 # seconds
    
    while true
    do
    	width=550
    	numblocks=${1:-4}
    	level=$numblocks'd' #Level can be 4d, 8d, 16d, 20d 
    	
    	nowtime=$(date +%H%M | sed -r 's/.$//')
    	nowtime=$nowtime"000"
    	nowyear=$(date +%Y -d -1day)
    	nowmonth=$(date +%m -d -1day)
    	nowday=$(date +%d -d -1day)
    	
    	workdir="/home/cutemaj/.earthwallpaper"
    
    	if [ ! -d $workdir ]; then
    		mkdir -p $workdir
    	fi
    
    	cd $workdir
    
    	site="http://himawari8-dl.nict.go.jp/himawari8/img/D531106"
    
    	url="$site/$level/$width/$nowyear/$nowmonth/$nowday/$nowtime"
    
    		for (( i=0; i<=$numblocks-1; ++i))
    		do
    		    for (( j=0; j<=$numblocks-1; ++j))
    			do
    				sourceurl="$url"$(printf '_%d_%d.png' "$i" "$j")
    				desturl="piece_"$numblocks"_"$(printf '%02d_%02d.png' "$i" "$j")
    				echo Downloading $sourceurl to $desturl
    			    wget $sourceurl -O $workdir/$desturl
    			done
    			convert -append piece_$numblocks*_*.png img_$numblocks"_"$(printf '%02d' "$i").png
    			rm piece_$numblocks*_*.png
    		done
    	convert +append img_$numblocks"_"*.png "out_"$numblocks".png"
    	rm img_*.png
    
    	xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitorVGA-0/workspace0/last-image -s $workdir/out_$numblocks.png 
    
    	sleep $delay
    done
    


    1. SleepingLion
      09.02.2016 13:47
      +1

      Ещё пара фиксов + правка предложенная Self_Perfection:

      Заголовок спойлера
      #!/bin/bash
      
      delay=900 # seconds
      
      while true
      do
      	width=550
      	numblocks=${1:-4}
      	level=$numblocks'd' #Level can be 4d, 8d, 16d, 20d
      	
      	timestamp=$(date -d -1day +%Y/%m/%d/%H%M | sed -r 's/.$/000/')
      	
      	workdir="/home/cutemaj/.earthwallpaper"
      
      	if [ ! -d $workdir ]; then
      		mkdir -p $workdir
      	fi
      
      	cd $workdir
      
      	site="http://himawari8-dl.nict.go.jp/himawari8/img/D531106"
      
      	url="$site/$level/$width/$timestamp"
      
      		for (( i=0; i<=$numblocks-1; ++i))
      		do
      		    for (( j=0; j<=$numblocks-1; ++j))
      			do
      				sourceurl="$url"$(printf '_%d_%d.png' "$i" "$j")
      				#sourceurl="$url$dash$i$dash$j.png"
      				#desturl="$url$dash"
      				desturl="piece_"$numblocks"_"$(printf '%02d_%02d.png' "$i" "$j")
      				echo Downloading $sourceurl to $desturl
      			    wget $sourceurl -O $workdir/$desturl
      			done
      			convert -append piece_$numblocks*_*.png img_$numblocks"_"$(printf '%02d' "$i").png
      			rm piece_$numblocks*_*.png
      		done
      	convert +append img_$numblocks"_"*.png "out_"$numblocks".png"
      	rm img_$numblocks"_"*.png
      
      	xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitorVGA-0/workspace0/last-image -s $workdir/out_$numblocks.png 
      
      	sleep $delay
      done
      


      1. marcor
        09.02.2016 16:49

        Код заменил, благодарю за фиксы)


  1. shweew
    09.02.2016 17:31

    По мелочи: сервер не всегда загружает изображения прямо совсем новые, так что есть шанс наткнуться на пустоту. Поэтому в скрипте я получаю фотки прошлого дня

    Может дело в тайм-зоне? ;-)


    1. marcor
      09.02.2016 17:33

      Кажись, неподалёку от Токио. Точно узнать не получится, думаю.


  1. shweew
    09.02.2016 17:43

    Наверное сохраняется по GTM
    Вот так работает и с виду более похоже на правду:

    timestamp=$(date -d -4hours +%Y/%m/%d/%H%M | sed -r 's/.$/000/') 
    


    1. marcor
      09.02.2016 17:47

      Кстати, да: автор недавно добавил в PowerShell-скрипт строку

      $ts = New-TimeSpan -Hours -2 -Minutes -30 #Number of hours and minutes to add/subtract to the date. Adjust this to offset your system date to around about GMT (I think?)
      $now = ((Get-Date -Second 00) + $ts)
      


      1. shweew
        09.02.2016 17:50

        Ну так и я про то же…


  1. shweew
    09.02.2016 17:50

    Ещё с долготой разобраться бы.


    1. marcor
      09.02.2016 17:56

      Ну, в Арче (хз, как в других linux) есть куча файлов /usr/share/zoneinfo/%Zone%/%SubZone%, которые используются для определения временных настроек. SubZone — это крупный город, по его имени теоретически можно определить примерные координаты юзера.


      1. shweew
        09.02.2016 19:14

        Я не про таймзону, я про ракурс съёмки, днём не видел ещё что там получается.


        1. SleepingLion
          09.02.2016 19:30

          Сделал минутное видео последних десяти дней — могу выложить.


        1. marcor
          09.02.2016 19:54

          Спутник геостационарный, если менять ракурс — надо искать другой. Я поспрашиваю знакомых астрономов, но ничо не обещаю)


  1. Sild
    09.02.2016 18:04

    Установка поверх i3wm:

    ```
    sudo apt-get install -y feh
    feh --bg-scale ~/Pictures/image.jpg #для установки
    echo «exec feh --bg-scale ~/Pictures/image.jpg» >> ~/.config/i3/config #для автоустановки при загрузке
    ```


    1. marcor
      09.02.2016 18:20

      Кинул коммит, проверь, работает ли.