Видео ролики бесплатно онлайн

Смотреть русский видео

Официальный сайт mkad14 24/7/365

Смотреть видео бесплатно

23.05.10 20:15 Kaener

СкриптыСоздание превью (thumbnail) и автопубликация его в dropbox

В общем, из-за одного моего хобби, часто приходится выкладывать скриншоты. Но, к сожалению, бесплатные хостинги изображений имеют свойство тормозить (часто слышу такое в сторону радикала), а иногда даже умирать (тот же sendpic.ru, частично ipicture.ru).

Решением этой проблемы, как мне кажется, является сервис dropbox’а — быстрый, бесплатный (до 2 GB) и вроде популярный (а значит надёжный). Да только превьюшки автоматом он делать не умеет. Вот и пришлось написать скрипт, который, используя imagemagick, создаёт thumbnail после чего публикует оригинал и превью, а потом возвращает сформированный bb-код уже готовый для вставки на форум phpBB-типа.



Собственно сам скрипт (комментарии местами могут быть лишние, сразу прошу прощения за избыточность; «линия» — это то что поверх изображения рисуется, не знал как назвать корректнее):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#!/bin/bash

#######################################################
#                     Конфигурация                    #
#######################################################
####################
# Общие параметры  #
####################
F_DPDIR="/home/kaener/Dropbox/Public/img" # папка дропбокса, в которую мы будем кидать оригинал картинки (без слэша вконце)
T_DPDIR="/home/kaener/Dropbox/Public/img/thumb" # папка дропбокса в которую мы будем кидать превьюшку (без слэша вконце)

ID=3297058 # id вашего аккаунта у дропбокса

T_HEIGHT=100 # желаемая высота превьюшки
T_WIDTH=180 # желаемая ширина превьюшки

IF_SIZE=1 # вставлять ли размер картинки, в текст на превьюшке. (1 — true. 0 — false)
IF_DATE=1 # создавать ли папку для картинки с текущей датой (позволяет хоть как-то их сортировать). (1 — true. 0 — false)

###############################
# Параметры линии под текстом #
###############################
IF_LINE=1 # делать ли вообще эту линию. (1 — true. 0 — false)

T_LINE_HEIGHT=16 # высота линии, в px
T_LINE_COL="#00234aa6" # цвет линии внизу превьюшки вместе с альфа каналом (последние два знаки задают прозрачность)

##############################
# Параметры текста на превью #
##############################
T_STP=4 # величина отступа от нижнего края картинки до текста, в px

T_WIDTH_SYMB=6 # ширина одного символа в выбраном шрифте
T_TEXT_FONT="DejaVu-Sans-Mono-Bold" # шрифт надписи (если изменяете этот параметр, измените ещё и ширину символа [T_WIDTH_SYMB] т.к. может пропасть центровка надписи)
T_TEXT_SIZE=11 # кегль шрифта (если изменяете этот параметр, измените ещё и ширину символа [T_WIDTH_SYMB] т.к. может пропасть центровка надписи)

T_TEXT_COL="white" # цвет текста

#######################################################
#                 Собственно тело скрипта             #
#######################################################
#############################
# Проверка указанного файла #
#############################
F_NAME="$1"
F_OK=1

while [ $F_OK -le 6 ]
do
        if [ ! -e "$F_NAME" ] || [ ! -f "$F_NAME" ] || [ ! -r "$F_NAME" ] # если есть проблемы (не сущствует, было указано на каталог, не доступен для чтения)
        then
                echo "Error! Some problem with file $F_NAME. Try chose another."
                if [ -n "`command -v zenity`" ]
                then
                        F_NAME=`zenity --file-selection` # просим выбрать нужный
                else
                        exit 1
                fi
                F_OK=$((F_OK+1))
                if [ "$F_OK" -ge 3 ] # три ошибки и на выход
                then
                        exit 1
                fi
        else
                F_OK=10
        fi
done

echo "Converting and thumbnailing $F_NAME"

######################
# Готовим переменные #
######################
if [ -z "`command -v convert`" ]
then
        echo "Imagemagick doesn't seem to install properly. Install it and try again."
        exit 1
