Микро-сервис для дропания всякой всячины

Сервисов, куда можно дропнуть любой файл и потом отдать всем заинтересованным ссылку, просто море. Начиная с Dropbox в связке, например с Dropzone и кончая массой всяких “все-в-одном” решений типа Droplr, CloudApp и массы прочих-разных. Вы мeня спросите, а зачем тогда надо тратить свое время на поиск и разработку своей версии всего этого хозяйства? “Вы узнаете об этом, если пойдете туда, куда я вас поведу.” (c) И. Бабель

В чем у меня проблема дропания в dropbox, название которого так созвучно нашей цели? В том, что у меня Dropbox это важное средство синхронизации файлов и впихивать все временное/расшариваемое в public фолдер мне кажется балаганом на грани бардака. Кроме того, вроде бы в dropbox теперь эти public штуки не такие прямые и ссылки ведут на страницу dropbox вместо честных прямых ссылок которые нам и нужны. И конечно, тут легко можно наткнуться на лимит по трафику, особенно для бесплатных экаунтов, что приведет к блокированию всего каталога с файлом-нарушителем.

С Droplr и CloudApp моя главная проблема это непрямые ссылки, т.е. опять попадание на промежуточную страницу сервиса, где можно искомый файл загрузить и/или посмотреть. Наверное и там можно упереться в лимиты, но я этот вопрос не особо исследовал. Кроме того, мне хочется чтоб заливка в это хранилище была гибкой и простой, чтоб можно приделать к чему угодно на хозяйстве, например к моему любимому Alfred.

От этого всего и еще по десятку прочих причин которые теперь и не вспомнить, возникло необоримое желание поднять свой собственный простой сервис расшаривания (велосипед имени меня), исключительно для личного использование. Я помню, что когда Skitch испортился и закрыл свой прямой хостинг картинок в угоду менее прямому Evernote – я быстро поднял маленький виртуальный сервер с входом (заливкой) по SCP и раздачей через Nginx. В это же время я добавил в Dropzone новый стандартный элемент, для SCP Upload, который достаточно хитер, чтоб в качестве результата засовывать правильный http линк обратно в clipboard.

Но и это хотелось улучшить. Во первых, хотелось что-то сделать с именами файлов которые заливаются. Т.е. заливая файл “бобук голый без sms.jpg” хотелось в результате получить какой-нибудь более стойкий и мене предсказуемый “личный” url типа http://drops.from-me.org/YzBkZDVlOGI5ZWFmYmNlZjlmYWRkZDAx.jpg и, конечно, сразу в укороченном виде типа http://bit.ly/YF1E8d

Сделать такое не просто, но очень просто. Вот скрипт для Alfred, тот что на картинке, именно это и делает:

	#!/bin/bash
	fname=$(basename {query})
	file_ext=$(echo $fname |awk -F . '{if (NF>1) {print $NF}}')
	ofname=$(date +%s | md5 | base64 | head -c 32).$file_ext
	scp {query} имя@сервер:/путь-к-дропсам-на-сервере/${ofname}
	curl -s --data "apiKey=[ваш api key]&login=[ваш логин]&longUrl=http://[ваш-урл]/$ofname &format=txt" http://api.bitly.com/v3/shorten | tr -d '\n' | pbcopy
	echo -n "$fname dropped, link in clipboard"

Этому делу надо поставить Silent и Action птички и в Advanced выбрать “Output to Notification Center”. И все, готово. Становимся в Finder на нужный файл, жмем комбинацию для Action Аlfred’а (у меня option + command + \ ) и выбираем/набираем заголовок того действия, что вы хотите совершить. Умный Alfred вам даже покажет preview для тех файлов которые он понимает. После выбора все пойдет на сервер и, по завершению заливки, короткий результат окажется в вашем буфере обмена.

Так, первая часть Марлезонского балета (для знатоков - он же Мерлезонский) на этом завершена. Но задача выполнена ровно на половину. Да, горячие клавиши наше все, но иногда удобнее просто что-то схватить и куда-то драг-энд-дропнуть, и при этом хочется аналогичного результата.

Тут я, как человек в ruby понимающий мало, по началу стал в тупик. Дело в том, что подобного рода расширения к Dropzone пишут на этом самом ruby, но ура - он (Dropzone) умеет в качестве действия запускать программу. Это у него зовется “Open Apliction”, что вполне логично. Дальше дело техники - открываем Automator, добавляем “Run Shell script” из списка Actions и вставляем туда тот же самый код, в котором только заменяем {query} на $1. Убеждаемся, что в Pass Input у нас “as argument” и сохраняем в виде Application куда душа пожелает. Моя пожелала сохранить в одну из папок Dropbox, чтоб оно само расползлось по всем машинам. В самом Dropzone добавить это дело 2х кликов, тут и описывать особо нечего. Кстати, если у вас нет Dropzone или его аналога (а кто какие аналоги знает?) иконку этого нового “приложения” можно добавить в Dock и перетягивать прямо на него.

Ну вот и все - “сервис” готов. Для улучшения есть куда приложить руки, например рисовать красивое превью всех файлов в хранилище, но показывать это только хозяину-параноику, ну или всему миру, если вам так приятнее. Можно пофантазировав представить, что с этой страницы по клику можно получать обратно тот же самый короткий url. Если кто такое напишет для бразуера - буду рад и благодарен.

Ну и конечно, если у вас нет места где можно поднять мелкую виртуалку в облаке и на AWS жалко 5 копеек, но водится домашний интернет - это все тоже наверное можно запустить. Даже на RPi должно работать без проблем, я пробовал. И конечно это легко адаптируется для прямой работы с S3 заменяя scp на s3cmd

P.S. Да, этот код не будет правильно работать с именами файлов в которых есть пробелы. Но эту починку я оставлю вам как домашнее задание. Когда будете предлагать свои варианты - проверьте сначала. scp + bash забавно работает в таких случаях.