Source code for harvestmedia.api.playlist

# -*- coding: utf-8 -*-
from urllib import quote as url_quote

from .exceptions import MissingParameter
from .track import Track
from .util import DictObj


[docs]class PlaylistQuery(object): """Performs calls for the :class:`Playlist` model, also useful in a static context. Available at `Playlist.query` or `playlist_instance.query` """
[docs] def get_member_playlists(self, member_id, _client): """Gets all of the playlists for a particular member. :param member_id: The Harvest Media member identifer :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ method_uri = '/getmemberplaylists/{{service_token}}/%(member_id)s' % \ {'member_id': member_id} xml_root = _client.get_xml(method_uri) playlists = [] playlist_elements = xml_root.find('playlists') for playlist_element in playlist_elements.getchildren(): playlist = Playlist._from_xml(playlist_element, _client) playlist.member_id = member_id playlists.append(playlist) return playlists
[docs] def add_track(self, member_id, playlist_id, track_id, _client): """Adds a track to a member playlist. :param member_id: The Harvest Media member identifer :param playlist_id: The Harvest Media playlist identifer :param track_id: The Harvest Media track identifer :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ method_uri = '/addtoplaylist/{{service_token}}/%(member_id)s/%(playlist_id)s/track/%(track_id)s' % \ {'member_id': member_id, 'playlist_id': playlist_id, 'track_id': track_id} _client.get_xml(method_uri)
[docs] def remove_track(self, member_id, playlist_id, track_id, _client): """Removes a track from a member playlist. :param member_id: The Harvest Media member identifer :param playlist_id: The Harvest Media playlist identifer :param track_id: The Harvest Media track identifer :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ method_uri = '/removeplaylisttrack/{{service_token}}/%(member_id)s/%(playlist_id)s/%(track_id)s' % \ {'member_id': member_id, 'playlist_id': playlist_id, 'track_id': track_id} _client.get_xml(method_uri)
[docs] def remove_playlist(self, member_id, playlist_id, _client): """Removes a member playlist. :param member_id: The Harvest Media member identifer :param playlist_id: The Harvest Media playlist identifer :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ method_uri = '/removeplaylist/{{service_token}}/%(member_id)s/%(id)s' % \ {'member_id': member_id, 'id': playlist_id} _client.get_xml(method_uri)
def _add_playlist(self, **kwargs): """This method is private because the class method on :class:`Playlist` should be used instead :param kwargs: The values for the playlist. See \ `Add Playlist <http://developer.harvestmedia.net/working-with-members-2/add-a-member-playlist/>`_ """ _client = kwargs.get('_client', None) if not _client: raise MissingParameter('You must pass _client to Playlist.add') member_id = kwargs.get('member_id', None) if not member_id: raise MissingParameter('You must pass member_id to Playlist.add') playlist_name = kwargs.get('playlist_name', None) if not playlist_name: raise MissingParameter('You must pass playlist_name to Playlist.add') method_uri = '/addplaylist/{{service_token}}/%(member_id)s/%(playlist_name)s/' % \ {'member_id': member_id, 'playlist_name': url_quote(playlist_name.encode('utf-8'))} xml_root = _client.get_xml(method_uri) playlists = xml_root.find('playlists') if playlists is not None: for playlist_xml in playlists.getchildren(): name = playlist_xml.get('name') if name == playlist_name: return Playlist._from_xml(playlist_xml, _client)
[docs] def update_playlist(self, member_id, playlist_id, playlist_name, _client): """Updates a playlist in the Harvest Media database. Essentially just a rename. :param member_id: The Harvest Media member identifer :param playlist_id: The Harvest Media playlist_id identifer :param playlist_name: The new name of the playlist" :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` :param kwargs: """ method_uri = '/updateplaylist/{{service_token}}/%(member_id)s/%(playlist_id)s/%(playlist_name)s' % \ {'member_id': member_id, 'playlist_id': playlist_id, 'playlist_name': url_quote(playlist_name.encode('utf-8'))} _client.get_xml(method_uri)
[docs]class Playlist(DictObj): """ Represents a Harvest Media member playlist asset :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ query = PlaylistQuery() def __init__(self, _client): self.tracks = [] self._client = _client @classmethod def _from_xml(cls, xml_data, _client): """Internally-used classmethod to create an instance of :class:`Playlist` from the XML returned by Harvest Media. Converts all attributes on the node to instance properties. Example XML:: <playlist id="908098a8a0ba8b065" name="sample playlist"> <tracks> <track tracknumber="1" time="02:50" lengthseconds="170" comment="Track Comment" composer="JJ Jayjay" publisher="PP Peepee" name="Epic Track" albumid="1abcbacbac33" id="11bacbcbabcb3b2823" displaytitle="Epic Track" genre="Pop / Rock" bpm="100" mixout="FULL" frequency="44100" bitrate="1411" dateingested="2008-05-15 06:08:18"/> </tracks> </playlist> :param xml_data: The Harvest Media XML node :param _client: An initialized instance of :class:`harvestmedia.api.client.Client` """ instance = cls(_client) instance.id = xml_data.get('id') for attribute, value in xml_data.items(): setattr(instance, attribute, value) tracks = xml_data.find('tracks') if tracks: for track in tracks.getchildren(): instance.tracks.append(Track._from_xml(track, _client)) return instance @classmethod
[docs] def add(cls, **kwargs): """Creates and returns a new (empty) playlist for a member `Add Member Playlist <http://developer.harvestmedia.net/working-with-members-2/add-a-member-playlist/>`_ for arguments. """ return cls.query._add_playlist(**kwargs)
[docs] def add_track(self, track_id): """Add a track to a this playlist :param track_id: The Harvest Media track identifer """ self.query.add_track(self.member_id, self.playlist_id, track_id, self._client) self.tracks.append(Track.query.get_by_id(track_id, self._client))
[docs] def remove_track(self, track_id): """Removes a track from this playlist :param track_id: The Harvest Media track identifer """ self.query.remove_track(self.member_id, self.id, track_id, self._client) for track in self.tracks: if track.id == track_id: self.tracks.remove(track)
[docs] def remove(self): """Remove this playlist""" self.query.remove_playlist(self.member_id, self.playlist_id, self._client)
[docs] def update(self): """Updates the playlist on Harvest Media with the current values values . """ self.query.update_playlist(self.member_id, self.id, self.name, self._client)