Pull to refresh

Opera Extension: Рейтинг фильма по версии IMDb и КиноПоиск

Введение


Все мы любим посмотреть вечерком какой-нибудь хороший фильм. На этапе поиска такого фильма на каком-нибудь трекере портале с легальным контентом хочется знать — стоит ли его вообще смотреть и тратить свое драгоценное время. Узнать рейтинг можно на сайтах типа КиноПоиск и IMDb. До недавнего времени приходилось заходить на эти сайты в поисках рейтинга.
С целью облегчить себе жизнь, начал искать какие-нибудь полезные сервисы, которые облегчили бы эту операцию и наткнулся на дополнение от КиноПоиск для FireFox, позволяющее получить рейтинг фильма и сделать прямой переход на его страницу, но в описании к расширению было указано:
PS. Специальные версии для Opera и Internet Explorer в ближайшем будущем не планируются.
Являясь ярым адептом Opera, я захотел незамедлительно исправить это досадное недоразумение. Уже в процессе написания расширения мне подумалось, почему бы не добавить и поддержку IMDb рейтинга, поскольку в ряде случаев он адекватнее КиноПоиска. Поскольку опыта в созданий расширений для Opera у меня не было, пришлось начинать с самых азов, но история в большей части не об этом.

Поиск доступных API

Хотя у КиноПоиск есть полноценный API, они не предоставляют к нему доступа всем желающим. Придется пользоваться тем, что есть. Немного почитав исходники FireFox дополнения, был найден вот такой url для API:
s.kinopoisk.ru/search/chrometoolbar.php?v=1&query=matrix
Подставляя в url название необходимого фильма, получаем json объект с такой структурой
{
	"type":"film",
	"name":"Matrix,The",
	"rus":"\u041c\u0430\u0442\u0440\u0438\u0446\u0430",
	"year":"1999",
	"rating":"8,0"
}

В ходе тестирования API заметил, что рейтинг хоть и отображается дробно, но всегда округляется до целого – досадно, но от этого никуда не денешься.
В процессе поиска API для IMDb был найден вот такой сервис:
Возможностей у него больше, нежели у КиноПоиска. Для того чтобы получить необходимую информацию, достаточно перейти вот по такой ссылке.
www.imdbapi.com/?t=matrix
В результате получаем JSON объект с множеством полей. Нам достаточно четырех
{
	"Title":"The Matrix",
	"Year":"1999",
	"Rating":"8.7",
	"ID":"tt0133093"
}


Создание расширение


В упомянутом ранее дополнении для FireFox выбор фильма производился простым выделением названия фильма на странице, я решил пойти другим путем по нескольким причинам:
  • Не хочется нагружать браузер лишней работой, когда это не нужно;
  • Особенности Opera API;
  • Я не люблю когда что-то в моем компьютере делается без моего ведома.

Следуя указанным выше ограничениям и почитав документацию к Opera API, пришел к следующей схеме взаимодействия:
  • При нажатии на кнопку popup сообщает background о готовности;
  • Background сообщает injected, что он готов принять выделенный текст;
  • Injected шлет background выделенный текст;
  • Background запрашивает IMDbAPI и КиноПоиск и шлет готовый к выводу текст popup;
  • Popup отображает полученные данные.

Некоторые моменты, доставившие немало для меня хлопот в Opera API

  • Событие onconnect для popup происходило два раза, из-за этого пришлось пересмотреть механизм общения popup с background скриптом;
  • Popup не может общаться с injected напрямую, но подробнее почитав API стало понятно почему: в качестве popup может быть открыт любой link, даже внешний;
  • Popup не может управлять своими параметрами. Опять же по причине, описанной в предыдущем пункте.

Что получилось


В результате родилось вот такое расширение для Opera.
Выделяем текст на странице и нажимаем на кнопку расширения на панели Opera, и получаем желанный рейтинг:
Movie Rating

Известные минусы и баги

  • Возможны ложные срабатывания: если не найдено точного совпадения, производится неточный поиск, что не всегда приводит к желаемому результату;
  • Выдается только один результат: фильмы c одинаковыми названиями – большая проблема;
  • IMDb не всегда правильно находит по русскому названию (как правило старые фильмы).

Надеюсь, это расширение будет кому-то полезно.
P.S. В данный момент расширение еще не прошло проверку в репозиторий Opera, поэтому даю ссылку на внешнее хранилище.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.