Example #1
0
    def load_from_file(klass, filename, sids):
        """
		Produces an instance of the Song class with all album, group, and artist IDs loaded from only a filename.
		All metadata is saved to the database and updated where necessary.
		"""

        # log.debug("playlist", u"sids {} loading song from file {}".format(sids, filename))
        kept_artists = []
        kept_groups = []
        matched_entry = db.c.fetch_row(
            "SELECT song_id FROM r4_songs WHERE song_filename = %s",
            (filename, ))
        if matched_entry:
            log.debug(
                "playlist",
                "this filename matches an existing database entry, song_id {}".
                format(matched_entry['song_id']))
            s = klass.load_from_id(matched_entry['song_id'])
            for metadata in s.artists:
                try:
                    if not metadata.is_tag:
                        kept_artists.append(metadata)
                    metadata.disassociate_song_id(s.id)
                except MetadataUpdateError:
                    pass
            for metadata in s.groups:
                try:
                    if not metadata.is_tag:
                        kept_groups.append(metadata)
                    metadata.disassociate_song_id(s.id)
                except MetadataUpdateError:
                    pass
        elif len(sids) == 0:
            raise SongHasNoSIDsException
        else:
            s = klass()

        s.load_tag_from_file(filename)
        s.save(sids)

        new_artists = Artist.load_list_from_tag(s.artist_tag)
        new_groups = SongGroup.load_list_from_tag(s.genre_tag)

        s.artists = zip_metadata(new_artists, kept_artists)
        s.groups = zip_metadata(new_groups, kept_groups)

        i = 0
        for metadata in s.artists:
            metadata.associate_song_id(s.id, order=i)
            i += 1
        for metadata in s.groups:
            metadata.associate_song_id(s.id)

        s.albums = [Album.load_from_name(s.album_tag)]
        s.albums[0].associate_song_id(s.id)

        s.update_artist_parseable()

        return s
Example #2
0
	def load_from_file(klass, filename, sids):
		"""
		Produces an instance of the Song class with all album, group, and artist IDs loaded from only a filename.
		All metadata is saved to the database and updated where necessary.
		"""

		# log.debug("playlist", u"sids {} loading song from file {}".format(sids, filename))
		kept_artists = []
		kept_groups = []
		matched_entry = db.c.fetch_row("SELECT song_id FROM r4_songs WHERE song_filename = %s", (filename,))
		if matched_entry:
			log.debug("playlist", "this filename matches an existing database entry, song_id {}".format(matched_entry['song_id']))
			s = klass.load_from_id(matched_entry['song_id'])
			for metadata in s.artists:
				try:
					if metadata.is_tag:
						metadata.disassociate_song_id(s.id)
					else:
						kept_artists.append(metadata)
				except MetadataUpdateError:
					pass
			for metadata in s.groups:
				try:
					if metadata.is_tag:
						metadata.disassociate_song_id(s.id)
					else:
						kept_groups.append(metadata)
				except MetadataUpdateError:
					pass
		elif len(sids) == 0:
			raise SongHasNoSIDsException
		else:
			s = klass()

		s.load_tag_from_file(filename)
		s.save(sids)

		new_artists = Artist.load_list_from_tag(s.artist_tag)
		new_groups = SongGroup.load_list_from_tag(s.genre_tag)

		i = 0
		for metadata in new_artists:
			metadata.associate_song_id(s.id, order=i)
			i += 1
		for metadata in new_groups:
			metadata.associate_song_id(s.id)

		s.artists = new_artists + kept_artists
		s.groups = new_groups + kept_groups

		s.albums = [ Album.load_from_name(s.album_tag) ]
		s.albums[0].associate_song_id(s.id)

		s.update_artist_parseable()

		return s
Example #3
0
    def load_from_file(cls, filename, sids):
        """
		Produces an instance of the Song class with all album, group, and artist IDs loaded from only a filename.
		All metadata is saved to the database and updated where necessary.
		"""

        kept_artists = []
        kept_groups = []
        matched_entry = db.c.fetch_row(
            "SELECT song_id FROM r4_songs WHERE song_filename = %s",
            (filename, ))
        if matched_entry:
            log.debug(
                "playlist",
                "this filename matches an existing database entry, song_id {}".
                format(matched_entry["song_id"]),
            )
            s = cls.load_from_id(matched_entry["song_id"])
            for metadata in s.artists:
                try:
                    if not metadata.is_tag:
                        kept_artists.append(metadata)
                    metadata.disassociate_song_id(s.id)
                except MetadataUpdateError:
                    pass
            for metadata in s.groups:
                try:
                    if not metadata.is_tag:
                        kept_groups.append(metadata)
                    metadata.disassociate_song_id(s.id)
                except MetadataUpdateError:
                    pass
        elif len(sids) == 0:
            raise SongHasNoSIDsException
        else:
            s = cls()

        s.load_tag_from_file(filename)
        s.save(sids)

        new_artists = Artist.load_list_from_tag(s.artist_tag)
        new_groups = SongGroup.load_list_from_tag(s.genre_tag)

        s.artists = zip_metadata(new_artists, kept_artists)
        s.groups = zip_metadata(new_groups, kept_groups)

        i = 0
        for metadata in s.artists:
            metadata.associate_song_id(s.id, order=i)
            i += 1
        for metadata in s.groups:
            metadata.associate_song_id(s.id)

        s.albums = [Album.load_from_name(s.album_tag)]
        s.albums[0].associate_song_id(s.id)

        s.update_artist_parseable()

        # do not get replay gain earlier in case an exception is thrown above
        # it means a lot of wasted CPU time in that scenario
        if db.c.fetch_var(
                "SELECT song_replay_gain FROM r4_songs WHERE song_id = %s",
            (s.id, )) is None:
            s.replay_gain = s.get_replay_gain()
            db.c.update(
                "UPDATE r4_songs SET song_replay_gain = %s WHERE song_id = %s",
                (s.replay_gain, s.id))

        return s