mirror of
https://github.com/badaix/snapcast.git
synced 2025-04-29 18:27:12 +02:00
Post metatags to Snapcast
This commit is contained in:
parent
cc25f1d937
commit
2762687c88
1 changed files with 81 additions and 11 deletions
|
@ -38,7 +38,6 @@ import tempfile
|
||||||
import base64
|
import base64
|
||||||
import musicbrainzngs
|
import musicbrainzngs
|
||||||
import requests
|
import requests
|
||||||
import json
|
|
||||||
|
|
||||||
__version__ = "@version@"
|
__version__ = "@version@"
|
||||||
__git_version__ = "@gitversion@"
|
__git_version__ = "@gitversion@"
|
||||||
|
@ -138,6 +137,50 @@ allowed_tags = {
|
||||||
'xesam:userRating': float,
|
'xesam:userRating': float,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# MPD to Snapcast tag mapping
|
||||||
|
tag_mapping = {
|
||||||
|
'album': ['album', str, False],
|
||||||
|
'albumsort': ['albumSort', str, False],
|
||||||
|
'albumartist': ['albumArtist', str, True],
|
||||||
|
'albumartistsort': ['albumArtistSort', str, True],
|
||||||
|
'artist': ['artist', str, True],
|
||||||
|
'artistsort': ['artistSort', str, True],
|
||||||
|
'astext': ['asText', str, True],
|
||||||
|
'audiobpm': ['audioBPM', int, False],
|
||||||
|
'autorating': ['autoRating', float, False],
|
||||||
|
'comment': ['comment', str, True],
|
||||||
|
'composer': ['composer', str, True],
|
||||||
|
'date': ['contentCreated', str, False],
|
||||||
|
'disc': ['discNumber', int, False],
|
||||||
|
'firstused': ['firstUsed', str, False],
|
||||||
|
'genre': ['genre', str, True],
|
||||||
|
'lastused': ['lastUsed', str, False],
|
||||||
|
'lyricist': ['lyricist', str, True],
|
||||||
|
'title': ['title', str, False],
|
||||||
|
'track': ['trackNumber', int, False],
|
||||||
|
'file': ['file', str, False],
|
||||||
|
'url': ['url', str, False],
|
||||||
|
'usecount': ['useCount', int, False],
|
||||||
|
'userating': ['useRating', float, False],
|
||||||
|
|
||||||
|
'duration': ['duration', float, False],
|
||||||
|
'track': ['track', int, False],
|
||||||
|
'name': ['name', str, False],
|
||||||
|
'originaldate': ['originalDate', str, False],
|
||||||
|
'performer': ['performer', str, True],
|
||||||
|
'conductor': ['conductor', str, True],
|
||||||
|
'work': ['work', str, False],
|
||||||
|
'grouping': ['grouping', str, False],
|
||||||
|
'label': ['label', str, False],
|
||||||
|
'musicbrainz_artistid': ['musicbrainzArtistId', str, False],
|
||||||
|
'musicbrainz_albumid': ['musicbrainzAlbumId', str, False],
|
||||||
|
'musicbrainz_albumartistid': ['musicbrainzAlbumArtistId', str, False],
|
||||||
|
'musicbrainz_trackid': ['musicbrainzTrackId', str, False],
|
||||||
|
'musicbrainz_releasetrackid': ['musicbrainzReleasetrackId', str, False],
|
||||||
|
'musicbrainz_workid': ['musicbrainzWorkId', str, False],
|
||||||
|
}
|
||||||
|
|
||||||
# python dbus bindings don't include annotations and properties
|
# python dbus bindings don't include annotations and properties
|
||||||
MPRIS2_INTROSPECTION = """<node name="/org/mpris/MediaPlayer2">
|
MPRIS2_INTROSPECTION = """<node name="/org/mpris/MediaPlayer2">
|
||||||
<interface name="org.freedesktop.DBus.Introspectable">
|
<interface name="org.freedesktop.DBus.Introspectable">
|
||||||
|
@ -513,6 +556,36 @@ class MPDWrapper(object):
|
||||||
|
|
||||||
mpd_meta = self.last_currentsong()
|
mpd_meta = self.last_currentsong()
|
||||||
print(mpd_meta)
|
print(mpd_meta)
|
||||||
|
snapmeta = {}
|
||||||
|
for key, values in mpd_meta.items():
|
||||||
|
try:
|
||||||
|
value = {}
|
||||||
|
if type(values) == list:
|
||||||
|
if len(values) == 0:
|
||||||
|
continue
|
||||||
|
if tag_mapping[key][2]:
|
||||||
|
value = list(map(type(tag_mapping[key][1]), values))
|
||||||
|
else:
|
||||||
|
value = tag_mapping[key][1](values[0])
|
||||||
|
else:
|
||||||
|
if tag_mapping[key][2]:
|
||||||
|
print('cast')
|
||||||
|
value = [tag_mapping[key][1](values)]
|
||||||
|
else:
|
||||||
|
value = tag_mapping[key][1](values)
|
||||||
|
snapmeta[tag_mapping[key][0]] = value
|
||||||
|
print(
|
||||||
|
f'key: {key}, value: {value}, mapped key: {tag_mapping[key][0]}, mapped value: {snapmeta[tag_mapping[key][0]]}')
|
||||||
|
except KeyError:
|
||||||
|
print(f'tag "{key}" not supported')
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
print("Can't cast value %r to %s" %
|
||||||
|
(value, tag_mapping[key][1]))
|
||||||
|
|
||||||
|
r = requests.post('http://127.0.0.1:1780/jsonrpc', json={"id": 4, "jsonrpc": "2.0", "method": "Stream.SetMeta", "params": {
|
||||||
|
"id": "Spotify", "meta": snapmeta}})
|
||||||
|
print(r)
|
||||||
|
|
||||||
self._metadata = {}
|
self._metadata = {}
|
||||||
|
|
||||||
for tag in ('album', 'title'):
|
for tag in ('album', 'title'):
|
||||||
|
@ -593,13 +666,13 @@ class MPDWrapper(object):
|
||||||
logger.error("Can't cast value %r to %s" %
|
logger.error("Can't cast value %r to %s" %
|
||||||
(value, allowed_tags[key]))
|
(value, allowed_tags[key]))
|
||||||
|
|
||||||
if 'xesam:title' in self._metadata and 'xesam:album' in self._metadata:
|
# if 'xesam:title' in self._metadata and 'xesam:album' in self._metadata:
|
||||||
result = musicbrainzngs.search_releases(artist=self._metadata['xesam:title'], release=self._metadata['xesam:album'],
|
# result = musicbrainzngs.search_releases(artist=self._metadata['xesam:title'], release=self._metadata['xesam:album'],
|
||||||
limit=1)
|
# limit=1)
|
||||||
if result['release-list']:
|
# if result['release-list']:
|
||||||
self._metadata[
|
# self._metadata[
|
||||||
'mpris:artUrl'] = f"http://coverartarchive.org/release/{result['release-list'][0]['id']}/front-250"
|
# 'mpris:artUrl'] = f"http://coverartarchive.org/release/{result['release-list'][0]['id']}/front-250"
|
||||||
print(self._metadata['mpris:artUrl'])
|
# print(self._metadata['mpris:artUrl'])
|
||||||
|
|
||||||
def notify_about_track(self, meta, state='play'):
|
def notify_about_track(self, meta, state='play'):
|
||||||
uri = 'sound'
|
uri = 'sound'
|
||||||
|
@ -623,9 +696,6 @@ class MPDWrapper(object):
|
||||||
body += ' (%s)' % _('Paused')
|
body += ' (%s)' % _('Paused')
|
||||||
|
|
||||||
notification.notify(title, body, uri)
|
notification.notify(title, body, uri)
|
||||||
r = requests.post('http://127.0.0.1:1780/jsonrpc', json={"id": 4, "jsonrpc": "2.0", "method": "Stream.SetMeta", "params": {
|
|
||||||
"id": "Spotify", "meta": meta}})
|
|
||||||
print(r)
|
|
||||||
|
|
||||||
def notify_about_state(self, state):
|
def notify_about_state(self, state):
|
||||||
if state == 'stop':
|
if state == 'stop':
|
||||||
|
|
Loading…
Add table
Reference in a new issue