symuid-sync 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import mutagen
  4. import mutagen.id3
  5. import mutagen.mp4
  6. import os
  7. import re
  8. import subprocess
  9. import sys
  10. import symuid
  11. PATH_DEFAULT_IGNORE_REGEX = r'\.(itdb|itc2|itl|jpg|midi?|plist|xml|zip)$'
  12. def generate_uuid():
  13. return subprocess.check_output(['uuid', '-v', '4', '-F', 'BIN']).strip()
  14. def log_path(track_path, msg, stream=sys.stdout):
  15. stream.write("{!r}: {}\n".format(track_path, msg))
  16. def log_path_error(track_path, msg):
  17. log_path(track_path, msg, stream=sys.stderr)
  18. def symuid_sync(path, path_ignore_regex, show_ignored=False):
  19. for track in symuid.Track.walk(
  20. root_path=path,
  21. path_ignore_regex=path_ignore_regex,
  22. ignored_cb=lambda p: show_ignored and log_path(p, 'ignored'),
  23. unsupported_cb=lambda p, e: log_path_error(p, 'unsupported type, skipped'),
  24. ):
  25. if track.get_uuid() is None:
  26. track.assign_uuid(generate_uuid())
  27. log_path(track.path, 'assigned uuid {!r}'.format(track.get_uuid()))
  28. def _init_argparser():
  29. import argparse
  30. argparser = argparse.ArgumentParser(description=None)
  31. argparser.add_argument('path')
  32. argparser.add_argument(
  33. '--path-ignore-regex',
  34. default=PATH_DEFAULT_IGNORE_REGEX,
  35. nargs=1,
  36. metavar='pattern',
  37. dest='path_ignore_regex',
  38. type=lambda pattern: re.compile(pattern),
  39. help='(default: %(default)s)',
  40. )
  41. argparser.add_argument(
  42. '--show-ignored',
  43. action='store_true',
  44. )
  45. return argparser
  46. def main(argv):
  47. argparser = _init_argparser()
  48. args = argparser.parse_args(argv[1:])
  49. symuid_sync(**vars(args))
  50. return 0
  51. if __name__ == "__main__":
  52. sys.exit(main(sys.argv))