Эмси

Совершенно поразительно, что все подряд программы-компаньоны к Айтюнсу показывают информацию о играющей песне во всплывающем временном окошке тогда, когда песня только начинается. Это ужасно неудобно:

  • когде песня только началась, тебе, как правило, на неё ещё наплевать;
  • временные окошки обязательно всплывают не там, где тебе нужно, мешая работе;
  • всплытия обычно сопровождаются анимацией, отвлекающей тебя от того, что ты делаешь;
  • они висят на экране слишком долго: ты уже прочитал, а они всё ещё загораживают что-нибудь;
  • они висят на экране слишком мало: ты только начал читать, а они исчезают;
  • в момент, когда тебе нравится песня, и ты задаёшься вопросом о её названии, ответа на этот вопрос нет на экране.

В комплекте с каждым Маком идёт диск с инструментами для разрабоки. Понятное дело, что я их установил практически сразу же, как купил Мак. Я хотел сделать программу, которая бы тихо показывала в правой части меню текущую играющую в Айтюнсе песню. Безо всякого кретинского плавненького скролирования этого названия влево-вправо, как я видел в одной программе. Безо всяких там рейтинговых звёздочек. Тем же самым шрифтом, что и всё остальное. Короче, просто вот так:

Название песни в менюбаре

Тогда я довольно быстро справился с этой задачей: Жан-Даниель Дюпа, автор Спарка (прекрасного менеджера клавиатурных шоткатов) подсказал мне, что нужно копать API под названием Scripting Bridge. Эта штука позволяет используя эплскриптовый словарь любых приложений общаться с ними. Получается вполне поэтический код. Вот так, например, узнаём, что играет в Айтюнсе:

iTunesApplication *iTunes;
iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
if ([iTunes isRunning]) NSString *text = [[iTunes currentTrack] name];

Добиться того, чего я хотел, оказалось не так сложно, но вот только для того, чтобы следить за Айтюнсом, приходилось использовать таймер. Каждые полсекунды я заново спрашивал у бедного Айтюнса, что же в нём играет:

updateTimer = [[NSTimer scheduledTimerWithTimeInterval:(.5)
  target:self selector:@selector(updateSong:) userInfo:nil repeats:YES] retain];

Вчера я наконец-то освоил штуку под названием Distributed Notification Center, которая позволяет отслеживать события в других программах. И поэтому теперь я делаю вот так:

notificationCenter = [NSDistributedNotificationCenter defaultCenter];
[notificationCenter addObserver:self
  selector:@selector(updateSong:) name:@"com.apple.iTunes.playerInfo" object:nil];

А ведь такую штуку уже как бы не стыдно показать. Если кто-то хочет попробовать — вперёд, всего 12 килобайт (зип-архив). Называется «Эмси» (Emcee.app). У программы нет меню, иконки в Доке и она отсутствует в списке Force Quit, поэтому чтобы из неё выйти нужно либо открыть Activity Monitor и прибить её там, либо просто сказать терминалу: killall Emcee

Кстати, картинка сверху — это скриншот.

Дальше
16 комментариев
Олег Андреев 2009

Офигенно! Спасибо.

Осталось повесить на щелчок открытие гугла с названием песни (чтобы можно было пойти на википедию или lyrics).

Павел Заставницкий 2009

Отличное начинание :)
Стоит сделать какой-нибудь эффект при смене трека — сейчас порой проскакивает белый прямоугольник.

Илья Бирман 2009

Да, меня это тоже напрягает, но так его рисует ОСь, а не я. Можно взять рисование на себя, но это ведь миллион вещей придётся изучить.

Костя Камков 2009

А как его установить?

Костя Камков 2009

Спасибо, разобрался.
Просто добавить в папку applescript=)

Илья Бирман 2009

При чём тут Эплскрипт? Его не надо устанавливать, а запустить его можно из любой папки, куда ни положи.

Илья Абламонов 2009

<mode dream=«on»> Ей бы еще Play/Pause на иконку повесить... вообще был бы идеал. И иконку справа, а не слева, чтобы при ограниченном меню сначала убирался текст, а потом кнопка.</mode>

Илья Бирман 2009

Вам действительно охота целиться в эту кнопку? Какой в этом смысл, когда у вас есть целая клавиатура нормальных, полноценных кнопок?

Костя Камков 2009

А нельзя ли сделать так, чтобы твой плагин автоматом включался при запуске iTunes и соответственно автоматом закрывался при выключении iTunes?

Илья Бирман 2009

Нужно её просто добавить в Login Items и забыть. Зачем её дёргать туда-сюда? Да и Айтюнс тоже всё время запущен должен быть. Единственное, пока прога не умеет отслеживать момент, когда Айтюнс закрывается, чтобы исчезнуть. Но если нажать «Стоп» в нём, то текст пропадёт.

Григорий Ноженко 2009

Работает только в лео?

Илья Бирман 2009

Да, Scripting Bridge есть только в нём.

Александр Шпринц 2009

Хочу поблагодарить Яндексом! Какой номер кошелька?

Илья Бирман 2009
Егор Львовский 2009

Замечательная утилита. Но на очень длинных меню, например в modo, пропадает совсем из Менюбара. Неплохо бы оставлять там иконку и показывать название песни при наведении :)

Иван Немытченко 2009

Отчего бы не выложить код на гитхаб? Было бы интересно поиграться/пофоркать :)

Игорь Списивцев 2009

Спасибо за утилитку. Play/Pause было б здорово повесить не на иконку, а на всю строку. И ещё двоеточие ставить только когда имя исполнителя не пустое.
Было б здорово приспособить её для воспроизведения интернет-радио. Сейчас у потока http://mp3.radioultra.ru/best-192.m3u выводится бесполезное BEST-FM Radio (Moscow) 100.5FM (так как стоит в названии). Но в айТюнсе под этой строчкой отображаются название композиции и имя исполнителя (чередуется с адресом сайта). Хорошо бы вытаскивать их и отображать.

Илья Бирман 2009

Да, чтобы это сделать придётся поднапрячься. Название текущей песни интернет-радио достаётся другим способом, чем информация об играемом файле. Попробую победить.

Update: Победил: http://ilyabirman.ru/meanwhile/2009/01/05/1/. Оказалось проще, чем я думал.

Сергей 2009

А зачем иконка Play/Pause?

Вадим Молчанов 2009

Спасибо за Эм-си. Будет дальнейшее развитие?

Илья Бирман 2009

Жизнь покажет :-)

Ещё один Илья 2009

Для Play/Pause (а также Back/Forward) есть ByteController (Google).

А вообще было бы очень круто видеть там время, оставшееся до конца трека. )

И вот ещё, оно пропадает, когда некоторые приложения становятся активными. Я так понимаю, это из-за того, что тупо не хватает места для названия? Что, если попробовать сделать максимальную фиксированную ширину и гонять название скроллом?

Павел Заставницкий 2009

Уже несколько раз нечаянно кликал по названию песни в надежде открыть окно айтюнса таким образом :)

Эдик Людоедоед 2009

Стоит своровать иконку с айФона, по-моему:
http://img-fotki.yandex.ru/get/3101/ludoedoed.0/0_2042b_258cc699_L.jpg
Можно отчернобелить, но тень точно нужно сделать.
И размер уменьшить, чтобы высота совпадала
с иджектом и динамиком

Мои книги