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

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

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

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

Kaener 23.05.2010 20:15

СкриптыСоздание превью (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_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><img />$T_LINK</url>" # вывести получившийся bb-code в консоль

if < -n "`command -v xsel`" >
then
printf "<url><img />$T_LINK</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</t_width_symb>


Пример получившейся превью-картинки:
Пример 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 за подсказку.


Тэги: bash bash-скрипт Dropbox
+ 5 -
Похожие Поделиться

antigluk 23.05.2010 20:23 #
+ 1 -
А я как-раз сегодня под влиянием статьи "Получение dropbox-ссылок без Nautilus'а" написал маленький скриптик scrot+dropbox :)
#!/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.2010 21:58 #
+ 1 -
Да, я под влиянием той статьи даже зарегистрироваться решил. =)
И за наводку на scrot спасибо, попробую.
philosoft 23.05.2010 22:40 #
+ 0 -
Неожиданный эффект статьи. ?
antigluk 23.05.2010 20:25 #
+ 1 -
Спасибо, заюзал :)
antigluk 23.05.2010 20:39 #
+ 2 -
Немного модифицировал его: если кому надо - для вывода html-кода вместо bb поменял формат:

####################
# Вывод результата #
####################
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.2010 22:23 #
+ 2 -
Проблема в том, что как-нить вы эту превьюху то со своего дропбокса уберете и все. Останется кака-нибудь статья или что-то в этом роде без скриншотов.
Kaener 23.05.2010 22:42 #
+ 0 -
Да, такая проблема может возникнуть. Чтобы от неё как-то «уйти», сделал отдельную папку для изображений в Public и создание отдельной папки с текущей датой в имени — если где-то что-то перестанет отображаться, я буду знать из какой папки пропало изображение и смогу попытаться восстановить его силами самого dropbox’а.

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

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

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

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

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


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

Online video HD

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

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

Full HD video online

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

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

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