list.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import argparse
  2. import re
  3. import typing
  4. import symuid
  5. def _walk_track_attrs(path, path_ignore_regex) -> typing.Iterator[dict]:
  6. for track in symuid.Track.walk(path, path_ignore_regex):
  7. yield {'path': track.path,
  8. 'comment': track.comment,
  9. 'play_count': track.get_play_count_sum()}
  10. def _init_argparser():
  11. argparser = argparse.ArgumentParser(description='filter & sort tracks')
  12. argparser.add_argument('path')
  13. argparser.add_argument(
  14. '--path-ignore-regex',
  15. default=symuid.Track.PATH_DEFAULT_IGNORE_REGEX,
  16. dest='path_ignore_regex',
  17. nargs=1,
  18. type=re.compile,
  19. metavar='pattern',
  20. help='(default: %(default)s)',
  21. )
  22. argparser.add_argument(
  23. '--filter',
  24. metavar='expression',
  25. dest='filter_expression',
  26. help='(example: {!r} or {!r})'.format(
  27. "play_count > 16 and path.endswith('.mp3')",
  28. "comment is None or len(comment) < 16",
  29. ),
  30. )
  31. argparser.add_argument(
  32. '--sort',
  33. metavar='expression',
  34. dest='sort_expression',
  35. help='(example: {!r} or {!r})'.format(
  36. "play_count * -1",
  37. "(play_count, len(path))",
  38. ),
  39. )
  40. argparser.add_argument(
  41. '--limit',
  42. type=int,
  43. help='(default: none)',
  44. )
  45. argparser.add_argument(
  46. '--prefix',
  47. type=str,
  48. default='',
  49. help='add prefix to each resulting path (default: %(default)r)',
  50. )
  51. return argparser
  52. def _main():
  53. args = _init_argparser().parse_args()
  54. # use generators until sort is required
  55. track_attrs = _walk_track_attrs(path=args.path, path_ignore_regex=args.path_ignore_regex)
  56. # pylint: disable=eval-used
  57. if args.filter_expression:
  58. track_attrs = filter(lambda a: eval(args.filter_expression, a), track_attrs)
  59. if args.sort_expression:
  60. track_attrs = sorted(track_attrs, key=lambda a: eval(args.sort_expression, a))
  61. for track_index, attr in enumerate(track_attrs):
  62. if args.limit and track_index == args.limit:
  63. break
  64. print(args.prefix + attr['path'])