list.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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", type=int, help="(default: none)",
  43. )
  44. argparser.add_argument(
  45. "--prefix",
  46. type=str,
  47. default="",
  48. help="add prefix to each resulting path (default: %(default)r)",
  49. )
  50. return argparser
  51. def _main():
  52. args = _init_argparser().parse_args()
  53. # use generators until sort is required
  54. track_attrs = _walk_track_attrs(
  55. path=args.path, path_ignore_regex=args.path_ignore_regex
  56. )
  57. # pylint: disable=eval-used
  58. if args.filter_expression:
  59. track_attrs = filter(lambda a: eval(args.filter_expression, a), track_attrs)
  60. if args.sort_expression:
  61. track_attrs = sorted(track_attrs, key=lambda a: eval(args.sort_expression, a))
  62. for track_index, attr in enumerate(track_attrs):
  63. if args.limit and track_index == args.limit:
  64. break
  65. print(args.prefix + attr["path"])