cmus_cache.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import argparse
  2. import os
  3. import sys
  4. import symuid
  5. import symuid.library.cmus
  6. from symuid._datetime import datetime_utc_now
  7. # TODO rename module to cmus.py
  8. # after ImportMismatchError on `pytest --doctest-modules` was fixed
  9. _PLAYER_NAME = 'cmus'
  10. _LIBRARY_ID_LENGTH_MIN = 8
  11. def symuid_import_cmus(library_id, cache_path):
  12. assert len(library_id) >= _LIBRARY_ID_LENGTH_MIN, library_id
  13. lib = symuid.library.cmus.Cache(cache_path)
  14. for cmus_track in lib.get_tracks():
  15. if not os.path.exists(cmus_track.path):
  16. sys.stderr.write('{!r}: not found\n'.format(cmus_track.path))
  17. elif cmus_track.play_count > 0: # check before symuid.Track to improve performance
  18. symuid_track = symuid.Track(path=cmus_track.path.decode())
  19. last_count = symuid_track.get_latest_play_count(
  20. player=_PLAYER_NAME,
  21. library_id=library_id,
  22. )
  23. assert last_count is None or last_count.count <= cmus_track.play_count, \
  24. (symuid_track.path, last_count.count, cmus_track.play_count)
  25. if last_count is None or last_count.count != cmus_track.play_count:
  26. symuid_track.register_play_count(
  27. symuid.PlayCount(
  28. player=_PLAYER_NAME,
  29. library_id=library_id,
  30. register_dt=datetime_utc_now(),
  31. count=cmus_track.play_count,
  32. ),
  33. tag_set_cb=lambda track, tag:
  34. print('{!r}: set tag {!r}'.format(track.path, tag)),
  35. )
  36. def _main():
  37. argparser = argparse.ArgumentParser(description="Import play counts from cmus' cache")
  38. argparser.add_argument('library_id')
  39. argparser.add_argument(
  40. 'cache_path',
  41. nargs='?',
  42. default=os.path.expanduser('~/.config/cmus/cache'),
  43. help='(default: %(default)r)',
  44. )
  45. args = argparser.parse_args()
  46. symuid_import_cmus(**vars(args))