예제 #1
0
class Chart(object):
    # This is backward compatible, Types must be singular
    __types = {'album' : 'Album','track' : 'Track','artist' : 'Artist'}
    __outputMsgError = "Empty chart, not storing:"
    __outputMsgOk = "Saving chart:"
    def __init__(self):
        try:
            self.prettyName
        except AttributeError:
            self.prettyName = None

        self.__setStorage()

        self.details = DetailItem(Detail(
            id = self.source_id,
            name = self.prettyName,
            description = self.description,
            have_extra = self.have_extra
            )
        );
        chartCache.shoveDetails(self.details, self.is_chart)
        self.have_extra = self.have_extra

        #Chart specific optional attributes
        self.geo = None
        self.extra = None
        self.genre = None
        self.source_id = self.details.get('id')
        self.cache_id = "%scacheControl" % self.source_id
        self.default = 0

        self.init()
        self.parse()

    def __setStorage(self):
        try:
            if self.is_chart:
                self.storage = chartCache.storage
            else:
                self.storage = chartCache.newreleases
        except AttributeError:
            self.is_chart = True
            self.storage = chartCache.storage

    def __getCacheControl(self):
        self.cacheControl = chartCache.setCacheControl(self.expires)

    def __createChartItem(self):
        try:
            chart = ChartItem(
                id = slugify(self.chart_id),
                name = self.chart_name,
                display_name = self.display_name,
                origin = self.origin,
                type = self.chart_type,
                default = self.default,
                source = self.source_id,
                date = self.cacheControl.get("Date-Modified"),
                expires = self.cacheControl.get("Date-Expires"),
                maxage = self.cacheControl.get("Max-Age"),
                list = self.chart_list
            )
        except AttributeError:
            print "ChartItem is missing required attributes!"
            raise

        if self.have_extra :
            if self.geo is not None:
                chart['geo'] = self.geo
            if self.genre is not None:
                chart['genre'] = self.genre
            if self.extra is not None:
                chart['extra'] = self.extra

        return chart

    def __updateCache(self, metadata, chart):
        data = self.storage.get(self.source_id, {})
        data[self.chart_id] = metadata
        self.storage[self.source_id] = data
        self.storage[self.source_id+self.chart_id] = dict(chart)
        self.storage[self.cache_id] = dict(self.cacheControl)

    def __createMetadata(self, chart):
        # metadata is the chart item minus the actual list plus a size
        metadata_keys = filter(lambda k: k != 'list', chart)
        metadata = { key: chart[key] for key in metadata_keys }
        metadata['size'] = len(self.chart_list)
        return metadata

    def init(self):
        raise NotImplementedError( "Scraper needs to implement this!")

    def parse(self):
        raise NotImplementedError( "Scraper needs to implement this!")

    def setChartId(self, id):
        self.chart_id = id

    def setChartName(self, name):
        self.chart_name = name.title()

    def setChartOrigin(self, origin):
        self.origin = origin

    def setChartDisplayName(self, name):
        self.display_name = name

    def setIsDefault(self, default):
        self.default = default

    def setChartGenre(self, genre):
        self.genre = genre

    def setChartExtra(self, extra):
        self.extra = extra

    def setChartGeo(self, geo):
        self.geo = geo;

    def setChartType(self, type):
        self.chart_type = self.__types.get(type.lower())

    def setExpiresInDays(self, day, hour = 1):
        self.expires = chartCache.timedeltaUntilDays(day, hour)
        self.__getCacheControl()

    def setExpiresOnDay(self, day, hour = 1):
        self.expires = chartCache.timedeltaUntilWeekday(day, hour)
        self.__getCacheControl()

    def getJsonContent(self, url):
        try:
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            content = response.read().decode('utf-8')
            return json.loads(content)
        except Exception,e:
            print "Error: %s" % e
            return {}
예제 #2
0
class Chart(object):
    # This is backward compatible, Types must be singular
    __types = {'album': 'Album', 'track': 'Track', 'artist': 'Artist'}
    __outputMsgError = "Empty chart, not storing:"
    __outputMsgOk = "Saving chart:"

    def __init__(self):
        try:
            self.prettyName
        except AttributeError:
            self.prettyName = None

        self.__setStorage()

        self.details = DetailItem(
            Detail(id=self.source_id,
                   name=self.prettyName,
                   description=self.description,
                   have_extra=self.have_extra))
        chartCache.shoveDetails(self.details, self.is_chart)
        self.have_extra = self.have_extra

        #Chart specific optional attributes
        self.geo = None
        self.extra = None
        self.genre = None
        self.source_id = self.details.get('id')
        self.cache_id = "%scacheControl" % self.source_id
        self.default = 0

        self.init()
        self.parse()

    def __setStorage(self):
        try:
            if self.is_chart:
                self.storage = chartCache.storage
            else:
                self.storage = chartCache.newreleases
        except AttributeError:
            self.is_chart = True
            self.storage = chartCache.storage

    def __getCacheControl(self):
        self.cacheControl = chartCache.setCacheControl(self.expires)

    def __createChartItem(self):
        try:
            chart = ChartItem(id=slugify(self.chart_id),
                              name=self.chart_name,
                              display_name=self.display_name,
                              origin=self.origin,
                              type=self.chart_type,
                              default=self.default,
                              source=self.source_id,
                              date=self.cacheControl.get("Date-Modified"),
                              expires=self.cacheControl.get("Date-Expires"),
                              maxage=self.cacheControl.get("Max-Age"),
                              list=self.chart_list)
        except AttributeError:
            print "ChartItem is missing required attributes!"
            raise

        if self.have_extra:
            if self.geo is not None:
                chart['geo'] = self.geo
            if self.genre is not None:
                chart['genre'] = self.genre
            if self.extra is not None:
                chart['extra'] = self.extra

        return chart

    def __updateCache(self, metadata, chart):
        data = self.storage.get(self.source_id, {})
        data[self.chart_id] = metadata
        self.storage[self.source_id] = data
        self.storage[self.source_id + self.chart_id] = dict(chart)
        self.storage[self.cache_id] = dict(self.cacheControl)

    def __createMetadata(self, chart):
        # metadata is the chart item minus the actual list plus a size
        metadata_keys = filter(lambda k: k != 'list', chart)
        metadata = {key: chart[key] for key in metadata_keys}
        metadata['size'] = len(self.chart_list)
        return metadata

    def init(self):
        raise NotImplementedError("Scraper needs to implement this!")

    def parse(self):
        raise NotImplementedError("Scraper needs to implement this!")

    def setChartId(self, id):
        self.chart_id = id

    def setChartName(self, name):
        self.chart_name = name.title()

    def setChartOrigin(self, origin):
        self.origin = origin

    def setChartDisplayName(self, name):
        self.display_name = name

    def setIsDefault(self, default):
        self.default = default

    def setChartGenre(self, genre):
        self.genre = genre

    def setChartExtra(self, extra):
        self.extra = extra

    def setChartGeo(self, geo):
        self.geo = geo

    def setChartType(self, type):
        self.chart_type = self.__types.get(type.lower())

    def setExpiresInDays(self, day, hour=1):
        self.expires = chartCache.timedeltaUntilDays(day, hour)
        self.__getCacheControl()

    def setExpiresOnDay(self, day, hour=1):
        self.expires = chartCache.timedeltaUntilWeekday(day, hour)
        self.__getCacheControl()

    def getJsonContent(self, url):
        try:
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            content = response.read().decode('utf-8')
            return json.loads(content)
        except Exception, e:
            print "Error: %s" % e
            return {}