From 1ed379b2019c09cff5ebedf0b58633a260e56882 Mon Sep 17 00:00:00 2001 From: Jay Moore Date: Wed, 21 Sep 2022 21:58:22 -0400 Subject: [PATCH] script sanity. merge ajw repo. --- README.md | 74 ++++++++++++++++++-- ajw.README | 196 ----------------------------------------------------- ajw.sh | 46 ++++++------- 3 files changed, 91 insertions(+), 225 deletions(-) delete mode 100644 ajw.README diff --git a/README.md b/README.md index e10ab12..abf3e7d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ -# Asterisk Jukebox & "Tape Cartridge" Player +# Asterisk Jukebox, "Tape Cartridge" Player, & Wizard Asterisk Jukebox & "Tape Cartridge" Player is a pair of scripts that provides a jukebox like interface for playing songs/albums stored on the server, as well as logic to perform this playback. +Asterisk Jukebox Wizard (AJW) is a shell script for generating the dialplan that +interfaces with the player logic. It was formally it's own project, but has been +merged in to this one. + ## About Asterisk Jukebox & Player consist of two basic dialplans: @@ -31,9 +35,6 @@ digits for a maximum of 99 tracks are supported. Playback logic's context is called using extension pattern matching which dictates leading zero behavior and passes some album information. -A related project, **[ajw - asterisk jukebox wizard](https://git.pickmy.org/dewdude/ajw)**, provides a bash script that -creates the jukebox interface for you. This will give more information as to how the script works. - ## How To Use/Setup Asterisk Jukebox depends heavily on your files being stored in a specific way; @@ -41,7 +42,7 @@ each album is it's own folder, all filenames are track numbers, and the jukebox folder lives in Asterisk's sounds directory. ``` -/var/lib/asterisk/sounds/en/jukeboxroot/album/[(0)1-99].ulaw +/var/lib/asterisk/sounds/en/(optionalfolder)/jukeboxroot/album/[(0)1-99].ulaw ``` Include tapecart-player.conf (or tryinclude), or it's contents, in to your @@ -81,7 +82,67 @@ which is not equal to "02" and causes playback to fail. Some of the logic for cart-player is done at the jukebox dialplan for dealing with lack of leading zeros; because sometimes you EXTEN:-2 and sometimes you want to EXTEN:-1. -The ajw.sh script will generate the configuration dialplans for you. +By design, one would be generating entry extension/contexts using the wizard. +But it is possible to use it manually with the above information. + +## Asterisk Jukebox Wizard (ajw) HOWTO + +The script automatically generates the album entry extensions, I've made every +effort to make sure they're in numerical order. If you want a specific order, +prefix your folder names. + +The automatic nature of the script does require your folder/files to already be +in place. By default, the script looks in `/var/lib/asterisk/sounds/en` for what +you specify to be the jukebox root. If they are one directory deeper in your +default sounds; you can specify that in the configuration. Examples: + +- `/var/lib/asterisk/sounds/en/jukeboxroot/albums` - All jukeboxes live in $asd +- `/var/lib/asterisk/sounds/en/astjuke/jukeboxroot/albums` - Jukebox roots live +under another folder (in this case, astjuke/) + +You can modify the location of your Asterisk Sounds directory by modifying the +`asd=` line at the beginning of the script. + +Once the files are in place and you have read access, run the script and answer +the prompts: + +``` +"Pick a name/identifier for this jukebox:" - name used for dialplan context + +"Enter the folder your jukebox roots live under:" - if your roots live under another +folder (because network mount/symlink), enter it here. Blank means no addtional path. + +"Enter the root folder name of your jukebox:" - folder in sounds that contain +all your albums + +"Enter the filename of your menu/intro:" - name of file played when answered. +lives in juke root. + +"How many times do you want it to play?" - how many times to play the intro +before hanging up + +"How many seconds between intro play?" - how many seconds between intro + playback + +"Enter the filename of your exit file:" - name of file played before hangup. +lives in juke root. + +"Enter A Channel Volume:" - Tell the Volume function to set a volume. Defaults to -3 +``` + +The script now automatically enumerates sub-folders, counts tracks, determines +leading zero, and writes the appropiate dialplan. You must prefix your folders +with numbers if you want to ensure they are a specific order. + +Make sure the conf file is included in your extensions.conf somehow; the same +for tapecart-player.conf. + +``` +[globals] +#include $name-juke.conf +``` + +Then it's just a matter of directing a call to it's context (usually s,$name-juke) ## Using The Jukebox @@ -111,6 +172,7 @@ pressing 0. # History ``` +22-SEP-2022: Merge ajw repo. Make script pass shellcheck. 21-SEP-2022: Add some sanitization. Broke repositories. Fixed 'em. 14-AUG-2022: Fix cartplayer extension fallthrough. Add HOWTHISWORKS.MD. Added ajw.sh 06-MAY-2022: Update Readme. Add conf/examples. diff --git a/ajw.README b/ajw.README deleted file mode 100644 index 5e7b835..0000000 --- a/ajw.README +++ /dev/null @@ -1,196 +0,0 @@ -# ajw - Asteisk Jukebox Wizard - -Builds a dialplan to make Asterisk function as a jukebox. - - -## About - -An Asterisk Jukebox is a IVR that mimics the function of a CD jukebox. It -currently supports playing single tracks or full albums. Selections are made -using a 4 digit code; album number and track number. Basic playback controls -are available during album play to skip back, ahead, and repeat track. - -## Requirements - -You will need to have the `func_volume.so` and `func_logic.so` loaded in order -to use Asterisk Jukebox. Add these to `modules.conf` - -## How To Use/Setup - -Asterisk Jukebox depends heavily on your files being stored in a specific way; -each album is it's own folder, all filenames are track numbers, and the jukebox -folder lives in Asterisk's sounds directory. - -``` -/var/lib/asterisk/sounds/en/(optional-subfolder)/jukeboxroot/album/[(0)1-99].ulaw -``` - -The 1.0 update to jaw sees it become ajw. The difference is that ajw now makes -dialplans that do not include playback logic. This is now a seperate file. - -You no longer tell it how many albums you have, how many folders, or tracks. -The script now automatically does all of this; and as a result, albums are added -in directory list order. If you want a specific order, prefix your folder names. - -The automatic nature of the script does require your folder/files to already be -in place. By default, the script looks in `/var/lib/asterisk/sounds/en` for what -you specify to be the jukebox root. If they are one directory deeper in your -default sounds; you can specify that in the configuration. Example: - -`/var/lib/asterisk/sounds/en/jukeboxroot/albums` - All jukeboxes live in $asd -`/var/lib/asterisk/sounds/en/astjuke/jukeboxroot/albums` - Jukebox roots live -under another folder - -You can modify the location of your Asterisk Sounds directory by modifying the -`asd=` line at the beginning of the script. - -Once the files are in place and you have read access, run the script and answer -the prompts: - -``` -"Pick a name/identifier for this jukebox:" - name used for dialplan context - -"Enter the folder your jukebox roots live under:" - if your roots live under another -folder (because network mount/symlink), enter it here. Blank means no addtional path. - -"Enter the root folder name of your jukebox:" - folder in sounds that contain -all your albums - -"Enter the filename of your menu/intro:" - name of file played when answered. -lives in juke root. - -"How many times do you want it to play?" - how many times to play the intro -before hanging up - -"How many seconds between intro play?" - how many seconds between intro - playback - -"Enter the filename of your exit file:" - name of file played before hangup. -lives in juke root. - -"Enter A Channel Volume:" - Tell the Volume function to set a volume. Defaults to -3 -``` - -The script now automatically enumerates sub-folders, counts tracks, determines -leading zero, and writes the appropiate dialplan. You must prefix your folders -with numbers if you want to ensure they are a specific order. - -Make sure the conf file is included in your extensions.conf somehow; the same -for tapecart-player.conf. - -``` -[globals] -#include $name-juke.conf -``` - -Then it's just a matter of directing a call to it's context (usually s,$name-juke). - -## Using The Jukebox - -When you dial the extension you're greeted with your intro file. You then need -to enter a 4 digit code comprised of the album and track number: - -``` -1234 -| |_________Track number -|___________Album number -``` - -Track number "00" is special and when entered, will play the entire album back -from the beginning. In album playback, the following controls affect playback: - -- 1 - skips back a track -- 2 - repeats the current track -- 3 - skips ahead a track - -At the end of the album, or at any time during playback; pressing 0 returns to -the main menu. - -Single track playback returns to the main menu at the end of the track, or by -pressing 0. - -# History - -``` -21-SEP-2022 - Add subfolder option - track sanitization for cart-player -14-AUG-2022 - Fixed missed (goodbye) label in setup context. -12-AUG-2022 - Doesn't write delay if you set Delay to 0. -11-MAY-2022 - Fatal error in accidently escaped character fixed. -07-MAY-2022 - Initial Commit -``` - -# Explanation of Generated Dialplan - -The dialplan has undergone some extensive changes since last update. The -use of While has been eliminated as it caused some problems. The way some -things are done have been drastically changed (hopefully for the better). Some -of this was necessitated by the wizard; some of it was in spite of the wizard. - -``` -[examplejuke-main] -exten = s,1,Answer() -same = n,Set(VOLUME(TX)=-3) -same = n,Set(c=examplejuke-main) -same = n(loop),Background(foobar/menu) -same = n,WaitExten(5) -same = n,Set(m=$[${m} + 1]) -same = n,GoToIf($["${m}" < "5"]?loop) -same = n(goodbye),Background(foobar/bye) -same = n,Hangup() - -``` - -After being answered, we set not just the channel volume but the context name. -Most of this is just looping the intro. - -``` -exten = _00XX,1,Set(aa=foobar/00album) -same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*11,1) -same = n,GoToIf($["${EXTEN:-2}" > "19"]?9999) -same = n,GoTo(cart-player,*${EXTEN:-2},1) -same = 9999,Playback(option-is-invalid) -same = n,GoTo(examplejuke-main,s,1) - -exten = _01XX,1,Set(aa=foobar/01album) -same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*15,1) -same = n,GoToIf($["${EXTEN:-2}" > "19"]?9999) -same = n,GoTo(cart-player,*${EXTEN:-2},1) -same = 9999,Playback(option-is-invalid) -same = n,GoTo(examplejuke-main,s,1) - -exten = _02XX,1,Set(aa=foobar/02album) -same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,#12,1) -same = n,GoToIf($["${EXTEN:-2}" > "19"]?9999) -same = n,GoToIf($["${EXTEN:-2}" < "10"]?cart-player,#${EXTEN:-1},1) ; these files don't have a leading zero -same = n,GoTo(cart-player,*${EXTEN:-2},1) -same = 9999,Playback(option-is-invalid) -same = n,GoTo(examplejuke-main,s,1) -``` -We no longer write the last two of the extension to a variable, we just call it -directly from now on. We also now use that as the extension we dial in the -single playback routine. We call either an extension starting with # or * -depending on the leading zero situation. AJW handles writing all of this. - -A full explanation of how the jukebox works, including explanation of -tapecart-player.conf is at the repository: -https://git.pickmy.org/dewdude/Asterisk_Jukebox/src/master/HOWITWORKS.MD - -# License - - ajw - Asterisk Jukebox Wizard - Copyright (C) 2022 Jay Moore - nq4tango@gmail.com - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - diff --git a/ajw.sh b/ajw.sh index 88ee187..8138fea 100644 --- a/ajw.sh +++ b/ajw.sh @@ -1,5 +1,5 @@ #!/bin/bash -#ajw v1.10 - jukebox for asterisk wizard +#ajw v1.2 - jukebox for asterisk wizard #Jay Moore/NQ4T - https://git.pickmy.org/dewdude/ajw #Twitter: @Music_OnHold #Licensed under GPL-3.0-or-later @@ -16,40 +16,40 @@ asd=/var/lib/asterisk/sounds/en/ # main context configuation setup() { -printf "[$name-main]\nexten = s,1,Answer()\nsame =n,Set(VOLUME(TX)=$vol)\nsame = n,Set(c=$name-main)\nsame = n(return),Set(m=1)\nsame = n(loop),Background($rootfolder/$introfile)\n" -[ -n "$delay" ] && printf "same = n,WaitExten($delay)\n" -printf "same = n,Set(m=\$[\${m} + 1])\nsame = n,GoToIf(\$[\"\${m}\" > \"$loop\"]?loop)\nsame = n(goodbye),Background($rootfolder/$goodbye)\nsame = n,Hangup()\n\n" +printf "[%s-main]\nexten = s,1,Answer()\nsame =n,Set(VOLUME(TX)=%s)\nsame = n,Set(c=%s-main)\nsame = n(return),Set(m=1)\nsame = n(loop),Background(%s/%s)\n" "$name" "$vol" "$name" "$rootfolder" "$introfile" +[ -n "$delay" ] && printf "same = n,WaitExten(%s)\n" "$delay" +printf "same = n,Set(m=\$[\${m} + 1])\nsame = n,GoToIf(\$[\"\${m}\" > \"%s\"]?loop)\nsame = n(goodbye),Background(%s/%s)\nsame = n,Hangup()\n\n" "$loop" "$rootfolder" "$goodbye" } >> $name-juke.conf # album selections album() { -printf "exten = _%02dXX,1,Set(aa=$rootfolder/$folder)\n" $a -[ "$lz" -eq 0 ] && printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" = \"00\"]?8track-player,#$tc,1)\n" || printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" = \"00\"]?8track-player,*$tc,1)\n" -printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" > \"$limit\"]?9999)\n" -[ "$lz" -eq 0 ] && printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" < \"10\"]?cart-player,#\${EXTEN:-1},1)\n" -printf "same = n,GoTo(cart-player,*\${EXTEN:-2},1)\nsame = 9999,Playback(option-is-invalid)\nsame =n,GoTo($name-main,s,1)\n\n" +printf "exten = _%02dXX,1,Set(aa=%s/%s)\n" "$a" "$rootfolder" "$folder" +[ -z "$ld" ] && printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" = \"00\"]?8track-player,#%s,1)\n" "$tc" || printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" = \"00\"]?8track-player,*%s,1)\n" "$tc" +printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" > \"%s\"]?9999)\n" "$limit" +[ -z "$ld" ] && printf "same = n,GoToIf(\$[\"\${EXTEN:-2}\" < \"10\"]?cart-player,#\${EXTEN:-1},1)\n" +printf "same = n,GoTo(cart-player,*\${EXTEN:-2},1)\nsame = 9999,Playback(option-is-invalid)\nsame =n,GoTo(%s-main,s,1)\n\n" "$name" } >> $name-juke.conf # main printf "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |a|j|w| - asterisk jukebox wizard\n version 1.10 - Jay Moore/NQ4T\n https://git.pickmy.org/dewdude/jaw\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n\n" printf "Pick a name/identifier for this jukebox: " -read name -printf "\nEnter the folder your jukebox roots live under. (Leave blank if they're under $ast): " -read sd +read -r name +printf "\nEnter the folder your jukebox roots live under. (Leave blank if they're under %s): " "$asd" +read -r sd printf "\nEnter the name of the root folder your jukebox albums live under: " -read rootfolder +read -r rootfolder printf "\nEnter the filename of your menu/intro: " -read introfile +read -r introfile printf "\nHow many times do you want it to play? " -read loop +read -r loop printf "\nHow many seconds between intro play? (Leave blank for no delay): " -read delay +read -r delay printf "\nEnter the filename of your exit file: " -read goodbye +read -r goodbye printf "\nEnter a channel volume. (I recommend -3, also the default if you leave this blank): " -read vol +read -r vol [ -n "$vol" ] && vol="-3" printf "\nWriting Basic Configuration.\n\nAuto-Generating Albums\n\n" [ -n "$sd" ] && rootfolder=$sd/$rootfolder @@ -57,18 +57,18 @@ setup; # album context loop -dir=$(ls $asd/$rootfolder -l | awk '/^d/ {print $9}') +dir=$(find $asd/$rootfolder -mindepth 1 -type d -printf '%f\n' | sort -n) a=0 for folder in $dir do -limit=$(ls $asd/$rootfolder/$folder -l | grep "ulaw" | wc -l) +limit=$(find $asd/$rootfolder/$folder/ -name "*.ulaw" | wc -l) tracks=$((limit + 1)) tc=$(printf "%02d" $tracks) -ld=$(ls $asd/$rootfolder/$folder -l | grep "ulaw" | awk '{print $9}' | awk '/^0/') -[ -z "$ld" ] && lz=0 || lz=1 +ld=$(find $asd/$rootfolder/$folder/ -name "*.ulaw" -printf "%f\n" | awk '/^0/') +#[ -z "$ld" ] && lz=0 || lz=1 album; a=$((a + 1)) done -printf "\n\nDone.\n\n\nYour jukebox is located at $name-juke.conf.\n" +printf "\n\nDone.\n\n\nYour jukebox is located at %s-juke.conf.\n" "$name" printf "Make sure to include it and the player conf in your dial plan somewhere.\n\n\n\n" \ No newline at end of file