symuid-list 1.7 KB

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