def process_item(self, item: Item):
        self._say("Fixing item: {}".format(item), log_only=True)

        year = item.get("year")
        original_year = item.get("original_year")

        if not original_year or self.cfg_force:
            mbdata = self._get_mb_data(item)
            if mbdata:
                extracted = common.extract_original_year_from_mb_data(mbdata)
                if extracted:
                    original_year = extracted
                    self._say(
                        "Got (MusicBrainz) recording `original_year`: {}".
                        format(original_year))

            if not original_year:
                original_year = self.get_mean_value_for_album(
                    item, "original_year")
                self._say("Got (mean-album) `original_year`: {}".format(
                    original_year))

            if not original_year:
                original_year = self.get_mean_value_for_artist(
                    item, "original_year")
                self._say("Got (mean-artist) `original_year`: {}".format(
                    original_year))

        if not year or self.cfg_force:
            year = self.get_mean_value_for_album(item, "year")
            self._say("Got (mean-album) `year`: {}".format(year))

            if not year:
                year = self.get_mean_value_for_artist(item, "year")
                self._say("Got (mean-artist) `year`: {}".format(year))

        if original_year:
            setattr(item, "original_year", original_year)

        if year:
            setattr(item, "year", year)

        if original_year and not year:
            setattr(item, "year", original_year)

        if year and not original_year:
            setattr(item, "original_year", year)

        if not year and not original_year:
            self._say("Cannot find info!")
def get_mb_search_url(item: Item):
    mb_artistid = item.get("mb_artistid")
    title = item.get("title")

    if not mb_artistid or not title:
        raise AttributeError(
            "Missing tag(mb_artistid or title)! Cannot build MB url.")

    query = 'arid:{arid} AND recording:"{title}"'.format(arid=mb_artistid,
                                                         title=title)
    url = "{base}recording/?query={qry}&fmt={fmt}".format(base=MB_BASE,
                                                          qry=query,
                                                          fmt="json")

    return quote_plus(url, safe=':/&?=')
    def _get_input_path_for_item(self, item: Item):
        input_path = item.get("path").decode("utf-8")

        if not os.path.isfile(input_path):
            raise FileNotFoundError(
                "Input file({}) not found!".format(input_path))

        return input_path
Exemple #4
0
def increment_play_count_on_item(item: Item, store=True, write=True):
    # clear_dirty is necessary to make sure that `ordering_score` and
    # `ordering_info` will not get stored to the library
    item.clear_dirty()
    item["play_count"] = item.get("play_count", 0) + 1
    if store:
        item.store()
    if write:
        item.write()
    def _get_output_path_for_item(self, item: Item):
        identifier = item.get("mb_trackid")
        if not identifier:
            input_path = self._get_input_path_for_item(item)
            identifier = hashlib.md5(input_path.encode('utf-8')).hexdigest()

        output_file = "{id}.{ext}".format(id=identifier, ext="json")

        return os.path.join(self._get_extraction_output_path(), output_file)
    def get_mean_value_for_artist(self, item: Item, field_name):
        answer = None

        query = MatchQuery('mb_artistid', item.get("mb_artistid"))
        items = self.lib.items(query)
        values = []
        for it in items:
            if it.get(field_name):
                val = int(it.get(field_name))
                if 0 < val < 2100:
                    values.append(val)

        if values:
            answer = int(round(sum(values) / len(values)))

        return answer
Exemple #7
0
    def process_item(self, item: Item):
        self._say("Fixing item: {}".format(item), log_only=True)
        current_genre = item.get("genre")

        tag_groups = []

        qtypes = (self.config["types"].keys())
        metadata = {
            'artist': item.get("artist"),
            'artistid': item.get("mb_artistid:"),
            'album': item.get("album"),
            'albumid': item.get("mb_releasegroupid"),
            'year': item.get("year")
        }

        for dp in self.dataproviders:
            # self._say("{}: {}".format("=" * 60, dp.name))
            for qtype in qtypes:
                tags = self.get_tags_from_provider(dp, qtype, metadata)
                # self._say("tags[{}]: {}".format(qtype, tags), log_only=False)
                if tags:
                    tag_groups.append({
                        'provider': dp.name,
                        'qtype': qtype,
                        'tags': tags
                    })

        # self._say("Tags: {}".format(tag_groups), log_only=False)

        tags = self.create_unified_tag_list(tag_groups)
        # self._say("Unified Tags: {}".format(tags), log_only=False)

        tags = self.get_scored_tags(tags)
        # self._say("Scored Tags: {}".format(tags), log_only=False)

        tags = sorted(tags.items(), key=operator.itemgetter(1), reverse=True)
        self._say("Ordered Tags: {}".format(tags), log_only=False)

        _max = self.config["max_tags"].as_number()
        _glue = self.config["tag_glue"].as_str()
        top_tags = [v[0] for v in tags][:_max]
        # self._say("Top Tags: {}".format(top_tags), log_only=False)

        changed = False
        if top_tags:
            new_genre = _glue.join(top_tags)
            if new_genre != current_genre:
                self._say("Setting new genre: '{}' -> '{}'".format(
                    current_genre, new_genre),
                          log_only=False)
                item["genre"] = new_genre
                changed = True

        return changed