From cb86205728e756125bd9174ae855a2f1f9680445 Mon Sep 17 00:00:00 2001 From: Loren Moore Date: Sat, 7 May 2022 01:00:06 -0400 Subject: [PATCH] Initial Commit. AJW 1.0 --- README.md | 170 +++++++++++++++++++++++++++++++++++++++++++ ajw.sh | 55 ++++++++++++++ example-juke.conf | 23 ++++++ tapecart-player.conf | 37 ++++++++++ 4 files changed, 285 insertions(+) create mode 100644 README.md create mode 100644 ajw.sh create mode 100644 example-juke.conf create mode 100644 tapecart-player.conf diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a20fea --- /dev/null +++ b/README.md @@ -0,0 +1,170 @@ +# 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. + +jaw is a wizard for building the jukebox dialplan. After uploading your files +in the proper folder/filename convention, just answer the jaw's questions; it +will automagically spit out a jukebox dialplan. + +## 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/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 the default asterisk directory; and that you can read it during execution. This +may require you to run the script as root. If your default directory isn't +/var/lib/asterisk/sounds/en then you must modify 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 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. + +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 + +``` +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,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=cleverlys/01cleverlys) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*13,1) +same = n,GoToIf($["${EXTEN:-2}" < "10"]?cart-player,\#${EXTEN:-1},1) +same = n,GoTo(cart-player,*${EXTEN:-2},1) + +exten = _01XX,1,Set(aa=cleverlys/02cashcrop) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*07,1) +same = n,GoToIf($["${EXTEN:-2}" < "10"]?cart-player,\#${EXTEN:-1},1) +same = n,GoTo(cart-player,*${EXTEN:-2},1) + +exten = _02XX,1,Set(aa=cleverlys/03blue) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*13,1) +same = n,GoToIf($["${EXTEN:-2}" < "10"]?cart-player,\#${EXTEN:-1},1) +same = n,GoTo(cart-player,*${EXTEN:-2},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 + +# 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 new file mode 100644 index 0000000..983954e --- /dev/null +++ b/ajw.sh @@ -0,0 +1,55 @@ +#!/bin/bash +#ajw v1.0 - jukebox for asterisk wizard +#Jay Moore/NQ4T - https://git.pickmy.org/dewdude/ajw +#Licensed under GPL-3.0-or-later + +# Works like this: +# Put all your albums in your Asterisk sounds directory: /jukebox root/album/track#.ulaw +# Run script, enter prompts. +# Copy .conf, include in extensions.conf, assign extension. + +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" +printf "same = n,WaitExten($delay)\nsame = n,Set(m=\$[\${m} + 1])\nsame = n,GoToIf(\$[\"\${m}\" < \"$loop\"]?loop)\nsame = n,Background($rootfolder/$goodbye)\nsame = n,Hangup()\n\n" +} >> $name-juke.conf + +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" +[ "$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)\n\n" +} >> $name-juke.conf + +printf "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |a|j|w| - asterisk jukebox wizard\n version 1.0 - 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 root folder name of your jukebox: " +read rootfolder +printf "\nEnter the filename of your menu/intro: " +read introfile +printf "\nHow many times do you want it to play? " +read loop +printf "\nHow many seconds between intro play? " +read delay +printf "\nEnter the filename of your exit file: " +read goodbye +printf "\nEnter a channel volume (I recommend -3): " +read vol +printf "\nWriting Basic Configuration.\n\nAuto-Generating Albums\n\n" +setup; +asd=/var/lib/asterisk/sounds/en +dir=$(ls $asd/$rootfolder -l | awk '/^d/ {print $9}') +a=0 +for folder in $dir +do +tracks=$(ls $asd/$rootfolder/$folder -l | grep "ulaw" | wc -l) +tracks=$((tracks + 1)) +tc=$(printf "%02d" $tracks) +ld=$(ls $asd/$rootfolder/$folder -l | grep "ulaw" | awk '{print $9}' | 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 "Make sure to include 8track-player.conf in some dial plan somewhere." diff --git a/example-juke.conf b/example-juke.conf new file mode 100644 index 0000000..23d4bd1 --- /dev/null +++ b/example-juke.conf @@ -0,0 +1,23 @@ +[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,Background(foobar/bye) +same = n,Hangup() + +exten = _00XX,1,Set(aa=foobar/00album) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*11,1) +same = n,GoTo(cart-player,*${EXTEN:-2},1) + +exten = _01XX,1,Set(aa=foobar/01album) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,*15,1) +same = n,GoTo(cart-player,*${EXTEN:-2},1) + +exten = _02XX,1,Set(aa=foobar/02album) +same = n,GoToIf($["${EXTEN:-2}" = "00"]?8track-player,#12,1) +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) \ No newline at end of file diff --git a/tapecart-player.conf b/tapecart-player.conf new file mode 100644 index 0000000..a37d9fe --- /dev/null +++ b/tapecart-player.conf @@ -0,0 +1,37 @@ +[cart-player] +exten = _#X,1,Wait(.25) +same= n,Background(${aa}/${EXTEN:-1}) +same = n,Goto(${c},s,return) +exten = _*XX,1,Wait(.25) +same= n,Background(${aa}/${EXTEN:-2}) +same = n,Goto(${c},s,return) +exten = 0,1,Goto(${c},s,return) + +[8track-player] +exten = _*XX,1,Set(tt=${IF($[${EXTEN:-2} < 10]?${EXTEN:-1}:${EXTEN:-2})}) +same = n,Set(t=1) +same = n,Set(p=*) +same = n(lead),GoToIf($[${t} = 10]?tenplus) +same = n(hax),Background(${aa}/0${t}) +same = n(next),Set(t=$[${t} + 1]) +same = n,GoToIf($[${t} < ${tt}]?lead) +same = n,Goto(${c},s,goodbye) +same = n(tenplus),Set(p=#) +same = n,GoTo(#00,hax) +exten = _#XX,1,Set(tt=${IF($[${EXTEN:-2} < 10]?${EXTEN:-1}:${EXTEN:-2})}) +same = n,Set(t=1) +same = n,Set(p=#) +same = n(hax),Background(${aa}/${t}) +same = n(next),Set(t=$[${t} + 1]) +same = n,GoToIf($[${t} < ${tt}]?hax) +same = n,Goto(${c},s,goodbye) + +exten = 1,1,GoToIf($["${t}" = "1"]?wait) +same = n,Set(t=$[${t} - 1]) +same = n(wait),Wait(.25) +same = n,Goto(${p}00,hax) +exten = 2,1,Wait(.25) +same = n,Goto(${p}00,hax) +exten = 3,1,Wait(.25) +same = n,Goto(${p}00,next) +exten = 0,1,Goto(${c},s,return) \ No newline at end of file