вторник, 5 апреля 2022 г.

Открыть в fbless книгу fb2 через правое контекстное меню в Thunar

Иногда возникает необходимость быстро просмотреть начало книги. К тому же, неплохо иметь в своём арсенале ещё одну читалку, особенно когда читаешь несколько книг "одновременно" (то есть периодически переключаясь с книги на книгу) в разных читалках (например, fbreader, foliate, coolreader), и "терять" в одной из читалок возможность при запуске определённой читалки ставиться на последнее прочитанное место не хочется.

Консольную читалку, то есть запускаемую в окне терминала можно установить командой sudo apt install fbless 

Сразу оговорюсь, что файла настроек и кэша, как описано здесь и здесь, на своей системе Linux Mint 20.3 найдено не было. Тем не менее, читалка была признана рабочей.

Однако использование команды fbless путь_к_книге навевало определённую тоску 😟

В результате было принято решение попробовать открыть файл с помощью fbless через правое контекстное меню файлового менеджера Thunar.

Но оформленная через "Особое действие" (пример создания) команда

 xfce4-terminal -H -x sh -c 'fbless %f; exec bash'

при открытии для эксперимента книги /home/minter/01/Хроники особого отдела.fb2 завершалась неудачей.

Вывод через терминал показывал ошибку в python3, из которого было понятно, что

[Errno 2] Нет такого файла или каталога: '/home/minter/01/Хроники'

Добавление кавычек в путь "%f" приводило к пустому окну терминала с заголовком "Дочерний процесс завершился нормально с кодом 2."

После переименования файла таким образом, чтобы в нём не содержалось пробелов, например:

Хроники особого отдела.fb2 --> Хроники-особого-отдела.fb2 - команда отрабатывалась нормально и книга открывалась.

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

Тогда было решено получить полный путь к имени файла, а затем считать его и передать при запуске fbless. В приводимом ниже примере полученный полный путь записывается с файл /tmp/fbless.txt, а затем передаётся в читалку как $(cat /tmp/fbless.txt) в кавычках.

Команда в одну строку:

realpath %f > /tmp/fbless.txt && xfce4-terminal  -H -x sh -c '/usr/bin/fbless "$(cat /tmp/fbless.txt)"; exec bash'

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

/home/minter/Загрузки/pCloud/Avtors/Дмитрий Леонидович/Проект "Пассионарность"/1. Судья.fb2

Однако, по совету более опытного товарища, вместо команды

xfce4-terminal -H -x sh -c 'fbless %f; exec bash'

необходимо вводить команду 

xfce4-terminal -H -x sh -c "fbless %f; exec bash"

Другими словами, вместо одинарных использовать двойные кавычки.

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


В таком случае команде необходимо задать ещё и параметр -g, после которого числом указать нужное значение %, например, -g 15

Далее приводится решение "для себя". Оно не является программистским, так как его первая часть была заимствована из готового решения (источник дано забыт) ввода значений с использованием zenity.


Идея. 

1. Запрос ввода значения % соответствует "Да". Указывается ожидание времени выбора. Если за это время никакая кнопка нажата не была, то считается, что была нажата кнопка "Нет".

2. Вводится значение (цифра), которая записывается в файл, например в /tmp/proc.txt  Если в предыдущем п.1 была нажата кнопка "Нет" (или выбрана по умолчанию после истечения времени выбора), то в /tmp/proc.txt записывается значение 0, что условно соответствует началу книги.

3. Далее используется команда для открытия книги с подстановкой считанного из файла значения, что для рассматриваемого примера осуществляется через 

$(cat /tmp/proc.txt)

Заимствованное готовое решение, оформляемое в виде исполняемого файла sh имеет листинг:

#!/bin/bash
zenity --width=180 --height=50 --question --text="Перейти на место,\nобозначенное % ?$task" --timeout 5
answer=$?
if [ "$answer" -eq 0 ]; then
    zenity --width=100 --title  "Ввод цифры" --text-info --editable > /tmp/proc.txt
elif [ "$answer" -eq 1 ]; then
    echo '0' > /tmp/proc.txt
elif [ "$answer" -eq 5 ]; then
    echo '0' > /tmp/proc.txt
fi
exit

За время ожидания выбора отвечает параметр -- timeout 5  В приведенном случае это соответствует 5 секундам. Экспериментальным способом вместо 5 можно подобрать удобное для своего использования значение.

🔰  Пояснение. Кнопке "Да" соответствует -eq1, кнопке "Нет" – -eq0, а выбор по умолчанию всегда будет -eq5. 

Увы но рабочий результат выполнения команды получился только с использованием тех "костылей", которые приводились в самом начале, то есть с применением realpath %f

Сначала выполняется скрипт получения значения процентов прочитанного, а потом собственно и запуск читалки с указанием этих процентов через параметр -g

путь_к_sh && xfce4-terminal -H -x sh -c "fbless %f -g $(cat /tmp/proc.txt); exec bash"

или (по первому варианту)

путь_к_sh && realpath %f > /tmp/fbless.txt && xfce4-terminal  -H -x sh -c '/usr/bin/fbless "$(cat /tmp/fbless.txt)" -g $(cat /tmp/proc.txt); exec bash'

🔰  Примечание. Следует отметить, что при вводе, например, значения 11 (11% книги), книга откроется именно в начале 11 %, но в книге отображаться будут 10%. 11 процентов начнутся тогда когда вы перейдёте на следующую строчку текста книги. 

Так как целочисленное значение % может соответствовать 2-3 страницам текста книги, то это может вызывать неудобство или раздражение. 

Выходом могло бы служить использование механизма закладок, которые записывается в файл fbless_save  Автоматически у меня он не создавался. Его приходилось создавать вручную здесь  ~/.fbless_save  или здесь  ~/.cache/fbless/fbless_save  Сведения о его местоположении взяты из этой публикации. Но как создать в fbless закладку мне неизвестно.

Официальную документацию для fbless читайте в файле /usr/share/doc/fbless/README.ru

✔  В качестве дополнения. Используя параметр -g 100 можно перейти в самый конец книги и узнать, является ли это окончанием всего цикла, окончанием отдельного тома или вообще ознакомительным фрагментом книги. Если необходимо это делать часто, то для этого можно создать дополнительное особое действие с командой:

xfce4-terminal  -H -x sh -c "fbless -g 100; exec bash"

Комментариев нет:

Отправить комментарий