Итак, обязательные требования к проекту — кроссплатформенность и наличие относительно удобного GUI — наложили некоторые ограничения на языки и платформы. Была выбрана довольно стандартная связка — C++ и Qt, как знакомая и удобная.
Само API представляет из себя набор вызовов XML-RPC или JSON-RPC, его описание лежит тут. Состоит оно, по сути, из набора базовых сущностей (а-ля видео, юзер, комментарий и т.д.) и набора команд для работы с контентом. В целом, API довольно удобно, хотя публично доступная версия имеет некоторые недоработки, но это отдельная история :) Её отголоски можно найти в тикетах трекера, адрес — чуть выше.
Описание технической части
Для работы с API нами был выбран вариант c JSON-ом. Немного помучавшись, были решены проблемы с JSON <-> Qt через QScriptValue и написание небольшого велосипеда. Первый этап пройден, можно передохнуть :)Далее встал вопрос о написании очень тупого однообразного кода для всех сущностей и команд. Конечно, в моей голове сразу родилась идея о генераторе, выдирающем описание из wiki и выдающем плюсовый код. И конечно, сотимовцем она была сразу же отвергнута как неочевидная по трудозатратам, да и код можно было бы написать руками, в конце концов. В общем-то, всё это верно, но взглянув вечером на кучу сущностей и гораздо большую кучу команд мне очень сильно взгрустнулось и было решено, скрепя сердце, написать чертов генератор. Плюсы решения очевидны — после написания базовой части, аля парсинга вики-формата будет легко конструировать нужный вывод. В общем, за пару вечеров оная утилитка была написана на python, и еще примерно за столько же начала генерировать нечто, почти полносью удовлетворяющее нас и компилятора. Параллельно я узнал, что мой сотимовец написал вручную за это время почти всё то, что генерит моя тулза :D
В общем, через недельку-полторы мы догенерили всё для работы с командами и получили практически полностью работающее и довольно удобное API в Qt-стиле для работы со smotri.com. Чуть опосля были написаны unit-тесты, и мы убедились, что все они проходятся.
Эта часть в настоящее время стабильна и оформлена как отдельная библиотека с примерно таким интерфейсом у главного класса SmotriApi (показаны не все команды):
public: uint videosListConverting (OptionalArgs o = OptionalArgs()); uint commentsAdd ( QString text, SmotriVideoId videoId, OptionalArgs o = OptionalArgs()); uint commentsDelete ( int commentId); uint videosRubricList (); uint authAuthUser ( QString login, QString password, OptionalArgs o = OptionalArgs()); uint testPreved ( QString message); signals: void videosListConvertingDone(const smotrelka::SmotriVideosListConvertingReply &reply, uint id); void commentsAddDone(const smotrelka::SmotriCommentsAddReply &reply, uint id); void commentsDeleteDone(const smotrelka::SmotriCommentsDeleteReply &reply, uint id); void commentsListDone(const smotrelka::SmotriCommentsListReply &reply, uint id); void videosRubricListDone(const smotrelka::SmotriVideosRubricListReply &reply, uint id); void authAuthUserDone(const smotrelka::SmotriAuthAuthUserReply &reply, uint id); void testPrevedDone(const smotrelka::SmotriTestPrevedReply &reply, uint id);
Дальше был написан примерочный вариант GUI, который постепенно оброс фичами до нужного состояния. В настоящее время он поддерживает следующие функции:
- получение списка видеорубрик
- получение списка новых видео
- получение списка популярных видео
- авторизация пользователя
- добавление видео
- просмотр видео через браузер
- удаление видео
Основная цель — реализация заливки видео — была успешно выполнена. Заливка видео делается через POST-запрос с типом контента multipart/form-data с единственным полем — самим файлом (поддерживается любой допускаемый самим smotri.com формат). Следует отметить, что на данный момент в публично доступной версии API не реализованы команды просмотра своих видео, находящихся в процессе конвертации, а также удаления своих видео. Как только хостинг smotri.com обновит свою версию API на исправленную, указанный функционал будет работать и в данном приложении (пока что выдается сообщение об ошибке).
Также надо отметить, что заливка не совсем хорошо масштабируется на большие файлы из-за того, что перед отправкой через POST содержимое файла целиком считывается в память (для последовательного считывания надо определить свой QIODevice, который последовательно вернет при считывании заголовки HTTP, а затем уже содержимое файла). Поэтому загрузка 200-метрового видео (максимальный размер, поддерживаемый smotri.com) потребует столько же памяти для клиента. Данноый недостаток планируется исправить.
Остальной функционал выполнен пока в достаточно черновой форме. Например, видео для просмотра открывается через браузер (с выходом Qt 4.5, где QtWebkit поддериживает Flash, это также будет исправлено).
О разработке
Данный проект open-source (GPL). Код доступен через SVN-репозитарий, также имеется вики и баг-трекер по данному адресу, где можно прочитать документацию, скачать тарболлы последних версий или готовые сборки.
В случае, если у кого-то возникнет желание присоединиться к разработке, создайте тикет в трекере с указанием twee в поле Cc: и указанием вашей контактной информации, договоримся.

