def setSongAlbum(song, album_name): app.logger.info('setSongAlbum') if not album_name: raise Exception('Song has no album name given') # update tag app.logger.info('Updating album {} for song {}'.format(album_name, song)) if song.path_name.lower().endswith('mp3'): tags = ID3(song.abs_path) tags["TALB"] = TALB(encoding=3, text=u'{}'.format(album_name)) tags.save(song.abs_path) elif song.path_name.lower().endswith('m4a'): tags = MP4(song.abs_path) raise Exception('Do song info for mp4') # get track info try: trck = tags['TRCK'].text[0] except KeyError: trck = '' if '/' in trck: track_number, total_tracks = trck.split('/') else: track_number = trck total_tracks = None try: total_tracks = int(total_tracks) except (ValueError, TypeError): total_tracks = None disc_number = int( tags['TPOS'].text[0].split('/')[0]) if 'TPOS' in tags else 1 total_discs = int(tags['TPOS'].text[0].split( '/')[1]) if 'TPOS' in tags and '/' in tags['TPOS'].text[0] else 1 year = int(tags['TDRC'].text[0].year) if 'TDRC' in tags else None # update model album = Album.query.filter_by(name=album_name, artist=song.artist).first() if not album: album = Album(album_name, song.artist) album.disc_number = disc_number album.total_discs = total_discs album.total_tracks = total_tracks album.year = year db.session.add(album) db.session.commit() app.logger.info('Created new album {} <= {}'.format(album, album_name)) song.album_id = album.id album.count_songs = len(album.songs) db.session.commit() app.logger.info('Update song in db')
def setSongAlbum(song, album_name): app.logger.info('setSongAlbum') if not album_name: raise Exception('Song has no album name given') # update tag app.logger.info('Updating album {} for song {}'.format(album_name, song)) if song.path_name.lower().endswith('mp3'): tags = ID3(song.abs_path) tags["TALB"] = TALB(encoding=3, text=u'{}'.format(album_name)) tags.save(song.abs_path) elif song.path_name.lower().endswith('m4a'): tags = MP4(song.abs_path) raise Exception('Do song info for mp4') # get track info try: trck = tags['TRCK'].text[0] except KeyError: trck = '' if '/' in trck: track_number, total_tracks = trck.split('/') else: track_number = trck total_tracks = None try: total_tracks = int(total_tracks) except (ValueError, TypeError): total_tracks = None disc_number = int(tags['TPOS'].text[0].split('/')[0]) if 'TPOS' in tags else 1 total_discs = int(tags['TPOS'].text[0].split('/')[1]) if 'TPOS' in tags and '/' in tags['TPOS'].text[0] else 1 year = int(tags['TDRC'].text[0].year) if 'TDRC' in tags else None # update model album = Album.query.filter_by(name=album_name, artist=song.artist).first() if not album: album = Album(album_name, song.artist) album.disc_number = disc_number album.total_discs = total_discs album.total_tracks = total_tracks album.year = year db.session.add(album) db.session.commit() app.logger.info('Created new album {} <= {}'.format(album, album_name)) song.album_id = album.id album.count_songs = len(album.songs) db.session.commit() app.logger.info('Update song in db')
def parseId3Tags(): app.logger.info('Parsing ID3 tags...') songs = Song.query.filter(Song.id3_parsed.is_(False)).limit(50).all() app.logger.info('{} songs found to parse...'.format(len(songs))) # app.logger.info(EasyID3.valid_keys.keys()) # app.logger.info(EasyMP4Tags.List) for song in songs: # get tag info info = {} if song.path_name.lower().endswith('mp3'): meta = MP3(song.abs_path) # app.logger.debug(meta.tags) try: info['song_title'] = meta.tags['TIT2'].text[0] except KeyError: info['song_title'] = song.path_name try: trck = meta.tags['TRCK'].text[0] if '/' in trck: info['track_number'], info['total_tracks'] = trck.split('/') else: info['track_number'] = trck info['total_tracks'] = None except KeyError: info['track_number'] = 1 info['total_tracks'] = 1 try: info['track_number'] = int(info['track_number']) except (ValueError, TypeError): info['track_number'] = None try: info['total_tracks'] = int(info['total_tracks']) except (ValueError, TypeError): info['total_tracks'] = None try: info['artist_name'] = meta.tags['TPE1'].text[0] except KeyError: info['artist_name'] = 'unknown artist' try: info['album_name'] = meta.tags['TALB'].text[0] except KeyError: info['album_name'] = 'unknown album' info['disc_number'] = int(meta.tags['TPOS'].text[0].split('/')[0]) if 'TPOS' in meta else 1 info['total_discs'] = int(meta.tags['TPOS'].text[0].split('/')[1]) if 'TPOS' in meta and '/' in meta.tags['TPOS'].text[0] else 1 info['year'] = int(meta.tags['TDRC'].text[0].year) if 'TDRC' in meta else None elif song.path_name.lower().endswith('m4a'): meta = MP4(song.abs_path) info['song_title'] = meta[u'\xa9nam'][0] info['track_number'] = int(meta[u'trkn'][0][0]) info['total_tracks'] = int(meta[u'trkn'][0][1]) info['artist_name'] = meta[u'\xa9ART'][0] info['album_name'] = meta[u'\xa9alb'][0] info['disc_number'] = int(meta[u'disk'][0][0]) if u'disk' in meta else 1 info['total_discs'] = int(meta[u'disk'][0][1]) if u'disk' in meta else 1 info['year'] = int(meta[u'\xa9day'][0]) if u'\xa9day' in meta else None else: raise Exception('Unknown extension {}'.format(song.path_name)) app.logger.debug(info) # artist info artist = Artist.query.filter_by(name_id=info['artist_name'].lower().strip()).first() if not artist: artist = Artist(info['artist_name']) db.session.add(artist) db.session.commit() app.logger.info('{} <= {}'.format(artist, info['artist_name'])) song.artist_id = artist.id # album info album = Album.query.filter_by(name_id=info['album_name'].lower().strip(), artist=artist).first() if not album: album = Album(info['album_name'], artist) album.disc_number = info['disc_number'] album.total_discs = info['total_discs'] album.total_tracks = info['total_tracks'] album.year = info['year'] db.session.add(album) db.session.commit() app.logger.info('{} <= {}'.format(album, info['album_name'])) song.album_id = album.id # song info song.name = info['song_title'] song.track_number = info['track_number'] song.id3_parsed = True db.session.commit() app.logger.info('Parsed {} ID3 tags...'.format(len(songs))) return len(songs)
def parseId3Tags(): app.logger.info('Parsing ID3 tags...') songs = Song.query.filter(Song.id3_parsed.is_(False)).limit(50).all() app.logger.info('{} songs found to parse...'.format(len(songs))) # app.logger.info(EasyID3.valid_keys.keys()) # app.logger.info(EasyMP4Tags.List) for song in songs: # get tag info info = {} if song.path_name.lower().endswith('mp3'): meta = MP3(song.abs_path) # app.logger.debug(meta.tags) try: info['song_title'] = meta.tags['TIT2'].text[0] except KeyError: info['song_title'] = song.path_name try: trck = meta.tags['TRCK'].text[0] if '/' in trck: info['track_number'], info['total_tracks'] = trck.split( '/') else: info['track_number'] = trck info['total_tracks'] = None except KeyError: info['track_number'] = 1 info['total_tracks'] = 1 try: info['track_number'] = int(info['track_number']) except (ValueError, TypeError): info['track_number'] = None try: info['total_tracks'] = int(info['total_tracks']) except (ValueError, TypeError): info['total_tracks'] = None try: info['artist_name'] = meta.tags['TPE1'].text[0] except KeyError: info['artist_name'] = 'unknown artist' try: info['album_name'] = meta.tags['TALB'].text[0] except KeyError: info['album_name'] = 'unknown album' info['disc_number'] = int(meta.tags['TPOS'].text[0].split('/') [0]) if 'TPOS' in meta else 1 info['total_discs'] = int( meta.tags['TPOS'].text[0].split('/')[1] ) if 'TPOS' in meta and '/' in meta.tags['TPOS'].text[0] else 1 info['year'] = int( meta.tags['TDRC'].text[0].year) if 'TDRC' in meta else None elif song.path_name.lower().endswith('m4a'): meta = MP4(song.abs_path) info['song_title'] = meta[u'\xa9nam'][0] info['track_number'] = int(meta[u'trkn'][0][0]) info['total_tracks'] = int(meta[u'trkn'][0][1]) info['artist_name'] = meta[u'\xa9ART'][0] info['album_name'] = meta[u'\xa9alb'][0] info['disc_number'] = int( meta[u'disk'][0][0]) if u'disk' in meta else 1 info['total_discs'] = int( meta[u'disk'][0][1]) if u'disk' in meta else 1 info['year'] = int( meta[u'\xa9day'][0]) if u'\xa9day' in meta else None else: raise Exception('Unknown extension {}'.format(song.path_name)) app.logger.debug(info) # artist info artist = Artist.query.filter_by( name_id=info['artist_name'].lower().strip()).first() if not artist: artist = Artist(info['artist_name']) db.session.add(artist) db.session.commit() app.logger.info('{} <= {}'.format(artist, info['artist_name'])) song.artist_id = artist.id # album info album = Album.query.filter_by( name_id=info['album_name'].lower().strip(), artist=artist).first() if not album: album = Album(info['album_name'], artist) album.disc_number = info['disc_number'] album.total_discs = info['total_discs'] album.total_tracks = info['total_tracks'] album.year = info['year'] db.session.add(album) db.session.commit() app.logger.info('{} <= {}'.format(album, info['album_name'])) song.album_id = album.id # song info song.name = info['song_title'] song.track_number = info['track_number'] song.id3_parsed = True db.session.commit() app.logger.info('Parsed {} ID3 tags...'.format(len(songs))) return len(songs)