Source code for spotify.inbox

from __future__ import unicode_literals

import logging
import threading

import spotify
from spotify import ffi, lib, serialized, utils

__all__ = ["InboxPostResult"]

logger = logging.getLogger(__name__)


[docs]class InboxPostResult(object): """The result object returned by :meth:`Session.inbox_post_tracks`.""" @serialized def __init__( self, session, canonical_username=None, tracks=None, message="", callback=None, sp_inbox=None, add_ref=True, ): assert ( canonical_username and tracks or sp_inbox ), "canonical_username and tracks, or sp_inbox, is required" self._session = session self.loaded_event = threading.Event() if sp_inbox is None: canonical_username = utils.to_char(canonical_username) if isinstance(tracks, spotify.Track): tracks = [tracks] message = utils.to_char(message) handle = ffi.new_handle((self._session, self, callback)) self._session._callback_handles.add(handle) sp_inbox = lib.sp_inbox_post_tracks( self._session._sp_session, canonical_username, [t._sp_track for t in tracks], len(tracks), message, _inboxpost_complete_callback, handle, ) add_ref = True if sp_inbox == ffi.NULL: raise spotify.Error("Inbox post request failed to initialize") if add_ref: lib.sp_inbox_add_ref(sp_inbox) self._sp_inbox = ffi.gc(sp_inbox, lib.sp_inbox_release) loaded_event = None """:class:`threading.Event` that is set when the inbox post result is loaded. """ def __repr__(self): if not self.loaded_event.is_set(): return "InboxPostResult(<pending>)" else: return "InboxPostResult(%s)" % self.error._name def __eq__(self, other): if isinstance(other, self.__class__): return self._sp_inbox == other._sp_inbox else: return False def __ne__(self, other): return not self.__eq__(other) def __hash__(self): return hash(self._sp_inbox) @property def error(self): """An :class:`ErrorType` associated with the inbox post result. Check to see if there was problems posting to the inbox. """ return spotify.ErrorType(lib.sp_inbox_error(self._sp_inbox))
@ffi.callback("void(sp_inbox *, void *)") @serialized def _inboxpost_complete_callback(sp_inbox, handle): logger.debug("inboxpost_complete_callback called") if handle == ffi.NULL: logger.warning("pyspotify inboxpost_complete_callback called without userdata") return (session, inbox_post_result, callback) = ffi.from_handle(handle) session._callback_handles.remove(handle) inbox_post_result.loaded_event.set() if callback is not None: callback(inbox_post_result)