def create_from_data(cls, subject, key_func, start = None, end = None): chart_type = cls.mro()[0]._chart_type period = cls.mro()[3]._period globals()["%slyChart" % period['name'].title().replace(' ','')]._check_chart_params({}, subject, start, end) mcl = MonthlyChart.get_chart_list(subject) if start is None and end is None: start = mcl[-period['duration']].start end = mcl[-1].end wcl = subject.weekly_chart_list period_wcl = [wc for wc in wcl if start < wc.start < end or start < wc.end < end] period_wacl = [] for wc in period_wcl: try: period_wacl.append( getattr(subject, "get_weekly_%s_chart" % chart_type)(wc.start, wc.end)) except LastfmError as ex: logging.log_silenced_exceptions(ex) stats_dict = period_wacl[0].__dict__["_%ss" % chart_type][0].stats.__dict__ count_attribute = [k for k in stats_dict.keys() if stats_dict[k] is not None and k not in ['_rank', '_subject']][0] items = {} for wac in period_wacl: for item in wac.__dict__["_%ss" % chart_type]: key = key_func(item) mw_start = max(wac.start, start) mw_end = min(wac.end, end) count = item.stats.__dict__[count_attribute] * (mw_end - mw_start).days / 7.0 if key in items: items[key].stats.__dict__[count_attribute] += count else: items[key] = item items[key].stats.__dict__[count_attribute] = count items = items.values() items = [a for a in items if a.stats.__dict__[count_attribute] >= 1] items.sort(key = lambda a: a.stats.__dict__[count_attribute], reverse=True) for i,item in enumerate(items): item.stats._rank = i + 1 item.stats.__dict__[count_attribute] = safe_int(item.stats.__dict__[count_attribute]) return globals()[ "%sly%sChart" % ( period['name'].title().replace(' ',''), chart_type.capitalize() )]( subject = subject, start = start, end = end, stats = Stats( subject = subject, **{count_attribute[1:]: sum(a.stats.__dict__[count_attribute] for a in items)} ), **{"%ss" % chart_type: items} )
def create_from_data(cls, subject, key_func, start=None, end=None): chart_type = cls.mro()[0]._chart_type period = cls.mro()[3]._period globals()["%slyChart" % period['name'].title().replace(' ', '')]._check_chart_params( {}, subject, start, end) mcl = MonthlyChart.get_chart_list(subject) if start is None and end is None: start = mcl[-period['duration']].start end = mcl[-1].end wcl = subject.weekly_chart_list period_wcl = [ wc for wc in wcl if start < wc.start < end or start < wc.end < end ] period_wacl = [] for wc in period_wcl: try: period_wacl.append( getattr(subject, "get_weekly_%s_chart" % chart_type)(wc.start, wc.end)) except LastfmError as ex: logging.log_silenced_exceptions(ex) stats_dict = period_wacl[0].__dict__["_%ss" % chart_type][0].stats.__dict__ count_attribute = [ k for k in stats_dict.keys() if stats_dict[k] is not None and k not in ['_rank', '_subject'] ][0] items = {} for wac in period_wacl: for item in wac.__dict__["_%ss" % chart_type]: key = key_func(item) mw_start = max(wac.start, start) mw_end = min(wac.end, end) count = item.stats.__dict__[count_attribute] * ( mw_end - mw_start).days / 7.0 if key in items: items[key].stats.__dict__[count_attribute] += count else: items[key] = item items[key].stats.__dict__[count_attribute] = count items = items.values() items = [a for a in items if a.stats.__dict__[count_attribute] >= 1] items.sort(key=lambda a: a.stats.__dict__[count_attribute], reverse=True) for i, item in enumerate(items): item.stats._rank = i + 1 item.stats.__dict__[count_attribute] = int( item.stats.__dict__[count_attribute]) return globals()["%sly%sChart" % (period['name'].title().replace( ' ', ''), chart_type.capitalize())]( subject=subject, start=start, end=end, stats=Stats(subject=subject, **{ count_attribute[1:]: sum(a.stats.__dict__[count_attribute] for a in items) }), **{ "%ss" % chart_type: items })
def gen(lst): for wc in wcl: try: yield self.get_weekly_album_chart(wc.start, wc.end) except LastfmError as ex: logging.log_silenced_exceptions(ex)
def gen(lst): for mc in mcl: try: yield self.get_monthly_tag_chart(mc.start, mc.end) except LastfmError as ex: logging.log_silenced_exceptions(ex)
def gen(lst): for wc in wcl: try: yield self.get_weekly_album_chart(wc.start, wc.end) except LastfmError as ex: logging.log_silenced_exceptions(ex)
def gen(lst): for mc in mcl: try: yield self.get_monthly_tag_chart(mc.start, mc.end) except LastfmError as ex: logging.log_silenced_exceptions(ex)