LINUX.ORG.RU
ФорумTalks

Хочется странного: открыть стандартный вход, как файл

 , , ,


0

3

Иногда хочется сделать что-нибудь такое: wget image.jpg -O - | gimp - т.е. открыть то, что приходит на стандартный вход, как полноценный файл. В принципе, можно написать простейшую обёртку, которая этот стандартный вход уложит в файл в /tmp, откроет, а потом удалит, но вдруг есть готовое решение? Подскажите, пожалуйста.

★★

проблема в том, что файл неизвестного размера, и все необходимые заголовки, мета-данные могут находиться в конце файла, в зависимости от типа. т.е. гимпу не известно, открываешь ты 42 байта пустой .gif или снимок вселенной 100500х100500 пикселей.

как ты сам заметил, вернее всего будет предварительно файл скачать в /tmp целиком, gimp сам ждать «конца файла» когда к нему прилетит не будет, и не должен.

Spoofing ★★★★★ ()
Ответ на: комментарий от Spoofing

Я, в принципе, понимаю, что не все файлы можно анализировать по ходу их поступления. Файл должен прийти целиком. Тогда, наверное, я просто набросаю обёртку.

Norong ★★ ()
Ответ на: комментарий от Norong

Это специфика стандартного входа, возможно гимп пытается отмотать файл назад, а с stdin так не получится. Приложение должно уметь читать файл подряд. Это не везде возможно, где-то специфично для приложения. Например:

curl http://xgu.ru/w/images/7/79/Pipe.jpg | feh /dev/stdin #не работает
curl http://xgu.ru/w/images/7/79/Pipe.jpg | feh - #работает
disarmer ★★★ ()
Ответ на: комментарий от disarmer

Понял. Тогда не буду упорствовать в стремлении к странному.

Norong ★★ ()

Используй временный файл в tmpfs.

nvidia ()
Ответ на: комментарий от Smola

А это все равно пайп, к которому точно так же нет произвольного доступа, только последовательный. Пруф - ls -la <(:)

deadNightTiger ★★★★ ()
Ответ на: комментарий от Spoofing

проблема в том, что файл неизвестного размера, и все необходимые заголовки, мета-данные могут находиться в конце файла

много знаешь форматов где такое справедливо? хоть один пример файла с графикой?

всегда как раз главный заголовок, всё в самом начале файла. Но некоторые секции могут быть размазаны дальше по файлу, но это совсем другая история.

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

n_play ()
Ответ на: комментарий от n_play

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

wieker ★★ ()
Ответ на: комментарий от wieker

mp4 - это контейнер, для потокового мультимедия. что там внутри напихают, от этого сильно зависит.

а вот картинки для gimp-a, явно не потоковые и обычно имеют все нужные значения в самом начале. Кроме того, есть же всякие прогрессивный JPEG и прочее, когда low-res версия картинки в самом начале доступна для preview, а остальное позже.

без трейлера его хрен откроешь, я даже не знаю готовых средств, как типичный mp4 открыть недозагруженный.

что это значит, я ничего не понял.

n_play ()
Ответ на: комментарий от n_play

не помню, чтобы не соврать, но с таким точно сталкивался. просто давно это было.

в далёкие времена увлекался ботоводством и писал скрипт http://hawkee.com/profile/61425/, который сообщает информацию по ссылкам, которые люди кидают в канал. вот этот скрипт умеет работать с различными типами файлов, чтобы выдёргивать из них мета-данные. это можно сказать, собственная реализация утилиты file.

язык, на котором оно писалось, не умеет ничего, кроме base convert, — язык не знает ни о каких типах данных, типа UTF-32 Little Endian, поэтому для того, чтобы конвертировать несколько байт JPEG изображения, указывающих высоту, приходилось самостоятельно изучать и изобретать «с нуля» эту фигню...

  if ($prop == width) return $base($+($base($bvar($+(&,$1),$calc($2 + 6),1),10,16,2),$base($bvar($+(&,$1),$calc($2 + 7),1),10,16,2)),16,10)

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

самый адок у flv, там тип данных doublelong

alias doublelong {
tokenize 32 $1
var %doublelong = $base($+($base($1,10,16,2),$base($2,10,16,2),$base($3,10,16,2),$base($4,10,16,2),$base($5,10,16,2),$base($6,10,16,2),$base($7,10,16,2),$base($8,10,16,2)),16,2,64)
return $+($iif($left(%doublelong,1),-),$calc($base($+(1.,$right(%doublelong,52)),2,10) * 2 ^ ($base($mid(%doublelong,2,11),2,10) - 1023)))
}

но я точно помню, что с талкивался с такими форматами, где оно всё было в конце... просто не помню точно с какими, чтоб не соврать. :)

Spoofing ★★★★★ ()
Ответ на: комментарий от Norong

Я так при помощи mpv видео смотрю без скачивания. При наличии youtube-dl - можно и с ютуба и других совместимых сайтов.

NeverLoved ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.