mirror of
https://github.com/badaix/snapcast.git
synced 2025-05-03 12:16:36 +02:00
return an empty object if metadata is empty
This commit is contained in:
parent
f871211384
commit
34c7068cd2
2 changed files with 65 additions and 51 deletions
|
@ -144,7 +144,7 @@ public:
|
||||||
|
|
||||||
json toJson() const
|
json toJson() const
|
||||||
{
|
{
|
||||||
json j;
|
json j(json::object());
|
||||||
addTag(j, "trackId", track_id);
|
addTag(j, "trackId", track_id);
|
||||||
addTag(j, "file", file);
|
addTag(j, "file", file);
|
||||||
addTag(j, "duration", duration);
|
addTag(j, "duration", duration);
|
||||||
|
|
|
@ -308,56 +308,69 @@ class SnapcastWrapper(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def __update_metadata(self, meta):
|
def __update_metadata(self, meta):
|
||||||
logger.info(f'Meta: "{meta}"')
|
try:
|
||||||
|
if meta is None:
|
||||||
|
meta = {}
|
||||||
|
logger.info(f'Meta: "{meta}"')
|
||||||
|
|
||||||
self._metadata = {}
|
self._metadata = {}
|
||||||
self._metadata['xesam:artist'] = ['Unknown Artist']
|
self._metadata['xesam:artist'] = ['Unknown Artist']
|
||||||
self._metadata['xesam:title'] = 'Unknown Title'
|
self._metadata['xesam:title'] = 'Unknown Title'
|
||||||
|
|
||||||
for key, value in meta.items():
|
for key, value in meta.items():
|
||||||
if key in tag_mapping:
|
if key in tag_mapping:
|
||||||
try:
|
try:
|
||||||
self._metadata[tag_mapping[key][0]
|
self._metadata[tag_mapping[key][0]
|
||||||
] = tag_mapping[key][1](value)
|
] = tag_mapping[key][1](value)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
logger.warning(f'tag "{key}" not supported')
|
logger.warning(f'tag "{key}" not supported')
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"Can't cast value {value} to {tag_mapping[key][1]}")
|
f"Can't cast value {value} to {tag_mapping[key][1]}")
|
||||||
|
|
||||||
if not 'mpris:artUrl' in self._metadata:
|
if not 'mpris:artUrl' in self._metadata:
|
||||||
self._metadata['mpris:artUrl'] = f'http://{self._params["host"]}:{self._params["port"]}/launcher-icon.png'
|
self._metadata['mpris:artUrl'] = f'http://{self._params["host"]}:{self._params["port"]}/launcher-icon.png'
|
||||||
|
|
||||||
logger.info(f'mpris meta: {self._metadata}')
|
logger.info(f'mpris meta: {self._metadata}')
|
||||||
|
|
||||||
self.notify_about_track(self._metadata)
|
self.notify_about_track(self._metadata)
|
||||||
new_meta = self._dbus_service.update_property('org.mpris.MediaPlayer2.Player',
|
new_meta = self._dbus_service.update_property('org.mpris.MediaPlayer2.Player',
|
||||||
'Metadata')
|
'Metadata')
|
||||||
logger.info(f'new meta {new_meta}')
|
logger.info(f'new meta {new_meta}')
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f'Error in update_metadata: {str(e)}')
|
||||||
|
|
||||||
def __update_properties(self, props):
|
def __update_properties(self, props):
|
||||||
if props is None:
|
try:
|
||||||
props = {}
|
if props is None:
|
||||||
logger.info(f'Properties: "{props}"')
|
props = {}
|
||||||
# store the last receive time stamp for better position estimation
|
logger.info(f'Properties: "{props}"')
|
||||||
if 'position' in props:
|
# store the last receive time stamp for better position estimation
|
||||||
props['received'] = time.time()
|
if 'position' in props:
|
||||||
|
props['_received'] = time.time()
|
||||||
|
|
||||||
changed_properties = {}
|
# ignore "internal" properties, starting with "_"
|
||||||
for key, value in props.items():
|
changed_properties = {}
|
||||||
if not key in self._properties:
|
for key, value in props.items():
|
||||||
changed_properties[key] = [None, value]
|
if key.startswith('_'):
|
||||||
elif value != self._properties[key]:
|
continue
|
||||||
changed_properties[key] = [self._properties[key], value]
|
if not key in self._properties:
|
||||||
for key, value in self._properties.items():
|
changed_properties[key] = [None, value]
|
||||||
if not key in props:
|
elif value != self._properties[key]:
|
||||||
changed_properties[key] = [value, None]
|
changed_properties[key] = [self._properties[key], value]
|
||||||
self._properties = props
|
for key, value in self._properties.items():
|
||||||
logger.info(f'Changed properties: "{changed_properties}"')
|
if key.startswith('_'):
|
||||||
for key, value in changed_properties.items():
|
continue
|
||||||
if key in property_mapping:
|
if not key in props:
|
||||||
self._dbus_service.update_property(
|
changed_properties[key] = [value, None]
|
||||||
'org.mpris.MediaPlayer2.Player', property_mapping[key])
|
self._properties = props
|
||||||
|
logger.info(f'Changed properties: "{changed_properties}"')
|
||||||
|
for key, value in changed_properties.items():
|
||||||
|
if key in property_mapping:
|
||||||
|
self._dbus_service.update_property(
|
||||||
|
'org.mpris.MediaPlayer2.Player', property_mapping[key])
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f'Error in update_properties: {str(e)}')
|
||||||
|
|
||||||
def on_ws_message(self, ws, message):
|
def on_ws_message(self, ws, message):
|
||||||
logger.info(f'Snapcast RPC websocket message received: {message}')
|
logger.info(f'Snapcast RPC websocket message received: {message}')
|
||||||
|
@ -481,14 +494,15 @@ class SnapcastWrapper(object):
|
||||||
return self._properties
|
return self._properties
|
||||||
|
|
||||||
def position(self):
|
def position(self):
|
||||||
logger.info(f'Position props: {self._properties}, meta: {self._metadata}')
|
logger.debug(
|
||||||
|
f'Position props: {self._properties}, meta: {self._metadata}')
|
||||||
if not 'position' in self._properties:
|
if not 'position' in self._properties:
|
||||||
return 0
|
return 0
|
||||||
if not 'mpris:length' in self._metadata:
|
if not 'mpris:length' in self._metadata:
|
||||||
return 0
|
return 0
|
||||||
position = self._properties['position']
|
position = self._properties['position']
|
||||||
if 'received' in self._properties:
|
if '_received' in self._properties:
|
||||||
position += (time.time() - self._properties['received'])
|
position += (time.time() - self._properties['_received'])
|
||||||
return position * 1000000
|
return position * 1000000
|
||||||
|
|
||||||
def property(self, name, default):
|
def property(self, name, default):
|
||||||
|
@ -869,13 +883,13 @@ class MPRISInterface(dbus.service.Object):
|
||||||
# Root methods
|
# Root methods
|
||||||
@ dbus.service.method(__root_interface, in_signature='', out_signature='')
|
@ dbus.service.method(__root_interface, in_signature='', out_signature='')
|
||||||
def Raise(self):
|
def Raise(self):
|
||||||
logger.info('Raise')
|
logger.debug('Raise')
|
||||||
webbrowser.open(url=f'http://{params["host"]}:{params["port"]}', new=1)
|
webbrowser.open(url=f'http://{params["host"]}:{params["port"]}', new=1)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ dbus.service.method(__root_interface, in_signature='', out_signature='')
|
@ dbus.service.method(__root_interface, in_signature='', out_signature='')
|
||||||
def Quit(self):
|
def Quit(self):
|
||||||
logger.info('Quit')
|
logger.debug('Quit')
|
||||||
return
|
return
|
||||||
|
|
||||||
# Player methods
|
# Player methods
|
||||||
|
@ -911,7 +925,7 @@ class MPRISInterface(dbus.service.Object):
|
||||||
|
|
||||||
@ dbus.service.method(__player_interface, in_signature='x', out_signature='')
|
@ dbus.service.method(__player_interface, in_signature='x', out_signature='')
|
||||||
def Seek(self, offset):
|
def Seek(self, offset):
|
||||||
logger.info(f'Seek {offset}')
|
logger.debug(f'Seek {offset}')
|
||||||
snapcast_wrapper.control("Seek", {"Offset": offset})
|
snapcast_wrapper.control("Seek", {"Offset": offset})
|
||||||
# status = mpd_wrapper.status()
|
# status = mpd_wrapper.status()
|
||||||
# current, end = status['time'].split(':')
|
# current, end = status['time'].split(':')
|
||||||
|
@ -928,7 +942,7 @@ class MPRISInterface(dbus.service.Object):
|
||||||
|
|
||||||
@ dbus.service.method(__player_interface, in_signature='ox', out_signature='')
|
@ dbus.service.method(__player_interface, in_signature='ox', out_signature='')
|
||||||
def SetPosition(self, trackid, position):
|
def SetPosition(self, trackid, position):
|
||||||
logger.info(f'SetPosition TrackId: {trackid}, Position: {position}')
|
logger.debug(f'SetPosition TrackId: {trackid}, Position: {position}')
|
||||||
snapcast_wrapper.control(
|
snapcast_wrapper.control(
|
||||||
"SetPosition", {"TrackId": trackid, "Position": position})
|
"SetPosition", {"TrackId": trackid, "Position": position})
|
||||||
self.Seeked(position)
|
self.Seeked(position)
|
||||||
|
@ -946,7 +960,7 @@ class MPRISInterface(dbus.service.Object):
|
||||||
|
|
||||||
@ dbus.service.method(__player_interface, in_signature='', out_signature='')
|
@ dbus.service.method(__player_interface, in_signature='', out_signature='')
|
||||||
def OpenUri(self):
|
def OpenUri(self):
|
||||||
logger.info('OpenUri')
|
logger.debug('OpenUri')
|
||||||
# TODO
|
# TODO
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue