deleted the mixins module. have moved all the mixins.* modules to mixin module
This commit is contained in:
parent
bc726dddc9
commit
03c5cb0046
@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.mixins._cacheable import cacheable
|
|
||||||
from lastfm.mixins._searchable import searchable
|
|
||||||
from lastfm.mixins._sharable import sharable
|
|
||||||
from lastfm.mixins._shoutable import shoutable
|
|
||||||
from lastfm.mixins._taggable import taggable
|
|
||||||
from lastfm.mixins._chartable import chartable
|
|
||||||
from lastfm.mixins._crawlable import crawlable
|
|
||||||
|
|
||||||
__all__ = ['cacheable', 'searchable', 'sharable', 'shoutable', 'taggable'
|
|
||||||
'chartable','crawlable']
|
|
@ -1,53 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
try:
|
|
||||||
from threading import Lock
|
|
||||||
except ImportError:
|
|
||||||
from dummy_threading import Lock
|
|
||||||
from lastfm.objectcache import ObjectCache
|
|
||||||
|
|
||||||
_lock = Lock()
|
|
||||||
|
|
||||||
def cacheable(cls):
|
|
||||||
@classmethod
|
|
||||||
def __new__(cls, *args, **kwds):
|
|
||||||
args = args[1:]
|
|
||||||
subject = None
|
|
||||||
if 'subject' in kwds and not 'Weekly' in cls.__name__:
|
|
||||||
subject = kwds['subject']
|
|
||||||
#del kwds['subject']
|
|
||||||
|
|
||||||
if 'bypass_registry' in kwds:
|
|
||||||
del kwds['bypass_registry']
|
|
||||||
inst = object.__new__(cls)
|
|
||||||
inst.init(*args, **kwds)
|
|
||||||
return inst
|
|
||||||
|
|
||||||
key = cls._hash_func(*args, **kwds)
|
|
||||||
if subject is not None:
|
|
||||||
key = (hash(subject), key)
|
|
||||||
|
|
||||||
with _lock:
|
|
||||||
inst, already_registered = ObjectCache.register(object.__new__(cls), key)
|
|
||||||
if not already_registered:
|
|
||||||
inst.init(*args, **kwds)
|
|
||||||
return inst
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _hash_func(*args, **kwds):
|
|
||||||
raise NotImplementedError("The subclass must override this method")
|
|
||||||
|
|
||||||
cls.__new__ = __new__
|
|
||||||
if not hasattr(cls, '_hash_func'):
|
|
||||||
cls._hash_func = _hash_func
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.append('__new__')
|
|
||||||
|
|
||||||
return cls
|
|
@ -1,451 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.lazylist import lazylist
|
|
||||||
from lastfm.decorators import cached_property
|
|
||||||
|
|
||||||
def chartable(chart_types):
|
|
||||||
def wrapper(cls):
|
|
||||||
@cached_property
|
|
||||||
def weekly_chart_list(self):
|
|
||||||
"""
|
|
||||||
a list of available weekly charts for this group
|
|
||||||
@rtype: L{list} of L{WeeklyChart}
|
|
||||||
"""
|
|
||||||
from lastfm.chart import WeeklyChart
|
|
||||||
params = self._default_params(
|
|
||||||
{'method': '%s.getWeeklyChartList' % self.__class__.__name__.lower()})
|
|
||||||
data = self._api._fetch_data(params).find('weeklychartlist')
|
|
||||||
return [
|
|
||||||
WeeklyChart.create_from_data(self._api, self, c)
|
|
||||||
for c in data.findall('chart')
|
|
||||||
]
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def monthly_chart_list(self):
|
|
||||||
from lastfm.chart import MonthlyChart
|
|
||||||
return MonthlyChart.get_chart_list(self)
|
|
||||||
|
|
||||||
def _default_params(self, extra_params = None):
|
|
||||||
if extra_params is not None:
|
|
||||||
return extra_params
|
|
||||||
else:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def get_weekly_album_chart(self, start = None, end = None):
|
|
||||||
"""
|
|
||||||
Get an album chart for the group, for a given date range.
|
|
||||||
If no date range is supplied, it will return the most
|
|
||||||
recent album chart for the group.
|
|
||||||
|
|
||||||
@param start: the date at which the chart should start from (optional)
|
|
||||||
@type start: C{datetime.datetime}
|
|
||||||
@param end: the date at which the chart should end on (optional)
|
|
||||||
@type end: C{datetime.datetime}
|
|
||||||
|
|
||||||
@return: an album chart for the group
|
|
||||||
@rtype: L{WeeklyAlbumChart}
|
|
||||||
|
|
||||||
@raise InvalidParametersError: Both start and end parameter have to be either
|
|
||||||
provided or not provided. Providing only one of
|
|
||||||
them will raise an exception.
|
|
||||||
"""
|
|
||||||
from lastfm.chart import WeeklyChart, WeeklyAlbumChart
|
|
||||||
params = self._default_params(
|
|
||||||
{'method': '%s.getWeeklyAlbumChart' % self.__class__.__name__.lower()})
|
|
||||||
params = WeeklyChart._check_chart_params(params, self, start, end)
|
|
||||||
data = self._api._fetch_data(params).find('weeklyalbumchart')
|
|
||||||
return WeeklyAlbumChart.create_from_data(self._api, self, data)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_weekly_album_chart(self):
|
|
||||||
"""
|
|
||||||
most recent album chart for the group
|
|
||||||
@rtype: L{WeeklyAlbumChart}
|
|
||||||
"""
|
|
||||||
return self.get_weekly_album_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def weekly_album_chart_list(self):
|
|
||||||
"""
|
|
||||||
a list of all album charts for this group in reverse-chronological
|
|
||||||
order. (that means 0th chart is the most recent chart)
|
|
||||||
@rtype: L{lazylist} of L{WeeklyAlbumChart}
|
|
||||||
"""
|
|
||||||
wcl = list(self.weekly_chart_list)
|
|
||||||
wcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for wc in wcl:
|
|
||||||
try:
|
|
||||||
yield self.get_weekly_album_chart(wc.start, wc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_monthly_album_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import MonthlyAlbumChart
|
|
||||||
return MonthlyAlbumChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_monthly_album_chart(self):
|
|
||||||
return self.get_monthly_album_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def monthly_album_chart_list(self):
|
|
||||||
mcl = list(self.monthly_chart_list)
|
|
||||||
mcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for mc in mcl:
|
|
||||||
try:
|
|
||||||
yield self.get_monthly_album_chart(mc.start, mc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_quaterly_album_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import QuaterlyAlbumChart
|
|
||||||
return QuaterlyAlbumChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_quaterly_album_chart(self):
|
|
||||||
return self.get_quaterly_album_chart()
|
|
||||||
|
|
||||||
def get_half_yearly_album_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import HalfYearlyAlbumChart
|
|
||||||
return HalfYearlyAlbumChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_half_yearly_album_chart(self):
|
|
||||||
return self.get_half_yearly_album_chart()
|
|
||||||
|
|
||||||
def get_yearly_album_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import YearlyAlbumChart
|
|
||||||
return YearlyAlbumChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_yearly_album_chart(self):
|
|
||||||
return self.get_yearly_album_chart()
|
|
||||||
|
|
||||||
def get_weekly_artist_chart(self, start = None, end = None):
|
|
||||||
"""
|
|
||||||
Get an artist chart for the group, for a given date range.
|
|
||||||
If no date range is supplied, it will return the most
|
|
||||||
recent artist chart for the group.
|
|
||||||
|
|
||||||
@param start: the date at which the chart should start from (optional)
|
|
||||||
@type start: C{datetime.datetime}
|
|
||||||
@param end: the date at which the chart should end on (optional)
|
|
||||||
@type end: C{datetime.datetime}
|
|
||||||
|
|
||||||
@return: an artist chart for the group
|
|
||||||
@rtype: L{WeeklyArtistChart}
|
|
||||||
|
|
||||||
@raise InvalidParametersError: Both start and end parameter have to be either
|
|
||||||
provided or not provided. Providing only one of
|
|
||||||
them will raise an exception.
|
|
||||||
"""
|
|
||||||
from lastfm.chart import WeeklyChart, WeeklyArtistChart
|
|
||||||
params = self._default_params(
|
|
||||||
{'method': '%s.getWeeklyArtistChart' % self.__class__.__name__.lower()})
|
|
||||||
params = WeeklyChart._check_chart_params(params, self, start, end)
|
|
||||||
data = self._api._fetch_data(params).find('weeklyartistchart')
|
|
||||||
return WeeklyArtistChart.create_from_data(self._api, self, data)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_weekly_artist_chart(self):
|
|
||||||
"""
|
|
||||||
most recent artist chart for the group
|
|
||||||
@rtype: L{WeeklyArtistChart}
|
|
||||||
"""
|
|
||||||
return self.get_weekly_artist_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def weekly_artist_chart_list(self):
|
|
||||||
"""
|
|
||||||
a list of all artist charts for this group in reverse-chronological
|
|
||||||
order. (that means 0th chart is the most recent chart)
|
|
||||||
@rtype: L{lazylist} of L{WeeklyArtistChart}
|
|
||||||
"""
|
|
||||||
wcl = list(self.weekly_chart_list)
|
|
||||||
wcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for wc in wcl:
|
|
||||||
try:
|
|
||||||
yield self.get_weekly_artist_chart(wc.start, wc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_monthly_artist_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import MonthlyArtistChart
|
|
||||||
return MonthlyArtistChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_monthly_artist_chart(self):
|
|
||||||
return self.get_monthly_artist_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def monthly_artist_chart_list(self):
|
|
||||||
mcl = list(self.monthly_chart_list)
|
|
||||||
mcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for mc in mcl:
|
|
||||||
try:
|
|
||||||
yield self.get_monthly_artist_chart(mc.start, mc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_quaterly_artist_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import QuaterlyArtistChart
|
|
||||||
return QuaterlyArtistChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_quaterly_artist_chart(self):
|
|
||||||
return self.get_quaterly_artist_chart()
|
|
||||||
|
|
||||||
def get_half_yearly_artist_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import HalfYearlyArtistChart
|
|
||||||
return HalfYearlyArtistChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_half_yearly_artist_chart(self):
|
|
||||||
return self.get_half_yearly_artist_chart()
|
|
||||||
|
|
||||||
def get_yearly_artist_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import YearlyArtistChart
|
|
||||||
return YearlyArtistChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_yearly_artist_chart(self):
|
|
||||||
return self.get_yearly_artist_chart()
|
|
||||||
|
|
||||||
def get_weekly_track_chart(self, start = None, end = None):
|
|
||||||
"""
|
|
||||||
Get a track chart for the group, for a given date range.
|
|
||||||
If no date range is supplied, it will return the most
|
|
||||||
recent artist chart for the group.
|
|
||||||
|
|
||||||
@param start: the date at which the chart should start from (optional)
|
|
||||||
@type start: C{datetime.datetime}
|
|
||||||
@param end: the date at which the chart should end on (optional)
|
|
||||||
@type end: C{datetime.datetime}
|
|
||||||
|
|
||||||
@return: a track chart for the group
|
|
||||||
@rtype: L{WeeklyTrackChart}
|
|
||||||
|
|
||||||
@raise InvalidParametersError: Both start and end parameter have to be either
|
|
||||||
provided or not provided. Providing only one of
|
|
||||||
them will raise an exception.
|
|
||||||
"""
|
|
||||||
from lastfm.chart import WeeklyChart, WeeklyTrackChart
|
|
||||||
params = self._default_params(
|
|
||||||
{'method': '%s.getWeeklyTrackChart' % self.__class__.__name__.lower()})
|
|
||||||
params = WeeklyChart._check_chart_params(params, self, start, end)
|
|
||||||
data = self._api._fetch_data(params).find('weeklytrackchart')
|
|
||||||
return WeeklyTrackChart.create_from_data(self._api, self, data)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_weekly_track_chart(self):
|
|
||||||
"""
|
|
||||||
most recent track chart for the group
|
|
||||||
@rtype: L{WeeklyTrackChart}
|
|
||||||
"""
|
|
||||||
return self.get_weekly_track_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def weekly_track_chart_list(self):
|
|
||||||
"""
|
|
||||||
a list of all track charts for this group in reverse-chronological
|
|
||||||
order. (that means 0th chart is the most recent chart)
|
|
||||||
@rtype: L{lazylist} of L{WeeklyTrackChart}
|
|
||||||
"""
|
|
||||||
wcl = list(self.weekly_chart_list)
|
|
||||||
wcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for wc in wcl:
|
|
||||||
try:
|
|
||||||
yield self.get_weekly_track_chart(wc.start, wc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_monthly_track_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import MonthlyTrackChart
|
|
||||||
return MonthlyTrackChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_monthly_track_chart(self):
|
|
||||||
return self.get_monthly_track_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def monthly_track_chart_list(self):
|
|
||||||
mcl = list(self.monthly_chart_list)
|
|
||||||
mcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for mc in mcl:
|
|
||||||
try:
|
|
||||||
yield self.get_monthly_track_chart(mc.start, mc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_quaterly_track_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import QuaterlyTrackChart
|
|
||||||
return QuaterlyTrackChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_quaterly_track_chart(self):
|
|
||||||
return self.get_quaterly_track_chart()
|
|
||||||
|
|
||||||
def get_half_yearly_track_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import HalfYearlyTrackChart
|
|
||||||
return HalfYearlyTrackChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_half_yearly_track_chart(self):
|
|
||||||
return self.get_half_yearly_track_chart()
|
|
||||||
|
|
||||||
def get_yearly_track_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import YearlyTrackChart
|
|
||||||
return YearlyTrackChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_yearly_track_chart(self):
|
|
||||||
return self.get_yearly_track_chart()
|
|
||||||
|
|
||||||
def get_weekly_tag_chart(self, start = None, end = None):
|
|
||||||
"""
|
|
||||||
Get a tag chart for the group, for a given date range.
|
|
||||||
If no date range is supplied, it will return the most
|
|
||||||
recent tag chart for the group.
|
|
||||||
|
|
||||||
@param start: the date at which the chart should start from (optional)
|
|
||||||
@type start: C{datetime.datetime}
|
|
||||||
@param end: the date at which the chart should end on (optional)
|
|
||||||
@type end: C{datetime.datetime}
|
|
||||||
|
|
||||||
@return: a tag chart for the group
|
|
||||||
@rtype: L{WeeklyTagChart}
|
|
||||||
|
|
||||||
@raise InvalidParametersError: Both start and end parameter have to be either
|
|
||||||
provided or not provided. Providing only one of
|
|
||||||
them will raise an exception.
|
|
||||||
|
|
||||||
@note: This method is a composite method. It is not provided directly by the
|
|
||||||
last.fm API. It uses other methods to collect the data, analyzes it and
|
|
||||||
creates a chart. So this method is a little heavy to call, as it does
|
|
||||||
mulitple calls to the API.
|
|
||||||
"""
|
|
||||||
from lastfm.chart import WeeklyChart, WeeklyTagChart
|
|
||||||
WeeklyChart._check_chart_params({}, self, start, end)
|
|
||||||
return WeeklyTagChart.create_from_data(self._api, self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_weekly_tag_chart(self):
|
|
||||||
"""
|
|
||||||
most recent tag chart for the group
|
|
||||||
@rtype: L{WeeklyTagChart}
|
|
||||||
"""
|
|
||||||
return self.get_weekly_tag_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def weekly_tag_chart_list(self):
|
|
||||||
"""
|
|
||||||
a list of all tag charts for this group in reverse-chronological
|
|
||||||
order. (that means 0th chart is the most recent chart)
|
|
||||||
@rtype: L{lazylist} of L{WeeklyTagChart}
|
|
||||||
"""
|
|
||||||
wcl = list(self.weekly_chart_list)
|
|
||||||
wcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for wc in wcl:
|
|
||||||
try:
|
|
||||||
yield self.get_weekly_tag_chart(wc.start, wc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_monthly_tag_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import MonthlyTagChart
|
|
||||||
return MonthlyTagChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_monthly_tag_chart(self):
|
|
||||||
return self.get_monthly_tag_chart()
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def monthly_tag_chart_list(self):
|
|
||||||
mcl = list(self.monthly_chart_list)
|
|
||||||
mcl.reverse()
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
for mc in mcl:
|
|
||||||
try:
|
|
||||||
yield self.get_monthly_tag_chart(mc.start, mc.end)
|
|
||||||
except LastfmError:
|
|
||||||
pass
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
def get_quaterly_tag_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import QuaterlyTagChart
|
|
||||||
return QuaterlyTagChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_quaterly_tag_chart(self):
|
|
||||||
return self.get_quaterly_tag_chart()
|
|
||||||
|
|
||||||
def get_half_yearly_tag_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import HalfYearlyTagChart
|
|
||||||
return HalfYearlyTagChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_half_yearly_tag_chart(self):
|
|
||||||
return self.get_half_yearly_tag_chart()
|
|
||||||
|
|
||||||
def get_yearly_tag_chart(self, start = None, end = None):
|
|
||||||
from lastfm.chart import YearlyTagChart
|
|
||||||
return YearlyTagChart.create_from_data(self, start, end)
|
|
||||||
|
|
||||||
@cached_property
|
|
||||||
def recent_yearly_tag_chart(self):
|
|
||||||
return self.get_yearly_tag_chart()
|
|
||||||
|
|
||||||
cls.weekly_chart_list = weekly_chart_list
|
|
||||||
cls.monthly_chart_list = monthly_chart_list
|
|
||||||
|
|
||||||
if not hasattr(cls, '_default_params'):
|
|
||||||
cls._default_params = _default_params
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.extend(['weekly_chart_list', 'monthly_chart_list'])
|
|
||||||
|
|
||||||
method_names = [
|
|
||||||
'get_weekly_%s_chart', 'recent_weekly_%s_chart', 'weekly_%s_chart_list',
|
|
||||||
'get_monthly_%s_chart', 'recent_monthly_%s_chart', 'monthly_%s_chart_list',
|
|
||||||
'get_quaterly_%s_chart', 'recent_quaterly_%s_chart',
|
|
||||||
'get_half_yearly_%s_chart', 'recent_half_yearly_%s_chart',
|
|
||||||
'get_yearly_%s_chart', 'recent_yearly_%s_chart'
|
|
||||||
]
|
|
||||||
for chart_type in chart_types:
|
|
||||||
for method_name in method_names:
|
|
||||||
setattr(cls, method_name % chart_type, locals()[method_name % chart_type])
|
|
||||||
cls._mixins.append(method_name % chart_type)
|
|
||||||
|
|
||||||
return cls
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
from lastfm.error import LastfmError
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.lazylist import lazylist
|
|
||||||
|
|
||||||
def crawlable(cls):
|
|
||||||
_get_all = cls._get_all
|
|
||||||
@staticmethod
|
|
||||||
def get_all(seed):
|
|
||||||
seed, hash_attrs, spider_func = _get_all(seed)
|
|
||||||
@lazylist
|
|
||||||
def gen(lst):
|
|
||||||
seen = []
|
|
||||||
api = seed._api
|
|
||||||
|
|
||||||
def hash_dict(item):
|
|
||||||
return dict((a, getattr(item, a)) for a in hash_attrs)
|
|
||||||
|
|
||||||
seen.append(hash_dict(seed))
|
|
||||||
yield seed
|
|
||||||
for hsh in seen:
|
|
||||||
for n in spider_func(api, hsh):
|
|
||||||
if hash_dict(n) not in seen:
|
|
||||||
seen.append(hash_dict(n))
|
|
||||||
yield n
|
|
||||||
return gen()
|
|
||||||
|
|
||||||
cls.get_all = get_all
|
|
||||||
delattr(cls, '_get_all')
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.append('get_all')
|
|
||||||
return cls
|
|
@ -1,53 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.decorators import depaginate
|
|
||||||
|
|
||||||
def searchable(cls):
|
|
||||||
@classmethod
|
|
||||||
@depaginate
|
|
||||||
def search(cls,
|
|
||||||
api,
|
|
||||||
search_item,
|
|
||||||
limit = None,
|
|
||||||
page = None,
|
|
||||||
**kwds):
|
|
||||||
from lastfm.api import Api
|
|
||||||
cls_name = cls.__name__.lower()
|
|
||||||
params = {
|
|
||||||
'method': '%s.search'%cls_name,
|
|
||||||
cls_name: search_item
|
|
||||||
}
|
|
||||||
for kwd in kwds:
|
|
||||||
if kwds[kwd] is not None:
|
|
||||||
params[kwd] = kwds[kwd]
|
|
||||||
|
|
||||||
if limit:
|
|
||||||
params.update({'limit': limit})
|
|
||||||
if page is not None:
|
|
||||||
params.update({'page': page})
|
|
||||||
|
|
||||||
data = api._fetch_data(params).find('results')
|
|
||||||
total_pages = int(data.findtext("{%s}totalResults" % Api.SEARCH_XMLNS))/ \
|
|
||||||
int(data.findtext("{%s}itemsPerPage" % Api.SEARCH_XMLNS)) + 1
|
|
||||||
yield total_pages
|
|
||||||
for a in data.findall('%smatches/%s'%(cls_name, cls_name)):
|
|
||||||
yield cls._search_yield_func(api, a)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _search_yield_func(api, search_term):
|
|
||||||
raise NotImplementedError("the subclass should implement this method")
|
|
||||||
|
|
||||||
cls.search = search
|
|
||||||
if not hasattr(cls, '_search_yield_func'):
|
|
||||||
cls._search_yield_func = _search_yield_func
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.append('search')
|
|
||||||
|
|
||||||
return cls
|
|
@ -1,38 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
def sharable(cls):
|
|
||||||
def share(self, recipient, message = None):
|
|
||||||
from lastfm.user import User
|
|
||||||
params = self._default_params({'method': '%s.share' % self.__class__.__name__.lower()})
|
|
||||||
if message is not None:
|
|
||||||
params['message'] = message
|
|
||||||
|
|
||||||
if not isinstance(recipient, list):
|
|
||||||
recipient = [recipient]
|
|
||||||
|
|
||||||
for i in xrange(len(recipient)):
|
|
||||||
if isinstance(recipient[i], User):
|
|
||||||
recipient[i] = recipient[i].name
|
|
||||||
params['recipient'] = ",".join(recipient)
|
|
||||||
self._api._post_data(params)
|
|
||||||
|
|
||||||
def _default_params(self, extra_params = None):
|
|
||||||
if extra_params is not None:
|
|
||||||
return extra_params
|
|
||||||
else:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
cls.share = share
|
|
||||||
if not hasattr(cls, '_default_params'):
|
|
||||||
cls._default_params = _default_params
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.append('share')
|
|
||||||
|
|
||||||
return cls
|
|
@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.decorators import cached_property, top_property
|
|
||||||
|
|
||||||
def shoutable(cls):
|
|
||||||
@cached_property
|
|
||||||
def shouts(self):
|
|
||||||
"""shouts for this %s""" % cls.__name__.lower()
|
|
||||||
from lastfm.shout import Shout
|
|
||||||
from lastfm.user import User
|
|
||||||
params = self._default_params({'method': '%s.getShouts' % self.__class__.__name__.lower()})
|
|
||||||
data = self._api._fetch_data(params).find('shouts')
|
|
||||||
return [
|
|
||||||
Shout(
|
|
||||||
body = s.findtext('body'),
|
|
||||||
author = User(self._api, name = s.findtext('author')),
|
|
||||||
date = s.findtext('date') and s.findtext('date').strip() and \
|
|
||||||
datetime(*(time.strptime(s.findtext('date').strip(), '%a, %d %b %Y %H:%M:%S')[0:6]))
|
|
||||||
)
|
|
||||||
for s in data.findall('shout')
|
|
||||||
]
|
|
||||||
|
|
||||||
@top_property("shouts")
|
|
||||||
def recent_shout(self):
|
|
||||||
"""recent shout for this %s""" % cls.__name__.lower()
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _default_params(self, extra_params = None):
|
|
||||||
if extra_params is not None:
|
|
||||||
return extra_params
|
|
||||||
else:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
cls.shouts = shouts
|
|
||||||
cls.recent_shout = recent_shout
|
|
||||||
if not hasattr(cls, '_default_params'):
|
|
||||||
cls._default_params = _default_params
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.extend(['shouts', 'recent_shout'])
|
|
||||||
|
|
||||||
return cls
|
|
||||||
|
|
||||||
from datetime import datetime
|
|
||||||
import time
|
|
@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
__author__ = "Abhinav Sarkar <abhinav@abhinavsarkar.net>"
|
|
||||||
__version__ = "0.2"
|
|
||||||
__license__ = "GNU Lesser General Public License"
|
|
||||||
__package__ = "lastfm.mixins"
|
|
||||||
|
|
||||||
from lastfm.safelist import SafeList
|
|
||||||
from lastfm.decorators import cached_property, authentication_required
|
|
||||||
|
|
||||||
def taggable(cls):
|
|
||||||
@cached_property
|
|
||||||
@authentication_required
|
|
||||||
def tags(self):
|
|
||||||
from lastfm.tag import Tag
|
|
||||||
params = self._default_params({'method': '%s.getTags' % self.__class__.__name__.lower()})
|
|
||||||
data = self._api._fetch_data(params, sign = True, session = True, no_cache = True).find('tags')
|
|
||||||
return SafeList([
|
|
||||||
Tag(
|
|
||||||
self._api,
|
|
||||||
name = t.findtext('name'),
|
|
||||||
url = t.findtext('url')
|
|
||||||
)
|
|
||||||
for t in data.findall('tag')
|
|
||||||
],
|
|
||||||
self.add_tags, self.remove_tag)
|
|
||||||
|
|
||||||
@authentication_required
|
|
||||||
def add_tags(self, tags):
|
|
||||||
from lastfm.tag import Tag
|
|
||||||
while(len(tags) > 10):
|
|
||||||
section = tags[0:9]
|
|
||||||
tags = tags[9:]
|
|
||||||
self.add_tags(section)
|
|
||||||
|
|
||||||
if len(tags) == 0: return
|
|
||||||
|
|
||||||
tagnames = []
|
|
||||||
for tag in tags:
|
|
||||||
if isinstance(tag, Tag):
|
|
||||||
tagnames.append(tag.name)
|
|
||||||
elif isinstance(tag, str):
|
|
||||||
tagnames.append(tag)
|
|
||||||
|
|
||||||
params = self._default_params({
|
|
||||||
'method': '%s.addTags' % self.__class__.__name__.lower(),
|
|
||||||
'tags': ",".join(tagnames)
|
|
||||||
})
|
|
||||||
self._api._post_data(params)
|
|
||||||
self._tags = None
|
|
||||||
|
|
||||||
@authentication_required
|
|
||||||
def remove_tag(self, tag):
|
|
||||||
from lastfm.tag import Tag
|
|
||||||
if isinstance(tag, Tag):
|
|
||||||
tag = tag.name
|
|
||||||
|
|
||||||
params = self._default_params({
|
|
||||||
'method': '%s.removeTag' % self.__class__.__name__.lower(),
|
|
||||||
'tag': tag
|
|
||||||
})
|
|
||||||
self._api._post_data(params)
|
|
||||||
self._tags = None
|
|
||||||
|
|
||||||
def _default_params(self, extra_params = None):
|
|
||||||
if extra_params is not None:
|
|
||||||
return extra_params
|
|
||||||
else:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
cls.tags = tags
|
|
||||||
cls.add_tags = add_tags
|
|
||||||
cls.remove_tag = remove_tag
|
|
||||||
if not hasattr(cls, '_default_params'):
|
|
||||||
cls._default_params = _default_params
|
|
||||||
|
|
||||||
if not hasattr(cls, '_mixins'):
|
|
||||||
cls._mixins = []
|
|
||||||
cls._mixins.extend(['tags', 'add_tags', 'remove_tag'])
|
|
||||||
|
|
||||||
return cls
|
|
Loading…
Reference in New Issue
Block a user