fi
F_S_NAME=`basename "$F_NAME"` # только имя файла (без пути)
T_NAME=${F_S_NAME%%.png}_thumb.png # имя превью (к оригинальному имени добавляеться суффикс "_thumb")
T_S_NAME=`basename "$T_NAME"` # только имя превью (без пути)
F_WIDTH=`identify $F_NAME | awk '{print $3}' | sed 's/[^0-9]/ /g' | awk '{print $1}'` # узнаём ширину изображения
F_HEIGHT=`identify $F_NAME | awk '{print $3}' | sed 's/[^0-9]/ /g' | awk '{print $2}'` # узнаём высоту изображения
F_SIZE=`identify $F_NAME | awk '{print $7}'` # узнаём размер изображения

F_RATIO=`echo "scale=0; ($F_HEIGHT / $F_WIDTH) * 10000 " | bc` # узнаём соотношение сторон изображения

#####################
# Создаём превьюшку #
#####################
if [ $F_RATIO -lt 4000 ] # если соотношение высоты к ширине изображения, меньше 0.4 (значение получено эмпирически) т.е. картинка широкая, но не высокая (пример: ширина=480, высота=180, RATIO=0.35)
then
        `convert "$F_NAME" -quality 0 -resize "$T_WIDTH" "$T_NAME" # создаём thumbnail по максимальной ширине, без указания граничной высоты`
elif [ $F_RATIO -ge 4000 ] # если соотношение высоты к ширине изображения, больше или равно 0.4 (значение получено эмпирически) т.е. картинка высокая, или средняя, но не широкая (пример: ширина 480, высота 216, RATIO=0.45)
then
        `convert "$F_NAME" -quality 0 -resize "x$T_HEIGHT" "$T_NAME"  # создаём thumbnail по максимальной высоте, без указания граничной ширины`
fi
 
#########################
# Узнаём что получилось #
#########################
T_WIDTH=`identify $T_NAME | awk '{print $3}' | sed 's/[^0-9]/ /g' | awk '{print $1}'`
T_HEIGHT=`identify $T_NAME | awk '{print $3}' | sed 's/[^0-9]/ /g' | awk '{print $2}'`

################################
# Готовим переменные для линии #
################################
if [ "$IF_LINE" -eq 1 ] # при условии, что вообще что-то надо будет делать
then
        if [ "$T_HEIGHT" -gt "$T_LINE_HEIGHT" ] # если высота превьюшки больше желаемой высоты линии, то
        then
                T_LINE_POS=`echo "scale=0; $T_HEIGHT - $T_LINE_HEIGHT" | bc` # узнаём позицию верхней границы линии на превьюшке
        else
                IF_LINE=0 # иначе рисовать её не будем
        fi
       
        if [ "$IF_SIZE" -eq 1 ] # если прибавлять к надписи размер, то
        then
                T_TEXT=`printf $F_WIDTH'x'$F_HEIGHT' ('$F_SIZE')'` # формируем текст
                T_PIX=`printf $F_WIDTH'x'$F_HEIGHT' ('$F_SIZE')' | wc -m` # узнаём количество символов
                T_PIX=`echo "scale=0; $T_PIX * ($T_WIDTH_SYMB + 1)" | bc` # узнаём размер надписи в px
        else
                T_TEXT=`printf $F_WIDTH'x'$F_HEIGHT` # формируем текст
                T_PIX=`printf $F_WIDTH'x'$F_HEIGHT | wc -m` # узнаём количество символов
                T_PIX=`echo "scale=0; $T_PIX * ($T_WIDTH_SYMB + 1)" | bc` # узнаём размер надписи в px
        fi
        if [ $T_WIDTH -lt $T_PIX ] # если ширина thumbnail'а меньше ширины текста, то
        then
                IF_LINE=0 # рисовать линию не будем
        fi
        T_WIDTH_TEXT=`echo "scale=0; ($T_WIDTH - $T_PIX) / 2" | bc` # узнаём положение первого пикселя надписи
        T_HEIGHT_TEXT=`echo "scale=0; $T_HEIGHT - $T_STP" | bc` # узнаём положение нижнего пикселя надписи
