ImageDrop - утилита для удобного размещения изображений через Dropbox

Как-то на форуме я заикнулся о том, что хочу написать программу, упрощающую размещение в форумах и блогах фоток схем, и прочих рисунков через DropBox. И вот сейчас она готова чуть более, чем на половину (ver 0.5), в связи с чем представляю свое тварение сообществу.
Что есть DropBox?
Если ты, вдруг, первый раз слышишь об этом сервисе, то расскажу вкратце. Сервис предоставляет тебе 2 Гб дискового пространства на своих серверах. На своем компе заводишь папку, которая будет синхронизироваться с сервером. В результате на халяву получаешь:
— Бекап своих файлов.
— Синхронизацию файлов между несколькими компами.
— Создание фотоальбомов (like this) буквально в два клика.
— Файловый хостинг для удобного размещения файлов.
— …
— PROFIT!

Понравилось? Тогда, welcome!

Почему дропбокс, а не всякие imageshack, jpegshare и другие радикалы?

Да, есть еще куча всяких бесплатных хостингов для изображений и файлов. Но главный вин дропбокса (на мой взгляд) заключается в том, что после редактирования изображений или файлов они автоматически обновляются на сервере, а ссылка остается прежней. Значит можно быстро внести изменения в картинку, которая размещена на куче сайтов и форумов. А для того, чтобы выложить в сеть обновление какого-нибудь своего твАрения, нужно просто обновить файл в папке дропбокса. Ну разве это не вин? :)

Собственно, сабж.


Программка отслеживает появление новых файлов в указаной папке (это папка должна находится в папке Public дропбокса). Как только ты сохраняешь в папку новый файл (или обновляешь существующий), программа копирует в буфер обмена: Public ссылку на файл, BB код для вставки изображения или HTML код. Что именно — задается в настройках. Впрочем, автоматику можно и отключить, и добираться до ссылок через меню.

При первом запуске программа просит указать папку, за которой она будет следить и ID твоего дропбокса:
img_drop_screen1.PNG

Дальше открывается окошко настроек. Там несколько вкладок, пока-что они на половину пустые.
img_drop_screen2.PNG

Окно программы можно скрыть (кнопка на вкладке «настройки»), тогда добраться до неё можно через значек в трее и его меню:
img_drop_screen3.PNG

Так-же ImageDrop умеет оповещать о том, что именно было скопировано в буфер обмена:
img_drop_screen4.PNG

Вот-так вот. Для начала не плохо вышло. Я доволен :)
Программу берем здесь
Исходники можно невозбранно взять тут.

Пожелания/предложения по улучшению складывайте в комментах.

P.S. Для вставки скринов в пост использовался ImageDrop :)
  • 0
  • 19 мая 2011, 21:16
  • dcoder

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

RSS свернуть / развернуть
Пара замечаний по скринам (прога как таковая пока не интересует)
1) Сколько видел твоих творений — интерфейсы некрасивые и вообще производят впечатление «поплывших». Постарайся делать их поровнее, оставлять меньше явно пустого пространства.
2) По видимому, в менюшку добавляются пункты для всех найденных картинок. Как только их станет больше, чем влазит в экран — станет крайне неудобно, а возможно и тормозно.

P.S. А что это за фиговина в альбоме сфоткана?
+1
  • avatar
  • Vga
  • 19 мая 2011, 22:26
1) Ну эта пока-что «готова чуть более, чем на половину» поэтому пока некоторая кривость интерфейса простительна :) Но впредь буду учитывать твой совет.
2) Там последние 5 добавленых/измененных файлов.

P.S. Это TV-B-GONE
0
Почитал про TV-B-Gone, как я понял это девайс для выключения телевизоров?
Возникла идея — собрать из нескольких ИК прожекторов для систем видеонабюдения один большой и когда жители дома напротив уютненько устроятся в кресле в пятничный вечер чтобы посмотреть аншлаг врубить пепяку и вырубить зомбоящики одним нажатием XD Реально и такое?
0
У Криса была подобная идея )
0
Крис говорил именно про взлом телевизоров — через инженерное (сервисное) меню. А тут — просто выключить. Безобидно :)
0
Не-не! И про это там тоже было)
0
Итак, вражеский телевизор лежит в перекрестье прицела, влажные от волнения пальцы застыли на пульте. Самое простое, что можно сделать (не привлекая к своей персоне никакого внимания), — это нащупать большую красную кнопку и вдавить ее до упора, отправляя телевизор в ждущий режим типа standby. После нескольких таких самопроизвольных отключений, агрегат, как правило, отправляется хозяевами на лечение в ближайшую мастерскую

