Журнал LinuxFormat - перейти на главную

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

LXF133 70 1.jpg С помощью libferris можно редактировать таблицы Google Spreadsheet.

В каталоге 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, смогли эти сообщения прочесть:

LXF133 72 1.jpg Просмотрите фотоальбомы Flickr как файловую систему в файловом менеджере ego. Расширенные атрибуты дадут вам дополнительную информацию.

LXF133 72 2.jpg Чтобы скопировать видео на сайт Vimeo, воспользуйтесь gfcp, GTK-заменой для cp, поставляемой с libferris.

 $ 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.

LXF133 73 1.jpg Текстовый редактор Kate в KDE работает с документами Google через librerris и Fuse.

Альтернатива 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-сервиса то, что вы хотели бы видеть в файловой системе, можете добавить это сами.

Ресурсы

Строим социальные сети

Когда сайты социальных сетей начнут поддерживать FOAF+SSL (http://www.w3.org/wiki/Foaf+ssl), вы сможете перетаскивать контакты из одного web-сервиса в каталог с друзьями на другом, обновляя данные на каждом.

Персональные инструменты
купить
подписаться
Яндекс.Метрика