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.

84 lines
2.5 KiB
Python

# make .env file with one line: "MUSIC_DIR=" followed directly by
# the filepath containing your music
import argparse
import os
import random
from time import sleep
def get_most_recent(d: str, exclude_dirs: list):
folders = list()
min_time = float('inf')
for dirname, subdirs, files in os.walk(d):
folder = dirname.replace(d, '')
excluded = False
for exclude_dir in exclude_dirs:
if exclude_dir in folder.lower():
excluded = True
break
if not folder or \
folder[0:2] == '/_' or \
folder[0:2] == '/.' or \
any(x in folder for x in ['Artwork', 'Scans']) or \
excluded:
continue
else:
lmt = os.stat(dirname).st_mtime
if lmt < min_time:
min_time = lmt
folders.append({
"dirname": dirname,
"modified": os.stat(dirname).st_mtime
})
most_recent = sorted(folders, key=lambda x: x['modified'], reverse=True)
return (most_recent, min_time)
argparser = argparse.ArgumentParser()
argparser.add_argument(
'num', type=int, default=1, help='number of folders to open')
argparser.add_argument(
'--latest', '-l', action='store_true', help='use latest additions')
argparser.add_argument(
'--weighted', '-w', action='store_true',
help='if not latest, weight new content higher than older')
argparser.add_argument(
'--exclude', '-e', type=str, default='',
help='Substrings of dirs to exlude, separated by commas')
args = argparser.parse_args()
exclude_dirs = [
dirname.lower()
for dirname in args.exclude.split(',')
if args.exclude
]
base_url = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(base_url, '.env'), 'r') as f:
music_dir = f.read().rsplit('=', 1)[1].strip()
most_recent, min_time = get_most_recent(music_dir, exclude_dirs)
if args.latest:
picks = [folder['dirname'] for folder in most_recent][:args.num]
elif args.weighted:
random.shuffle(most_recent)
picks = random.choices(
[folder['dirname'] for folder in most_recent],
k=args.num * 3,
weights=[(folder['modified'] - min_time) for folder in most_recent]
)
picks = list(dict.fromkeys(picks))[:args.num]
else:
random.shuffle(most_recent)
picks = random.choices(
[folder['dirname'] for folder in most_recent],
k=args.num
)
picks = list(dict.fromkeys(picks))[:args.num]
for pick in picks:
print(pick)