Как записать на диск понравившийся видеоролик
Наверно не только у меня частенько возникает желание сохранить понравившиеся utube-овские ролики. Посмотрел сам, понравилось, захотелось показать другим. Как скопировать себе на комп и сохранить его в виде файла?
В Венде при просмотре роликов в папке юзера имеются скрытые папки, где хранятся временные файлы при просмотре интернетовских страниц. Файлы видео роликов имеют расширение .flv, .avi и другие. Иногда вообще не имеют расширения. Как правило видеоматериалы представляют собой огромные массивы данных, размеры файлов от нескольких мегабайт до сотен мегабайт. Поэтому, даже если имя файла неизвестно и расширения нет, то отличить его от другого мусора можно по объему. Но это Венда. Она меня принципиально не интересует.
Я пользуюсь исключительно Линуксом. А если быть более точным,то Ubuntu и Debian -- вот мои рабочие лошадки.
До недавнего времени Ubuntu (про другие Линуксы ничего не скажу. Я не знаю их, поэтому говорить за них не буду.) сохраняла временные файлы в директории /tmp. Оно и понятно! Этот директорий как раз и создан для таких целей -- для временного хранения временных файлов. Даже если приложение за собой не почистит свой мусор, при следующей загрузке системы директорий /tmp будет девственно чист. Удобно?- Да! Это Вам не Венда, которая засирается по мере эксплуатации. В прочем, не стоит отвлекаться на быдло-оси для народа. Давайте поговорим о высоком.
Так вот, я так и делал: запускал как обычно просмотр ролика в Firefox, а когда просмотр заканчивал, я не спешил закрывать страницу. Дело в том, что пока страница бала открыта, временный файл существовал в директории /tmp. В общем, если ролик понравился, то мне оставалось зайти в этот директорий и скопировать самый большой файл в какое-нибудь другое место. Файлы роликов обычно имели странные имена, начинающиеся на Flash, далее следовали случайные цифры и буквы. В принципе отличить файл от других не составляло особого труда.
С некоторых пор, к сожалению, я заметил, что жадные интернет-товарищи ввели новый механизм сохранения роликом на компе. Можно так же как и прежде смотреть ролик самому, а вот скопировать -- фиг! Не стало файла. Причем следует заметить, что файл-то существует явно, но обычных средств для того что бы его увидеть -- не хватает.
Если вам не интересно, что там тарахтит под капотом, можете пропустить этот кусок текста
Поскольку я программист, то для меня это не составило какого-то особого секрета. В отличие от Венды, в Линуксе файловые системы строятся немножко иначе, более изящно что-ли. Вот смотрите, традиционные операции с файлом следующие:
* открыть файл
* закрыть файл
* создать файл
* удалить файл
* читать из файла
* писать в файл
Все просто и понятно. Блудить негде. Такая картина наблюдается как в Линуксе, так и в Венде. Чтобы создать временный файл, имя которого гарантированно не будет совпадать с множеством имен других файлов файл, в системе (и в Линуксе, и в Винде) присутствует функция генерации уникального имени. Да-да, Вы правы, те файлы, о которых я говорил чуть ранее, которые назывались типа Flash6f8ty3, имена их как раз генерировались при помощи этой функции. Все чудесно работает как в Линуксе, так и в Венде.
Отличие Линукса заключается в том, что в нем есть еще один механизм для работы с временными файлами, на который Венда не способна. Тут я должен Вас немного просветить программированием. Самую малость. Потерпите!
Как операционные системы работают с файлами? Открытие и создание файлов осуществляется по их именам. В процессе открытия/создания файлу присваивается уникальный номер (число, дескриптор, идентификатор, хэндлер -- в данном контексте это все одно и тоже!). И правильно! Что легче указывать при каждой операции записи: уникальное число (присущее только этому файлу) или его имя? Компьютеру с числами проще и быстрее работать.) Таким образом, ели вам необходимо записать, считать ил закрыть файл, вы не таскаете по всей программе его имя, а указываете только его число, которое его однозначно идентифицирует.
Теперь смотрите внимательно. Я буду говорить об отличие в работе двух конкурирующих операционных систем.
В Венде, если вы создадите файл (получите его уникальный номер) и тут же его удалите, то файл сразу перестает существовать. Дальнейшие операции прочитать/записать в файл (по уникальному его номеру) будут сопровождаться ошибками. Все правильно -- файла-то не существует! Поэтому здесь говорить не о чем. Фи, как неинтересно!
Посмотрим, как это реализовано в Линуксе. Давайте создадим какой-нибудь файл (получим его число) и тут же его удалим. Файл удален. Он не существует. Но у нас есть его число -- его идентификатор. В Вендовом случае -- число уже бесполезно. Помер человек, не услышит он своего имени, не отзовется. В Линуксе клинический случай лечится! Оказывается Линукс удаляет файл для всех, кроме нашей проги. Для нашей проги файл удалится тогда, когда мы ее окончательно закроем. Значит, пока мы знаем этот уникальный номер файла, мы можем читать и писать в этот файл. Да это же виртуальный мир! Файла как такового нет, но мы с ним можем продолжать работать! Класс!!! Никто кроме нас не знает и даже не догадывается о нашем временном файле. Секретность на высоте. Венде такое даже не снилось!
Возвращаемся в сознание. Проигрыватель, который показывает нам видеоролики в Firefox-е как раз и использует этот механизм засекречивания информации. Если бы такое было в Венде, то случай наверно был бы фатальным. Но мы-то с вами имеем ось, работу которой контролирует не команда ухарей из Рэдмода, а исключительно мы!
Вспоминаем теорию, вспоминаем как устроен и работает Линукс. Конкретно прокачиваем свои знания по виртуальной файловой системе /proc.
Если вы отцепите диск и посмотрите на его файловую систему, то не обнаружите нем директория /proc. Этот директорий виртуальный. Он существует только в оперативной памяти и только тогда, когда загружен и работает Линукс. Если вы зайдет в этот катало и посмотрите на его содержимое, то вы увидите множество директорий, названия которых -- есть числа. Это не совсем директории. Это -- как бы программы (точнее -- процессы). Когда запускается программа (т.е. создается процесс), то система этому процессу (так же как и файлу, см. выше) присваивает уникальное число, которое называется не иначе как идентификатор процесса (PID).
Теперь, если зайти в директорий какого-нибудь процесса, то мы увидим еще целую кучу поддиректорий и файлов. (Не забывайте, что в Линуксе всё есть файл!) найдите среди них директорий с именем fd. Это ни что иное, как директорий, содержащий список файловых дескрипторов (fd = file descriptor). Да-да-да!!! Вы угадали! Это как раз и есть те самые числа, которые однозначно определяют открытые файлы.
Теперь наша задача по сохранению видеоролика сводится к последовательности действий:
* узнать идентификатор процесса (PID), который показывает нам ролик
* зайти в директорий /proc/xxx/fd/ и определить дескриптор, который соответствует файлу ролика
* скопировать файл (соответствующий этому дескриптору) в наше место.
А теперь конкретная инструкция
1. Видеоролики показывает нам программа-плагин plugin-containe. Определим ее PID:
alex@zhevak:~$ ps -e | grep plugin-containe
1746 ? 00:00:03 plugin-containeУ меня на компе этот процесс имеет PID равный 1746. У вас будет какой-то свой.
2. Идем смотреть на дескрипторы файлов:
alex@zhevak:~$ ls -l /proc/1746/fd
итого 0
lr-x------ 1 alex alex 64 2011-02-27 21:56 0 -> /dev/null
lrwx------ 1 alex alex 64 2011-02-27 21:56 1 -> /home/alex/.xsession-errors
lrwx------ 1 alex alex 64 2011-02-27 21:56 10 -> pipe:[277640]
lrwx------ 1 alex alex 64 2011-02-27 21:56 11 -> pipe:[277641]
lr-x------ 1 alex alex 64 2011-02-27 21:56 12 -> pipe:[277641]
l-wx------ 1 alex alex 64 2011-02-27 21:56 13 -> socket:[277644]
lrwx------ 1 alex alex 64 2011-02-27 21:56 14 -> /home/alex/.mozilla/firefox/0mzlz24h.default/cert8.db
lrwx------ 1 alex alex 64 2011-02-27 21:56 15 -> /home/alex/.mozilla/firefox/0mzlz24h.default/key3.db
l-wx------ 1 alex alex 64 2011-02-27 21:56 16 -> /tmp/FlashXXmfZRgz (deleted)
lrwx------ 1 alex alex 64 2011-02-27 21:56 17 -> pipe:[299684]
lrwx------ 1 alex alex 64 2011-02-27 21:56 18 -> pipe:[299684]
lrwx------ 1 alex alex 64 2011-02-27 21:56 19 -> pipe:[299685]
lrwx------ 1 alex alex 64 2011-02-27 21:56 2 -> /home/alex/.xsession-errors
lr-x------ 1 alex alex 64 2011-02-27 21:56 20 -> pipe:[299685]
l-wx------ 1 alex alex 64 2011-02-27 21:56 21 -> socket:[299689]
lrwx------ 1 alex alex 64 2011-02-27 21:56 3 -> socket:[277552]
lr-x------ 1 alex alex 64 2011-02-27 21:56 4 -> anon_inode:[eventpoll]
lrwx------ 1 alex alex 64 2011-02-27 21:56 42 -> socket:[277553]
l-wx------ 1 alex alex 64 2011-02-27 21:56 5 -> socket:[277637]
lr-x------ 1 alex alex 64 2011-02-27 21:56 6 -> socket:[277638]
l-wx------ 1 alex alex 64 2011-02-27 21:56 7 -> pipe:[277639]
lr-x------ 1 alex alex 64 2011-02-27 21:56 8 -> pipe:[277639]
l-wx------ 1 alex alex 64 2011-02-27 21:56 9 -> pipe:[277640]Видите? Вот он, гад -- /tmp/FlashXXmfZRgz, да еще и прикрылся: говорит, что он удален (deleted). Но нам это уже не важно. Нам нужно знать только его номер (дескриптор). Дескриптор файлов -- это, собственно, числа перед стрелочками. Дескрипторы -- это как бы soft-линки на файлы (по Вендовому -- указатели, ссылки).
3. Копируем файл, на который "указывает" дескриптор в наше безопасное место:
alex@zhevak:~$ dd if=/proc/1746/fd/16 of=funny.flv bs=4096
993+1 записей считано
993+1 записей написано
скопировано 4070149 байт (4,1 MB), 0,043064 c, 94,5 MB/cНу вот и все, господа! Теперь вы имеете в своем домашнем директории нормальный файл видеоролика. (В моем примере этот файл называется funny.flv)
Приятных вам просмотров!
UPDATE
1.
Мне тут задали вопрос: "А как не ошибиться? Как мы можем знать, что это за файл?"
В Линуксе есть такая команда file, которая расскажет вам о типе файла. Но поскольку дескриптор -- это сим-линк, то мы при запросе должны указать ключик -L. Тогда команда file расскажет нам не о самой сим-линке, а о том файле, на кого она показывает:
alex@zhevak:~$ file -L /proc/1746/fd/16
/proc/1746/fd/16: Macromedia Flash Video
Как мы видим, у нас все нормально -- это действительно файл с видеороликом.
2.
Я сейчас перечитал этот текст, и немного ужаснулся. Грамматических ошибок -- море! Я как-нибудь их потом исправлю. Жутко хочу спать. Категорически не высыпаюсь в последнее время. А может весна, авитаминоз 


