jukebox.py

#!/usr/bin/python3
# ===================================================================
# Simple jukebox - play bugle calls
# ===================================================================
# pip install playsound
# -------------------------------------------------------------------
# from playsound import playsound
# playsound('abc.mp3')
# ===================================================================
# sudo apt install mp3123
# -------------------------------------------------------------------
# import os
# f = 'sound.mp3'
# os.system(f'mp3123 {f}')
# ===================================================================
# also see:  https://pythonbasics.org/python-play-sound/
# ===================================================================


from playsound import playsound
import user_interface as ui
import platform, re, os, sys


AUDDIR   = './bugle-calls'     # directory of files
FILEPATS = [ '\.mp3$' ]        # list of regexp to match audio files


# -------------------------------------------------------------------
# ---- test if a directory exists - returns True or False
# -------------------------------------------------------------------

def dir_exists(dir):
    if os.path.isdir(dir):
        return True
    return False

# -------------------------------------------------------------------
# ---- test if a file matached a regexp - return True or False
# ---- (ignore case)
# -------------------------------------------------------------------

def file_match(file,patterns):

    for p in patterns:
        if re.search(p,file,re.IGNORECASE):
            return True
    return False

# -------------------------------------------------------------------
# ---- get a list files in a directory that matach a regexp
# -------------------------------------------------------------------

def get_list_of_files(dir,pats):

    # --- get a list of entries in the directory

    flist = os.listdir(dir)

    # --- get a list of audio files

    files = []                       # list of files 

    for f in flist:                  # for each file name
        ff = dir + f                 # file path + name  
        if os.path.isfile(ff):       # regular file?
            if file_match(f,pats):   # file name match pattern?
                files.append(f)      # save file name

    return files


# -------------------------------------------------------------------
# ---- main
# -------------------------------------------------------------------

if __name__ == '__main__':

# ---- running Python3?

    if not ui.running_python3():
        print()
        print('Must run Python3 - exit program')
        print()
        sys.exit()

# ---- fix path to audo files (must end in '/')

    if not re.search('/$',AUDDIR):
        AUDDIR = AUDDIR + '/'

# ---- does the audio file directory exists

    if not dir_exists(AUDDIR):
        print()
        print(f'Directory {AUDDIR} does not exist')
        sys.exit()

# ---- get a list of audio files

    aflist = get_list_of_files(AUDDIR,FILEPATS)

    aflen = len(aflist)

    if aflen < 1:
        sys.exit()

# ---- menu

    while(True):

        ui.clear_screen()

        print('===========================================')
        print('================ My Jukbox ================')
        print('===========================================')

        i = 0

        for af in aflist:
            print(f'[{i}] {af}')
            i += 1

        print()
        s = ui.get_user_input('Enter data: ')
        if not s:              # empty string?
            break

        (tf,n) = ui.is_int(s)
        if not tf:
            print()
            print(f'You entered a bad selection')
            ui.pause()
            continue

        af = AUDDIR + aflist[n]

        playsound(AUDDIR + aflist[n])

        ##ui.pause()

    print()