29 January 2011

Отмечание просмотренных серий на MyShows.ru

Programming

Постановка задачи


Задача: автоматизировать рутинные действия по отмечанию просмотренных эпизодов на сайте myshows.ru. Поясню, после просмотра очередной серии Теории Большого Взрыва я открываю мои сериалы, нахожу сериал, нахожу просмотренный эпизод и отмечаю его как «просмотренный».

После обнаружения api.myshows.ru сразу зародилась идея серьезно упростить этот процесс. Хотелось бы, чтобы это выглядело так: вызываем контекстное меню файла с только что просмотренной серией и выбираем «Отметить на myshows.ru».

В основе будет Ruby скрипт, который будет принимать имена файлов в качестве аргументов, определять имя сериала, номер сезона и эпизода и затем отмечающий серию в вашем профиле через API сайта.

API


Сначала было решено сделать обертку поверх их API на Ruby. Получилась ничем не примечательная библиотека myshows, использующая httparty для общения с сайтом. В силу общей занятости меня, в библиотеке реализована не вся функциональность сайта, а только поиск сериалов/эпизодов и их отмечание, так как именно это необходимо для решения поставленной задачи. Вот пример использования:

require 'rubygems'
require 'myshows'

profile = MyShows::Profile.new 'demo', 'fe01ce2a7fbac8fafaed7c982a04e229'

tbbt = profile.show 'big bang theory'
tbbt.title # => 'The Big Bang Theory'

pilot = tbbt.episode 1, 1
pilot.title # => 'Pilot'
pilot.check!

Стоит заметить, что метод Profile#show, который ищет сериал по имени среди ваших сериалов, оптимизирован для поиска именно имен сериалов. Он может находить сериалы по аббревиатуре названия, по части названия, по названию без пробелов и так далее. Это сделано в связи с тем, что названия сериалов в имени файлов зачастую сильно коверкаются: lietome.s03e01.webdl.rus.novafilm.tv.avi вместо lie.to.me.s03e01.webdl.rus.novafilm.tv.avi, House.M.D.s07e01.rus.LostFilm.TV.avi вместо House.s07e01.rus.LostFilm.TV.avi и так далее.

Парсинг имени файла


Скрипт должен уметь, получив имя файла с серией, распознать в нем имя сериала, номер сезона и эпизода. Everybody stand back. I know regular expressions. Поискав по локальной сети форматы записи этой информации в имени файла, выделил два основных и написал соответствующие регулярные выражения:
  • title.s01e01.blah.blah.avi;
  • Title — 1x01 — Episode Title.avi;
  • Title — 01 — Blah Blah.avi (подсказал друг анимешник).
Существуют так же вариации с другими разделителями или без них, это не сильно усложняет регулярные выражения. Они получается совсем нехитрые, Вы можете найти их в конечном коде скрипта в функции parse_filename.

UPD: напомнили, что один файл может соответствовать двум сериям. Эта проблема решается несложными правками в регулярных выражениях.

Скрипт


Объединив парсинг имени файла и использование библиотеки myshows получается простой скрипт, который получив в качестве аргументов имена файлов, пытается отметить их в Вашем профиле и сообщает в stdout об успехе этого действия:

$ myshows-checker ".../V.s02e01.LostFilm.TV.avi" ".../V.s03e01.LostFilm.TV.avi"
Checked V (2009) - 2x1 - Red Rain
Error: episode with number 3x1 was not found in show V (2009)

Имя пользователя и md5 пароля скрипт пытается вытащить из файла ~/.myshows, лучшего способа я не придумал.

Интеграция в файловый менеджер


Конечно этот скрипт можно использовать из других скриптов и из командной строки, но я все-таки смотрю сериалы открывая их двойным кликом в файловом менеджере.

Тут необходимо сказать, что я являюсь пользователем Mac OS X, и поэтому дальнейшие слова будут именно об интеграции ранее написанного скрипта с этой ОС. Если Вам это не интересно, можете перейти сразу к заключению.

Будем использовать Automator. Необходимо создать новую Службу, которая будет получать «выбранные файлы фильмов» в «любой программе».

Добавляем действие «Запустить shell-скрипт», выбираем в качестве языка «/usr/bin/ruby» с передачей ввода «как аргументов». Затем вставляем ранее написанный скрипт в поле для ввода скрипта, заменив то, что там было (для красоты можно удалить первую строку "#!/...").

Добавляем действие «Запустить AppleScript». Необходимо в каком-либо виде вывести информационные сообщения, которые печатал скрипт. Было решено воспользоваться функцией display dialog, получается примерно такой AppleScript:

on run {input, parameters}
  repeat with msg in input
    display dialog msg buttons {"OK"}
  end repeat
  return input
end run

Должно было получиться что-то похожее на это:


Служба готова к использованию, остается только сохранить и придумать имя. Теперь в Finder можно ее вызвать:


UPD: подсказали, что можно использовать Growl для вывода сообщений. Для этого необходимо единожды выполнить следующий AppleScript

tell application "GrowlHelperApp"
  register as application ¬
    "MyShows Checker" all notifications {"Notification"} ¬
    default notifications {"Notification"}
end tell

и внести изменения в созданную Службу

on run {input, parameters}
  repeat with msg in input
    tell application "GrowlHelperApp"
      notify with name ¬
        "Notification" title ¬
        "MyShows Checker" description msg ¬
        application name ¬
        "MyShows Checker" image from location ¬
        "file:///path/to/some/image.png"
    end tell
  end repeat
  return input
end run

По желанию можно после строк «image from location» указать путь к картинке, которая будет использоваться в качестве иконки, иначе просто сотрите кусок от «image from...» до ".../some/image.png".

Выглядит гораздо лучше чем «display dialog …»


Заключение


Оно работает, это радует.

Измерения показали что среднее время работы скрипта 2-5 секунд на отмечание серий одного сериала, то есть отметить один эпизод сериала и десять займет примерно одинаковое время, а вот отметить пилотные серии десяти разных сериалов займет 20-50 секунд, что, в принципе, никому не нужно. Самое узкое место всей системы — это запросы к сайту и выкачивание больших списков эпизодов. Служба созданная Automator'ом работает по-дольше, есть постоянная добавка.

А теперь у меня есть обращение к тем, кого заинтересовала эта идея. Наверняка есть люди, которые отмечают сериалы на myshows.ru и пользуются Windows, KDE, Gnome, …. Сам Ruby-скрипт является кросс-платформенным, но вот интеграция с конкретным файловым менеджером — нет. В связи с этим ищутся люди, которые смогли бы рассказать, как интегрировать подобный Ruby-скрипт в их любимый файловый менеджер.

UPD:
Спасибо Nebulosa за альтернативную реализацию на bash'е.
Tags:myshowsseriesсериалыrubyautomatorapplescriptmac os xgrowl
Hubs: Programming
+34
19.8k 55
Comments 66
Top of the last 24 hours