diff --git a/beetsplug/sonosupdate.py b/beetsplug/sonosupdate.py new file mode 100644 index 000000000..56a315a15 --- /dev/null +++ b/beetsplug/sonosupdate.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# This file is part of beets. +# Copyright 2018, Tobias Sauerwein. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. + +"""Updates a Sonos library whenever the beets library is changed. +This is based on the Kodi Update plugin. +""" +from __future__ import division, absolute_import, print_function + +from beets.plugins import BeetsPlugin +import soco + + +class SonosUpdate(BeetsPlugin): + def __init__(self): + super(SonosUpdate, self).__init__() + self.register_listener('database_change', self.listen_for_db_change) + + def listen_for_db_change(self, lib, model): + """Listens for beets db change and register the update""" + self.register_listener('cli_exit', self.update) + + def update(self, lib): + """When the client exists try to send refresh request to a Sonos + controler. + """ + self._log.info(u'Requesting a Sonos library update...') + + device = soco.discovery.any_soco() + + if device: + device.music_library.start_library_update() + else: + self._log.warning(u'Could not find a Sonos device.') + return + + self._log.info(u'Sonos update triggered') diff --git a/docs/changelog.rst b/docs/changelog.rst index dd04b1d71..b1c0d4c29 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -21,6 +21,9 @@ New features: * A new importer configuration ``artist_credit`` will tell beets to prefer the artist credit over the artist when autotagging. :bug:`1249` +* A new interoperability plugin to automatically notify Sonos controllers to + update the music library once the beets library got updated. + Thanks to :user:`cgtobi`. Fixes: diff --git a/docs/plugins/index.rst b/docs/plugins/index.rst index b17c4db98..edd82a255 100644 --- a/docs/plugins/index.rst +++ b/docs/plugins/index.rst @@ -87,6 +87,7 @@ like this:: rewrite scrub smartplaylist + sonosupdate spotify the thumbnails @@ -159,12 +160,15 @@ Interoperability * :doc:`plexupdate`: Automatically notifies `Plex`_ whenever the beets library changes. * :doc:`smartplaylist`: Generate smart playlists based on beets queries. +* :doc:`sonosupdate`: Automatically notifies `Sonos`_ whenever the beets library + changes. * :doc:`thumbnails`: Get thumbnails with the cover art on your album folders. .. _Emby: http://emby.media .. _Plex: http://plex.tv .. _Kodi: http://kodi.tv +.. _Sonos: http://sonos.com Miscellaneous ------------- @@ -262,4 +266,3 @@ Here are a few of the plugins written by the beets community: .. _whatlastgenre: https://github.com/YetAnotherNerd/whatlastgenre/tree/master/plugin/beets .. _beets-usertag: https://github.com/igordertigor/beets-usertag .. _beets-popularity: https://github.com/abba23/beets-popularity - diff --git a/docs/plugins/sonosupdate.rst b/docs/plugins/sonosupdate.rst new file mode 100644 index 000000000..97a13bd07 --- /dev/null +++ b/docs/plugins/sonosupdate.rst @@ -0,0 +1,18 @@ +SonosUpdate Plugin +================== + +The ``sonosupdate`` plugin lets you automatically update `Sonos`_'s music +library whenever you change your beets library. + +To use ``sonosupdate`` plugin, enable it in your configuration +(see :ref:`using-plugins`). + +To use the ``sonosupdate`` plugin you need to install the `soco`_ library with:: + + pip install soco + +With that all in place, you'll see beets send the "update" command to your Sonos +controller every time you change your beets library. + +.. _Sonos: http://sonos.com/ +.. _soco: http://python-soco.com