Эмси
Совершенно поразительно, что все подряд программы-компаньоны к Айтюнсу показывают информацию о играющей песне во всплывающем временном окошке тогда, когда песня только начинается. Это ужасно неудобно:
- когде песня только началась, тебе, как правило, на неё ещё наплевать;
- временные окошки обязательно всплывают не там, где тебе нужно, мешая работе;
- всплытия обычно сопровождаются анимацией, отвлекающей тебя от того, что ты делаешь;
- они висят на экране слишком долго: ты уже прочитал, а они всё ещё загораживают что-нибудь;
- они висят на экране слишком мало: ты только начал читать, а они исчезают;
- в момент, когда тебе нравится песня, и ты задаёшься вопросом о её названии, ответа на этот вопрос нет на экране.
В комплекте с каждым Маком идёт диск с инструментами для разрабоки. Понятное дело, что я их установил практически сразу же, как купил Мак. Я хотел сделать программу, которая бы тихо показывала в правой части меню текущую играющую в Айтюнсе песню. Безо всякого кретинского плавненького скролирования этого названия влево-вправо, как я видел в одной программе. Безо всяких там рейтинговых звёздочек. Тем же самым шрифтом, что и всё остальное. Короче, просто вот так:
Тогда я довольно быстро справился с этой задачей: Жан-Даниель Дюпа, автор Спарка (прекрасного менеджера клавиатурных шоткатов) подсказал мне, что нужно копать 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
Кстати, картинка сверху — это скриншот.
Офигенно! Спасибо.
Осталось повесить на щелчок открытие гугла с названием песни (чтобы можно было пойти на википедию или lyrics).
Отличное начинание :)
Стоит сделать какой-нибудь эффект при смене трека — сейчас порой проскакивает белый прямоугольник.
Да, меня это тоже напрягает, но так его рисует ОСь, а не я. Можно взять рисование на себя, но это ведь миллион вещей придётся изучить.
А как его установить?
Спасибо, разобрался.
Просто добавить в папку applescript=)
При чём тут Эплскрипт? Его не надо устанавливать, а запустить его можно из любой папки, куда ни положи.
<mode dream=«on»> Ей бы еще Play/Pause на иконку повесить... вообще был бы идеал. И иконку справа, а не слева, чтобы при ограниченном меню сначала убирался текст, а потом кнопка.</mode>
Вам действительно охота целиться в эту кнопку? Какой в этом смысл, когда у вас есть целая клавиатура нормальных, полноценных кнопок?
А нельзя ли сделать так, чтобы твой плагин автоматом включался при запуске iTunes и соответственно автоматом закрывался при выключении iTunes?
Нужно её просто добавить в Login Items и забыть. Зачем её дёргать туда-сюда? Да и Айтюнс тоже всё время запущен должен быть. Единственное, пока прога не умеет отслеживать момент, когда Айтюнс закрывается, чтобы исчезнуть. Но если нажать «Стоп» в нём, то текст пропадёт.
Работает только в лео?
Да, Scripting Bridge есть только в нём.
Хочу поблагодарить Яндексом! Какой номер кошелька?
Замечательная утилита. Но на очень длинных меню, например в 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
Можно отчернобелить, но тень точно нужно сделать.
И размер уменьшить, чтобы высота совпадала
с иджектом и динамиком