Source code for asyncspotify.track

from datetime import datetime, timedelta

from .audioanalysis import AudioAnalysis
from .audiofeatures import AudioFeatures
from .mixins import ArtistMixin, ExternalIDMixin, ExternalURLMixin
from .object import SpotifyObject


class _BaseTrack(SpotifyObject, ExternalURLMixin, ArtistMixin):
	_type = 'track'

	def __init__(self, client, data):
		super().__init__(client, data)

		ExternalURLMixin.__init__(self, data)
		ArtistMixin.__init__(self, data)

		self.available_markets = data.pop('available_markets', None)
		self.disc_number = data.pop('disc_number')
		self.explicit = data.pop('explicit')
		self.preview_url = data.pop('preview_url')
		self.track_number = data.pop('track_number')
		self.is_local = data.pop('is_local')

		self.duration = timedelta(milliseconds=data.pop('duration_ms'))

	def avaliable_in(self, market):
		'''
		Check if track is available in a market.

		:param market: ISO-3166-1_ value.
		:return:
		'''
		return market in self.available_markets

	async def audio_features(self) -> AudioFeatures:
		'''
		Get 'Audio Features' of the track.
		
		:param track: :class:`Track` instance or Spotify ID of track.
		:return: :class:`AudioFeatures`
		'''

		return await self._client.get_audio_features(self.id)

	async def audio_analysis(self) -> AudioAnalysis:
		'''
		Get 'Audio Analysis' of the track.
		
		:param track: :class:`Track` instance or Spotify ID of track.
		:return: :class:`AudioAnalysis`
		'''
		return await self._client.get_audio_analysis(self.id)


[docs]class SimpleTrack(_BaseTrack): ''' Represents a Track object. id: str Spotify ID of the track. name: str Name of the track. artists: List[:class:`Artist`] List of artists that appear on the track. images: List[:class:`Image`] List of associated images, such as album cover in different sizes. uri: str Spotify URI of the album. link: str Spotify URL of the album. type: str Plaintext string of object type: ``track``. available_markets: List[str] or None Markets where the album is available in ISO-3166-1_ form. disc_number: int What disc the track appears on. Usually ``1`` unless there are several discs in the album. duration: `timedelta <https://docs.python.org/3/library/datetime.html#timedelta-objects>`_ timedelta instance representing the length of the track. explicit: bool Whether the track is explicit or not. external_urls: dict Dictionary that maps type to url. is_playable: bool tbc linked_from: :class:`LinkedTrack` tbc restrictions: restrictions object tbc preview_url: str An URL to a 30 second preview (MP3) of the track. track_number: int The number of the track on the album. is_local: bool Whether the track is from a local file. '''
[docs]class FullTrack(_BaseTrack, ExternalIDMixin): ''' Represents a complete Track object. This type has some additional attributes not existent in :class:`SimpleTrack`. album: :class:`SimpleAlbum` An instance of the album the track appears on. popularity: int An indicator of the popularity of the track, 0 being least popular and 100 being the most. external_ids: dict Dictionary of external IDs. ''' def __init__(self, client, data): super().__init__(client, data) ExternalIDMixin.__init__(self, data) self.popularity = data.pop('popularity') from .album import SimpleAlbum self.album = SimpleAlbum(client, data.pop('album'))
[docs]class PlaylistTrack(FullTrack): ''' Represents a Track object originating from a playlist. This type has some additional attributes not existent in :class:`SimpleTrack` or :class:`FullTrack`. added_at: `datetime <https://docs.python.org/3/library/datetime.html#module-datetime>`_ Indicates when the track was added to the playlist. added_by: User object Indicates who added the track to the playlist. The information provided from the API is not enough to instantiate a PublicUser object, so it's a plain copy of the returned json object. ''' def __init__(self, client, data): super().__init__(client, data.pop('track')) self.added_at = datetime.strptime(data.pop('added_at'), "%Y-%m-%dT%H:%M:%SZ") self.added_by = data.pop('added_by')