script sanity. merge ajw repo.
							parent
							
								
									7deca290eb
								
							
						
					
					
						commit
						1ed379b201
					
				@ -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 <https://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue