From 30d79d09cd612e857e13ba45727d2f87b91a6f95 Mon Sep 17 00:00:00 2001 From: asmaklad Date: Sun, 4 Dec 2022 15:14:58 +0100 Subject: [PATCH 1/4] Update playAzaan.sh fix the omxplayer replacement --- playAzaan.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playAzaan.sh b/playAzaan.sh index 6ad5f25..e6b3f81 100755 --- a/playAzaan.sh +++ b/playAzaan.sh @@ -15,7 +15,7 @@ for hook in $root_dir/before-hooks.d/*; do done # Play Azaan audio -omxplayer --vol $vol -o local $audio_path +mpg321 -g $vol $audio_path # Run after hooks for hook in $root_dir/after-hooks.d/*; do From 8355932855a2a1fc3b44ab0e1a4208f36e697fda Mon Sep 17 00:00:00 2001 From: hussam-u410 Date: Thu, 1 Jan 2026 16:29:05 -0600 Subject: [PATCH 2/4] fix gain/volume calculations --- playAzaan.sh | 10 +++++++--- updateAzaanTimers.py | 18 +++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/playAzaan.sh b/playAzaan.sh index e6b3f81..c35a1c7 100755 --- a/playAzaan.sh +++ b/playAzaan.sh @@ -1,11 +1,15 @@ #!/usr/bin/env bash if [ $# -lt 1 ]; then - echo "USAGE: $0 []" + echo "USAGE: $0 []" exit 1 fi audio_path="$1" -vol=${2:-0} +MAX_PCM=32767 +vol=${2:-100} # percent (0-100). 100 is normal. +if [ "$vol" -lt 0 ]; then vol=0; fi +if [ "$vol" -gt 100 ]; then vol=100; fi +gain=$(( vol * MAX_PCM / 100 )) root_dir=`dirname $0` # Run before hooks @@ -15,7 +19,7 @@ for hook in $root_dir/before-hooks.d/*; do done # Play Azaan audio -mpg321 -g $vol $audio_path +mpg123 -q -f "$gain" "$audio_path" # Run after hooks for hook in $root_dir/after-hooks.d/*; do diff --git a/updateAzaanTimers.py b/updateAzaanTimers.py index 963539c..4d37a92 100755 --- a/updateAzaanTimers.py +++ b/updateAzaanTimers.py @@ -29,9 +29,9 @@ def parseArgs(): dest='method', help='Method of calculation') parser.add_argument('--fajr-azaan-volume', type=int, dest='fajr_azaan_vol', - help='Volume for fajr azaan in millibels, 1500 is loud and -30000 is quiet (default 0)') + help='Volume for fajr azaan as a percent (0-100). 100 is normal (default 100)') parser.add_argument('--azaan-volume', type=int, dest='azaan_vol', - help='Volume for azaan (other than fajr) in millibels, 1500 is loud and -30000 is quiet (default 0)') + help='Volume for azaan (other than fajr) as a percent (0-100). 100 is normal (default 100)') return parser def mergeArgs(args): @@ -43,6 +43,8 @@ def mergeArgs(args): lat, lng, method, fajr_azaan_vol, azaan_vol = f.readlines()[0].split(',') except: print('No .settings file found') + def clamp_percent(v): + return max(0, min(100, int(v))) # merge args if args.lat: lat = args.lat @@ -56,17 +58,19 @@ def mergeArgs(args): method = args.method if args.fajr_azaan_vol: fajr_azaan_vol = args.fajr_azaan_vol - if fajr_azaan_vol: - fajr_azaan_vol = int(fajr_azaan_vol) if args.azaan_vol: azaan_vol = args.azaan_vol + + if fajr_azaan_vol: + fajr_azaan_vol = clamp_percent(fajr_azaan_vol) if azaan_vol: - azaan_vol = int(azaan_vol) + azaan_vol = clamp_percent(azaan_vol) + # save values with open(file_path, 'wt') as f: f.write('{},{},{},{},{}'.format(lat or '', lng or '', method or '', - fajr_azaan_vol or 0, azaan_vol or 0)) - return lat or None, lng or None, method or None, fajr_azaan_vol or 0, azaan_vol or 0 + fajr_azaan_vol or 100, azaan_vol or 100)) + return lat or None, lng or None, method or None, fajr_azaan_vol or 100, azaan_vol or 100 def addAzaanTime (strPrayerName, strPrayerTime, objCronTab, strCommand): job = objCronTab.new(command=strCommand,comment=strPrayerName) From b38b5b7da7aa98f07dffa41e63f0e55a2fee9d52 Mon Sep 17 00:00:00 2001 From: hussam-u410 Date: Fri, 2 Jan 2026 15:35:12 -0600 Subject: [PATCH 3/4] example .settings file --- .settings.example | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .settings.example diff --git a/.settings.example b/.settings.example new file mode 100644 index 0000000..c99d4d3 --- /dev/null +++ b/.settings.example @@ -0,0 +1,5 @@ +# Copy this file to `.settings` and replace the placeholders. +# Format: lat,lng,method,fajr_volume_percent,azaan_volume_percent +# +# Keep it as a single CSV line with 5 values. +,,MWL,100,100 From 6bcaff9cd22e5b59611b8fbc81f8433a5153c9f8 Mon Sep 17 00:00:00 2001 From: hussam-u410 Date: Fri, 2 Jan 2026 15:42:48 -0600 Subject: [PATCH 4/4] allow customization of mp3 file --- .settings.example | 6 ++--- updateAzaanTimers.py | 53 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/.settings.example b/.settings.example index c99d4d3..938478d 100644 --- a/.settings.example +++ b/.settings.example @@ -1,5 +1,5 @@ # Copy this file to `.settings` and replace the placeholders. -# Format: lat,lng,method,fajr_volume_percent,azaan_volume_percent +# Format: lat,lng,method,fajr_volume_percent,azaan_volume_percent,fajr_audio,azaan_audio # -# Keep it as a single CSV line with 5 values. -,,MWL,100,100 +# Keep it as a single CSV line with 7 values. +,,MWL,100,100,Adhan-fajr.mp3,Adhan-Madinah.mp3 diff --git a/updateAzaanTimers.py b/updateAzaanTimers.py index 4d37a92..f719073 100755 --- a/updateAzaanTimers.py +++ b/updateAzaanTimers.py @@ -5,6 +5,7 @@ import sys from os.path import dirname, abspath, join as pathjoin import argparse +import shlex root_dir = dirname(abspath(__file__)) sys.path.insert(0, pathjoin(root_dir, 'crontab')) @@ -32,19 +33,32 @@ def parseArgs(): help='Volume for fajr azaan as a percent (0-100). 100 is normal (default 100)') parser.add_argument('--azaan-volume', type=int, dest='azaan_vol', help='Volume for azaan (other than fajr) as a percent (0-100). 100 is normal (default 100)') + parser.add_argument('--fajr-audio', dest='fajr_audio', + help='MP3 filename or path for fajr (default Adhan-fajr.mp3)') + parser.add_argument('--azaan-audio', dest='azaan_audio', + help='MP3 filename or path for all other prayers (default Adhan-Madinah.mp3)') return parser def mergeArgs(args): file_path = pathjoin(root_dir, '.settings') # load values - lat = lng = method = fajr_azaan_vol = azaan_vol = None + lat = lng = method = fajr_azaan_vol = azaan_vol = fajr_audio = azaan_audio = None try: with open(file_path, 'rt') as f: - lat, lng, method, fajr_azaan_vol, azaan_vol = f.readlines()[0].split(',') + parts = f.readlines()[0].strip().split(',') + # Backward compatible: + # - old format: lat,lng,method,fajr_volume,azaan_volume + # - new format: lat,lng,method,fajr_volume,azaan_volume,fajr_audio,azaan_audio + while len(parts) < 7: + parts.append('') + lat, lng, method, fajr_azaan_vol, azaan_vol, fajr_audio, azaan_audio = parts[:7] except: print('No .settings file found') def clamp_percent(v): return max(0, min(100, int(v))) + def norm_audio(v, default_name): + v = (v or '').strip() + return v or default_name # merge args if args.lat: lat = args.lat @@ -60,17 +74,26 @@ def clamp_percent(v): fajr_azaan_vol = args.fajr_azaan_vol if args.azaan_vol: azaan_vol = args.azaan_vol + if args.fajr_audio: + fajr_audio = args.fajr_audio + if args.azaan_audio: + azaan_audio = args.azaan_audio if fajr_azaan_vol: fajr_azaan_vol = clamp_percent(fajr_azaan_vol) if azaan_vol: azaan_vol = clamp_percent(azaan_vol) + fajr_audio = norm_audio(fajr_audio, 'Adhan-fajr.mp3') + azaan_audio = norm_audio(azaan_audio, 'Adhan-Madinah.mp3') # save values with open(file_path, 'wt') as f: - f.write('{},{},{},{},{}'.format(lat or '', lng or '', method or '', - fajr_azaan_vol or 100, azaan_vol or 100)) - return lat or None, lng or None, method or None, fajr_azaan_vol or 100, azaan_vol or 100 + f.write('{},{},{},{},{},{},{}'.format( + lat or '', lng or '', method or '', + fajr_azaan_vol or 100, azaan_vol or 100, + fajr_audio, azaan_audio + )) + return lat or None, lng or None, method or None, fajr_azaan_vol or 100, azaan_vol or 100, fajr_audio, azaan_audio def addAzaanTime (strPrayerName, strPrayerTime, objCronTab, strCommand): job = objCronTab.new(command=strCommand,comment=strPrayerName) @@ -107,8 +130,8 @@ def addClearLogsCronJob (objCronTab, strCommand): parser = parseArgs() args = parser.parse_args() #Merge args with saved values if any -lat, lng, method, fajr_azaan_vol, azaan_vol = mergeArgs(args) -print(lat, lng, method, fajr_azaan_vol, azaan_vol) +lat, lng, method, fajr_azaan_vol, azaan_vol, fajr_audio, azaan_audio = mergeArgs(args) +print(lat, lng, method, fajr_azaan_vol, azaan_vol, fajr_audio, azaan_audio) #Complain if any mandatory value is missing if not lat or not lng or not method: parser.print_usage() @@ -122,8 +145,20 @@ def addClearLogsCronJob (objCronTab, strCommand): isDst = time.localtime().tm_isdst now = datetime.datetime.now() -strPlayFajrAzaanMP3Command = '{}/playAzaan.sh {}/Adhan-fajr.mp3 {}'.format(root_dir, root_dir, fajr_azaan_vol) -strPlayAzaanMP3Command = '{}/playAzaan.sh {}/Adhan-Madinah.mp3 {}'.format(root_dir, root_dir, azaan_vol) +fajr_audio_path = fajr_audio if fajr_audio.startswith('/') else pathjoin(root_dir, fajr_audio) +azaan_audio_path = azaan_audio if azaan_audio.startswith('/') else pathjoin(root_dir, azaan_audio) +strPlayFajrAzaanMP3Command = '{} {} {} >> {} 2>&1'.format( + shlex.quote(pathjoin(root_dir, 'playAzaan.sh')), + shlex.quote(fajr_audio_path), + shlex.quote(str(fajr_azaan_vol)), + shlex.quote(pathjoin(root_dir, 'adhan.log')), +) +strPlayAzaanMP3Command = '{} {} {} >> {} 2>&1'.format( + shlex.quote(pathjoin(root_dir, 'playAzaan.sh')), + shlex.quote(azaan_audio_path), + shlex.quote(str(azaan_vol)), + shlex.quote(pathjoin(root_dir, 'adhan.log')), +) strUpdateCommand = '{}/updateAzaanTimers.py >> {}/adhan.log 2>&1'.format(root_dir, root_dir) strClearLogsCommand = 'truncate -s 0 {}/adhan.log 2>&1'.format(root_dir) strJobComment = 'rpiAdhanClockJob'