вотъ
0
Видел где-то такую штуку. Но щас не нашел.
0
Лучше аккуратно рисовать интерфейс с самого начала. Благо, в дельфи это легко и просто.
0
Писать целую софтинку чтобы превратить список файлов в ссылки? о_О
Хватило бы махонького макроса в текстовом редакторе.
0
Программу можно усовершенствовать, добавить функционал. А макрос, он такой макрос…
0
Хм, всегда надо стараться обходиться готовыми средствами. Имхо.
Макрос запилить сможет любой юзер за пару минут, а прогу модифицировать — тока автор. И то если будет не лень.
0
Да тоже, в общем-то, любой юзер. Только изучать придется Delphi, а не язык макросов) Сорцы же даны.
0
Еще замечание. На сей раз касательно сорцов. Неплохо бы знать, какие файлы зачем нужны и в архив с сорцами мусор не пихать. К мусору в случае дельфи относятся скомпилированные модули .dcu (за исключением случая, когда к .dcu нет исходника), скомпилированные ресурсы .res (только при наличии .rc исходника, иначе нужны), файлы .local, .identcache, .ddp, .dsk (эти вообще вредные, т.к. являются автоматически подхватываемыми файлами настройки рабочего стола Delphi), .cfg (файл опций для компилятора, автоматически создается средой), бэкапы *.~*, папка __history.
То же относится и к другим языкам/средам. Например у mikroPascal'я из всей тучи создаваемых файлов нужны только *.mpas и файл проекта (.inc еще, если используется).
+1
  • avatar
  • Vga
  • 19 мая 2011, 23:27
Да, я про это дело регулярно забываю.
Надо-бы скриптик для очистки от мусора завести. :)
0
Там написать-то пять строк, и все — del. И привыкнуть выделять только нужные файлы для архивирования.
0
Заглянул в сорцы. Нда. Прога каждые три секунды прогоняет поиск по папке с картинками и ищет самые свежие. Чем не устроила имеющаяся в винде функция получения уведомлений об изменениях в указанной папке?
Алсо, форматирование плохое. Пришлось скормить реформаттеру, прежде чем разбирать)
0
  • avatar
  • Vga
  • 19 мая 2011, 23:51
Быдлокодинг с таймером признаю, да.
А чем форматирование-то плохое? Покажи кусок кода после реформаттора.
0
Реформаттер настоен на стиль Борланда (с небольшими изменениями на мой вкус).
До
procedure TSettings_form.BitBtn1Click(Sender: TObject);
var
tmp_Str: string;
begin
 tmp_Str := StdWindows.ShowChooseFolder();
 if tmp_str <> '' then
 begin
  Own_folder := tmp_Str;
  edDropFolder.Text := Own_folder;
 end;
end;

procedure TSettings_form.Button1Click(Sender: TObject);
begin
   ShowWindow(Settings_form.Handle, SW_HIDE);
   ShowWindow(Application.Handle, SW_HIDE);
end;

После
procedure TSettings_form.BitBtn1Click(Sender: TObject);
var
  tmp_Str: string;
begin
  tmp_Str:=StdWindows.ShowChooseFolder();
  if tmp_str<>'' then
  begin
    Own_folder:=tmp_Str;
    edDropFolder.Text:=Own_folder;
  end;
end;

procedure TSettings_form.Button1Click(Sender: TObject);
begin
  ShowWindow(Settings_form.Handle, SW_HIDE);
  ShowWindow(Application.Handle, SW_HIDE);
end;

(Выпиленные пробелы вокруг := — это просто мне так нравится, реформаттер довольно гибко настраивается).
Здесь наиболее страшная каша из индентов:
procedure TSettings_form.RefreshTimerTimer(Sender: TObject);
var
 sr: TSearchRec;
 FileWrtTime: TDateTime;
 flag:boolean;
 tmp_string:string;
 n: integer;
begin
if not DirectoryExists(Own_folder) then exit;

if Own_folder[Length(Own_folder)]<>'\' then Own_folder := Own_folder + '\';


if FindFirst(Own_Folder+'*.*', faAnyFile, sr)=0 then
  begin
    repeat
      if (sr.Name='.') or (sr.Name='..') then continue;
      if sr.Attr and faDirectory = faDirectory then continue;
      FileWrtTime:=FileDateToDateTime(FileAge(Own_folder + sr.Name));

      flag := false;
      if CompareDateTime(FileWrtTime,LastCheckTime)=GreaterThanValue then flag:=true;
      for n := 0 to 4 do
       if ExtractFileName(RecentPics[n].FileName)=sr.Name then flag := false;
                         


      if flag then
       begin
        For n := 4 downto 1 do RecentPics[n] := RecentPics[n-1];

        RecentPics[0].FileName := Own_folder + sr.Name;
        RecentPics[0].PreviewName := 'N.S.';
        RecentPics[0].PublicLink := resolve_names(Link_base +'/'+ sr.Name);
        RecentPics[0].HTMLcode := '<img src="'+RecentPics[0].PublicLink+'"  alt="'+sr.Name+'" />';
        RecentPics[0].BBcode := '[img]'+RecentPics[0].PublicLink+'[/img]';

        if AutomaticCopy <> -1 then
         begin
          if AutomaticCopy=0 then tmp_string := recentPics[0].PublicLink;
          if AutomaticCopy=1 then tmp_string := recentPics[0].HTMLcode;
          if AutomaticCopy=2 then tmp_string := recentPics[0].BBcode;

          ClipBoard.SetTextBuf(PChar(tmp_string));
          if cbCopyNotify.Checked then
          begin
           TrayIcon.BalloonTitle := 'ImageDrop';
           TrayIcon.BalloonHint := Notify_text1[AutomaticCopy] + ' для файла "' +
            sr.Name + '" скопирован в буфер обмена';
           TrayIcon.ShowBalloonHint;
          end;
         end;
       end;
      
    until FindNext(sr)<>0;
  end;
LastCheckTime := Now;
end;

После:
procedure TSettings_form.RefreshTimerTimer(Sender: TObject);
var
  sr: TSearchRec;
  FileWrtTime: TDateTime;
  flag: boolean;
  tmp_string: string;
  n: integer;
begin
  if not DirectoryExists(Own_folder) then exit;

  if Own_folder[Length(Own_folder)]<>'\' then Own_folder:=Own_folder+'\';

  if FindFirst(Own_Folder+'*.*', faAnyFile, sr)=0 then
  begin
    repeat
      if (sr.Name='.')or(sr.Name='..') then continue;
      if sr.Attr and faDirectory=faDirectory then continue;
      FileWrtTime:=FileDateToDateTime(FileAge(Own_folder+sr.Name));

      flag:=false;
      if CompareDateTime(FileWrtTime, LastCheckTime)=GreaterThanValue then flag:=true;
      for n:=0 to 4 do
        if ExtractFileName(RecentPics[n].FileName)=sr.Name then flag:=false;

      if flag then
      begin
        for n:=4 downto 1 do
          RecentPics[n]:=RecentPics[n-1];

        RecentPics[0].FileName:=Own_folder+sr.Name;
        RecentPics[0].PreviewName:='N.S.';
        RecentPics[0].PublicLink:=resolve_names(Link_base+'/'+sr.Name);
        RecentPics[0].HTMLcode:='<img src="'+RecentPics[0].PublicLink+'"  alt="'+sr.Name+'" />';
        RecentPics[0].BBcode:='[img]'+RecentPics[0].PublicLink+'[/img]';

        if AutomaticCopy<>-1 then
        begin
          if AutomaticCopy=0 then tmp_string:=recentPics[0].PublicLink;
          if AutomaticCopy=1 then tmp_string:=recentPics[0].HTMLcode;
          if AutomaticCopy=2 then tmp_string:=recentPics[0].BBcode;

          ClipBoard.SetTextBuf(PChar(tmp_string));
          if cbCopyNotify.Checked then
          begin
            TrayIcon.BalloonTitle:='ImageDrop';
            TrayIcon.BalloonHint:=Notify_text1[AutomaticCopy]+' для файла "'+
              sr.Name+'" скопирован в буфер обмена';
            TrayIcon.ShowBalloonHint;
          end;
        end;
      end;

    until FindNext(sr)<>0;
  end;
  LastCheckTime:=Now;
end;

Хотя в редакторе это чуть заметнее. Там индент-гайды и прочее.
0
+1
Оно вроде только под NTFS работает? )
0
Там не сказано, а в 98-й я работал очень давно и не помню, замечала ли Delphi внешнее изменение открытых файлов. Но скорее да, чем нет. Оно же в общем-то работает не с ФС, а с ОС.
Ну и FAT32 нынче не сильно распространен, кроме как на флешках — он намного менее устойчив, чем NTFS.
0
Да нормальное там форматирование…
0
Ну да, есть же еще автошема.
0
Хорошая идея использовать Dropbox, хоть и лежала на поверхности. Надо будет наваять себе подобную программулинку (с блэк-джеком естественно). Сейчас пользуюсь VisualBooster'ом, но он иногджа подглючивает.

