Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет piyavking ([info]piyavking)
@ 2014-02-08 17:20:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Бaш ответ wally
#!/bin/bash

# Парсер обоев с девиантарта, bingimages, goodfons, фликра, и обойного ВКонтактного паблика Paperchan. При запуске выбирает случайные обои из последних опубликованных на источниках. Есть возможность использования своего списка ссылок на обои.
# Предназначен для запуска по cron, в связи с чем имя пользователя прописывал "в лоб", поэтому для использования "piyavking" следует заменить на своё имя юзера. Различные ключи запуска позволяют формировать "чёрный список", "избранное", и включать-выключать источники обоев. Есть достаточно подробные, как я считаю, комментарии.
# Писался для использования на двух мониторах, лёгким движением приспосабливается под любое их количество. Используется curl и xmlstarlet. Для отрисовки обоев используется feh (при наличии другого менеджера обоев достаточно заменить соответствующую строку на свою обойную команду).

# если пользователь в иксах
if [ "$(who | grep 'piyavking pts')" != '' ];then
    # задаём директории для локальных обоев и конфигурационных файлов (в конфигурационной директории создаём список по умолчанию wallurl.default), количество обоев из каждого источника
    # конфиг walllist.conf имеет вид:
    ###############
    # bindimage 1
    # deviantart 1
    # favorities 1
    # flickr 1
    # goodfon 1
    # local 0
    # paperchan 1
    ###############
    local_dir='/home/piyavking/Pictures/wallpapers/'
    conf_dir='/home/piyavking/Pictures/wallpapers/'
    vol=5
    # функции отсеивания забаненных изображений и и записи 5 случайных адресов из локального списка в глобальный
    function check1 {
        banned="n"
        while read lineban;do
            if [ "$1" == "$lineban" ];then
                banned="y"
            fi
        done < $3
        if [ "$banned" != "y" ];then
            echo $1 >> $2
        fi
    }
    function check2 {
        checked=$1
        while read linecheck;do
            checked=$(grep -v $linecheck <<< "$checked")
        done < $conf_dir'banned.txt'
        wallurl="$wallurl"$'\n'"$(echo "$checked" | shuf | head -n $vol)"
    }
    # если скрипт запущен с аргументом
    if [ "$1" != "" ];then
        # определяем монитор, на котором находится мышь, оперируем с обоиной на этом мониторе
        if [ $((`xdotool getmouselocation | awk -F' ' '{print $1}' |  awk -F':' '{print $2}'`)) -lt 1280 ]; then
            wname=`cat $conf_dir'wallname' | head -n 1 | awk -F' ' '{print $1}'`
        else
            wname=`cat $conf_dir'wallname' | head -n 1 | awk -F' ' '{print $2}'`
        fi
        # разбор по случаям аргументов
        case "$1" in
            "-f"   )
            # отправить в избранное
                check1 $wname $conf_dir'favorities.txt' $conf_dir'favorities.txt'
            ;;
            "-b"   )
            # не загружать больше
                check1 $wname $conf_dir'banned.txt' $conf_dir'banned.txt'
            ;;
            "-e"   )
            # показать в браузере
                x-www-browser $wname
            ;;
        esac
        # если запустить скрипт с тегом в качестве аргумента, то он поменяет соответствующее тегу число в walllist.conf с 0 на 1, и наоборот
        if [ "$(cat $conf_dir'walllist.conf' | grep $1)" != "" ];then
            conftemp=$(cat $conf_dir'walllist.conf')
            case $(echo "$conftemp" | grep $1" " | awk -F' ' '{print $2}') in
                "1"   )
                    echo "$conftemp" | sed "s/${1}\ 1/${1} 0/g" > $conf_dir'walllist.conf'
                ;;
                "0"   )
                    echo "$conftemp" | sed "s/${1}\ 0/${1} 1/g" > $conf_dir'walllist.conf'
                ;;
            esac
        fi
    # без аргумента
    else
        # загружаем список, из которого будет выбираться обоина, и начинаем его формировать, в файле walllist.conf содержатся ключи использования источников, если напротив источника стоит 0, то он не используется
        wallurl=''
        # проверяем сеть
        if ( ping -c 1 "ya.ru" > /dev/null 2>&1 );then
            # парсим deviantart rss
            if [ "$(cat $conf_dir'walllist.conf' | grep deviantart | awk -F' ' '{print $2}')" != "0" ]; then
                deviantart=$(curl 'http://backend.deviantart.com/rss.xml?q=in%3Acustomization%2Fwallpaper+sort%3Atime' | xmlstarlet sel -t -v '//media:content/@url')
                check2 "$deviantart"
            fi
            # парсим bindimage rss
            if [ "$(cat $conf_dir'walllist.conf' | grep bindimage | awk -F' ' '{print $2}')" != "0" ]; then
                bindimage=$(curl 'http://feeds.feedburner.com/bingimages' | xmlstarlet sel -t -v '//enclosure/@url')
                check2 "$bindimage"
            fi
            # парсим flickr rss
            if [ "$(cat $conf_dir'walllist.conf' | grep flickr | awk -F' ' '{print $2}')" != "0" ]; then
                flickr=$(curl 'http://api.flickr.com/services/feeds/photos_public.gne?tags=wallpaper,wallpapers&tagmode=any' | grep 'link rel="enclosure" type="image/jpeg" href=' | awk -F'"'  '{print $6}')
                check2 "$flickr"
            fi
            # парсим goodfon rss
            goodfon=''
            if [ "$(cat $conf_dir'walllist.conf' | grep goodfon | awk -F' ' '{print $2}')" != "0" ]; then
                while read GF_item;do
                    goodfon="$goodfon"$'\n'$(curl $(curl $GF_item | grep 'Скачать оригинал:' | sed -e "s/<\|>/\n/g" | grep 'a href'  | awk -F'"' '{print $2}' | sed 's/^/http:\/\/www.goodfon.ru/') | grep 'top.location.href' | awk -F"\x27" '{print $2}' | awk -F"?" '{print $1}')
                done <<< "$(curl 'http://www.goodfon.ru/goodfon.rss' | xmlstarlet sel -t -v '//link' | sed '1,1d')"
                check2 "$(sed '/./,$!d' <<< "$goodfon")"
            fi
            # парсим стенку Paperchan'а (подобным образом можно парсить любой паблик)
            paperchan=''
            if [ "$(cat $conf_dir'walllist.conf' | grep paperchan | awk -F' ' '{print $2}')" != "0" ]; then
                while read SD_item;do
                    while read SD_photo;do
                        src=$(curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" $SD_photo | sed -e 's/\"id\"/\n/g' | grep $(echo $SD_photo | awk -F'_' '{print $2}') | grep 'w_src' | awk -F'"w_src"' '{print $2}' | awk -F'"' '{print $2}' | sed -e 's/\\//g')
                        if [ "$src" == '' ];then
                            src=$(curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" $SD_photo | sed -e 's/\"id\"/\n/g' | grep $(echo $SD_photo | awk -F'_' '{print $2}') | grep 'z_src' | awk -F'"z_src"' '{print $2}' | awk -F'"' '{print $2}' | sed -e 's/\\//g')
                        fi
                        paperchan="$paperchan"$'\n'$src
                        sleep 1
                    done <<< "$(curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" $SD_item | sed -e "s/<\|>/\n/g" | grep 'return showPhoto' | awk -F"\x27" '{print $2}'  | sed 's/^/http:\/\/vk.com\/photo/')"
                done <<< "$(curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" 'http://vk.com/wall-55438333?own=1' | sed -e "s/<\|>/\n/g" | grep 'href="/wall-55438333_' | awk -F'"' '{print $2}' | awk -F'?' '{print $1}' | sed 's/^/http:\/\/vk.com/' | sort | uniq)"
                check2 "$(sed '/./,$!d' <<< "$paperchan")"
            fi
            # добавляем случайных обоин из избранного (в файле 'favorities' допускаются комментарии с '#')
            if [ "$(cat $conf_dir'walllist.conf' | grep favorities | awk -F' ' '{print $2}')" != "0" ]; then
                wallurl="$wallurl"$'\n'"$(cat $conf_dir'favorities.txt' | grep -v '#' | shuf | head -n $vol)"
            fi
        fi
        # добавляем локальных обоин
        if [ "$(cat $conf_dir'walllist.conf' | grep local | awk -F' ' '{print $2}')" != "0" ]; then
            wallurl="$wallurl"$'\n'"$(find $local_dir -type f -name '*.jpg' -o -name '*.png' | shuf | head -n $vol)"
        fi
        # если список не сформирован, используем дефолтный
        if [ "$wallurl" == '' ]; then
            wallurl=$(cat $conf_dir'wallurl.default')
        fi
        # убираем в списке верхнюю пустую строку, вешаем на столы случайные обоины из списка, записываем их адреса в wallname
        wallurl=$(sed '/./,$!d' <<< "$wallurl")
        wallname=$(shuf <<< "$wallurl" | head -n 2 | sed "{:q;N;s/\n/ /g;t q}")
        feh --bg-fill $wallname
        echo $wallname > $conf_dir'wallname'
    fi
fi