symuid-import-cmus 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import datetime as dt
  4. import os
  5. import re
  6. import symuid
  7. # import symuid.library.cmus
  8. import sys
  9. FILE_PREFIX = b'CTC'
  10. VERSION_LENGTH = 1
  11. SUPPORTED_VERSION = b'\x0c'
  12. LINE_SEPARATOR = b'\xff' * 56
  13. COLUMN_SEPARATOR = b'\x00'
  14. # always big endian, see cache_init()
  15. FLAGS_BYTEORDER = 'big'
  16. FLAGS_LENGTH = 4
  17. FLAG_64_BIT = 0x01
  18. def symuid_import_cmus(cache_path):
  19. with open(os.path.expanduser(cache_path), 'rb') as c:
  20. # see cache.c cache_init()
  21. assert c.read(len(FILE_PREFIX)) == FILE_PREFIX
  22. cache_version = c.read(VERSION_LENGTH)
  23. assert cache_version == SUPPORTED_VERSION, cache_version
  24. flags = int.from_bytes(c.read(FLAGS_LENGTH), byteorder=FLAGS_BYTEORDER)
  25. # only support 64-bit flag
  26. assert flags & ~FLAG_64_BIT == 0, flags
  27. cache_data = [l.split(COLUMN_SEPARATOR)
  28. for l in c.read().split(LINE_SEPARATOR)]
  29. for track_data in cache_data[1:]:
  30. track_path, codec, codec_profile = track_data[0:3]
  31. if not os.path.exists(track_path):
  32. sys.stderr.write('{!r}: not found\n'.format(track_path))
  33. else:
  34. print(track_path)
  35. def _init_argparser():
  36. import argparse
  37. argparser = argparse.ArgumentParser(description=None)
  38. argparser.add_argument(
  39. 'cache_path',
  40. nargs='?',
  41. default='~/.config/cmus/cache',
  42. help='(default: %(default)r)',
  43. )
  44. return argparser
  45. def main(argv):
  46. argparser = _init_argparser()
  47. args = argparser.parse_args(argv[1:])
  48. symuid_import_cmus(**vars(args))
  49. return 0
  50. if __name__ == "__main__":
  51. sys.exit(main(sys.argv))