LINUX.ORG.RU

помогите прикрутить прогресс zenity, mktorrent

 , mktorrent,


0

1

Привет, ЛОР!
пытаюсь сделать гуй для mktorrent и по сути скрипт уже выполняет самый минимальный функционал, только не могу понять как прикрутить прогресс-бар(хочется разобраться),
из консоли mktorrent показывает прогресс в виде строки
Hashed 147 of 728 pieces
как поместить эти значения в переменные?



Последнее исправление: agafron (всего исправлений: 1)
Ответ на: комментарий от agafron

Можно через пайп прикрутить. Тут есть пара примеров. Если тебе нужно преобразовывать вывод mktorrent, то немного сложнее будет, но можно так же через пайп и цикл, например.

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

Вот пример, близкий к твоему случаю:

#!/bin/sh
( for (( i=0; i < 51; i++ )) ; do
    echo $((100 * i / 50))
    echo "# Hashed $i of 50 pieces"
    sleep 0.1
  done
) | zenity --progress
rassol
()
Ответ на: комментарий от rassol

за пример спасибо!
подскажи, пожалуйста как можно получать эти значения из строки, которую выводит mktorrent Hashed 147 of 728 pieces
я имею ввиду, что хочу получать значения в переменные, типа:

min_value=0;
current_value=147; // то значение которое меняет прогрессбар
max_value=728;

если можно, то конкретику
просто запусти у себя mktorrent -o /path/to/outfile.torrent --piece-length=22 /path/to/inputfile, именно в этом зытык

agafron
() автор топика
Ответ на: комментарий от PunkoIvan

ага, тоже мысли туда смотрят, или с помощью awk, только я не особо в нем разбираюсь

agafron
() автор топика
Ответ на: комментарий от PunkoIvan

только одно значение постоянно меняется, и помещать в current_value ее нужно при каждом изменении либо используя тот же sleep

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

Я понял твою проблему: mktorrent использует символ \r, чтобы перенабрать строку. Можно попробовать заменить этот символ на символ новой строки:

mktorrent ... | sed 's/\r/\n/g'

Однако теперь возникает проблема с буфером.

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

это уже прогресс, но да, пропадает динамика, mktorrent сначала выполняет задачу и только потом вываливает кучу строк(

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

Что-то туплю. Надо было так:

mktorrent ... \
  | stdbuf -oL tr '\r' '\n' \
  | while read l ; do
      echo $l
    done

Осталось в цикле распарсить полученную строку.

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

Короче, попробуй вот такую штуку:

#!/bin/sh
mktorrent ... \
  | stdbuf -oL tr '\r' '\n' \
  | while read l ; do
      [[ $l = Hashed* ]] || continue
      a=(`grep -o '[0-9]*' <<< $l`)
      echo $((100 * $a / ${a[1]}))
      echo "# $l"
    done | zenity --progress
rassol
()
Последнее исправление: rassol (всего исправлений: 1)
Ответ на: комментарий от rassol

Вот спасибо, так спасибо!!! Я только начал разбираться как это запилить, а уже готово!!! Круть, спасибо!

agafron
() автор топика
Ответ на: комментарий от rassol

заметил одну вещь, конструкция zenity --file-selection --confirm-overwrite --save не работает, zenity предлагает перезаписать существующий файл, но не делает этого, mktorrent ругается, как это сделать средствами mktorrent не нашел

agafron
() автор топика
Ответ на: комментарий от rassol

пока выглядит некошерно

#!/bin/bash
declare -r DEFAULT_ANNOUNCE="http://bt01.nnm-club.cc"
declare -r FILETIPE="torrent"
declare -r DEFAULT_PIECE_LENGTH=22


# Выбираю режим работы
mode=0
zenity --question --ok-label="Файл" --cancel-label="Папку" \
--title="Выбор режима работы" \
--text="Выбирать файл или каталог?" || mode=1
echo "$mode" 

if [[ $mode = 0 ]]; then 
  filename=`zenity --file-selection --title="Выбор файла"`
	case $? in
	0) NAME="$filename";;
	1)  zenity --info --text="Файл не выбран."
	 exit 1
	 esac 
	else 
	
   dirname=`zenity --file-selection --directory --title="Выбор каталога"`
	case $? in
	0)  NAME="$dirname";;
	1)  zenity --info --text="Каталог не выбран."
	exit 1
	esac 
fi
#NAME="$NAME"
# echo "name"; 
# echo "$NAME";
# #echo $(basename $NAME);
SAVE_NAME="$NAME";
# echo save_name;
# echo $SAVE_NAME;
# Запрашиваю размер части торрента
piece=$(zenity --entry --title="Размер части торрента" \
--text="Введите значение между 15 и 28:" \
--entry-text $DEFAULT_PIECE_LENGTH)
if [ -z ${piece} ]; then exit 1; fi

announce=$(zenity --entry --title="Анонс-сервер торрент-трекера" \
--text="Введите анонс-сервер трекера, если знаете" \
--entry-text $DEFAULT_ANNOUNCE)
if [ -z ${announce} ]; then exit 1; fi

outfile="$SAVE_NAME.$FILETIPE";
save_path="$(zenity --file-selection --confirm-overwrite --save --filename="$outfile")";


# echo 'save_path:';
# echo $save_path;
# echo 'outfile:';
# echo $outfile;
#echo "mktorrent -o $save_path -a=http://bt01.nnm-club.cc --piece-length=$piece $NAME";
mktorrent -o "$save_path" -a=$announce --piece-length=$piece "$NAME" \
| stdbuf -oL tr '\r' '\n' \
  | while read l ; do
      [[ $l = Hashed* ]] || continue
      a=(`grep -o '[0-9]*' <<< $l`)
      echo $((100 * $a / ${a[1]}))
      echo "# $l"
    done | zenity  --progress \
    --title='Создание торрент-файла' \
    --auto-close #

agafron
() автор топика
Последнее исправление: agafron (всего исправлений: 2)
Ответ на: комментарий от agafron

Вместо

mode=0
zenity ... || mode=1
echo "$mode" 

можно использовать

zenity ...
mode=$?

zenity предлагает перезаписать существующий файл, но не делает этого

Насколько я понимаю, опция --confirm-overwrite нужна только для того, чтобы выводить диалог с подтверждением о перезаписи файла.

Самый простой способ — удалять существующий файл средствами оболочки:

[[ -f "$NAME" ]] && rm "$NAME"
rassol
()
Ответ на: комментарий от rassol

[[ -f "$NAME" ]] && rm "$NAME"

немного не понял, где это указать?

можно использоватьzenity ...mode=$?

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

agafron
() автор топика
Последнее исправление: agafron (всего исправлений: 1)
Ответ на: комментарий от agafron

немного не понял, где это указать?

После вызова zenity, но до вызова mktorrent. Например:

save_path="$(zenity ...)"
[[ -f "$save_path" ]] && rm "$save_path"
mktorrent -o "$save_path" ...

Если файл с таким именем существует, то он будет удалён и mktorrent отработает нормально.

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