Csandriel

wallshow (atd based wallpapers scheduled rotating script)

Dec 30th, 2018 (edited)
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.62 KB | None | 0 0
  1. #!/bin/bash
  2. #Csandriel
  3. #08.03.2018
  4.  
  5. #wallshow
  6.  
  7.  
  8. #Скрипт предназначен для автоматической смены обоев. Использует пакеты feh и демон atd
  9. #Требует наличия файла ~/.Xresources (если отсутствует, создать пустой)
  10.  
  11.      #There will be a temporary copy of wallpaper for immediate using
  12.      #Здесь должно быть задано имя временного фала, в который будет копироваться обоина,
  13.      #для промежуточного храненения:
  14.            
  15.             #----Must-be-set-----
  16. TEMP_WF=/home/user/wallpaper.img
  17.      #Это рудимент
  18.  
  19.  
  20.      #the directory where wallpapers are stored:
  21.      #директорий где хранятся подлежащие ротации обои. Обрабатывается рекурсивно, тоесть с подпапками
  22.            
  23.             #----Must-be-set-----
  24. WS_DIR=/data0/graph/wallpaper
  25.  
  26.      #list of graphic files found in WS_DIR:
  27.      #в этом файле будет храниться список файлов, найденных в WS_DIR, поименно, с путями,
  28.  
  29.             #----Must-be-set-----
  30. WS_FILE=/home/bin/.wallshow.lst
  31.      #Generating/Updating of the list
  32.      #may be done with '-u' key
  33.      #Генерация данного списка выполняется с ключем -u
  34.  
  35.             #НЕ ЗАБЫВАЕМ wallshow -u когда запускаем впервые, иначе получим cp cannot stat ''
  36.             #don't forget to execute -u (update .wallshow.lst) key at the first invocation.
  37.  
  38. #Примеры использования:
  39. #use examples:
  40. #wallshow -p 5min
  41. #wallshow -p 2hours
  42. #wallshow -p 5days
  43. #задает интервал, в расписании смены обоев
  44. #sets the interval of wallpaper changing
  45.  
  46.  
  47. #Called without  any key, the script just does randomly wallpaper change,
  48. #Вызванный без каких либо ключей скрипт просто случайно выбирает новую обою
  49. #not affecting chedule if it is set.
  50. #при чем не меняя расписания, если таковое уже задано.
  51. #Every new invocation of -p key erases the chedule previosly set
  52. #Каждый вызов с ключем -p очищает ранее заданное расписание
  53.  
  54. #Key -s stops wallshow, leaving current wallpaper remained, and removing chedule.
  55. # -s останавливает слайдшоу, оставляя текущую обоину и удаляя расписание дальнейших смен
  56. #Key -d deletes the source file of current wallpaper
  57. # -d удаляет текущий файл, заданный в качестве обоины (полезно для очистки от мусора оптовых партий обоев)
  58. #Key -u refreshes the images-list of script
  59. # -u обновляет список файлов, подлежащих ротации, вновь перечитывая директорий обоев.
  60.  
  61. #Remember QUOTES here:
  62. #Еще один рудимент
  63. PERFORM="setwallpaper "
  64.  
  65. setwallpaper(){
  66. cp -f "$1"  "$TEMP_WF"
  67. feh --bg-fill "$TEMP_WF"
  68.  
  69. }
  70.  
  71.  
  72. #logged in username here:
  73.            
  74.             #----Must-be-set-----
  75.             #if launched as root then drop root and restart script as $USER
  76. USER=user
  77.  
  78. if [ $UID -eq 0 ] ; then echo "DROP ROOT & recurse"; STRING="$@"; su $USER -c "$0 $STRING"; exit; fi
  79.  
  80. #count of lines in wallpapers-list:
  81. WS_FILE_LINES=$(echo $(wc -l $WS_FILE)|sed 's_\([^ ]*\).*_\1_')
  82.  
  83. #id of the display wich wallshow must be performed for:
  84. DISPLAY_NUM=:0
  85.  
  86. #gets a random number from  a given range
  87. gfromrange(){
  88.     Max_RAND=32762
  89.             MIN=$1
  90.             MAX=$2
  91.             RANGE=$(($MAX-$MIN))
  92.             r=$(bc -l <<<"($RANGE/$Max_RAND)*$RANDOM+$MIN")
  93.             x=$(echo $r|sed 's_^.*[\.]\(.\).*_\1_')
  94.             r=$(echo $r|sed -e 's/[\.].*//')      
  95.             if  [ $x -gt 4 ] ; then  ((r++)) ; fi  
  96.                                                    
  97.             echo $r        
  98.     }
  99.     #enumerates graphical files in $WS_DIR, stores the list in $WS_FILE
  100. getlist(){
  101. echo "image list have been updating..........."
  102.     find "$WS_DIR" \
  103.     -iname "*png" -o \
  104.     -iname "*jpg" -o \
  105.     -iname "*gif" -o \
  106.     -iname "*bmp" -o \
  107.     -iname "*jpeg" -o \
  108.     -iname "*tiff" -o \
  109.     -iname "*tif"  \
  110.     >"$WS_FILE"
  111.     echo "done."
  112.     echo "$(wc -l $WS_FILE|sed 's_\([0-9]*\).*_\1_')" files was added
  113. }
  114.  
  115. selectfile(){
  116.     num=`gfromrange 1 $WS_FILE_LINES`
  117.     echo $(sed -n "$num"p $WS_FILE)
  118. }
  119.  
  120.  
  121. settime(){
  122.     #a tricky passage: list at-jobs related to the script
  123.     #and removing it in the same time by pricessing 'at -l' report
  124.     #directly to removing command
  125.     at -qw -l|sed 's_\([0-9]*\).*_atrm \1_'|sh
  126.     #set new shedule
  127.     at <<EOF -qw now+ "$PAUSE"
  128. DISPLAY="$DISPLAY_NUM" "$0" -p "$PAUSE"
  129. EOF
  130. }
  131.  
  132. usage(){
  133. echo "RTFM in the script itself"
  134. }
  135.  
  136. #main()
  137.  
  138. while getopts usdp: OPTION
  139.     do  case "$OPTION" in
  140.         u) getlist; exit 0;;
  141.         p) PAUSE="$OPTARG"
  142.             settime
  143.             echo "the interval has been set to $PAUSE";;
  144.         s)  at -qw -l|sed 's_\([0-9]*\).*_atrm \1_'|sh; exit 0;;
  145.         d)#now we have became severe enough  
  146.         #to store our variables in system files:
  147.         WSW=$(sed -n 's/WS_WALLPAPER:\(.*\)/\1/p' ~/.Xresources)
  148.             rm "$WSW"
  149.             echo -e " $WSW\n was deleted";
  150.             exit 0;;
  151.  
  152.         ?) usage; exit 1;;
  153.     esac
  154.     done
  155.  
  156. WS_WALLPAPER=$(selectfile)
  157.  
  158. sed -i '/WS_WALLPAPER/d' ~/.Xresources
  159. echo "WS_WALLPAPER:$WS_WALLPAPER" >> ~/.Xresources
  160.  
  161. DISPLAY=$DISPLAY_NUM $($PERFORM "$WS_WALLPAPER")
  162. echo -e " WS_WALLPAPER="$WS_WALLPAPER"\n was set"
Advertisement
Add Comment
Please, Sign In to add comment