12 лет назад 17 октября 2006 в 12:37 138

Как-то раз мой приятель-линуксоид Олег Бройтман хотел записать на болванку кинофильм. И обнаружил, что файл на болванку не влезает. Причем речь шла о каком-то десятке лишних мегабайт. Другой бы на его месте либо расстроился и плюнул на все это дело, либо, опять же, расстроился и пошел бы в магазин за приводом, который умеет писать DVD. Но мой приятель не пораженец и не транжира, поэтому он сел и написал скрипт, который может записать на болванку файл, несколько больший, чем можно на нее записать при штатном режиме работы.

Кстати говоря, мой приятель вообще очень любит писать скрипты и, что самое главное, умеет это делать. Первые скрипты он написал еще тогда, когда даже не слышал слова “Linux”. А работал он тогда в системе DOS и предпочитал объединять готовые программы в громадные bat-файлы. Как-то раз проходил мимо его компьютера один человек, заглянул в монитор и сказал: “Да ты же типичный линуксоид!” Олег подумал и, действительно, стал линуксоидом. В чем не раскаялся и по сей день.

Однако вернемся к нашей задаче. Для ее решения надо вспомнить про то, что практически все современные приводы поддерживают режим записи, называемый пережигом (Overburning, Oversizing) и позволяющий записать на болванку некоторое количество дополнительной информации. Поскольку скрипт для пережига болванки является не единственным скриптом для записи компакт-дисков, то есть смысл указать наиболее общие параметры, которые будут использоваться практически каждым скриптом в одном файле.

Файл .config выглядит так:
cd_image_iso=”$HOME/work/
cd-image.iso”
dev_cdrw=/dev/cdrw
dev_sg=/dev/sg0
dev_scsi=0,1,0
fs_cdrw=/cdrw
fs_mnt=/mnt
eject_cdrw=cdrw
speed=16.

Первая строка файла конфигурации указывает на директорию и название iso-файла, который является образом записываемого диска (iso-файл можно создать командой mkisofs). В следующих трех строках указываются устройства записи на компакт-диск. Наличие трех строк объясняется тем, что скрипты используют ссылки на один и тот же привод, как на IDE-, так и на SCSI-устройство (в системе Linux пишущий привод воспринимается как устройство, подключенное по интерфейсу SCSI), а третья строка – адрес того же самого устройства для низкоуровневой программы записи.

Следующие две строки описывают файловые системы, куда будут монтироваться диски командой mount. Смысл завершающих строк конфигурационного файла очевиден – указывается устройство, лоток которого будет выдвинут после завершения работы, и определяется скорость записи (разумеется, в каждом конкретном случае следует поставить реальную скорость записи, поддерживаемую приводом). Общий скрипт для записи любого компакт-диска называется cdrec-data и выглядит следующим образом:

#! /bin/sh
. .config
exec cdrecord -v speed=”$speed” dev=”$dev_scsi” -data “$cd_image_iso”.

Обратите внимание на первую строку скрипта. Она говорит о том, что данный скрипт написан на командном языке shell, который присутствует практически в любом дистрибутиве системы Linux и ставится по умолчанию. Для того чтобы понять работу скрипта, вовсе не обязательно уметь программировать. Ясно видно, что вызывается команда cdrecord, которая записывает на устройство dev_scsi файл cd_image_iso со скоростью speed. Как вы можете заметить, пока о пережиге речь не идет. Но этот скрипт достаточно универсален и используется другими скриптами, что позволяет собирать их, как конструктор.

Перед тем, как приступить к реальной записи, было бы неплохо протестировать болванку на предмет того, влезет ли на нее наш образ (упрек в сторону тестеров, которым трудно помимо штатного объема компакт-диска приводить и максимально возможный объем). Делается это скриптом overburn-test:

#! /bin/sh
. .config
exec cdrec-data -overburn
-dao -dummy -eject.

Теперь становится ясно, зачем написан скрипт cdrec-data. Затем, чтобы не повторять один и тот же текст в каждом скрипте, который так или иначе связан с прожигом болванки. При выполнении тестовой записи пишущее устройство работает с выключенным лазером (или с лазером, включенным на минимальную мощность), “записывая” на болванку наш образ.
Если тест прошел успешно, то настало время выполнить запись. Для этой задачи предназначен скрипт overburn:

#! /bin/sh
. .config
exec cdrec-data -overburn
-dao -eject.

Отличается он от тестового скрипта только отсутствием опции -dummy, которая и приказывает лазеру не портить болванку раньше времени.

Олег Бройтман

А еще мой приятель Олег Бройтман любит слушать музыку в формате MP3. И сильно не нравится ему то, что во всех компакт-дисках отечественного производства тэги написаны в кодировке CP-1251 (ее еще называют win-кодировкой), поскольку сам он предпочитает KOI-8R. Разумеется, проигрыватель xmms понимает тэги и в кодировке CP-1251 (интересно, есть ли проигрыватели, которые работают под Windows и понимают KOI-8R?), но остальные программы выдают абракадабру. Захотелось ему, к примеру, посмотреть название композиции, которая звучит в данный момент, не открывая плейера, а сделать он этого не может.

Другой бы на его месте расстроился и плюнул на все это дело, или, опять же, расстроился и перешел бы на Windows. Но, как я уже говорил, Олег – человек упрямый и экономный. Денег на Windows ему жалко, а по-другому он не умеет – принципиальный. Впрочем, он эту Windows и даром не возьмет, разве что Билл Гейтс лицензию на GPL изменит. В этом случае и за деньги готов купить, а иначе – никак. Вот такой он весь из себя принципиальный.

И тогда решил он написать скрипт, который может все тэги перевести из CP-1251 в KOI-8R. А потом подумал и дописал его так, чтобы обратное преобразование тоже было возможным, поскольку он не только принципиальный человек, но и большой оптимист – верит, наверное, в то, что рано или поздно одумается Билл Гейтс насчет лицензии.

Этот скрипт он написал на языке python, изучать который он начал давно по причине своей полной неспособности к запоминанию сложных построений, которые присутствуют в других языках (это он мне сам рассказал, хотя, как мне кажется, пококетничал). А python – язык довольно простой, не зря его потихоньку начинают в школе изучать. Главное достоинство этого языка заключается в том, что программист, относящийся к делу творчески, большую часть времени может уделить методу решения поставленной задачи, а не борьбе с трехэтажными конструкциями.

Эта особенность очень важна для тех пользователей, которые пишут программы, не являясь при этом профессиональными программистами, – математикам, физикам, химикам, биологам… Фактически, большинству пользователей. Впрочем, убедитесь сами.
Выглядит скрипт, который Олег назвал recode-id3v2.py, так:

#! /usr/local/bin/python -O
import sys
import pyid3lib
from m_id3 import all_v2_
text_frames
src_encoding = sys.argv[1]
dst_encoding = sys.argv[2]
def recode_str(astr):
astr = astr.replace(chr(185), ‘N’) # Number
return unicode(astr, src_
encoding, “replace”).encode
(dst_encoding, “replace”)
def id3recode(id3tag, attr):
astr = getattr(id3tag, attr, None)
if astr:
setattr(id3tag, attr, recode_
str(astr))
for filename in sys.argv[3:]:
id3tag = pyid3lib.tag(filename)
for frame in all_v2_text_
frames:
id3recode(id3tag, frame)
id3tag.update().

Использует он одну из стандартных библиотек популярного сегодня языка С++ – id3lib, которую превосходно можно использовать и в программах, написанных на языке python.

Устроен скрипт очень просто – перекодировка осуществляется через Unicode. Пользоваться этим скриптом также очень просто – нужно набрать название скрипта, затем две кодировки (откуда и куда) и список файлов в любом виде, поскольку в системе Linux список файлов программе подставляет shell.

Только следует обратить внимание на то, что программа запишет полученные файлы в ту же директорию, что и исходные (точнее говоря, музыкальная составляющая файлов вообще не затрагивается, а остается той же самой, что и была), стало быть, тэги в первоначальной кодировке станут недоступными.

Если вам захочется использовать эти скрипты для себя, то не обязательно переносить их вручную со страниц журнала. Все, о чем вы прочитали в этой статье (и намного больше), можно найти в интернете по адресу phd.pp.ru/Software/misc/cdr-mp3-video-tools. А необходимые библиотеки можно найти на id3lib.sourceforge.net и pyid3lib.sourceforge.net.

Никто не прокомментировал материал. Есть мысли?