cmus_cache.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 (
  18. cmus_track.play_count > 0
  19. ): # check before symuid.Track to improve performance
  20. symuid_track = symuid.Track(path=cmus_track.path.decode())
  21. last_count = symuid_track.get_latest_play_count(
  22. player=_PLAYER_NAME, library_id=library_id,
  23. )
  24. assert last_count is None or last_count.count <= cmus_track.play_count, (
  25. symuid_track.path,
  26. last_count.count,
  27. cmus_track.play_count,
  28. )
  29. if last_count is None or last_count.count != cmus_track.play_count:
  30. symuid_track.register_play_count(
  31. symuid.PlayCount(
  32. player=_PLAYER_NAME,
  33. library_id=library_id,
  34. register_dt=datetime_utc_now(),
  35. count=cmus_track.play_count,
  36. ),
  37. tag_set_cb=lambda track, tag: print(
  38. "{!r}: set tag {!r}".format(track.path, tag)
  39. ),
  40. )
  41. def _main():
  42. argparser = argparse.ArgumentParser(
  43. description="Import play counts from cmus' cache"
  44. )
  45. argparser.add_argument("library_id")
  46. argparser.add_argument(
  47. "cache_path",
  48. nargs="?",
  49. default=os.path.expanduser("~/.config/cmus/cache"),
  50. help="(default: %(default)r)",
  51. )
  52. args = argparser.parse_args()
  53. symuid_import_cmus(**vars(args))