Подписаться на блог
В Твиттере

Реплики и ссылки на заметки

В Фейсбуке

Ссылки на заметки

Вконтакте

Ссылки на заметки

В Телеграме

Ссылки на заметки

В Тумблере

Заметки целиком

В Же-же

Заметки целиком

По РСС

Заметки целиком

Если что-то из этого не работает, напишите мне: ilyabirman@ilyabirman.ru.

Эмси

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

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

Тогда я довольно быстро справился с этой задачей: Жан-Даниель Дюпа, автор Спарка (прекрасного менеджера клавиатурных шоткатов) подсказал мне, что нужно копать 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 комментариев
Олег Андреев
Офигенно! Спасибо.

Осталось повесить на щелчок открытие гугла с названием песни (чтобы можно было пойти на википедию или lyrics).
Павел Заставницкий
Отличное начинание :)
Стоит сделать какой-нибудь эффект при смене трека — сейчас порой проскакивает белый прямоугольник.
Илья Бирман
Да, меня это тоже напрягает, но так его рисует ОСь, а не я. Можно взять рисование на себя, но это ведь миллион вещей придётся изучить.
Костя Камков
А как его установить?
Костя Камков
Спасибо, разобрался.
Просто добавить в папку applescript=)
Илья Бирман
При чём тут Эплскрипт? Его не надо устанавливать, а запустить его можно из любой папки, куда ни положи.
Илья Абламонов
<mode dream=«on»> Ей бы еще Play/Pause на иконку повесить... вообще был бы идеал. И иконку справа, а не слева, чтобы при ограниченном меню сначала убирался текст, а потом кнопка.</mode>
Илья Бирман
Вам действительно охота целиться в эту кнопку? Какой в этом смысл, когда у вас есть целая клавиатура нормальных, полноценных кнопок?
Костя Камков
А нельзя ли сделать так, чтобы твой плагин автоматом включался при запуске iTunes и соответственно автоматом закрывался при выключении iTunes?
Илья Бирман
Нужно её просто добавить в Login Items и забыть. Зачем её дёргать туда-сюда? Да и Айтюнс тоже всё время запущен должен быть. Единственное, пока прога не умеет отслеживать момент, когда Айтюнс закрывается, чтобы исчезнуть. Но если нажать «Стоп» в нём, то текст пропадёт.
Григорий Ноженко
Работает только в лео? 
Илья Бирман
Да, Scripting Bridge есть только в нём.
Александр Шпринц
Хочу поблагодарить Яндексом! Какой номер кошелька?
Илья Бирман
410018636248.
Егор Львовский
Замечательная утилита. Но на очень длинных меню, например в modo, пропадает совсем из Менюбара. Неплохо бы оставлять там иконку и показывать название песни при наведении :)
Иван Немытченко
Отчего бы не выложить код на гитхаб? Было бы интересно поиграться/пофоркать :)
Игорь Списивцев
Спасибо за утилитку. Play/Pause было б здорово повесить не на иконку, а на всю строку. И ещё двоеточие ставить только когда имя исполнителя не пустое.
Было б здорово приспособить её для воспроизведения интернет-радио. Сейчас у потока http://mp3.radioultra.ru/best-192.m3u выводится бесполезное BEST-FM Radio (Moscow) 100.5FM (так как стоит в названии). Но в айТюнсе под этой строчкой отображаются название композиции и имя исполнителя (чередуется с адресом сайта). Хорошо бы вытаскивать их и отображать.
Илья Бирман
Да, чтобы это сделать придётся поднапрячься. Название текущей песни интернет-радио достаётся другим способом, чем информация об играемом файле. Попробую победить.

Update: Победил: http://ilyabirman.ru/meanwhile/2009/01/05/1/. Оказалось проще, чем я думал.
Сергей
А зачем иконка Play/Pause?
Вадим Молчанов
Спасибо за Эм-си. Будет дальнейшее развитие?
Илья Бирман
Жизнь покажет :-)
Ещё один Илья
Для Play/Pause (а также Back/Forward) есть ByteController (Google).

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

И вот ещё, оно пропадает, когда некоторые приложения становятся активными. Я так понимаю, это из-за того, что тупо не хватает места для названия? Что, если попробовать сделать максимальную фиксированную ширину и гонять название скроллом?
Павел Заставницкий
Уже несколько раз нечаянно кликал по названию песни в надежде открыть окно айтюнса таким образом :)
Эдик Людоедоед
Стоит своровать иконку с айФона, по-моему:
http://img-fotki.yandex.ru/get/3101/ludoedoed.0/0_2042b_258cc699_L.jpg
Можно отчернобелить, но тень точно нужно сделать.
И размер уменьшить, чтобы высота совпадала
с иджектом и динамиком

Пользовательский интерфейс
Доступен первый раздел
электронного учебника

Популярное