Из функционала хотелось бы настройку горячих клавиш:
— снять весь экран
— снять активное окно
— снять облласть
0
— снять весь экран
— снять активное окно
— снять облласть
Делал я это на дельфях, даже исходники где-то валяются…
0
PrintScreen и Alt-PrintScreen чем не устраивают? Можно добавить функцию «сбросить картинко из клипборда в папку», если лень запустить Paint/Irfan View/что-угодно.
0
Тем, что результат надо сохранять =) Ну и третий пункт тоже не нужно упускать из вида.
Да, я в курсе о Snipping Tool в Win7, но она не умеет быстро сохранять весь экран и окно.
0
Все равно область выделять вручную. Print Screen, запускаем IrfanView (можно повесить на ярлык шорткат вроде Ctrl-Alt-I), Ctrl-V, взмахом мыши выделяем нужную область, Ctrl-Y (оно же Edit — Crop Selection), S (оно же Save As). Учитывая, что диалог откроется в последней использовавшейся папке, а это скорее всего папка дропбокса — остается только назвать файл и нажать энтер. Практически так же — в пейнте.
Из всего этого можно сократить пару шорткатов (которые входят в привычку и оттарабаниваются со скростью автоматной очереди) и опционально именование файла (если не лень потом выяснять, который из файлов вида clipboard897.jpg нужный).
0
Иногда правда еще нужно провести «фотосессию», скажем какого-нить «мастера». Впрочем, автоскриншотер встроен много куда, включая тот же IrfanView (и многие другие смотрелки).
0
Ужас. При помощи VisualBooster все сокращается до трех действий: PrintScreen, «взмах мышью», Enter. Все, ссылка у вас уже в клипборде.
0
Ну, если публиковать картинки хотя бы по десятку в сутки — это оправдано.
Впрочем, действия не равноправные — хоткеи оттарабаниваются очередью.
0
Вот, нашел. Недоделанная реализация чата для локалки на UDP, там как раз остановился на возможности вставки картинок, т.е. выделенной области экрана прямо в окно ввода. Писал давно (судя по дате файлов — 2008 год), поэтому многое уже не вспомню, но может что пригодится.

dl.dropbox.com/u/22991016/PChat.7z

Даже под вайном запустился… Блин, уже ностальгия :)

0
Все эти программки грешат только одним — невозможностью перенастроиться на другое хранилище. Другими словами, отсутствием демократичности. Почему это делается понятно — желание увеличить релевантность своего ресурса. Вот и уважаемый BSVi, когда выложил свою замечательную программку тоже не устоял перед этим искушением. К его чести, он об этом сразу предупредил и кто не имеет своих вэб-ресурсов (да и тот, кто имеет), конечно, вполне может пользоваться програмкой и помогать тем самым автору. Но меня, конкретно, больше устроило бы отправлять свои скриншоты на свой ресурс и хранить их там (получать ссылки для размещения на форумах или для пересылки ссылок на них).
Не помню как называлась программа, написанная нашим соотечественником, но для всех субъектов бывшего СССР он на только нам понятном слэнге (чтобы буржуины не догадались — для них она платная) описал, как пройти безвозмездно регистрацию и ее активацию — вот это истинно джентльменский поступок.
0
  • avatar
  • DVF
  • 20 мая 2011, 22:00
Их не так мало. Light Alloy, SHTTPS, один из наборов скинованных контролов для дельфи — это только то, что навскидку вспоминается.
0
При чем тут Light Alloy с снятие скриншотов только с воспроизводимого контента? И зачем упоминание о SHTTPS? Я дома сервер не устанавливаю и мой ресурс не на нем. Ну, а с дельфи я не дружу, увы.
0
Это к вопросу про джентельменский поступок. Или имелась в виду именно программа для снятия скринов с автовыкладыванием в интернет? Так их и вообще бесплатных хватает.
0
Например?
0
По мне, у BSVi идеальная милая программка со всем необходимым функционалом. Вот только бы разрешил менять настройку отстойника.
Что до здесь представленной программы, то есть существенный недостаток, который автор почему-то представил как положительную сторону (у каждого свой взгляд): автоматическое изменение отображения картинки там, где размещены на нее ссылки. А если мне надо, чтобы не на всех ресурсах эта картинка изменилась? Копаться в памяти, где я понавтыкал на нее ссылок?
0
Вдруг кого заинтересует функционал сабжа в линуксах, я случайно наткнулся на это: habrahabr.ru/blogs/linux/108126/

