Beispiel #1
0
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')
Beispiel #2
0
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')
Beispiel #3
0
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)
Beispiel #4
0
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)