fi

###############################################
# Выполняем добавление этой линии на thumnail #
###############################################
if [ $IF_LINE -eq 1 ]
then
        `convert "$T_NAME" -fill $T_LINE_COL -draw "rectangle 0,$T_HEIGHT,$T_WIDTH,$T_LINE_POS" -font $T_TEXT_FONT -pointsize $T_TEXT_SIZE -fill $T_TEXT_COL -draw "text $T_WIDTH_TEXT,$T_HEIGHT_TEXT '$T_TEXT'" -append "$T_NAME"`
fi

#####################
# Файловые операции #
#####################
if [ "$IF_DATE" -eq 1 ]
then
        DIR_DATE=`date +%d%m%Y`
        if [ ! -e "$F_DPDIR/$DIR_DATE" ]
        then
                `mkdir "$F_DPDIR/$DIR_DATE"`
        fi
        if [ ! -e "$T_DPDIR/$DIR_DATE" ]
        then
                `mkdir "$T_DPDIR/$DIR_DATE"`
        fi
        F_DPDIR=`printf $F_DPDIR'/'$DIR_DATE`
        T_DPDIR=`printf $T_DPDIR'/'$DIR_DATE`
        DIR_DATE=`echo $DIR_DATE'/'`
fi

`cp -f "$F_NAME" "$F_DPDIR"` # копируем исходное изображение
`mv -f "$T_NAME" "$T_DPDIR"` # переносим thumbnail

########################
# Получение результата #
########################
if [ -n "`ls -l "$F_DPDIR" | grep "$F_S_NAME"`" ] && [ -n "`ls -l "$T_DPDIR" | grep "$T_S_NAME"`" ]
then
        T_LINK=`dropbox puburl "$T_DPDIR/$T_S_NAME"`
        F_LINK=`dropbox puburl "$F_DPDIR/$F_S_NAME"`
        if  [ "`dropbox status | grep "isn't running"`" ]
        then
                T_LINK="http://dl.getdropbox.com/u/$ID/img/thumb/$DIR_DATE/$T_S_NAME"
                F_LINK="http://dl.getdropbox.com/u/$ID/img/$DIR_DATE/$F_S_NAME"
        elif [ -z "`echo $T_LINK | grep http`" ] || [ -z "`echo $F_LINK | grep http`" ]
        then
                echo "Error! Folders $F_DPDIR or/and $T_DPDIR aren't public."
        exit 1
        fi
else
        if [ -n "`ls -l "$F_DPDIR" | grep "$F_S_NAME"`" ]
        then
                echo "Error! Copy file failed."
        fi
        if [ ! "`ls -l "$T_DPDIR" | grep "$T_S_NAME"`" ]
        then
                echo "Error! Move thumbnail failed."   
        fi
        exit 1
fi

####################
# Вывод результата #
####################
echo "[url=$F_LINK][img]$T_LINK[/img][/url]" # вывести получившийся bb-code в консоль

if [ -n "`command -v xsel`" ]
then
        printf "[url=$F_LINK][img]$T_LINK[/img][/url]" | xsel -ibp #скопировать получившийся bb-code в буфер обмена
fi

######
# PS #
######
if [ -n "`dropbox status | grep "isn't running"`" ]
then
        echo "P.S. Dropbox isn't running. Start it to begin sync."
fi

Пример получившейся превью-картинки:
Пример thumbnail

Учился на примерах из многих источников, в том числе и здешних. Всем авторам огромное спасибо за такую «заочную» помощь.
Также есть желание учиться дальше, потому жду здоровой критики и разумных предложений. =)


ADD:
Для вывода html-кода, вместо bb, надо заменить секцию «Вывод результата» на вот это:

1
2
3
4
5
6
7
8
9
####################
# Вывод результата #
####################
echo "<a href=\"$F_LINK\"><img src=\"$T_LINK\" /></a>" # вывести получившийся html-code в консоль

if [ -n "`command -v xsel`" ]
then
        printf "<a href=\"$F_LINK\"><img src=\"$T_LINK\" /></a>" | xsel -ibp #скопировать получившийся html-code в буфер обмена
fi

Спасибо antigluk за подсказку.



antigluk 23.05.10 20:23 # +1
А я как-раз сегодня под влиянием статьи "Получение dropbox-ссылок без Nautilus'а" написал маленький скриптик scrot+dropbox :)
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