Удобней в своей жизни не видел (разве что мыслями управлять): нажимаем ctrl или alt или что там настроим, выделяем мышой квадрат, отпускаем мышь — ссылка в буфере :) Меньше секунды.
0
ну и проверка :)
0
У скрипта обнаружился недочёт — при работе на разных компьютерах имена файлов начинают совпадать, соответственно картинки затираются новыми, и отображаются уже новые по всем связанным ссылкам.
Можно попасть в конфуз, вставив сиськи на серьёзную конференцию :)
Доделал случайное имя из 20 символов:
#!/bin/bash

 DPDIR='/home/user/Dropbox/Public'
 DOPDIR='/images' # путь к внутренней папке, если имеется
 ID=СВОЙ_ID

# создание случайного имени файла
matrix='abcdefghijklmnopqrstuvwxyz'
length=20
while [ "${n:=1}" -le "$length" ]
do
  tempfn="$tempfn${matrix:$(($RANDOM%${#matrix})):1}"
  let n+=1
done

fullname=$DPDIR$DOPDIR'/'$tempfn'.'${1##*.}

if [ -e "$1" ]
then
cp -f "$1" "$fullname"
  file=`basename "$fullname"`
  link="http://dl.getdropbox.com/u/$ID$DOPDIR/$file"
  notify-send -i go-down "Dropbox" "Ссылка скопирована в буфер обмена"
  echo "$link" | xsel -b -i
else
  notify-send -i dialog-information "Dropbox" "Выберите файл!"
fi
0
Жду с нетерпением финальную версию программы. И еще такой вопрос — можно ли дропбоксом синхронизировать отдельную папку? А то малость неудобно все закидывать в его папку
0
По-моему он только свою папку синхронизирует.
0
dcoder и еще такой вопрос — при заливке картинок вашей прогой они хранятся только на сервере или их еще и на диске надо сохранять?
0
Если на диске изменить/удалить то это отразится и на картинке на сервере.
0
Спасибо. Было бы удобно выбирать какие файлы просто заливать на сервер, а какие синхронизировать
0
А это уже не ко мне, а к разработчикам DropBox. :)
+1
В клиенте дропбокса нашли уязвимость
0
Странно почему ссылка не добавилась — вот
0
0
Дубль три? :)

Уже загуглил и прочитал. Вообще, не хорошо. Но ведь для того, чтобы это использовать надо сначала получить доступ к config.db, а это на хорошо защищенной машине не просто.
0
Только что без проблем прочитал этот файл, буду думать о защите
0
Я имел ввиду: получить доступ извне. А со своей машины каждый может. :)
0
А если просто запустить трояна, который будет куда-то этот самый файл сливать, то начнется массовая потеря аккаунтов
0
Можно просто не хранить в дропбоксе ничего непубличного. А синхронизацию своих данных можно производить и другими средствами. VCS, например.
0
Если есть доступ к этому файлу, значит есть доступ и к остальным на машине, или, в крайнем случае, к локальным файлам в папке дропбокса точно! Тогда смысл?
0
Затем, что есть класс программ — паролетырки, они собирают в системе пароли из известных им хранилищ и немедля отсылают автору, без заражения. Не помню как они называются на самом деле. Так вот, утянуть host_id из файла и переслать письмом своему автору вместе с полусотней других паролей куда проще, чем двухгиговую папку дропбокса.
0
ааа, ну это да, согласен.
Во всяком случае мне пока бояться нечего, кроме как целенаправленной попытки взлома. Но тут как в известном анекдоте про неуловимого Джо :)
0
Паролетырки — они, зачастую, как говно. Как только неуловимый Джо в него наступает — автор узнает его пароли. После чего может выяснить — а есть чего интересненького у этого неизвестного человека?
Хотя, конечно, можно работать осторожно и в говно не наступать левые файлики не запускать. Но и на старуху бывает проруха.
0
Я просто про то, что под Windows уже года два не работаю. Что дома, что на работе. И вероятность «паролетырык» под линуксом крайне мала. А если её помножить на мою нужность кому-то, то получится число, сравнимое с уровнем шума… :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.