symuid-list 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import symuid
  4. def symuid_list(path, path_ignore_regex, filter_expression, sort_expression):
  5. # use generators until sort is required
  6. attr_it = ({'path': track.path, 'play_count': track.get_play_count_sum()}
  7. for track in symuid.Track.walk(path, path_ignore_regex))
  8. if filter_expression:
  9. attr_it = filter(lambda a: eval(filter_expression, a), attr_it)
  10. if sort_expression:
  11. attr_it = list(attr_it)
  12. attr_it.sort(key=lambda a: eval(sort_expression, a))
  13. for attr in attr_it:
  14. print(attr['path'])
  15. def _init_argparser():
  16. import argparse
  17. import re
  18. argparser = argparse.ArgumentParser(description=None)
  19. argparser.add_argument('path')
  20. argparser.add_argument(
  21. '--path-ignore-regex',
  22. default=symuid.Track.PATH_DEFAULT_IGNORE_REGEX,
  23. nargs=1,
  24. metavar='pattern',
  25. dest='path_ignore_regex',
  26. type=lambda pattern: re.compile(pattern),
  27. help='(default: %(default)s)',
  28. )
  29. argparser.add_argument(
  30. '--filter',
  31. metavar='expression',
  32. dest='filter_expression',
  33. help='(example: {!r})'.format(
  34. "play_count > 16 and path.endswith('.mp3')",
  35. ),
  36. )
  37. argparser.add_argument(
  38. '--sort',
  39. metavar='expression',
  40. dest='sort_expression',
  41. help='(example: {!r} or {!r})'.format(
  42. "play_count * -1",
  43. "(play_count, len(path))",
  44. ),
  45. )
  46. return argparser
  47. def main(argv):
  48. argparser = _init_argparser()
  49. args = argparser.parse_args(argv[1:])
  50. symuid_list(**vars(args))
  51. return 0
  52. if __name__ == "__main__":
  53. import sys
  54. sys.exit(main(sys.argv))