Source code for harvestmedia.api.track
# -*- coding: utf-8 -*-
import xml.etree.cElementTree as ET
from .category import Category
from .util import DictObj
[docs]class TrackQuery(object):
"""Performs calls for the :class:`Track` model, also useful in a static
context. Available at `Track.query` or `track_instance.query`
"""
[docs] def get_tracks_for_album(self, album_id, _client, get_full_detail=True):
"""Gets all of the tracks for a particular album.
:param album_id: The Harvest Media album identifer
:param _client: An initialized instance of :class:`harvestmedia.api.client.Client`
:param get_full_detail: if True, sends a second request to get all of \
the details for every track on the album
"""
track_list = []
method_uri = '/getalbumtracks/{{service_token}}/' + album_id
xml_root = _client.get_xml(method_uri)
tracks = xml_root.find('tracks').getchildren()
for track_element in tracks:
track = Track._from_xml(track_element, _client)
track_list.append(track)
if len(track_list) == 0:
return track_list
if get_full_detail:
# now we need to get the fulldetail
track_ids = [t.id for t in track_list]
return self.get_tracks(track_ids, _client)
else:
return track_list
[docs] def get_tracks(self, track_ids, _client):
"""Takes a list of track ids and returns a list of
:class:`harvestmedia.api.track.Track` objects.
:param track_ids: A list of track identifiers to fetch from Harvest
:param _client: An initialized instance of :class:`harvestmedia.api.client.Client`
"""
method_uri = '/gettracks/{{service_token}}'
xml_data = ET.Element('tracks')
xml_data.set('fulldetail', 'true')
for track_id in track_ids:
xml_track = ET.Element('track')
xml_track.text = track_id
xml_data.append(xml_track)
xml_post_body = ET.tostring(xml_data)
xml_data = _client.post_xml(method_uri, xml_post_body)
xml_tracks = xml_data.find('tracks')
tracks = []
if xml_tracks is not None:
for xml_track in xml_tracks.getchildren():
tracks.append(Track._from_xml(xml_track, _client))
return tracks
[docs] def get_by_id(self, track_id, _client):
"""Takes takes a single track id and returns a
:class:`harvestmedia.api.track.Track` object.
:param track_ids: A list of track identifiers to fetch from Harvest
:param _client: An initialized instance of :class:`harvestmedia.api.client.Client`
"""
method_uri = '/gettracks/{{service_token}}'
xml_data = ET.Element('tracks')
xml_data.set('fulldetail', 'true')
xml_track = ET.Element('track')
xml_track.text = track_id
xml_data.append(xml_track)
xml_post_body = ET.tostring(xml_data)
xml_data = _client.post_xml(method_uri, xml_post_body)
xml_tracks = xml_data.find('tracks')
if xml_tracks is not None:
xml_track = xml_tracks.find('track')
if xml_track is not None:
return Track._from_xml(xml_track, _client)
[docs]class Track(DictObj):
""" Represents a Harvest Media track asset
:param _client: An initialized instance of :class:`harvestmedia.api.client.Client`
"""
query = TrackQuery()
def __init__(self, _client):
self.categories = []
self._client = _client
@classmethod
def _from_xml(cls, xml_data, _client):
"""Internally-used classmethod to create an instance of :class:`Track` from
the XML returned by Harvest Media. Converts all attributes
on the node to instance properties.
Example XML::
<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"/>
:param xml_data: The Harvest Media XML node
:param _client: An initialized instance of :class:`harvestmedia.api.client.Client`
"""
instance = cls(_client)
for attribute, value in xml_data.items():
setattr(instance, attribute, value)
categories = xml_data.find('categories')
if categories is not None:
for category in categories.getchildren():
instance.categories.append(Category(category))
return instance
[docs] def as_dict(self):
"""Returns the dictionary representation of this Track"""
return dict([(k, v) for k, v in self.__dict__.items()])