Exemple #1
0
def testTagGenre():
    from eyed3.id3 import Genre

    tag = Tag()

    assert (tag.genre is None)

    try:
        tag.genre = b"Not Unicode"
    except TypeError:
        pass  # expected
    else:
        assert not ("Non unicode genre, expected TypeError")

    gobj = Genre(u"Hardcore")

    tag.genre = u"Hardcore"
    assert (tag.genre.name == u"Hardcore")
    assert (tag.genre == gobj)

    tag.genre = 130
    assert tag.genre.id == 130
    assert tag.genre.name == u"Terror"

    tag.genre = 0
    assert tag.genre.id == 0
    assert tag.genre.name == u"Blues"

    tag.genre = None
    assert tag.genre is None
    assert tag.frame_set[b"TCON"] is None
Exemple #2
0
    def save_button_action(self):
        self.gui_fields_to_fld_val()

        for key, val in self.fld_val.items():
            print(key, ":", val)

        tag = self.audio_file.tag
        tag.version = ID3_DEFAULT_VERSION

        # These fields are assigned normally
        tag.title = self.fld_val['title']
        tag.artist = self.fld_val['artist']
        tag.album = self.fld_val['album']
        tag.album_artist = self.fld_val['album_artist']
        tag.original_release_date = self.fld_val['original_release_date']
        tag.release_date = self.fld_val['release_date']
        tag.recording_date = self.fld_val['recording_date']

        # These fields need some converting or special assignments
        tag.genre = Genre(self.fld_val['genre'])
        tag.track_num = (self.fld_val['track_num'], self.fld_val['num_tracks'])
        if self.fld_val[
                'comments'] is not None and self.fld_val['comments'] != "":
            tag.comments.set(self.fld_val['comments'])

        tag.save(encoding="utf_8")
Exemple #3
0
def testTagGenre():
    from eyed3.id3 import Genre

    tag = Tag()

    assert_is_none(tag.genre)

    try:
        tag.genre = "Not Unicode"
    except TypeError:
        pass  # expected
    else:
        assert_false("Non unicode genre, expected TypeError")

    gobj = Genre(u"Hardcore")

    tag.genre = u"Hardcore"
    assert_equal(tag.genre.name, u"Hardcore")
    assert_equal(tag.genre, gobj)

    tag.genre = 130
    assert_equal(tag.genre.id, 130)
    assert_equal(tag.genre.name, u"Terror")

    tag.genre = 0
    assert_equal(tag.genre.id, 0)
    assert_equal(tag.genre.name, u"Blues")

    tag.genre = None
    assert_is_none(tag.genre)
    assert_is_none(tag.frame_set["TCON"])
    def process_tags(self, dest: str, entry: Mapping[str, Any]) -> None:
        """
        Set ID3v2 tags on downloaded MP3 file.

        :param dest: File to change tags on.
        :param entry: Entry from RSS feed to use,
            alongside metadata,
            to populate ID3v2 tags.
        """
        audiofile = eyed3.load(dest)

        # Process tags. If set to set_tags and tags are empty, write tags.
        # Pull tags into sub metadata if it's not set.
        # Pull tags into entry unless they're empty, and then try sub.

        # TODO do this cleaner, but we shouldn't crash out if tags can't be set.
        try:
            LOG.info(f"Artist tag is '{audiofile.tag.artist}'.")
            if audiofile.tag.artist == "" and self.settings["set_tags"]:
                LOG.info(f"Setting artist tag to '{self.metadata['artist']}'.")
                audiofile.tag.artist = self.metadata["artist"]

            if self.metadata["artist"] == "":
                self.metadata["artist"] = audiofile.tag.artist

            if audiofile.tag.artist != "":
                entry["metadata"]["artist"] = audiofile.tag.artist
            else:
                entry["metadata"]["artist"] = self.metadata["artist"]

            LOG.info(f"Album tag is '{audiofile.tag.album}'.")
            if audiofile.tag.album == "":
                LOG.info(f"Setting album tag to '{self.metadata['album']}'.")
                audiofile.tag.album = self.metadata["album"]

            if self.metadata["album"] == "":
                self.metadata["album"] = audiofile.tag.album

            if audiofile.tag.album != "":
                entry["metadata"]["album"] = audiofile.tag.album
            else:
                entry["metadata"]["album"] = self.metadata["album"]

            LOG.info(f"Album Artist tag is '{audiofile.tag.album_artist}'.")
            if audiofile.tag.album_artist == "":
                LOG.info(
                    f"Setting album_artist tag to '{self.metadata['album_artist']}'."
                )
                audiofile.tag.album_artist = self.metadata["album_artist"]

            if self.metadata["album_artist"] == "":
                self.metadata["album_artist"] = audiofile.tag.album_artist

            if audiofile.tag.album_artist != "":
                entry["metadata"]["album_artist"] = audiofile.tag.album_artist
            else:
                entry["metadata"]["album_artist"] = self.metadata[
                    "album_artist"]

            LOG.info(f"Title tag is '{audiofile.tag.title}'.")
            LOG.info(
                f"Overwrite setting is set to '{self.settings['overwrite_title']}'."
            )
            if audiofile.tag.title == "" or self.settings["overwrite_title"]:
                LOG.info(f"Setting title tag to '{entry['title']}'.")
                audiofile.tag.title = entry["title"]

            # Store some extra tags on the entry.
            # Doesn't matter if they're empty, they're empty on the # entry too.

            # If the genre tag is not set,
            # default it to the Podcast genre.
            # Genre id list can be found at:
            # https://eyed3.readthedocs.io/en/latest/plugins/genres_plugin.html?highlight=genre
            if audiofile.tag.genre is None:
                audiofile.tag.genre = Genre(id=186)

            entry["metadata"]["genre"] = audiofile.tag.genre.name

            entry["metadata"]["date"] = str(
                audiofile.tag.getBestDate(prefer_recording_date=True))

            # TODO this is catching "Unable to write ID3 v2.2" error.
            # should be able to do more gracefully.
            try:
                audiofile.tag.save()
            except NotImplementedError as ef:
                LOG.warning(
                    f"Caught NotImplementedError {ef}. Skipping tag setting.")
                return

        # TODO this is catching tag not being present at all, I think, which should be fixable.
        except AttributeError as e:
            LOG.warning(f"Caught AttributeError {e}. Skipping tag setting.")
            return