Skip to content

Instantly share code, notes, and snippets.

@tribela
Last active September 21, 2019 16:07
Show Gist options
  • Save tribela/532ffeab1c3d4055a83ab828f1012108 to your computer and use it in GitHub Desktop.
Save tribela/532ffeab1c3d4055a83ab828f1012108 to your computer and use it in GitHub Desktop.
Make latest musics playlist for MPD
#!/usr/bin/env python3
from collections import namedtuple
from datetime import timedelta
import functools
import os
from os import path
import sys
import time
DirMtimePair = namedtuple('DirMtimePair', ['dir', 'mtime'])
def is_music_file(filename):
ext = path.splitext(filename)[1]
if filename.startswith('.'):
return False
return ext in ('.mp3', '.ogg', '.wav', '.flac')
def iterate_dir(p):
dirs = []
files = []
for e in os.scandir(p):
if e.name.startswith('.'):
continue
if e.is_file():
files.append(e.path)
elif e.is_dir():
dirs.append(e.path)
yield (p, dirs, files)
for d in dirs:
yield from iterate_dir(d)
def scan_dir(rootdir):
result = {}
for dirpath, dirs, files in iterate_dir(rootdir):
if path.basename(dirpath).startswith('.'):
continue
music_files = list(map(
functools.partial(path.join, dirpath),
filter(is_music_file, files)))
if music_files:
mtime = max(map(path.getmtime, music_files))
result[DirMtimePair(dirpath, mtime)] = music_files
return result
def main(music_dir, playlist, min_count=100, max_mtime=7):
min_count = 100
max_mtime = 7
result = []
tree = scan_dir(music_dir)
now = time.time()
for key in sorted(tree.keys(), key=lambda x: x.mtime, reverse=True):
diff = timedelta(0, now - key.mtime)
if diff.days > max_mtime and len(result) >= min_count:
break
result.extend(map(
functools.partial(path.relpath, start=music_dir),
sorted(tree[key])))
if playlist:
with open(playlist, 'w') as fp:
fp.write('\n'.join(result))
else:
print('\n'.join(result))
if __name__ == '__main__':
music_dir = sys.argv[1]
try:
playlist = sys.argv[2]
except IndexError:
playlist = None
main(music_dir, playlist)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment