You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jay 6b2b3434f5 Depreciation. Final Tweaks. The End. 2 years ago
LICENSE Initial Commit of .73 2 years ago
README.md Depreciation. Final Tweaks. The End. 2 years ago
example.conf Initial Commit of .73 2 years ago
jaw.sh Initial Commit of .73 2 years ago

README.md

jaw - Jukebox for Asterisk Wizard

Builds a dialplan to make Asterisk function as a jukebox.

It has been depreciated in favor of ajw. https://git.pickmy.org/dewdude/ajw

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 .73 update brings some major changes to the wizard. You no longer need to have leading zeros for tracks under 10; just specify in the prompt whether you do. But everything for that jukebox must follow the same convention.

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.

"How many albums:" - the number of albums to enter

"Enter 1 if tracks < 10 have leading 0:" - Script looks for 1 or 0.

The script is now fully automatic from this point; gathering each folder in the jukebox root, counting the tracks, and writing the config.

Copy the conf to your asterisk directory and include it in your extensions.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

19-NOV-2021 - Intitial Commit
19-NOV-2021 - Additional Settings. More Confusing To Read
20-NOV-2021 - Finally fixed that major bug in playback.
		Replaced all echo with printf.
21-NOV-2021 - Added explanation of dialplan
22-NOV-2021 - Fixed "0 to menu" bug in album playback.
		Added volume input prompt.
01-MAY-2022 - Major Update: More automation, better dialplan

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.

[foobar-main]
exten = s,1,Answer()			; Hello, Bananaphone
same =n,Set(VOLUME(TX)=-3)		; my Candian friend told me everything was too loud
same = n(return),Set(m=1)		; counter for loop
same = n(loop),Background(foobar/foo)	; play background/intro
same = n,WaitExten(5)			; Wait 5 seconds
same = n,Set(m=$[${m} + 1])		; increment the counter
same = n,GoToIf($["${m}" < "5"]?loop)	; Protip: don't use while unless absolutely necessary
same = n,Background(foobar/bar)	; outro file
same = n,Hangup()			; "and your mother!" *SLAM!*

I don't think much has changed here other than replacing the while with a few labels and gotoif. I had issues with whileloops nesting and causing problems.

exten = _00XX,1,Set(aa=bar/foobar)		; pattern match for album and write folder location
same = n,GoToIf($["${EXTEN:-2}" = "00"]?full)	; check for 00 in track number
same = n,Goto(foo-juke-one,${EXTEN:-2},1)	; go to single playback routine, use stripped ext
same = n(full),Set(tt=6)				; this is one more than actual album track number			
same = n,Goto(foo-juke-full,s,1)			; go to album playback routine

exten = _01XX,1,Set(aa=bar2/bar)		; Second verse, same as the first. A little bit louder a little bit worse
same = n,GoToIf($["${EXTEN:-2}" = "00"]?full)	; I'm Henry the eighth I am. Henry the eighth I am I am
same = n,Goto(foo2-juke-one,${EXTEN:-2},1)	; I got married to the window next door, she's been married seven times before
same = n(full),Set(tt=5)				; And ev'ry one was a Henry (Henry!). She wouldn't have a Willy or a Sam (no Sam)
same = n,Goto(foo-juke-full,s,1)			; I'm her eighth old man, I'm Henry. Henry the eighth I am.

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.

[foo-juke-one]					; single playback routine
;exten = _0X,1,Wait(.25)				; extension for tracks without leading 0
;same= n,Background(${aa}/${EXTEN:-1})	; pull only the last digit of called extension, play
;same= n,Goto(foo-main,s,1)			; go back to main menu	
exten = _XX,1,Wait(.25)				; tracks with leading 0 or > 10
same= n,Background(${aa}/${EXTEN})		; play file
same = n,Goto(foo-main,s,return)		; go home

exten = 0,1,Goto(foo-main,s,return)		; press 0 to go home

So the big change here is the fact we now use pattern matching. In cases where you don't have leading zeros in the file name; then we match extensions starting with 0 and just use the last digit. This extension is only written if needed. The second extension matches anything and just passes it. It's always written as it's used for tracks over 10 and leading 0 filenames.

[foo-juke-full]					; full album context
exten = s,1,Set(t=1)				; reset track counter
;same = n(lead),GoToIf($[${t} > 9]?hax)		; leading 0 file name hack
;same = n,Background(${aa}/0${t})		; only written if needed
;same = n,Goto(s,next)				; make sure you pick the right option in wizard
same = n(hax),Background(${aa}/${t})		; play the thing
same = n(next),Set(t=$[${t} + 1])			; increment the track counter
same = n(skip),GoToIf($[${t} < ${tt}]?hax)		; Asterisk while sucks. We'll make our own.
;same = n(skip),GoToIf($[${t} < ${tt}]?lead)	; This line is used instead if you have leading 0s
same= n,Background(bar/bar)			; play the outro
same = n,Hangup()				; GTFO

exten = 1,1,GoToIf($["${t}" = "1"]?wait)		; We can't play track 0.
same = n,Set(t=$[${t} - 1])			; decrement track counter
same = n(wait),Wait(.25)				; wait for dtmf
same = n,Goto(s,hax)				; go play the thing
;same = n,Goto(s,lead)				; if leading 0s is true

exten = 2,1,Wait(.25)				; shut up DTMF
same = n,Goto(s,hax)				; go play the thing
;same = n,Goto(s,lead)				; if leading 0s is true

exten = 3,1,Wait(.25)				; DTMF hax
same = n,Goto(s,next)				; go to next track
exten = 0,1,Goto(foo-main,s,return)		; go home dad you're drunk

The another elimination of the while loops makes for a big change. The hack for leading 0's is now optional; and a few more labels from eliminting the loop and being able to skip writing the hack bring it together. The skip extension no longer actually does math, but just directs to the dialplan line that does.

License

jaw - jukebox for asterisk 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 <https://www.gnu.org/licenses/>.