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
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
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