- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF133:libferris
Материал из Linuxformat.
- libferris Управляем содержимым web-сайтов через интерфейс файловой системы
Содержание |
libferris: Добавим сервисы
- Копируйте и редактируйте контент Facebook, Youtube и Vimeo, не запуская браузер. Бен Мартин покажет, как это сделать.
libferris |
---|
|
Месяц назад мы познакомились с libferris и узнали, как с помощью этой библиотеки загружать изображения на Flickr прямо с рабочего стола Linux. Во второй части мы расширим наши охват и поговорим о других сервисах, таких как Facebook, видеохостинги и Google Docs, и о передаче данных напрямую в сеть.
Если просмотреть содержимое URL-адреса facebook:// с помощью утилиты, связанной с libferris (или через Fuse), вы увидите два каталога и файл. Файл status содержит ваш текущий статус в Facebook, который можно обновить, записав туда данные. Так как на вашей странице в Facebook отображаются ссылки и статусы ваших друзей, расположение вашего статуса в файле делает саму файловую систему удобным средством для микроблоггинга.
$ fls -1 facebook:// contacts recent status $ fcat facebook://status Simone is home! $ echo Эй, кто купит обезъяну? | ferris-redirect -T facebook://status
В каталоге contacts находятся файлы виртуальных карточек vCard всех ваших друзей в Facebook. Содержимое этого (и многих других) каталогов в libferris можно просмотреть командой ferris-ls -0. Опция -0 велит libferris показывать данные, которые библиотека считает интересными, вместо обычного времени изменения, размера, владельца и группы, которые покажет ls -l. В примере ниже я скрыл свои личные данные. Обратите внимание, что NNNNNNNNN будет заменено идентификатором каждого из ваших друзей в Facebook. В файле vCard будет находиться миниатюра контакта, но его телефон с помощью этого API получить нельзя, хотя на сайте Facebook он доступен.
</p> $ ferrisls -0 facebook://contacts/NNNNNNNNN.vcf John Doe , , NNNNNNNNN ...
Наконец, в каталоге facebook://recent находятся последние записи всех ваших друзей в той форме, в какой вы видите их на своей странице в Facebook. В дальнейшем планируется поддержка загрузки фото- и видеоальбомов.
Видеохостинги
Наряду с Facebook, libferris 1.3.6 поддерживает выгрузку видео-роликов на Flickr, Vimeo и YouTube. Для двух последних сайтов пока поддерживается только выгрузка, но в будущем, вероятно, появится API для работы с друзьями, списками, поиском и комментариями, вроде того, что сейчас предлагает Flickr API. Как и во Flickr API, было бы здорово иметь возможность изменять размер и формат видеоролика в процессе выгрузки.
Выгрузка файла на эти сайты сводится к его копированию в каталог upload. По ходу процесса вы увидите достаточно общий отчет о ходе передачи.
gfcp -av medium-test-video.mp4 vimeo://upload gfcp -av medium-test-video.mp4 youtube://upload
В дополнение к фотохостингам, в libferris недавно была добавлена поддержка GStreamer. На данный момент файловая система gstreamer:// может только захватывать данные, и вы должны сказать libferris, откуда и как это делать. Вы вписываете, какие виртуальные файлы вам нужны, в файл ~/.ferris/gstreamer.xml. Пример показан в коде ниже. Те, кому знаком GStreamer (LXF125 и LXF130), обратят внимание, что элемент <source> содержит обрабатываемый канал, который могла бы использовать команда gst-launch. Каждый XML-элемент велит libferris создать виртуальный файл, а элемент <source> сообщает, как использовать GStreamer для создания содержимого файла, когда этот файл считывается.
<gstreamer> <capture> <file name=”test.jpg”> <source> filesrc location=/tmp/medium-test-image.jpg ! appsink name=sink </source> </file> <file name=”n810.mpeg”> <source> tcpclientsrc host=myn810 port=5434 ! queue ! jpegdec ! ffenc_mpeg2video ! ffmux_mpeg ! appsink name=sink </source> </file> </capture> </gstreamer>
Когда вы читаете test.jpg, то просто получаете копию локального файла /tmp/medium-test-image.jpg. Стадии канала отделяются друг от друга восклицательным знаком, а последней стадией всегда должна быть appsink с именем sink. С другой стороны, если мы прочтем файл n810.mpeg, то получим содержимое web-камеры на нашем Nokia N810 в виде потока MPEG2.
Libferris поддерживает оповещения о создании, удалении или изменениях в файловой системе. Например, команда ferrisls -monitorall -0 url://что-тотам заставит ferrisls выдать список содержимого каталога и ожидать от файловой системы событий, о которых нужно сообщить.
В результате, при настроенных на захват видео и изображений виртуальных файлах GStreamer можно «скопировать» данные с вашей камеры прямо в web-сервис. Копирование виртуальных файлов JPEG одним махом на web-сервисы протестировано; поддержка загрузки видео напрямую через gstreamer:// еще ожидается.
Файлы, созданные в gstreamer.xml, появляются в gstreamer://capture под теми именами, которые вы им дали. Поддержка пока ограничена файлами только-для-чтения, но в будущем планируется и поддержка записи в GStreamer.
Вы наверняка обратили внимание, что часто имеется каталог upload, позволяющий копировать файл на web-сервис. Это работает, потому что виртуальная файловая система позволяет создать файл в каталоге upload, и потом, когда вы получаете std::iostream для этого файла, выполняется HTTP-запрос к web-сервису. Когда вы записывает данные в этот поток, libferris продолжает отправлять ваш контент web-сервису.
Обычно компьютер может выдавать данные значительно быстрее, чем интернет-соединение способно их забрать, поэтому libferris время от времени должна просить приложение подождать. Принцип здесь тот же, что и при записи на медленный диск, в соответствии с архитектурой std::iostreams C++. Как только сетевой буфер очистится, отправив порцию данных web-сервису, libferris разрешит потоку принять еще. Эти игры в кошки-мышки позволяют клиенту libferris в любой момент времени знать примерный объем данных, отправленный web-сервису. Примерный – потому что, конечно, между потоком и сетью есть небольшой буфер, и у libferris всегда есть какие-то данные, которая она пытается выгрузить в сеть.
Обработка видео
Обработка видео для загрузки на web-сервисы сложнее. Если понять, что такое корректный JPEG-файл, нетрудно, то в случае с видео-роликом приходится принимать во внимание контейнеры для аудио- и видеокодеков. Многие сайты не принимают популярные открытые кодеки, что создает проблему с лицензированием ПО и патентами. Вероятно, будет добавлена поддержка загрузки видео с помощью специальных профилей перекодировки для MEncoder, так что пользователь сможет выбрать или обновить профили без необходимости что-то компилировать.
Данные на потоке
Так как данные передаются через поток ввода-вывода (iostream), в будущем должна появиться возможность скопировать данные с web-камеры прямо на сайт видеохостинга. Конечно, в определенный момент придется нажать Ctrl+C чтобы остановить загрузку. И тогда libferris следует знать, что вы сделали это, чтобы корректно закончить передачу данных по HTTP.
В первой части обзора мы говорили о трудностях в создании приложений с открытым исходным кодом, которые получают доступ к web-сервисам, таким как YouTube, Flickr и Google Docs. Теперь мы немного порезвимся с сервисами Google и посмотрим, как обстоят дела здесь. Сервисы Google в libferris находятся по адресу google://. В корне этой схемы вы видите docs, spreadsheets и youtube. Каталог youtube – то же самое, что и youtube:// в libferris – с точки зрения внутренней архитектуры, последнее лишь указывает на первое.
Как легко догадаться, в каталоге docs хранятся документы Google Docs, а в каталоге spreadsheets – таблицы Google Spreadsheets. Так как Google Spreadsheets – это тоже Google Docs, та же самая таблица будет доступна в обоих каталогах. Различие заключается в вариантах возможного взаимодействия с каталогами: каталог spreadsheets рассчитан на чтение и запись таблиц, их листов, ячеек и т. д. Каталог docs нацелен на полноценное взаимодействие с документом – например, на создание, замену и удаление целой таблицы.
Портим ячейки
В прошлой статье мы чуть-чуть коснулись каталога google://docs. Google Docs API включает поддержку для добавления данных в существующие текстовые файлы вместо их замены. Как и пример из первой статьи, фрагмент кода ниже сохраняет сегодняшнюю дату в файл google://docs. Затем с помощью флага --append команды ferris-redirect новое содержимое добавляется в существующий документ Google. Добавление может пригодиться, если у вас есть скрипт, генерирующий информационные сообщения, и вы хотели бы, чтобы пользователи, у которых есть доступ к Google Docs, смогли эти сообщения прочесть:
$ ftouch google://docs/appender.txt $ date | ferris-redirect --trunc google://docs/appender.txt $ fcat google://docs/appender.txt Fri Aug 21 11:54:25 EST 2009 $ date | ferris-redirect --append google://docs/appender.txt $ fcat google://docs/appender.txt Fri Aug 21 11:54:25 EST 2009 Fri Aug 21 11:54:53 EST 2009
Если вы создадите несколько каталогов в web-интерфейсе Google Docs, они появятся в виде каталогов и в libferris. По адресу google://docs можно просматривать их содержимое, загружать данные и обновлять целые документы.
Вы, видимо, любопытствуете, что же еще поддерживает для таблиц libferris. Вспомним, что у файла в libferris бывают расширенные атрибуты (EA) вида ключ=значение, и эти атрибуты также виртуализируются libferris. Таким образом, атрибуты могут приходить и уходить откуда и куда угодно.
А если разделить таблицу на строки и представить каждую в виде файла со столбцами, представленными расширенными атрибутами? Тогда содержимое отдельной ячейки можно было бы получить командой cat, а для записи в определенную ячейку приспособить перенаправление stdin — короче говоря, наладить взаимодействие таблиц с командной строкой.
Несколько примеров помогут прояснить функции расширенных атрибутов и ячеек. Пусть вы создали таблицу smalltest1 с рабочим листом Sheet1. В libferris URL этого листа содержит префикс google://spreadsheets и имя таблицы, за которым следует имя рабочего листа, как показано в объявлении переменной SPREAD ниже.
При открытии smalltest1 (или создании новой таблицы) через web-интерфейс Google строки пронумерованы, причем верхняя строка имеет номер 1, следующая – 2 и т. д. Столбцы отмечены буквами, начиная с A. Все это соответствует стандартному соглашению об обозначениях элементов таблиц.
В libferris каждая строка становится виртуальным файлом с именем, которому соответствует номер строки, и расширенными атрибутами для связанных с ней ячеек в столбцах A, B, C и т. д. Чтение атрибута b файла 9 даст нам значение ячейки B9 таблицы. В примере ниже Google превращается в самодельный калькулятор, сначала заполняющий две ячейки таблицы, а затем записывающий формулу в третью ячейку. Как и через web-интерфейс, в ячейку можно записать формулу, но значением ячейки будет результат ее применения. Так, запустив cat для ячейки с формулой, мы увидим результат вычисления:
Если воспользоваться Google Spreadsheets как калькулятором, множество пользователей сможет обновлять отдельные ячейки при расчетах.
$ export SPREAD=google://spreadsheets/smalltest1/Sheet1 $ echo 5 | ferris-redirect --ea b $SPREAD/9 $ echo 23 | ferris-redirect --ea c $SPREAD/9 $ echo -n “=sum(B9,C9)” | ferris-redirect --ea d $SPREAD/9 $ fcat -a d $SPREAD/9 28
Далее, предположим, что в строке 9 аналогичным образом заданы значения, по крайней мере для столбцов B, C и D. Добавив метки и небольшую обертку для SQLite, приведенную ниже, мы можем позабавиться с SQL и Google Spreadsheets. Обратите внимание, что в обеих командах echo для предотвращения создания символа перевода строки используется опция -n. Это важно, так как мы хотим, чтобы в ячейку записалось foo, а не foo\n. В следующем примере создается сессия SQLite для libferris:
$ echo -n foo | ferris-redirect --ea a $SPREAD/9 $ echo -n bar | ferris-redirect --ea a $SPREAD/10 $ cat run.sh #!/bin/bash SQLFILE=${1:=test.sql}; rm -f /tmp/empty/test.sqlite touch /tmp/empty/test.sqlite sqlite3 -init $SQLFILE /tmp/empty/test.sqlite >/dev/null;
Во всех SQL-файлах, которые работают с Google Spreadsheets, нужно настроить виртуальную таблицу для рабочего листа. Соответствующие SQL-запросы (файл $SQLFILE) приведены ниже. Сначала загружается общая библиотека виртуальной таблицы libferris, а затем создается таблица для представления URL-адреса, доступного через libferris. Третий параметр – упрощенная версия обычного синтаксиса создания таблицы: перечисление всех столбцов и их типов.
Столбец берется из расширенных атрибутов файловой системы libferris, и поскольку каждый столбец таблицы – это расширенный атрибут, легко получить через SQLite всю таблицу:
.load libferrissqlitevtable.so create virtual table fs using libferris( ‘google://spreadsheets/smalltest1/Sheet1’,‘’,name text, a text, b int, c int, d int, e text, f text, size int );
Табличный SQL
Чтобы затвитить или обновить ваш статус в Facebook, достаточно всего-навсего перенаправить данные в файл.
Иногда требуется захватить с камеры и выкинуть кучу изображений, пока устройство правильно настроит яркость.
Можно проверить, что Google умеет складывать числа и что формула в D9 работает так, как мы ожидали, сложив две ячейки с помощью SQL. Обратите внимание, что выражение с where выбирает строку по значению ячейки в таблице, ограничивая запрос только строкой 9. Вот какие данные будут выбраны из Google Spreadsheet:
.headers on select a,b,c,d,b+c as result from fs where a = ‘foo’; a|b|c|d|result foo|21|25|46|46
Конечно, в запросах можно использовать конструкции SQL и поинтереснее. Посмотрите на набор данных ниже. Группировка по двум столбцам для генерации отчета здесь легко обрабатывается SQL:
SELECT max(b),max(c),avg(d) AS mean, sum(d) AS total FROM fs WHERE NOT (b = ‘’ OR c = ‘’) GROUP BY b,c; max(b)|max(c)|mean|total LA|barry|77.0|77 LA|john|12.0|12 LA|peter|54.5|109 NY|barry|77.6666666666667|233 NY|peter|56.0|56
В первой строке листа можно также дать столбцам заголовки: например, поместить location в B1 этой таблицы и пользоваться location вместо b в качестве имени столбца. Когда вы редактируете данные клиентом libferris – в ferris-redirect или файловом менеджере ego (см. рисунок) – таблица в браузере обновляется автоматически. Правда, поддержка мониторинга ленты обновления от Google в libferris еще не реализована, и если вы что-то измените в браузере, то, чтобы увидеть эти изменения, придется обновить клиенты libferris вручную. Обратите внимание, что в файловом менеджере ego столбцы с именами city, person и sales соответствуют столбцам b, c и d. Для доступа можно использовать любое из имен.
В дальнейшем планируется добавить возможность использования другого интерфейса аутентификации в Google, и незачем будет указывать имя файла и пароль в libferris. Также планируется поддержка в Google Docs большего количества типов файлов и обновлений с возможной интеграцией с rsync и git, так что вы сможете локально хранить резервную копию или журнал с изменениями файловой системы Google Docs.
Альтернатива SQL
Если вы не любите SQL, для получения данных из таблицы Google или любой другой файловой системы libferris пользуйтесь XQuery. XQuery может быть удобнее в том случае, если вы генерируете XML-документ по запросу.
Libferris умеет монтировать журналы Apache и реляционные базы данных, а XQuery позволит объединить web-записи первого с пользовательскими данными последних в отдельные KML-файлы для анализа географии ваших посетителей в Google Earth.
Идем дальше
Кроме Google Docs, планируется расширить поддержку YouTube, Vimeo и других видеохостингов, включив туда поиск по видео и загрузку через виртуальные файлы – точно так же, как в API Flickr. Таким образом, должна появиться возможность проигрывать видео с этих сайтов прямо в MPlayer, Xine или VLC, не привлекая браузер.
Основная задача, конечно, охватить побольше сайтов. О некоторых уже известно: это Last.fm и LinkedIn. Также есть планы выделить базовые классы для общей функциональности web-сервиса – постов, списков, комментариев и друзей. В конце концов, на многих из этих сайтов есть система друзей и списки видеороликов и фотографий. Базовые классы смогут позаботиться о функционале, инициируя перечитывания и асинхронные обновления. Это значит, что когда друг добавит комментарий, тот автоматически появится в виртуальной файловой системе.
Сбор друзей всех web-сервисов на Akonadi может также оказаться перспективным. По файлам виртуальных карточек vCard может будет легко увидеть общих друзей на разных web-сервисах.
Web-сервисы – последнее добавление к libferris, и они постоянно развиваются, обрастая новыми возможностями и все больше приближаясь к web-сервисам, лежащим в их основе. Помните, что это открытое ПО – увидев в API web-сервиса то, что вы хотели бы видеть в файловой системе, можете добавить это сами.
Ресурсы
- Первая часть статьи о совместном использовании libferris и SQLite. http://ldn.linuxfoundation.org/article/libferris-and-sqlite-a-powerful-combination-part-1
- Информация по GStreamer и загрузке. http://gstreamer.freedesktop.org
- Домашняя страница расширяемого хранилища Akonadi. http://pim.kde.org/akonadi
Строим социальные сети
Когда сайты социальных сетей начнут поддерживать FOAF+SSL (http://www.w3.org/wiki/Foaf+ssl), вы сможете перетаскивать контакты из одного web-сервиса в каталог с друзьями на другом, обновляя данные на каждом.