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
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)
|