Разработки проекта PuppyRus > Программирование и компиляция
Abook_2_mpv консольный плеер для аудиокниг.
totiks2012:
Доброго дня всем ! Долгое время лелеял мечту о простеньком консольном плеере для аудиокниг. Плееров способных запоминать последний воспроизведенный трек, да еще и место откуда прервалось воспроизведение, с использованием GUI достаточно, Audacious, Sayonara, Deadbeef, Smplayer , это те которые знаю и использовал. Из консольных же я знаю лишь moc , cmus , и сколько не крутил их , сколько не вчитывался в help-ы и документацию, так и не нашел как задействовать функцию воспроизводить при перезапуске , последний трек и место , особенно понравился moc простое и понятное управление, но я не смог найти у него эту функцию. Потому созрел написать свой консольный плеер для аудиокниг. Долго рассусоливать не буду так что привожу код Abook_2_mpv.
--------------------------
обновление: Добил скрипт, вот финал , качать тут https://disk.yandex.ru/d/yoo_40kyKuw64A
удалил строку которая переносит файлы из подкаталогов, для этого плеера следует подготавливать файлы например, склеить , скрипт который делает это берет из подкаталогов и склеивает в один общий mp3, в архиве оба скрипта.
обновление_2: в архиве теперь скрипт, в котором исправлена еще одна найденая ошибка(при входе в опцию выбора трека, при отказе от выбора трека , и нажатии на esq , вместо того чтоб выходил в общее меню. всё равно воспроизводил первый трек, теперь выходит) ,кроме того изменил скрипт для склеивания mp3 , назвал sinia_izolenta_3.sh, который умеет после того как указать путь к каталогу, внутри которого требуется
объединить все MP3 файлы в один. После ввода пути
скрипт создаст временный каталог, объединит MP3 файлы без преобразования качества, клеит с качеством исходного,
в него и переместит получившийся файл обратно в выбранный каталог.
totiks2012:
Как работать со скриптом .
В каталоге ~/Music необходимо создать новый каталог с именем <pl> , далее в него скопировать каталог с аудиокнигой, например каталог с именем <С. Лем Звёздные дневники Йона Тихого>, важное замечание этот каталог должен содержать только треки, если этот каталог содержит подкаталоги то необходимо произвести некоторые действия чтоб из подкаталогов эти треки переместить в текущий каталог с аудиокнигой у нас в примере каталог с именем <С. Лем Звёздные дневники Йона Тихого>, это очень просто сделать, ибо включено в функционал скрипта, как это сделать я расскажу чуть ниже.
(в версии скрипта Abook_2_mpv_totiks_v09_07_fin.sh это поведение скрипта изменено и теперь он переносит треки из подкаталога если нужно сам, берите эту версию скрипта)
После этих действий, запускаем скрипт, и мы попадаем в первую локацию скрипта, нас тут встретят строка поиска peco и три интерактивные строки:
Продолжить
Выйти
Перенести файлы из подкат. в текущий каталог
Опишу каждую из них
1. Продолжить
Из названия этой строки ясно что если выбрать эту строку, то скрипт продолжит свою работу. И перейдет во вторую локацию.
2. Выйти
Тут всё ясно, это пункт для выхода из программы.
3.Перенести файлы из подкат. в текущий каталог
Этот пункт меню нужен для переноса треков из подкаталогов в текущий каталог .
Перехожу к описанию второй локации которая начнется если выбрать из первой локации, пункт меню <Продолжить>.
Вторая локация нам предложит следующий пункты меню:
Продолжить прослушивание трека
Выбрать трек и слушать
Стереть историю
1.Продолжить прослушивание трека
При выборе этого пункта меню , mpv будет воспроизводить треки по плейлисту, если запущен первый раз , то будет воспроизводить плейлист от первого трека к последнему, с запоминанием места и трека который был воспроизведен при выходе. По идее скрипт мог состоять только из этого кода, но мне хотелось больше контроля и функционала, рассказываю дальше.
2.Выбрать трек и слушать
Слушая аудиокнигу, бывает ситуации когда вы хотите вернутся назад на нужный вам трек, этот пункт меню позволяет выбрать нужный трек, и проигрывать дальше по плейлисту, история прослушивания перепишется от выбранного трека и далее.
3.Стереть историю
Обнуляет историю прослушивания,позволяя слушать книгу с самого начала.
Возможно этот пункт меню избыточен и его надлежит убрать. Ибо перекрывается функционалом пункта 2.Выбрать трек и слушать.
Описание скрипта закончено.
По скрипту надеюсь будет обратная реакция, может у кого новые идеи будут, ибо у меня они исчерпались. По поводу почему функционал пункта 3.Перенести файлы из подкат. в текущий каталог, из первой локации не внедрил в автоматическом режиме, всё потому что затирался каталог с файлом сохранения позиций, и только сегодня утром я понял что этот каталог можно было исключить из затирания, в общем скрипт будет улучшаться.
А пока жду тестов и отзывов.
imp:
Вы полностью решили в консоль переехать?)
Плюсую
P.S. Кроме того, мне нравится этот код
totiks2012:
--- Цитата: imp от 23 Август 2023, 13:06:51 ---Вы полностью решили в консоль переехать?)
Плюсую
P.S. Кроме того, мне нравится этот код
--- Конец цитаты ---
(... смущено ) Спасибо!
Сегодня решил проблему с переносом треков из подкаталогов в текущий, скрипт улучшил, лишние пункты убрал. Пока что в процессе теста чтоб отловить всех муравьёв... возможно вечером ,крайний ,завтра выложу .
totiks2012:
Добил скрипт, вот финал качать тут https://disk.yandex.ru/d/4hAmN9WN6EqIdQ
---------------------------------
в этом коде есть баг , исправленный код в ответах ниже
---------------------------------
что изменил:
эту версию скрипта специально оставил для изучения , строка
find . -mindepth 1 -type d -not -name "W_L" -exec sh -c 'mv -v "$0"/* "$PWD" && rm -r "$0"' {} \;
оказалось вредной по сути она проявила уязвимость окружения termux, уявимость проявляется если эта строка начинает работать с расшареным каталогом,вне home каталога в домашнем каталоге телефона, эфект бомбический, хомяка вывернуло на изнанку, то есть строка вывела из всех подкаталогов все файлы в хомяк ???
---------------------------------------------------------------------------------------
1. автоматизировал перенос треков из подкаталогов в текущий---больше никогда так делать не буду.
2. убрал лишний пункт сброса истории треков, теперь достаточно выбрать 1 трек аудиокниги, и это приведет к той же ситуации что мы слушаем книгу заново.
-------------------------------------------------
этот код не брать! Abook_2_mpv_totiks_v09_07_fin.sh ,в заголовке исправленый v09_09
если удалить вышеобозначеную строку код будет работать исправно и безопасно.
по сути пока строка работала с указанным каталогом в хомяке termux, проблем не было, но после шальной мысли перенести плейлист с файлами в расшаренный для termux каталог в пространство пользователя телефона, делал для удобства, чтоб был доступ из файлового менеджера андроид, то есть вне хомякка termux, вот тут бомба и взорвалась, кто найдёт это ,и прочитает, знатно посмеётся, я себе обеспечил веселье на весь вечер,пока всё восстанавливал, это уж точно.
-------------------------------------------------
--- Код ---
#!/bin/bash
#set -x
while true; do
selected_option=$(echo -e "Продолжить\nВыйти" | peco --prompt "Продолжим работу в программе? ")
case "$selected_option" in
"Выйти")
break
;;
"Продолжить")
selected_option=$(echo -e "Продолжить прослушивание трека\nВыбрать трек и слушать" | peco --prompt "Выберите действие: ")
case "$selected_option" in
"Выбрать трек и слушать")
selected_dir=$(find $HOME/Music/pl -mindepth 1 -maxdepth 1 -type d ! -name "W_L" | grep -v '/\..*' | xargs -I {} basename {} | peco)
cd $HOME/Music/pl/"$selected_dir"
rm -r ./W_L/
mkdir ./W_L/
#пернос треков из подкаталогов в текущий
#find . -mindepth 1 -type d -not -name "W_L" -exec sh -c 'mv -v "$0"/* "$PWD" && rm -r "$0"' {} \; #-строка ой не хорошая никогда так не делайте
# Получаем список треков в текущей директории
tracks=$(ls | grep -E '\.mp3$|\.flac$')
#tracks=$(find ./ -type f \( -name "*.mp3" -o -name "*.flac" \) -print | sort)
# Используем Peco для выбора трека
selected_track=$(echo "$tracks" | peco --prompt "Выберите трек: ")
# Создаем плейлист из всех треков, начиная с выбранного трека
playlist=$(echo "$tracks" | awk -v selected="$selected_track" '{if ($0 == selected) selected_found=1} {if (selected_found) print; if (!$0 ~ selected) print}' | xargs -0 printf "%s\n" | tr '\0' '\n')
echo "$playlist" >./pl.txt
# Передаем выбранный трек в mpv для воспроизведения
mpv --no-video --save-position-on-quit --watch-later-directory=./W_L --playlist="pl.txt"
;;
"Продолжить прослушивание трека")
# Ваш скрипт для слушания
selected_dir=$(find $HOME/Music/pl -mindepth 1 -maxdepth 1 -type d ! -name "W_L" | grep -v '/\..*' | xargs -I {} basename {} | peco)
cd $HOME/Music/pl/"$selected_dir"
mkdir ./W_L
#пернос треков из подкаталогов в текущий
#find . -mindepth 1 -type d -not -name "W_L" -exec sh -c 'mv -v "$0"/* "$PWD" && rm -r "$0"' {} \; -строка ой не хорошая никогда так не делайте
if [ -z "$playlist_file" ]; then
playlist_file="$PWD/playlist.txt"
find "$PWD" -type f '(' -iname '*.mp3' -o -iname '*.flac' ')' | sort > "$playlist_file"
fi
mpv --no-video --save-position-on-quit --watch-later-directory=./W_L --playlist="playlist.txt"
;;
esac
;;
esac
done
--- Конец кода ---
Навигация
Перейти к полной версии