Красивые «фишки» и «штучки» это конечно очень хорошо, но что будет представлять из себя плэйлист без текстовой информации о песнях? По этому мы в первую очередь позаботимся об этом. Конечно же, при создании собственного скрипта, мы практически никогда явно не разделяем различные стадии. Особенно это касается создания скриптов для текста и скриптов для цветовых схем, процессы создания которых идут параллельно, по той причине, что большая часть описания цветовой схемы определяет как именно будет выглядеть текстовая часть. И наоборот. Вот, хорошее место чтобы еще раз сказать: никто не заставляет Вас повторять мой дизайн буква в букву. Если что то Вас не устраивает - просто возьмите и сделайте как Вам угодно. В конце концов в том том то и прелесть Fooobar2000: у каждого есть свой собственный выбор, неограниченный конфигурацией из нескольких пресетов.
Ну что-то я совсем заболтался Итак, идите в Foobar2000 → Preferences, в открывшемся дереве выберите Display → Columns UI → Playlist View
и перейдите на закладку Columns. С левой стороны будет список всех имеющихся столбцов. Мы собираемся начать с нуля, поэтому смело нажимайте кнопку Delete для того чтобы их все удалить.
Для создания новых столбцов имеются 2 кнопки: New создает новый столбец в конце списка, т.е. этот столбец будет крайним справа в плэйлисте. А кнопка Insert вставляет новый столбец перед тем столбцом, который выбран в данный момент.
Наш первый столбец содержит информацию о исполнителе и альбоме. Нажмите New для того чтобы создать столбец, которому автоматически присвоится имя New column. Замените это имя в поле Display name значением Artist/Album (или любым другим, которое по Вашему лучше подходит). Установите значение width (ширина столбца) равное 250 и Aligment равное Left (выравнивание по левому краю). Самым важным является большое поле ввода внизу. Если вкладка Display еще не активна, то щелкните на ней мышкой и приготовитесь вводить код.
В большинстве столбцов мы должны делать различия между композициями принадлежащими полным альбомам (с этого момента я буду называть их 'альбомными трэками') и отдельными композициями (отдельными трэками). Задача скрипта будет такая: Если работаем с альбомным трэком, то делаем то-то. Если же работаем с отдельным трэком, делаем другое. Конечно же для этого лучше всего подойдет конструкция if
<pre class="code">$if(<b>$get_global(isAlbum)</b>
,
// Tasks for album tracks go here
,
// Tasks for single tracks go here
)</pre>
Обратите внимание на часть выделенную жирным шрифтом. Т.к. разделение альбомный/отдельный трэк нам нужно повсеместно, то самым эффективным решением будет выполнить такой запрос только один раз, сохранив его результат в глобальной переменной и в дальнейшем просто использовать эту переменную там где необходимо. Это спасает нас от перепечатывания одних и тех же строк снова и снова, и делает скрипт быстрее, потому что запрос фактически выполняется только один раз.
Посмотрите на закладку General , поставьте галочку Use global variables for display (использовать глобальные переменные для отображения) и активируйте закладку Variables внизу. Сюда мы введем код для проверки альбома.
$if($and(%tracknumber%,%album tracks%,%album%), $set_global(isAlbum,1) )
В первой строке используется функция $and()
для того чтобы проверить наличие тэгов tracknumber, album tracks и album. Это выражение будет истинным только в случае когда в файле содержатся все три тэга. Говоря простыми словами, мы предполагаем что композиция является альбомным трэком если в ней присутствуют все эти тэги. В противном случае она рассматривается как отдельный трэк.
Во второй строке $set_global()
создает переменную с именем isAlbum
и присваивает ей значение 1
. Таким образом, если все три тэга имеются, то переменная isAlbum
будет существовать. В противном случае этой переменной не будет.
Все что определено на закладке Global / Variables при помощи $set_global()
может быть получено в любом месте кода при помощи $get_global()
. И это именно то, что мы делаем в первом скрипте. Давайте вернемся к нему и вставим код для отдельных трэков
$if($get_global(isAlbum) , // Tasks for album tracks go here , // Tasks for single tracks go here [%artist%] )
Очень легко и очень скучно, не правда ли? Мы просто ищем тэг artist (не забудьте про подстановку полей, скрывающуюся за ним) и используем квадратные скобки, для того чтобы предотвратить показ знака ?
, в случае отсутствия тэга.
Случай с альбомным трэком более интересен. Взгляните еще раз на скриншот завершенного дизайна. На первых пяти строках альбома Вы видите текст. Чтобы добится такого результата мы использовали функцию $select()
для фильтрации по номеру трэка (который по существу представляет собой номер строки в альбоме).
$select(%tracknumber%, // Track 1 $if($strcmp(%codec%,'ATSC A/52'),'dolby digital ac3', $if($info(lame_version),'lame', $lower(%codec%) )) ' album {', // Track 2 ' '$if2(%album artist%,'<no artist>'), // Track 3 ' '$if2(%album%,'<no album>'), // Track 4 ' '['Disc '%disc%$tab()]$if2(%album date%,[%date%])$tab(), // Track 5 '}' )
В первую очередь обратите внимание на третью строку в секции Track 1. Она возвращает имя аудио кодека. Конечно же здесь мы делаем небольшое допущение, потому что %codec%
показывает кодек только для первого трэка в альбоме. Но неужели кто-то кодирует разные трэки с одного альбома разными кодеками?
$Lower
переводит имя кодека в нижний регистр.
Поднимемся на две строчки выше. Представьте что мы работаем с альбомом в формате AC3 (что, вообще-то, маловероятно). В этом случае команда %codec%
вернет строку ‘ATSC A/52’ в качестве имени кодека, что с технической точки зрения совершенно верно, так как это официальное название, установленное МСЭ. Несмотря на это, с трудом верится что всем знакомо такое обозначение. Поэтому мы используем $if()
в сочетании с $strcmp()
(эта функция говорит нам являются две ли строки, переданные как аргументы, идентичными) для того чтобы перехватить ‘ATSC A/52’ и взамен вывести ‘dolby digital ac3’.
Нечто подобное происходит и на следующей строке. Функция $info()
используется для получения технической информации о файле. Здесь мы ищем lame_version
для того чтобы определить MP3 файлы полученные при помощи кодировщика Lame. Если мы встретим подобный файл, мы покажем ‘lame’ вместо ‘MP3’, которое бы мы получили при использовании %codec%
. MP3 файлы сжатые другим кодировщиком (не-Lame) не имеют поля lame_version
и поэтому $if()
не сработает в этом случае. Поэтому для таких фалы будут отображены просто как ‘mp3’. Правда на данный момент все Ваши файлы сжатые Lame будут так же отображаться как 'mp3’, потому что Foobar2000 0.9 пока не поддерживает определения поля lame_version
. Но я абсолютно уверен, что в конце концов такая возможность появится.
Итак мы посмотрели на строку $lower(%codec%)
. Последующая пара скобок закрывает два if. Следующая же строка добавляет статическую строку после информации о кодеке.
Код из секции track 1 так же является нашим первым примером использования вложенных выражений, когда второе выражение $if()
является частью иначе первого $if()
. Как это можно перевести: Если используемый кодек называется ‘ATSC A52’, отобразить более понятное ‘dolby digital ac3'. Иначе выолнить вторую команду if: Проверить наличие поля lame_version
и отобразить ‘lame’. Если же такого поля нет, использовать то что выдаст %codec%
. И этим мы завершаем 1-ю строку альбома.
Вторая строка начинается с трех знаков пробела, служащих для отступа в плэйлисте. $if2()
ищет и показывает тэг %album artist%
(и снова не забываем про подстановку полей) или, если Ваши файлов не имеют правильных тэгов, строку ‘no-artist’. То же самое происходит и на 3-й строке, но уже с тэгом album.
Строка 4 содержит информацию о номере диска и дате релиза. И в первую очередь мы отображаем значение поля %disc%
, используя квадратные скобки для тоо чтобы выводить значение только в случае если это поле присутствует, и отображаем, к примеру, Disc 1. Затем идет $tab()
, которое вставляет знак табуляции, используемый для выравнивания текста в столбце. Это работает так:
выравнивание по левому краю $tab() выравнивание по правому краю выравнивание по левому краю $tab() выравнивание по центру $tab() выравнивание по правому краю
Теперь для многодисковых альбомов мы выводим информацию о диске на левой стороне столбца, за этой информацией идет выравненный по правому краю последующий текст. Для однодисковых альбомов эта колонка пуста, не считая трех отступов (знаков пробела).
Далее наступает время $if2()
позаботиться об отображении даты. В первую очередь мы проверяем наличие тэга album date и отображаем его, если он есть. Напомню что тэг album date используется в сборниках, когда дата выхода отдельного трэка отличается от даты выхода альбома (сборника). если же данный тэг не найден, то отображается тэг date, но, благодаря квадратным скобкам, опять же, только в том случае если этот есть в файле.
Ну вот мы и подошли к 5-й строке. В общем-то я даже не знаю что про нее сказать Просто напросто закрывающая скобка для нашего выражения, начатого на строке 1. Вот, собственно, и все для отображения в режиме альбома в этом столбце. Полностью это выглядит так:
$if($get_global(isAlbum) , // --- Album view --- $select(%tracknumber%, // Track 1 $if($strcmp(%codec%,'ATSC A/52'),'dd_ac3', $if($info(lame_version),'lame', $lower(%codec%) )) ' album {', // Track 2 ' '$if2(%album artist%,'<no artist>'), // Track 3 ' '$if2(%album%,'<no album>'), // Track 4 ' '['Disc '%disc%$tab()]$if2(%album date%,[%date%])$tab(), // Track 5 '}' ), // --- Single view --- [%artist%] )
Создайте новый столбец, назовите его #, устновите ширину (Width) равную 30 пикселей и выравнивание по центру (Alignment равное Centre). В этом столбце будет отображаться номер трэка для альбомов, для одиночных трэков мы ничего не будем отображать. Скрипт предельно прост
$if($get_global(isAlbum), $ifgreater(%tracknumber%,9, %tracknumber%, '0'$num(%tracknumber%,1) ))
Первая строка Вам уже наверняка знакома, она выполняет остальные строки для альбомных трэков, и, естественно, пропускает их для одиночных.
Строки начиная со второй являются вызовом одной команды - $ifgreater()
, которая делает следующее: Если номер трэка больше 9 (что означает что он состоит из 2-х цифр), то отображать номер трэка. Иначе отобразить 0, а затем номер трэка, без нуля в начале.
Стоит отметить, что вы не можете не указывать часть иначе в коммандах $ifgreater()
, такое разрешается только для обычного $if()
.
Функция $num(number,length)
работает следующим образом: она берет число number и присоединяет нули к его началу до тех пор пока, пока дляна строки не станет равной length. Если же длина строки (количество цифр) в number уже больше length, то никаких действий выолняться не будет. Если же строка содержащая число number уже заполнена нулями спереди до длины большей чем length, то после выполнения функции лишние нули будут удалены. Данная возможность этой функции именно то, что нам надо в этом скрипте, потому что ее вызов с length равной 1 всегда удаляет любые нули в начале строки, а подстановка полей foobar2000 всегда дополняет нулями номер трэка до двух цифр. Вы могли заметить, что наш вызов $ifgreater()
сам ставит ноль в для номера трэка, если он меньше 10. Вы спросите, зачем мы подставляем ноль сами, хотя мы обрезали его перед этим используя $num(%tracknumber%,1)
? Почему не не используем стандартную подстановку полей, которая автоматически добавляет ноль? Так вот, далее мы планируем отображать этот ведущий ноль другим цветом, а используя стандартную подстановку полей это невозможно.
Собственно скрипт для столбца Tracknumber готов. Тем не менее мы добавим одну маленькую изюминку, сделав отображение номеров трэков в шестнадцатеричной системе. Конвертация числа осуществляется простым вызовом функции $hex()
. Получим наш финальный скрипт:
$if($get_global(isAlbum), $ifgreater(%tracknumber%,15, $hex(%tracknumber%,1), '0'$hex(%tracknumber%,1) ))
Синтаксис у $hex()
точно такой же как и у $num()
. Все что нам нужно сделать, это поместить все выводимые номера трэков в функцию $hex()
и немного изменить код для добавления нулей, потому что в шестнадцатеричной системе вторая цифра появляется у числа большего F, равному 15 в десятеричной системе. Соответственно нам нужно заменить нашу 9-ку во второй строке скрипта на 15.
Конечно же Вы можете отображать номера трэков так как Вам угодно, я же поклонник шестнадцатеричной системы, и буду использовать этот скрипт на всем протяжении этого пособия.
~~DISCUSSION~~