fn=`scrot '/home/roma/Dropbox/Public/screen/%Y-%m-%d_%H-%M_$wx$h.png' -e 'echo $f'`
while [ -z "`dropbox filestatus $fn | grep "up to date"`" ]; do
  sleep 1;
done
url="`dropbox puburl $fn`"
echo $url
echo $url | xsel -ib
zenity --info --title=webprintscreen.sh --text "Ссылка\n$url\nскопирована в буфер обмена"
Kaener 23.05.10 21:58 # +1
Да, я под влиянием той статьи даже зарегистрироваться решил. =)
И за наводку на scrot спасибо, попробую.
philosoft 23.05.10 22:40 # +0
Неожиданный эффект статьи. ☺
antigluk 23.05.10 20:25 # +1
Спасибо, заюзал :)
antigluk 23.05.10 20:39 # +2
Немного модифицировал его: если кому надо - для вывода html-кода вместо bb поменял формат:

1
2
3
4
5
6
7
8
9
####################
# Вывод результата #
####################
echo "<a href=\"$F_LINK\"><img src=\"$T_LINK\"></a>" # вывести получившийся html-code в консоль

if [ -n "`command -v xsel`" ]
then
        printf "<a href=\"$F_LINK\"><img src=\"$T_LINK\"></a>" | xsel -bi #скопировать получившийся html-code в буфер обмена
fi
digiwhite 23.05.10 22:23 # +2
Проблема в том, что как-нить вы эту превьюху то со своего дропбокса уберете и все. Останется кака-нибудь статья или что-то в этом роде без скриншотов.
Kaener 23.05.10 22:42 # +0
Да, такая проблема может возникнуть. Чтобы от неё как-то «уйти», сделал отдельную папку для изображений в Public и создание отдельной папки с текущей датой в имени — если где-то что-то перестанет отображаться, я буду знать из какой папки пропало изображение и смогу попытаться восстановить его силами самого dropbox’а.

С другой стороны, могу возразить, что, например, когда упал ipucture.ru, это во-первых, тоже было без предупреждения, а во-вторых, восстановить было труднее чем просто запустить скрипт рекурсивно для папки — ссылки ведь изменяются каждый раз как загружаешь. В то время как при использовании dropbox'а очень легко заменять изображения даже без редактирования статьи.

digiwhite 24.05.10 00:21 # +0
Согласен :). Ничто не вечно под луной. Лучше бы конечно было бы хранить изображение в базе движка ну или "около нее". Но это уже совсем другая история. :)
goblinyara 23.05.10 23:31 # +1
прикольное у вас разрешение....
Kaener 23.05.10 23:40 # +1
Это скриншот только одного экрана в iceweasel/firefox, а реальное на мониторе 1600х900. =)
urandom 24.05.10 00:36 # +0
Все это бесполезно. Стоит разместить ссылку на файл в дропбокс на популярный сайт и она в мгновение ока окажется "забаненой" из-за высокой нагрузки. Проверено хабром.
Kaener 24.05.10 01:19 # +0
Странно. Я основывался на «Using Dropbox as a free and automatic web publishing solution», «Use Dropbox to host a website» в TipsAndTricks и ещё тут видел использование такого решения. Вроде никто не жаловался. Хотя вполне возможно, что блокируют.
В принципе, на особо популярных сайтах я пока скриншоты выкладывать не собираюсь, так что мне не страшно. Но всё равно, спасибо за предупреждение.
inst 24.05.10 00:59 # +0
Вот для этих целей и можно было бы использовать SkyDrive! Его, если что и потерять не страшно =))

PS. Сарказм, не принимайте всерьёз.

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 156)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 3150 из 232 городов)
            Топ пользователей Топ блогов

            Новенькие: xlin, pulo, AlBay, thordendal, zoobok
            welinux.ru

            Смотреть онлайн бесплатно

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн