1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- import datetime as dt
- import os
- import re
- import symuid
- # import symuid.library.cmus
- import sys
- FILE_PREFIX = b'CTC'
- VERSION_LENGTH = 1
- SUPPORTED_VERSION = b'\x0c'
- LINE_SEPARATOR = b'\xff' * 56
- COLUMN_SEPARATOR = b'\x00'
- # always big endian, see cache_init()
- FLAGS_BYTEORDER = 'big'
- FLAGS_LENGTH = 4
- FLAG_64_BIT = 0x01
- def symuid_import_cmus(cache_path):
- with open(os.path.expanduser(cache_path), 'rb') as c:
- # see cache.c cache_init()
- assert c.read(len(FILE_PREFIX)) == FILE_PREFIX
- cache_version = c.read(VERSION_LENGTH)
- assert cache_version == SUPPORTED_VERSION, cache_version
- flags = int.from_bytes(c.read(FLAGS_LENGTH), byteorder=FLAGS_BYTEORDER)
- # only support 64-bit flag
- assert flags & ~FLAG_64_BIT == 0, flags
- cache_data = [l.split(COLUMN_SEPARATOR)
- for l in c.read().split(LINE_SEPARATOR)]
- for track_data in cache_data[1:]:
- track_path, codec, codec_profile = track_data[0:3]
- if not os.path.exists(track_path):
- sys.stderr.write('{!r}: not found\n'.format(track_path))
- else:
- print(track_path)
- def _init_argparser():
- import argparse
- argparser = argparse.ArgumentParser(description=None)
- argparser.add_argument(
- 'cache_path',
- nargs='?',
- default='~/.config/cmus/cache',
- help='(default: %(default)r)',
- )
- return argparser
- def main(argv):
- argparser = _init_argparser()
- args = argparser.parse_args(argv[1:])
- symuid_import_cmus(**vars(args))
- return 0
- if __name__ == "__main__":
- sys.exit(main(sys.argv))
|