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

  • Tutorial

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


Задача: автоматизировать рутинные действия по отмечанию просмотренных эпизодов на сайте 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'е.
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 66
  • +2
    А я обычно отмечаю серии сразу после скачивания. Да и не такая уж это рутина %)
    • +6
      Хм, Вы видимо смотрите сразу после скачивания? У меня обычно довольно много не посмотренного…
    • 0
      Нет, не сразу. Просто не просмотренные серии находятся в отдельной папке.
      • 0
        А просмотренные в корзине.
        • +3
          Если все будут удалять просмотренные серии в корзину, то кто же будет их раздавать для тех кто не посмотрел?
          • 0
            Во всем должен быть здоровый эгоизм ;)
      • +2
        Вот бы еще в виде плагина для видеоплеера, что бы после 60-70-80% просмотра файла автоматически его «скроблил».

        А автору топика респект за такой скрипт!
        • 0
          А какие видеоплееры с поддержкой плагинов вы знаете? Я использую VLC, QT и ни тот, ни другой вроде бы ничего подобного не поддерживает.
          • 0
            Хотя вроде есть какие-то VLC Extensions
          • 0
            Самый очевидный, но грязный способ — инжектиться в процесс плеера, при этом подменив оригинальный исполняемый файл на свой, благо для пользователя это останется незамеченным, все ведь упаковано в бандлы. Ну или искать соответствующие заголовки окон, но тогда другая проблема — как понять, просмотрел ли пользователь серию или нет. Может у него на паузе был файл 40 минут, да и придется все время держать в памяти не нужный процесс.
          • 0
            Есть такой сериальный плагин code.google.com/p/mptvseries/ для медиацентра Mediaportal, авторы которого сейчас работают над интеграцией с аналогом майшоуза — trakt.tv, плагин при просмотре серии автоматически отсылает инфу на этот сайт, значит при некоторых изменениях можно отсылать инфу на майшоуз и больше не заботиться о ручном отмечаниии серии.
          • 0
            Прикольно, зарегился. А можно организовать рассылку на выход новых серий? С появление в Фэйсбуке почты очень полезный был бы аддон.
            • +2
              Ужаснулся :)

              Нас 37106 пользователей. Все вместе мы убили
              3105 лет 10 месяцев 8 дней 16 часов 48 минут.
              В среднем на человека: 1 месяц 13 часов 51 минуту.
              • +4
                У них есть RSS на новые серии и их появление на торрентах, плюс есть сервис tvepisodes.ru
                • +1
                  для этих целей можете kinobaza.tv использовать
                • +13
                  От создателей автору — молодец :).
                  Как раз сегодня обновили мы API до версии 1.4, и там появился ещё тот функционал, которого нет на сайте (или он не представлен широко) — оценка серии, добавление серии в избранное или игнор-лист :).

                  Так что можно к скрипту вашему ещё добавить оценку по пятибальной шкале (вызвать сначала check, потом rate).
                  Успехов! Если какие-то вопросы есть или предложения по api — пишите :)
                  • +1
                    больше спасибо Вам за удобный сервис!
                    • +1
                      Присоединяюсь: огромное спасибо за сервис!
                      Автору топика тоже респект: налицо творческий подход и нестандартное мышление!
                      • 0
                        Рейтинг это хорошо, думаю сделаю.

                        А из замечаний: у вас json отдается с заголовком text/html, это как-то не по фен-шую. HTTP библиотека по началу с ума сходила от этого.
                        • 0
                          Хотелось бы кроме кнопочки «посмотрел эпизод» кнопочку «скачал эпизод» и чтобы на странице profile/ отмеченные как уже скачанные как-то отличались от не отмеченных.
                          • 0
                            Я тут вожусь со скриптом, обнаружил что при поиске фраза не «триммится», т.е. «Blue Mountain State » вернет 404, но без пробела в конце — всё находит.

                            Собственно, перед поиском фразу оберните в trim () если это php, спасибо заранее.
                            • 0
                              А еще попробуйте «V», «Flash Forward», «House M D»…
                            • 0
                              И еще! :)

                              Иногда для нахождения имени сериала пользуешься ссылкой , так вот:

                              api.myshows.ru/shows/search/?q=Star%20Wars%20The%20Clone%20Wars не работает,

                              api.myshows.ru/shows/search/?q=Star%20Wars:%20The%20Clone%20Wars
                              работает.

                              Поиск ведётся по имени файла и двоеточие в нём почти никогда не будет, т.к. это зарезервированный символ на Windows.

                              Расширьте вариации поиска, чтобы искало и без двоеточия.
                              • 0
                                У нас разные подходы: Вы просите изменить поиск на стороне сервера, я же усовершенствовал его на стороне клиента :)

                                Изначально у меня был небольшой скрипт на примерно 70 строк, но когда я начал тестить реальные файлы, понял, что это никуда не годится. Написав в myshows.ru ответа не получил, тогда и решил сделать отдельно библиотеку и мудреный поиск.
                            • 0
                              пожалуй следует сказать что тем у кого дефалтный ruby нужно будет поставить пару пакетов

                              $ sudo gem install httparty
                              $ sudo gem install memoize

                              и в файле с паролем логин пароль разместить на разных строках.

                              $ cat ~/.myshows
                              demo
                              fe01ce2a7fbac8fafaed7c982a04e229
                              • 0
                                gem install myshows долже по зависимостям вытянуть все остальные, только что проверил. Это все и так написано в README, просто не стал сюда копипастить.
                                • 0
                                  а я подумал что модуль myshows самостоятельно поставить ) что и сделал, скачав с github
                              • +1
                                если сериал не в списке тех которые смотришь, то скрипт возвращает ошибку. Может сделать проверку на существование сериала и добавлять его в список просматриваемых?
                                • 0
                                  Есть проблема с глобальным поиском сериалов по имени. Поиск по названию «V» (Визитёры) выдает кучу мусора, и разобраться что из этого наш сериал очень сложно. Поэтому чтобы скрипт хоть что-то находил правильно было сделано решение искать только по сериалам пользователя, так как их меньше.
                                  Ну и все-таки один-то раз можно зайти на сайт отметить сериал статусом «Смотрю»
                                • 0
                                  Я тоже занимаюсь похожим велосипедом, правда, на Java и с GUI. Уже есть интеграция с MyShows (двусторонняя), uTorrent, планируется интеграция с MPCHC (в перспективе и с другими плеерами), remote-приложение для Android.
                                  Когда приложение выйдет из стадии pre-pre-alpha, обязательно напишу на хабре. А пока что скриншот
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • +1
                                      Потому что некоторые смотрят много сериалов и трудно запомнить какие серии смотрел, а какие нет.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • +8
                                          Значит Вам не нужен myshows.ru, поздравляю :)
                                        • –1
                                          Просто если трудно запомнить что смотрел — может смотреть поменьше? А то ведь смысл смотреть если потом забываешь?
                                      • 0
                                        Руби ставить не хочу, а вот bash-скрипт запилить — милое дело!

                                        Спасибо за наводку на сайт и идею. Всё время забываю (а чаще просто не запоминаю) номер серии, сайт для меня — спасение!
                                        • 0
                                          Настроил у себя, отличное применение автоматору, раньше даже как-то не задумывался о нем :) Сервис тоже неплохой, все время забывал на какой серии остановился.
                                          респект
                                          • +5
                                            cypok, я тут понял, что у нас же есть в базе некоторые имена файлов (от популярных сериалов точно) и расширил API, добавив туда ещё один метод — поиск эпизодов по файлу:

                                            api.myshows.ru/shows/search/file/?q=Lie.To.Me.s03e08.rus.LostFilm.TV.avi
                                            api.myshows.ru/shows/search/file/?q=House.M.D.s07e10.rus.720p.LostFilm.TV.mkv
                                            api.myshows.ru/shows/search/file/?q=Star.Wars.The.Clone.Wars.s02e01e02.rus.LostFilm.TV.avi

                                            Предлагаю модифицировать скрипт и поставить туда использование этого метода (работает он достаточно быстро).
                                            • 0
                                              Может просто все эти регулярки перенести на Вашу сторону, а апи на входе будет получать имя файла в любых методах. В оценке и в отметке просмотренного…
                                              • +1
                                                В таком случае api.myshows.ru/shows/search/file/?q=Lie.To.Me.s03e12.rus.LostFilm.TV.avi в JSON параметр match = 85. Это означает, что файла такого он не нашел, но нашел сериал и серию (по регуляркам). А в оценке и отметке нужен episodeId, без него никак.
                                                • 0
                                                  А какие еще значения match возможны?
                                                  • 0
                                                    Пока только эти два, в дальнейшем — 60 — из серии «скорее всего этот сериал и возможно этот эпизод… „
                                              • +1
                                                Эх… я уже bash-скрипт запилил, используя поиск сериала и потом поиск серии для определения id серии… :)

                                                Сейчас поправим с учетом расширения API.
                                              • +1
                                                Решил потестировать этот метод…
                                                Выдало 404 на следующие запросы:
                                                blue.mountain.state (Blue Mountain State)
                                                it.crowd (The IT Crowd)
                                                flash.forward (FlashForward)
                                                avatar (Avatar: The Last Airbender)
                                                over.there (Over There (US))

                                                А моя поделка все эти случаи успешно обрабатывает, я специально этого добивался. Я думаю можно попробовать сначала воспользоваться этим поиском (/search/file/), а потом уже через перебор всех сериалов пользователя. Для большинства сериалов сработает первое, а что не осилит, добьет мой метод.
                                                • +1
                                                  flash forward обычно пишут без. api.myshows.ru/shows/search/file/?q=flashforward.s01e01.avi :)
                                                  it crowd идет как the api.myshows.ru/shows/search/file/?q=the.it.crowd.s01e01.avi
                                                  а по остальным — просто в базе нет ;).
                                                  В общем, для популярных должно работать, а то, что не нашлось — вторым методом, это правильнее будет.

                                                  • +1
                                                    Это была не претензия, поймите меня правильно, просто я объяснил, почему я делал ручной поиск по сериалам пользователя, почему он в общем случае эффективнее.
                                                  • 0
                                                    Вот тут результаты того, как работают два подхода на выборке из тех сериалов, что я сейчас смотрю. Server — значит имя файла было распознано через /shows/search/file/, client — значит был ручной парсинг и перебор сериалов. Скорость работы обоих вариантов сильно варьируется и для обоих вариантов лежит в диапозоне 7-12 секунд.
                                                  • 0
                                                    И иногда бывают какие-то странные «зависания»
                                                    time {s.episodes_by_filename "Star.Wars.The.Clone.Wars.s02e01e02.rus.tv.AVI" }
                                                          user     system      total        real
                                                      0.010000   0.000000   0.010000 ( 35.431711)
                                                  • –2
                                                    Объясните зачем этот сайт? Чтобы отмечать сериалы и сери икоторые вы посмотрели? Я и так помню допустим…
                                                    • 0
                                                      Хорошо, значит Вам не нужен этот сайт.
                                                      • –1
                                                        Да, пвыходит так, пока проблем с память нету — не нужно. Плюс, список сериалов на сайте ну оооооочень скудный, российских вообще нету…
                                                        • 0
                                                          А вы видели рос. базу сериалов? сделаете? тогда будет ;)
                                                          • 0
                                                            рос. база сериалов? не, не видел
                                                      • 0
                                                        Сайт также нужен, чтобы видеть какие новые серии появились, а не только, чтобы отмечать.
                                                        • –2
                                                          Т.к российских сериалов там нету, не вижу преимуществ над on-my.tv или tvcountdown.com, или людым 0sec torrent трекером :)
                                                          • 0
                                                            Многие русские люди любят смотреть сериалы на русском, удивительно.
                                                        • 0
                                                          удобно популярность отслеживать, искать «похожие». видеть, что смотрят знакомые.
                                                        • 0
                                                          Я не пользуюсь надоедливым Growl, но заметил, что он добавляет в Automator действие «Show Growl notification», не надо для этого писать свой AppleScript :-)
                                                          • 0
                                                            И как в него передать вывод предыдущего действия? Как я понял в него можно только константные строки забить.
                                                          • 0
                                                            Блин, авторизация в API по md5 от пароля… Куда катится мир…
                                                            • 0
                                                              А можно куда-нибудь выложить файлом?

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