smotrelka: еще один клиент для API Smotri.com

    В силу некоторых обстоятельств было решено написать клиент для работы со Smotri.com через предоставляемый ими API. Надо сказать, подобный топик уже проскакивал на хабре (здесь), но там описывалось приложение несколько другого характера.

    Итак, обязательные требования к проекту — кроссплатформенность и наличие относительно удобного 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: и указанием вашей контактной информации, договоримся.

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое