Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bgm123 - update with several improvements #69

Merged
merged 9 commits into from Jul 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
282 changes: 157 additions & 125 deletions scriptmodules/supplementary/bgm123.sh
Expand Up @@ -13,65 +13,84 @@ rp_module_id="bgm123"
rp_module_desc="Straightforward background music player using mpg123"
rp_module_help="Place your MP3 files in $datadir/bgm"
rp_module_section="exp"
rp_module_flags="!all rpi"
rp_module_flags=""

function _get_vars_bgm123() {
case "$1" in
autostart) echo "$configdir/all/autostart.sh" ;;
bashrc) echo "$home/.bashrc" ;;
onstart) echo "$configdir/all/runcommand-onstart.sh" ;;
onend) echo "$configdir/all/runcommand-onend.sh" ;;
autoconf) echo "$configdir/all/$md_id.cfg" ;;
menudir) echo "$datadir/retropiemenu" ;;
init) echo "$md_inst/bgm_start.sh" ;;
killscript) echo "$md_inst/bgm_stop.sh" ;;
fadescript) echo "$md_inst/bgm_fade.sh" ;;
esac
}

function depends_bgm123() {
getDepends mpg123
}

function _autostart_bgm123() {
echo "$configdir/all/autostart.sh"
}
function install_bin_bgm123() {
local autoconf="$(_get_vars_bgm123 autoconf)"
local menudir="$(_get_vars_bgm123 menudir)"
local file
local scripts=(
'bgm_start.sh'
'bgm_stop.sh'
'bgm_fade.sh'
)

# copy scripts and include config
for file in "${scripts[@]}"; do
cp "$md_data/$file" "$md_inst"
sed -i 's|.*#autoconf.*|source "'"$autoconf"'" #autoconf|' "$md_inst/$file"
done

function _bashrc_bgm123() {
echo "$home/.bashrc"
# create rp menu items
cp -f "$md_data/icon.png" "$menudir/icons/$md_id.png"
touch "$menudir/$md_id.rp"
chown -R $user:$user "$menudir"
}

function _onstart_bgm123() {
echo "$configdir/all/runcommand-onstart.sh"
}
function configure_bgm123() {
local autostart="$(_get_vars_bgm123 autostart)"
local bashrc="$(_get_vars_bgm123 bashrc)"
local onstart="$(_get_vars_bgm123 onstart)"
local onend="$(_get_vars_bgm123 onend)"
local autoconf="$(_get_vars_bgm123 autoconf)"
local menudir="$(_get_vars_bgm123 menudir)"
local share="$datadir/bgm"
local file

function _onend_bgm123() {
echo "$configdir/all/runcommand-onend.sh"
}
# find gamelist
local gamelist="$menudir/gamelist.xml"
[[ -f "$gamelist" ]] || gamelist="$configdir/all/emulationstation/gamelists/retropie/gamelist.xml"

function _gamelist_bgm123() {
local xmlfile="$datadir/retropiemenu/gamelist.xml"
[[ -f "$xmlfile" ]] || xmlfile="$configdir/all/emulationstation/gamelists/retropie/gamelist.xml"
echo "$xmlfile"
}
if [[ "$md_mode" == "remove" ]]; then
# remove menu items and network share

function install_bin_bgm123() {
local autostart
autostart="$(_autostart_bgm123)"
local bashrc
bashrc="$(_bashrc_bgm123)"
local onstart
onstart="$(_onstart_bgm123)"
local onend
onend="$(_onend_bgm123)"
local gamelist
gamelist="$(_gamelist_bgm123)"

local scriptname="bgm_vol_fade.sh"
local share="$datadir/bgm"
local file
rm -f "$menudir/$md_id.rp" "$menudir/icons/$md_id.png"
xmlstarlet ed -L -d "/gameList/game[contains(path,'$md_id.rp')]" "$gamelist"

toggle_bgm123 "off"
remove_share_samba "bgm"
restart_samba

return
fi

# preserve original file versions
for file in "$autostart" "$bashrc" "$onstart" "$onend"; do
# preserve original file versions
if [[ -f "$file" && ! -f "$file.old.$md_id" ]]; then
cp -v "$file" "$file.old.$md_id"
chown $user:$user "$file.old.$md_id"
fi
done

cp "$md_data/$scriptname" "$md_inst"
chmod +x "$md_inst/$scriptname"

touch "$datadir/retropiemenu/$md_id.rp"
cp "$md_data/icon.png" "$datadir/retropiemenu/icons/$md_id.png"
chown -R $user:$user "$datadir/retropiemenu"

# add gamelist entry
if ! grep "<path>./$md_id.rp</path>" "$gamelist" >/dev/null; then
xmlstarlet ed -L -s "/gameList" -t elem -n "gameTMP" \
-s "//gameTMP" -t elem -n path -v "./$md_id.rp" \
Expand All @@ -82,132 +101,145 @@ function install_bin_bgm123() {
"$gamelist"
fi

# create user config
local tmp="$(mktemp)"
iniConfig "=" '"' "$tmp"
echo '# Configuration file for bgm123' > "$tmp"
iniSet "status" "enabled"
iniSet "mixer_channel" "HDMI"
iniSet "music_player" "mpg123"
iniSet "music_dir" "$share"
iniSet "mapped_volume" "enabled"
copyDefaultConfig "$tmp" "$autoconf"
rm -f "$tmp"

# check for enable
iniConfig "=" '"' "$autoconf"
iniGet "status"
[[ "$ini_value" == "enabled" ]] && toggle_bgm123 on

# add music dir and network share
mkUserDir "$share"
add_share_samba "bgm" "$share"
restart_samba
}

function disable_bgm123() {
local autostart
autostart="$(_autostart_bgm123)"
local bashrc
bashrc="$(_bashrc_bgm123)"
local onstart
onstart="$(_onstart_bgm123)"
local onend
onend="$(_onend_bgm123)"
function toggle_bgm123() {
local autostart="$(_get_vars_bgm123 autostart)"
local bashrc="$(_get_vars_bgm123 bashrc)"
local onstart="$(_get_vars_bgm123 onstart)"
local onend="$(_get_vars_bgm123 onend)"
local init="$(_get_vars_bgm123 init)"
local killscript="$(_get_vars_bgm123 killscript)"
local fadescript="$(_get_vars_bgm123 fadescript)"
local file

# kill player now since .bashrc won't do it later
(vcgencmd force_audio hdmi 0) >/dev/null
pkill mpg123

# backup files and attempt to remove any existing bgm config
for file in "$autostart" "$bashrc" "$onstart" "$onend"; do
if [[ -f "$file" ]]; then
# backup file and attempt to remove any existing bgm config
cp -f "$file" "$file.bak"
chown $user:$user "$file.bak"
sed -i '/#bgm/d' "$file"

# if file is now empty, remove it
[[ ! -s "$file" ]] && rm -f "$file"
fi
done
}

function remove_bgm123() {
local gamelist
gamelist="$(_gamelist_bgm123)"
# enable with toggle "on" or "enable(d)"
# disable with anything else
if [[ "$1" == "on" || "$1" == "enable"?("d") ]]; then
for file in "$autostart" "$bashrc" "$onstart" "$onend"; do
touch "$file"
chown $user:$user "$file"
done

rm -f "$datadir/retropiemenu/$md_id.rp" "$datadir/retropiemenu/icons/$md_id.png"
xmlstarlet ed -L -d "/gameList/game[contains(path,'$md_id.rp')]" "$gamelist"

disable_bgm123
remove_share_samba "bgm"
restart_samba
}
echo "$(echo -e 'while pgrep omxplayer >/dev/null; do sleep 1; done #bgm123\n(sleep 10; bash "'"$init"'") & #bgm123'; cat $autostart)" > "$autostart"
echo '[[ "$(tty)" == "/dev/tty1" ]] && (bash "'"$killscript"'" &) #bgm123' >> "$bashrc"
echo "$(echo 'bash "'"$fadescript"'" -STOP & #bgm123'; cat $onstart)" > "$onstart"
echo '(sleep 1; bash "'"$fadescript"'" -CONT) & #bgm123' >> "$onend"

function enable_bgm123() {
local autostart
autostart="$(_autostart_bgm123)"
local bashrc
bashrc="$(_bashrc_bgm123)"
local onstart
onstart="$(_onstart_bgm123)"
local onend
onend="$(_onend_bgm123)"

local fadescript="$md_inst/bgm_vol_fade.sh"
local file

disable_bgm123

for file in "$autostart" "$bashrc" "$onstart" "$onend"; do
touch "$file"
chown $user:$user "$file"
done
printMsgs "console" "Background music enabled."
else
# kill player now since .bashrc won't do it later
su "$user" -c "bash $killscript"

echo -e "$(echo -e 'while pgrep omxplayer >/dev/null; do sleep 1; done #bgm123\n((vcgencmd force_audio hdmi 1) >/dev/null; sleep 8; mpg123 -Z "'$datadir'/bgm/"*.[mM][pP]3 >/dev/null 2>&1) & #bgm123'; cat $autostart)" > "$autostart"
echo -e '[[ "$(tty)" == "/dev/tty1" ]] && ((vcgencmd force_audio hdmi 0) >/dev/null; pkill mpg123) #bgm123' >> "$bashrc"
echo -e '"'"$fadescript"'" -STOP & #bgm123' >> "$onstart"
echo -e '(sleep 1; "'"$fadescript"'" -CONT) & #bgm123' >> "$onend"
}
for file in "$onstart" "$onend"; do
# if file is now empty, remove it
[[ -f "$file" && ! -s "$file" ]] && rm -f "$file"
done

function configure_bgm123() {
[[ "$md_mode" == "install" ]] && enable_bgm123
printMsgs "console" "Background music disabled."
fi
}

function play_pause_bgm123() {
if pgrep mpg123 >/dev/null; then
su "$user" -c "$md_inst/bgm_vol_fade.sh &"
else
su "$user" -c "((vcgencmd force_audio hdmi 1) >/dev/null; sleep 1; mpg123 -Z $datadir/bgm/*.[mM][pP]3 >/dev/null 2>&1) &"
fi
# dummy enable/disable functions for CLI
function disable_bgm123() {
toggle_bgm123 off
}

function next_track_bgm123() {
pkill mpg123
su "$user" -c "((vcgencmd force_audio hdmi 1) >/dev/null; sleep 1; mpg123 -Z $datadir/bgm/*.[mM][pP]3 >/dev/null 2>&1) &"
function enable_bgm123() {
toggle_bgm123 on
}

function gui_bgm123() {
local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --menu "Choose an option for $md_id" 22 86 16)
local autoconf="$(_get_vars_bgm123 autoconf)"
iniConfig "=" '"' "$autoconf"

local autostart="$(_get_vars_bgm123 autostart)"
local init="$(_get_vars_bgm123 init)"
local killscript="$(_get_vars_bgm123 killscript)"
local fadescript="$(_get_vars_bgm123 fadescript)"

local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --menu "Configuration for $md_id. Please choose an option." 22 86 16)
while true; do
local enabled=0
grep '#bgm123' "$configdir/all/autostart.sh" >/dev/null && enabled=1
local options=()
if [[ "$enabled" -eq 1 ]]; then
options+=(
E "Enable or disable background music (currently: Enabled)"
)
if pgrep emulationstatio >/dev/null; then
options+=(
P "Play / pause"
N "Next track"
)
fi
else
# check if bgm code is actually enabled in autostart
local status="disabled"
grep '#bgm123' "$autostart" >/dev/null && status="enabled"

local mapped
iniGet "mapped_volume" && mapped="$ini_value"

local options=(
1 "Enable or disable background music (currently: ${status^})"
2 "Enable or disable mapped volume profile (currently: ${mapped^})"
)
if [[ "$status" == "enabled" ]] && pgrep emulationstatio >/dev/null; then
options+=(
E "Enable or disable background music (currently: Disabled)"
P "Play / pause"
N "Next track"
)
fi

local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
if [[ -n "$choice" ]]; then
case "$choice" in
E)
if [[ "$enabled" -eq 1 ]]; then
disable_bgm123
1)
if [[ "$status" == "enabled" ]]; then
toggle_bgm123 off
iniSet "status" "disabled"
printMsgs "dialog" "Background music disabled."
else
enable_bgm123
toggle_bgm123 on
iniSet "status" "enabled"
printMsgs "dialog" "Background music enabled."
fi
;;
2)
if [[ "$mapped" == "enabled" ]]; then
iniSet "mapped_volume" "disabled"
printMsgs "dialog" "Mapped volume disabled."
else
iniSet "mapped_volume" "enabled"
printMsgs "dialog" "Mapped volume enabled."
fi
;;
P)
play_pause_bgm123
if pgrep mpg123 >/dev/null; then
su "$user" -c "bash $fadescript &"
else
su "$user" -c "bash $init &"
fi
;;
N)
next_track_bgm123
su "$user" -c "(bash $killscript; sleep 1; bash $init) &"
;;
esac
else
Expand Down