1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # -*- coding: utf-8 -*-
- import re
- import sys
- def _int_from_bytes_sys(data_bytes):
- return int.from_bytes(data_bytes, byteorder=sys.byteorder)
- class Track:
- RESERVED_PAD_REGEX = rb'\xff{16,}'
- STRING_TERMINATOR = b'\x00'
- def __init__(self, cache_size, cache_bytes):
- """
- struct cache_entry {
- // size of this struct including size itself
- uint32_t size;
- int32_t play_count;
- int64_t mtime;
- int32_t duration;
- int32_t bitrate;
- int32_t bpm;
- uint8_t _reserved[CACHE_ENTRY_RESERVED_SIZE];
- // filename, codec, codec_profile and N * (key, val)
- char strings[];
- };
- """
- assert len(cache_bytes) + 4 == cache_size
- self._play_count = _int_from_bytes_sys(cache_bytes[0:4])
- # self._mtime = _int_from_bytes_sys(cache_bytes[4:12])
- # self._duration_seconds = _int_from_bytes_sys(cache_bytes[12:16])
- # self._bitrate = _int_from_bytes_sys(cache_bytes[16:20])
- # self._bpm = _int_from_bytes_sys(cache_bytes[20:24])
- strings = re.split(self.RESERVED_PAD_REGEX, cache_bytes)[1] \
- .split(self.STRING_TERMINATOR)
- self._path = strings[0]
- @property
- def path(self):
- return self._path
- @property
- def play_count(self):
- return self._play_count
|