list.py 2.1 KB

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