Read cover with1 “readpicture” command if “albumart” is not found (close #90)
This commit is contained in:
parent
e976e05efe
commit
44fb332c62
109
src/client.py
109
src/client.py
|
@ -650,57 +650,25 @@ class Client(Base):
|
||||||
|
|
||||||
|
|
||||||
def _get_albumart(self, album):
|
def _get_albumart(self, album):
|
||||||
data = None
|
|
||||||
if album in self._albums:
|
if album in self._albums:
|
||||||
album = self._albums[album]
|
album = self._albums[album]
|
||||||
if not album.get_tracks():
|
|
||||||
return (album, None)
|
|
||||||
self._logger.debug("get albumart for album \"%s\"", album.get_title())
|
self._logger.debug("get albumart for album \"%s\"", album.get_title())
|
||||||
size = 1
|
|
||||||
offset = 0
|
|
||||||
index = 0
|
|
||||||
|
|
||||||
# Read data until size is reached
|
# Use "albumart" command
|
||||||
try:
|
if album.get_tracks():
|
||||||
while offset < size:
|
try:
|
||||||
self._write('albumart', args=[album.get_tracks()[0].get_file(), offset])
|
return (album, self._read_binary('albumart', album.get_tracks()[0].get_file(), False))
|
||||||
|
except CommandException as e:
|
||||||
|
# The "albumart" command throws an exception if not found
|
||||||
|
if e.get_error_number() != Client.PROTOCOL_ERROR_NOEXISTS:
|
||||||
|
raise e
|
||||||
|
# If no albumart can be found, use "readpicture" command
|
||||||
|
for track in album.get_tracks():
|
||||||
|
data = self._read_binary('readpicture', track.get_file(), True)
|
||||||
|
if data:
|
||||||
|
return (album, data)
|
||||||
|
|
||||||
# Read first line which tells us whether there is an albumart
|
return (album, None)
|
||||||
line = self._read_line()
|
|
||||||
if line.startswith(Client.PROTOCOL_ERROR):
|
|
||||||
error = line[len(Client.PROTOCOL_ERROR):].strip()
|
|
||||||
self._logger.debug("command failed: %r", error)
|
|
||||||
raise CommandException(error)
|
|
||||||
# First line is the file size
|
|
||||||
size = int(self._parse_dict([line])['size'])
|
|
||||||
self._logger.debug("size: %d", size)
|
|
||||||
# Second line is the count of bytes read
|
|
||||||
binary = int(self._parse_dict([self._read_line()])['binary'])
|
|
||||||
self._logger.debug("binary: %d", binary)
|
|
||||||
|
|
||||||
# Create new data array on the first iteration
|
|
||||||
if not data:
|
|
||||||
data = bytearray(size)
|
|
||||||
# Create a view for the current chunk of data
|
|
||||||
data_view = memoryview(data)[offset:offset+binary]
|
|
||||||
# Read actual bytes
|
|
||||||
self._read_bytes(data_view, binary)
|
|
||||||
offset += binary
|
|
||||||
# Read line break to complete previous repsonse
|
|
||||||
self._read_line()
|
|
||||||
# Read command completion
|
|
||||||
end = self._read_line()
|
|
||||||
if not end.startswith(Client.PROTOCOL_COMPLETION):
|
|
||||||
self._logger.debug("albumart not completed")
|
|
||||||
data = None
|
|
||||||
break
|
|
||||||
except CommandException as e:
|
|
||||||
# If no albumart can be found, do not throw an exception
|
|
||||||
if e.get_error_number() == Client.PROTOCOL_ERROR_NOEXISTS:
|
|
||||||
data = None
|
|
||||||
else:
|
|
||||||
raise e
|
|
||||||
return (album, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_custom(self, name):
|
def _get_custom(self, name):
|
||||||
|
@ -844,6 +812,55 @@ class Client(Base):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _read_binary(self, command, filename, has_mimetype):
|
||||||
|
data = None
|
||||||
|
size = 1
|
||||||
|
offset = 0
|
||||||
|
index = 0
|
||||||
|
|
||||||
|
# Read data until size is reached
|
||||||
|
while offset < size:
|
||||||
|
self._write(command, args=[filename, offset])
|
||||||
|
|
||||||
|
# Read first line
|
||||||
|
line = self._read_line()
|
||||||
|
# Check first line for error
|
||||||
|
if line.startswith(Client.PROTOCOL_ERROR):
|
||||||
|
error = line[len(Client.PROTOCOL_ERROR):].strip()
|
||||||
|
self._logger.debug("command failed: %r", error)
|
||||||
|
raise CommandException(error)
|
||||||
|
# Check first line for completion
|
||||||
|
if line.startswith(Client.PROTOCOL_COMPLETION):
|
||||||
|
break
|
||||||
|
# First line is the file size
|
||||||
|
size = int(self._parse_dict([line])['size'])
|
||||||
|
self._logger.debug("size: %d", size)
|
||||||
|
# For some commands the second line is the mimetype
|
||||||
|
if has_mimetype:
|
||||||
|
mimetype = self._parse_dict([self._read_line()])['type']
|
||||||
|
# Next line is the count of bytes read
|
||||||
|
binary = int(self._parse_dict([self._read_line()])['binary'])
|
||||||
|
self._logger.debug("binary: %d", binary)
|
||||||
|
|
||||||
|
# Create new data array on the first iteration
|
||||||
|
if not data:
|
||||||
|
data = bytearray(size)
|
||||||
|
# Create a view for the current chunk of data
|
||||||
|
data_view = memoryview(data)[offset:offset+binary]
|
||||||
|
# Read actual bytes
|
||||||
|
self._read_bytes(data_view, binary)
|
||||||
|
offset += binary
|
||||||
|
# Read line break to complete previous repsonse
|
||||||
|
self._read_line()
|
||||||
|
# Read command completion
|
||||||
|
end = self._read_line()
|
||||||
|
if not end.startswith(Client.PROTOCOL_COMPLETION):
|
||||||
|
self._logger.debug("albumart not completed")
|
||||||
|
data = None
|
||||||
|
break
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def _read_bytes(self, buf, nbytes):
|
def _read_bytes(self, buf, nbytes):
|
||||||
self._logger.debug("reading bytes")
|
self._logger.debug("reading bytes")
|
||||||
# Use already buffered data
|
# Use already buffered data
|
||||||
|
|
Loading…
Reference in a new issue