예제 #1
0
def get_play_time(path):
    if eyeD3.isMp3File(path):
        audioFile = eyeD3.Mp3AudioFile(path)
        tag = audioFile.getTag()
        return audioFile.getPlayTime()
    else:
        return 0
예제 #2
0
def check_mp3_filename(mp3):
    "Check if the title, album and artist are present in the filename"
    if not eyeD3.isMp3File(mp3):
        print "---ERROR: %s is not a valid MP3" % mp3
        return
    mp3file = None
    mp3file = eyeD3.Mp3AudioFile(mp3)
    tag = mp3file.getTag()
    if not tag:
        print "---ERROR processing %s" % mp3
        return
    title = tag.getTitle().replace('/', safechar)
    album = tag.getAlbum().replace('/', safechar)
    artist = tag.getArtist().replace('/', safechar)
    #Make filename safe:
    for unsafe in unsafechars:
        title = title.replace(unsafe, safechar)
        album = album.replace(unsafe, safechar)
        artist = artist.replace(unsafe, safechar)
    title = re.sub('\.+$', '', title)
    album = re.sub('\.+$', '', album)
    artist = re.sub('\.+$', '', artist)
    filename = os.path.realpath(mp3)
    try:
        #if artist and filename.find(artist) == -1: print "Check %s: %s" % (filename, artist)
        if artist and (filename.find(artist) == -1 and
                       (not artist.startswith("The ")
                        or filename.find(artist[4:] + ", The") == -1)):
            print "Check %s: %s" % (filename, artist)
        if album and filename.find(album) == -1:
            print "Check %s: %s - %s" % (filename, artist, album)
        if title and filename.find(title) == -1:
            print "Check %s: %s - %s - %s" % (filename, artist, album, title)
    except:
        print "ERROR trying to display", mp3
예제 #3
0
 def __init__(self, path):
     if not os.path.isfile(path) and eyeD3.isMp3File(path):
         raise IOError(path)
     self.audio_file = eyeD3.Mp3AudioFile(path)
     self.tag = self.audio_file.getTag()
     self.mod_time = os.stat(path)[stat.ST_MTIME]
     self.path = path
예제 #4
0
    def save(self):
        """
        """
        # Setup song slug.
        self.slug = slugify(self.title)

        # Determine what letter the song title starts with and populate that
        # information.
        lower_title = self.title.lower()
        if lower_title.startswith('the '):
            title = self.title
            basetitle = title[4:].strip()
            the = title[:3]
            title = basetitle + ', ' + the
            self.startswith = title[0]
        else:
            self.startswith = lower_title[0]

        # Fix song characteristics.
        import eyeD3
        audio_file = eyeD3.Mp3AudioFile(self.file)
        tag = audio_file.getTag()

        # Set bitrate information.
        self.variable_bitrate, self.bitrate = audio_file.getBitRate()
        # Set duration of song in seconds.
        self.duration = audio_file.getPlayTime()
        # Set sample frequency.
        self.sample_frequency = audio_file.getSampleFreq()

        # Call parent save()
        super(Song, self).save()
예제 #5
0
    def store_new_mp3(self, mp3filename):
        """
        Create a new instance for the Mp3 filename given into the mp3items dict.
        """
        mp3_metadata = eyeD3.Mp3AudioFile(mp3filename)

        # If the file has no Tag...
        if not mp3_metadata.tag:
            APPLOG.warning("MP3 File has no Tag, creating a new one")
            tag = eyeD3.Tag()
            tag.setVersion(eyeD3.tag.ID3_DEFAULT_VERSION)
            tag.linkedFile = eyeD3.LinkedFile(mp3filename)
            mp3_metadata.tag = tag

        # Update to ID3_DEFAULT_VERSION if actual is under ID3_V2
        # Specific update for the ID3_V2_2 tag version also, because the eyeD3
        # raise TagException with "Unable to write ID3 v2.2". :(
        if mp3_metadata.tag.getVersion() <= eyeD3.tag.ID3_V2_2:
            APPLOG.warning("Updating ID3 tag %s to the eyeD3 ID3_DEFAULT_VERSION(%i)" %\
                           (mp3_metadata.tag.getVersionStr(),
                            eyeD3.tag.ID3_DEFAULT_VERSION))
            mp3_metadata.tag.setVersion(eyeD3.tag.ID3_DEFAULT_VERSION)

        # Assign metadata to the mp3 file
        self.mp3items[mp3filename] = {}
        self.mp3items[mp3filename]['metadata'] = mp3_metadata
        self.mp3items[mp3filename]['apic_pixbuf'] = self.extract_apic_pixbuf(
            mp3_metadata)
        self.mp3items[mp3filename]['rename_with'] = None
예제 #6
0
 def mp3info(self,path):
     trackInfo = eyeD3.Mp3AudioFile(path)
     tag = trackInfo.getTag()
     tag.link(path) 
     tag.getArtist()
     metadata={}
     metadata['album']=tag.getAlbum()
     metadata['track']=tag.getTitle()
     metadata['length']=trackInfo.getPlayTimeString()
     metadata['release_year']=tag.getYear()
     return metadata
예제 #7
0
def eyeD3parse(entry):
    if eyeD3.isMp3File(entry['location'].encode('utf8')):
        try:
            mp3 = eyeD3.Mp3AudioFile(entry['location'].encode('utf8'))
            entry['mp3'] = {}
            entry['mp3']['parser'] = 'eyeD3'
            entry['mp3']['vbr'], entry['mp3']['bitrate'] = mp3.getBitRate()
            entry['mp3']['freq'] = mp3.getSampleFreq()
            entry['mp3']['length'] = mp3.getPlayTime()

            if mp3.tag:
                if mp3.tag.getArtist():
                    entry['mp3']['artist'] = mp3.tag.getArtist()
                if mp3.tag.getTitle():
                    entry['mp3']['title'] = mp3.tag.getTitle()
                if mp3.tag.getAlbum():
                    entry['mp3']['album'] = mp3.tag.getAlbum()
                if mp3.tag.getYear():
                    entry['mp3']['year'] = mp3.tag.getYear()
                if mp3.tag.getTrackNum():
                    entry['mp3']['track'] = mp3.tag.getTrackNum()
                if mp3.tag.getDiscNum():
                    entry['mp3']['disc'] = mp3.tag.getDiscNum()
                if mp3.tag.getVersion():
                    entry['mp3']['version'] = mp3.tag.getVersion()
                if mp3.tag.getVersionStr():
                    entry['mp3']['versionstring'] = mp3.tag.getVersionStr()
                try:
                    if mp3.tag.getBPM():
                        entry['mp3']['bpm'] = mp3.tag.getBPM()
                except ValueError:
                    pass
                if mp3.tag.getPublisher():
                    entry['mp3']['publiser'] = mp3.tag.getPublisher()

                if mp3.tag.getDate():
                    entry['mp3']['date'] = map(lambda x: x.getDate(),
                                               mp3.tag.getDate())
                if mp3.tag.getComments():
                    entry['mp3']['comments'] = map(lambda x: x.__unicode__(),
                                                   mp3.tag.getComments())
                if mp3.tag.getLyrics():
                    entry['mp3']['lyrics'] = map(lambda x: x.__unicode__(),
                                                 mp3.tag.getLyrics())
                if mp3.tag.getUserTextFrames():
                    entry['mp3']['usertext'] = map(lambda x: x.__unicode__(),
                                                   mp3.tag.getUserTextFrames())
        except:
            print strftime("[%Y-%m-%d %H:%M:%S] "
                           ) + 'eyeD3 Error with ' + entry['location'].encode(
                               'utf8') + ' ', sys.exc_info()
    return entry
예제 #8
0
    def tagGet(self,path):#get music tags to load into music table
        taglist = []
        tag = eyeD3.Tag()

        try:#to get music play duration
            trackInfo = eyeD3.Mp3AudioFile(path)
            Duration = trackInfo.getPlayTimeString()
        except:
            Duration = "Unknown"
        else:
            Duration = trackInfo.getPlayTimeString()

        tag.link(path)

        try:#get music genre
            g = tag.getGenre()
        except:
            Genre = "Unknown Genre"#tag.getGenre()
        else:
            if g == None:
                Genre = "Unknown Genre"
            else:
                junk = tag.getGenre()
                Genre = junk
        g = str(Genre)
        g = g.replace("(","")
        g = g.replace(")","")
        Genre = g.translate(None,digits)

        #get music arist, album, title, year tags
        if tag.getArtist() == "":
            Artist = "Unknown Artist"
        else:
            Artist = tag.getArtist()
        
        if tag.getAlbum() == "":
            Album = "Unknown Album"
        else:
            Album = tag.getAlbum()
        
        if tag.getTitle() == "":

            Title = self.titleResolve(path)
        else:
            Title = tag.getTitle()
        if tag.getYear() == None:
            Year = " "
        else:
            Year = tag.getYear()
        taglist.extend([Title,Artist,Album,Duration,Year,Genre])
        return taglist
예제 #9
0
def mp3info(filename):
    try:
	af = eyeD3.Mp3AudioFile(filename)
	tag = af.getTag()
	if tag is None:
	    out = { 'artist' : os.path.basename(filename), 'title' : '', 'len' : af.getPlayTime() }
	else:
	    out = { 'artist': tag.getArtist(), 'title' : tag.getTitle(), 'len' : af.getPlayTime() }
    except eyeD3.tag.InvalidAudioFormatException:
	out = { 'artist' : os.path.basename(filename), 'title' : '', 'len' : 0 }
    except eyeD3.tag.TagException, e:
	sys.stderr.write("Tag error: "+filename+"\n")
	sys.stderr.write(str(e)+"\n")
	sys.exit(1)
예제 #10
0
def get_id3(path):
    trackInfo = eyeD3.Mp3AudioFile(path)
    tag = trackInfo.getTag()
    tag.link(path)

    tags = {
        'artist': tag.getArtist(),
        'album': tag.getAlbum(),
        'title': tag.getTitle(),
        'length': trackInfo.getPlayTimeString(),
        'year': tag.getYear()
    }

    return tags
예제 #11
0
def getLyrics(opt=False):
    for mp3 in pathFile:
        mp3 = cleanMp3(mp3)
        trackInfo = eyeD3.Mp3AudioFile(mp3)
        tag = trackInfo.getTag()

        lTitle = tag.getTitle().replace('\r', '\n')
        title = lTitle.encode(ENCODING, "remplace")

        if opt:
            loadAllLyrics(tag, title)
        else:
            writeOneForOne(tag, title)
    if opt:
        writeDocLyrics()
예제 #12
0
    def save(self, *args, **kwargs):
        self.file_size = self.file.size

        super(Song, self).save(*args, **kwargs)

        file_path = os.path.join(settings.MEDIA_ROOT, self.file.name)

        if eyeD3.isMp3File(file_path):
            audioFile = eyeD3.Mp3AudioFile(file_path)
            self.duration = audioFile.getPlayTime()

            tag = audioFile.getTag()
            self.artist = tag.getArtist()
            self.album = tag.getAlbum()
            self.track_number = tag.getTrackNum()

        super(Song, self).save(*args, **kwargs)
예제 #13
0
def get_track_length(filename):
    if util.find_command('mplayer') is not None:
        try:
            mplayer_output = os.popen('mplayer -msglevel all=-1 -identify -vo null -ao null -frames 0 "%s" 2>/dev/null' % filename).read()
            return int(float(mplayer_output[mplayer_output.index('ID_LENGTH'):].splitlines()[0][10:])*1000)
        except:
            pass
    else:
        log('Please install MPlayer for track length detection.')

    try:
        eyed3_info = eyeD3.Mp3AudioFile(filename)
        return int(eyed3_info.getPlayTime()*1000)
    except:
        pass

    return int(60*60*1000*3) # Default is three hours (to be on the safe side)
예제 #14
0
def get(path):
    a = path_leaf(path)
    taglist = []
    tag = eyeD3.Tag()
    try:
        trackInfo = eyeD3.Mp3AudioFile(path)
        Duration = trackInfo.getPlayTimeString()
    except:
        Duration = "Unknown"
    else:
        Duration = trackInfo.getPlayTimeString()

    tag.link(path)    

    if tag.getArtist() == "":
        Artist = "Unknown Artist"
    else:
        Artist = tag.getArtist()
    
    if tag.getAlbum() == "":
        Album = "Unknown Album"
    else:
        Album = tag.getAlbum()
    
    if tag.getTitle() == "":

        Title = titleResolve(path)
    else:
        Title = tag.getTitle()
    try:
        g = tag.getGenre()
    except:
        Genre = "Unknown"#tag.getGenre()
    else:
        if g == None:
            Genre = "Unknown"
        else:
            #bdir = dirs.encode('utf-8')
            junk = tag.getGenre()
            Genre = junk
    #print str(Genre)+"1"
    taglist.extend([a,Title,Artist,Album,Duration,str(Genre)])
    #print taglist[5]
    return taglist
예제 #15
0
def replace_music_eyed3(name, path, newname, newpath):
    """ Pattern replace for mp3 """

    file = get_new_path(name, path)

    if eyeD3.isMp3File(file):
        try:
            audioFile = eyeD3.Mp3AudioFile(file, eyeD3.ID3_ANY_VERSION)
            tag = audioFile.getTag()
        except Exception, e:
            print "ERROR eyeD3:", e
            newpath = get_new_path('', path)
            return '', unicode(newpath)

        try:
            artist = clean_metadata(tag.getArtist())
        except Exception, e:
            print "ERROR eyeD3:", e
            artist = None
예제 #16
0
파일: wjmMp3Rename.py 프로젝트: wimac/home
def getId3Tags(file):
    if debug == 1:
        print "processing" + file
    trackInfo = eyeD3.Mp3AudioFile(file)
    tag = trackInfo.getTag()
    #tag.link(file)
    artist = tag.getArtist()
    artist = artist.replace(' ', '_')
    artist = artist.replace('?', '')
    album = tag.getAlbum()
    album = album.replace(' ', '_')
    album = album.replace('?', '')
    title = tag.getTitle()
    title = title.replace(' ', '_')
    title = title.replace('?', '')
    nfile = artist + "-" + album + "-" + title + ".mp3"
    if debug == 1:
        print nfile
    os.rename(file, nfile)
예제 #17
0
def file_metadata(fname):
    """ Get the file metadata for an mp3 file.
    The argument is expected to be an mp3 file. No checking is done
    """
    if eyed3api == "old":
        audfile = eyeD3.Mp3AudioFile(fname)
        if not audfile:
            return None
        duration = audfile.play_time
        artist = audfile.tag.getArtist()
        title = audfile.tag.getTitle()
        release = audfile.tag.getAlbum()
    elif eyed3api == "new":
        # We load the file directly instead of using .load() because
        # load calls magic(), which is not threadsafe.
        audfile = eyed3.mp3.Mp3AudioFile(fname)
        if not audfile or not audfile.tag:
            return None
        duration = audfile.info.time_secs
        artist = audfile.tag.artist
        title = audfile.tag.title
        release = audfile.tag.album

    releaseid = mb_release_id(audfile.tag)
    # TODO: Album release artist.
    # TODO: If there are 2 artists, the tags are separated by '; '
    # TODO: In id3 2.4 it's a \0
    artistid = mb_artist_id(audfile.tag)
    recordingid = mb_recording_id(audfile.tag)
    return {
        "file": fname,
        "duration": duration,
        "meta": {
            "artist": artist,
            "title": title,
            "release": release,
            "releaseid": releaseid,
            "artistid": artistid,
            "recordingid": recordingid
        }
    }
예제 #18
0
    def __extract_image(self, filename):
        """
        extract image from the podcast file
        """
        imagefile = None
        try:
            if eyeD3.isMp3File(filename):
                tag = eyeD3.Mp3AudioFile(filename).getTag()
                images = tag.getImages()
                if images:
                    tempdir = tempfile.gettempdir()
                    img = images[0]
                    imagefile = img.getDefaultFileName()
                    img.writeFile(path=tempdir, name=imagefile)
                    imagefile = "%s/%s" % (tempdir, imagefile)
                else:
                    log(u'No image found in %s' % filename)
        except:
            pass

        return imagefile
예제 #19
0
from shutil import copy2

artists = defaultdict(set)
albums = defaultdict(list)

input = '/path/to/input/folder'
output = '/path/to/output/folder'

for dn, _, files in os.walk(input):
    for f in files:
        fn = join(dn, f)

        _, ext = splitext(fn)
        if ext == '.mp3':
            try:
                audioFile = eyeD3.Mp3AudioFile(fn)
                tag = audioFile.getTag()

                artist = tag.getArtist()
                album = tag.getAlbum()
                title = tag.getTitle()
                track = tag.getTrackNum()

                full_title = title
                if track != (None, None):
                    # a regular printf format could take care of the ugly zfill / int cast
                    # but I could not remember the syntax ...
                    full_title = '%s %s' % (str(track[0]).zfill(2), title)

                albums[album].append((full_title, fn))
                artists[artist].add(album)
예제 #20
0
 def __init__(self, path):
     # load id3 tags from file
     try:
         self.id3 = eyeD3.Mp3AudioFile(path)
     except IOError:
         print "Library is empty"
예제 #21
0
                       default='false',
                       help='Sort and create directories based on albums')
(options, args) = readCmdline.parse_args()
print options.ArtistBased

filePath = "/media/Music Maza/Western/"

songList = os.listdir(filePath)
metaDataList = {}
artistList = []
albumList = []
#print songList
for song in songList:
    #print song
    try:
        music = eyeD3.Mp3AudioFile(filePath + song)  #load a song
    except eyeD3.tag.InvalidAudioFormatException:
        continue
    except IOError:
        print "couldn't read the ", song
        print "Continuing"
        continue
    musicData = music.getTag()  #reuse the variable and get all tags
    if musicData:
        artistList.append(musicData.getArtist())
        albumList.append(musicData.getAlbum())
        metaDataList[music.fileName] = [
            musicData.getArtist().lower().strip(),
            musicData.getAlbum().lower().strip()
        ]
예제 #22
0
        theSame = 0

        while theSame < 10 :
                if oldfilesize == os.path.getsize("4Music/Cache/_cache.tmp") :
                        theSame = theSame + 1
                else :
                        oldfilesize = os.path.getsize("4Music/Cache/_cache.tmp")
                time.sleep(1)

        print "The file is completely downloaded. Copying now..."

	tempFile = "4Music/"+str(time.time())+".mp3"

        shutil.copyfile("4Music/Cache/_cache.tmp",tempFile)

	audioFile = eyeD3.Mp3AudioFile(tempFile)
	tag = audioFile.getTag()

	if len(tag.getArtist()) > 0 and len(tag.getTitle()) > 0 :
		shutil.copyfile(tempFile,"4Music/"+tag.getArtist()+" - "+tag.getTitle()+".mp3")
		os.remove(tempFile)

        print "File is copied. You can now skip to the next song..."

        doesExist = True
        while doesExist == True :
                if os.path.exists("4Music/Cache/_cache.tmp") == False :
                        doesExist = False
                else :
                        time.sleep(1)
예제 #23
0
def replace_music_eyed3(name, path, newname, newpath):
    """ Pattern replace for mp3 """

    file = get_new_path(name, path)

    if eyeD3.isMp3File(file):
        try:
            audioFile = eyeD3.Mp3AudioFile(file, eyeD3.ID3_ANY_VERSION)
            tag = audioFile.getTag()
        except Exception as e:
            print("ERROR eyeD3:", e)
            newpath = get_new_path('', path)
            return '', str(newpath)

        try:
            artist = clean_metadata(tag.getArtist())
        except Exception as e:
            print("ERROR eyeD3:", e)
            artist = None

        try:
            album = clean_metadata(tag.getAlbum())
        except Exception as e:
            print("ERROR eyeD3:", e)
            album = None

        try:
            title = clean_metadata(tag.getTitle())
        except Exception as e:
            print("ERROR eyeD3:", e)
            title = None

        try:
            track = clean_metadata(tag.getTrackNum()[0])
        except Exception as e:
            print("ERROR eyeD3:", e)
            track = None

        try:
            trackt = clean_metadata(tag.getTrackNum()[1])
        except Exception as e:
            print("ERROR eyeD3:", e)
            trackt = None

        try:
            genre = clean_metadata(tag.getGenre().getName())
        except Exception as e:
            print("ERROR eyeD3:", e)
            genre = None

        try:
            year = clean_metadata(tag.getYear())
        except Exception as e:
            print("ERROR eyeD3:", e)
            year = None

        if artist != None: newname = newname.replace('{artist}', artist)
        else: newname = newname.replace('{artist}', '')

        if album != None: newname = newname.replace('{album}', album)
        else: newname = newname.replace('{album}', '')

        if title != None: newname = newname.replace('{title}', title)
        else: newname = newname.replace('{title}', '')

        if track != None: newname = newname.replace('{track}', str(track))
        else: newname = newname.replace('{track}', '')

        if trackt != None:
            newname = newname.replace('{tracktotal}', str(trackt))
        else:
            newname = newname.replace('{tracktotal}', '')

        if genre != None: newname = newname.replace('{genre}', genre)
        else: newname = newname.replace('{genre}', '')

        if year != None: newname = newname.replace('{myear}', year)
        else: newname = newname.replace('{myear}', '')
    else:
        newname = newname.replace('{artist}', '')
        newname = newname.replace('{album}', '')
        newname = newname.replace('{title}', '')
        newname = newname.replace('{track}', '')
        newname = newname.replace('{tracktotal}', '')
        newname = newname.replace('{genre}', '')
        newname = newname.replace('{myear}', '')

    # Returns new name and path
    newpath = get_new_path(newname, path)
    return str(newname), str(newpath)
예제 #24
0
        def media_data(f):
            if f.name in self.media_data_cache:
                return self.media_data_cache[f.name]

            item = {}
            item['path'] = f.name
            item['part_path'] = f.name.replace(local_base_path, '', 1)
            item['name'] = os.path.split(f.name)[1]
            item['is_dir'] = f.isdir
            item['is_playlist'] = f.isplay
            item['params'] = 'No'

            if f.title:
                item['Title'] = f.title

            if f.duration > 0:
                item['Duration'] = f.duration

            if f.isdir or f.isplay or '://' in f.name:
                self.media_data_cache[f.name] = item
                return item

            if os.path.splitext(f.name)[1].lower() in TRANSCODE:
                # If the format is: (track #) Song name...
                #artist, album, track = f.name.split(os.path.sep)[-3:]
                #track = os.path.splitext(track)[0]
                #if track[0].isdigit:
                #    track = ' '.join(track.split(' ')[1:])

                #item['SongTitle'] = track
                #item['AlbumTitle'] = album
                #item['ArtistName'] = artist
                fname = unicode(f.name, 'utf-8')
                if mswindows:
                    fname = fname.encode('iso8859-1')
                cmd = [ffmpeg_path(), '-i', fname]
                ffmpeg = subprocess.Popen(cmd, stderr=subprocess.PIPE,
                                               stdout=subprocess.PIPE, 
                                               stdin=subprocess.PIPE)

                # wait 10 sec if ffmpeg is not back give up
                for i in xrange(200):
                    time.sleep(.05)
                    if not ffmpeg.poll() == None:
                        break

                if ffmpeg.poll() != None:
                    output = ffmpeg.stderr.read()
                    d = durre(output)
                    if d:
                        millisecs = (int(d.group(1)) * 3600 + \
                                     int(d.group(2)) * 60 + \
                                     int(d.group(3))) * 1000 + \
                                     int(d.group(4)) * 100
                    else:
                        millisecs = 0
                    item['Duration'] = millisecs
            else:
                try:
                    audioFile = eyeD3.Mp3AudioFile(unicode(f.name, 'utf-8'))
                    item['Duration'] = audioFile.getPlayTime() * 1000

                    tag = audioFile.getTag()
                    artist = tag.getArtist()
                    title = tag.getTitle()
                    if artist == 'Various Artists' and '/' in title:
                        artist, title = title.split('/')
                    item['ArtistName'] = artist.strip()
                    item['SongTitle'] = title.strip()
                    item['AlbumTitle'] = tag.getAlbum()
                    item['AlbumYear'] = tag.getYear()
                    item['MusicGenre'] = tag.getGenre().getName()
                except Exception, msg:
                    print msg
예제 #25
0
def fix_mp3_case(mp3, prompt, rename, renamepattern):
    "Uses eyeD3 to extract the title, album and artist names and correct their capitalisation"
    updated = False
    if not eyeD3.isMp3File(mp3):
        corruptfiles.append(mp3)
        print "---ERROR: %s is not a valid MP3" % mp3
        return
    mp3file = None
    try:
        mp3file = eyeD3.Mp3AudioFile(mp3)
    except:
        corruptfiles.append(mp3)
        print "---ERROR processing %s" % mp3
        return
    tag = mp3file.getTag()
    if not tag:
        corruptfiles.append(mp3)
        print "---ERROR processing %s" % mp3
        return
    title = tag.getTitle()
    album = tag.getAlbum()
    artist = tag.getArtist()
    fixedtitle = fixcase(title)
    fixedalbum = fixcase(album)
    fixedartist = fixcase(artist)
    if title != fixedtitle or album != fixedalbum or artist != fixedartist:
        print 'About to alter "%s" as follows:' % mp3
        if title != fixedtitle:
            print ' Title: "%s"\n    ==> "%s"' % (title, fixedtitle)
        if album != fixedalbum:
            print ' Album: "%s"\n    ==> "%s"' % (album, fixedalbum)
        if artist != fixedartist:
            print 'Artist: "%s"\n    ==> "%s"' % (artist, fixedartist)
        if not prompt or raw_input("Is that OK? ").lower().find('y') == 0:
            tag.setTitle(fixedtitle)
            tag.setAlbum(fixedalbum)
            tag.setArtist(fixedartist)
            tag.update()
            updated = True
    if rename:
        renamedpatternmatched = False
        for renpat in renamepattern:
            #eyeD3 replaces / with -, but I want it replaced with _ like Amarok:
            tag.setTitle(tag.getTitle().replace('/', safechar))
            tag.setAlbum(tag.getAlbum().replace('/', safechar))
            tag.setArtist(tag.getArtist().replace('/', safechar))
            renamestr = tag.tagToString(renpat)
            if renamestr.find("%") == -1:
                renamedpatternmatched = True
                #Make filename safe:
                for unsafe in unsafechars:
                    renamestr = renamestr.replace(unsafe, safechar)
                #Remove trailing dots if present to mimic amarok
                renamestr = re.sub('\.+$', '', renamestr)
                filename = os.path.basename(mp3file.fileName)
                if filename != renamestr + ".mp3":
                    try:
                        sys.stdout.write(
                            'ABOUT TO RENAME: "%s"\n             TO: "%s"' %
                            (filename, renamestr + ".mp3"))
                    except:
                        sys.stdout.write(
                            'ABOUT TO RENAME: "%s"\n           TO: "%r" (Note: Unprintable characters should not cause any issues during rename)'
                            % (filename, renamestr + ".mp3"))
                    if not prompt or raw_input(", OK? ").lower().find(
                            'y') == 0:
                        if not prompt: print
                        mp3file.rename(renamestr, sys.getfilesystemencoding())
                if updated:
                    #Look for changed values that were not included in the rename:
                    if title != fixedtitle and renpat.find("%t") == -1:
                        temp = "FROM: %s - %s - %s\n ===> %s - %s - %s" % (
                            artist, album, title, fixedartist, fixedalbum,
                            fixedtitle)
                        if temp not in warntitle: warntitle.append(temp)
                    if album != fixedalbum and renpat.find("%a") == -1:
                        temp = "FROM: %s - %s\n ===> %s - %s" % (
                            artist, album, fixedartist, fixedalbum)
                        if temp not in warnalbum: warnalbum.append(temp)
                    if artist != fixedartist and renpat.find("%A") == -1:
                        temp = "FROM: %s\n ===> %s" % (artist, fixedartist)
                        if temp not in warnartist: warnartist.append(temp)
                break
        if not renamedpatternmatched:
            warnrename.append(
                "FROM: %s - %s - %s\n ===> %s - %s - %s" %
                (artist, album, title, fixedartist, fixedalbum, fixedtitle))
예제 #26
0
    def __addMP3file(self, filename):
        """
        Add mp3 file to the music cache

        Process:
            - Open file
            - Get tags
            - Insert data to the music cache database
        """
        try:
            mp3_file = eyeD3.Mp3AudioFile(filename, eyeD3.ID3_ANY_VERSION)
            tags = mp3_file.getTag()
        except ValueError:  # Tags are corrupt
            self.logger.error("Couldn't read ID3tags: " + filename)
            return

        if tags is None:
            self.logger.error("Couldn't read ID3tags: " + filename)
            return

        # Get track lenght in seconds
        length = mp3_file.getPlayTime()

        # Get avarage bitrate
        bitrate = mp3_file.getBitRate()[1]

        # Get artist name
        artist = tags.getArtist()
        if artist is None or len(artist) == 0:
            artist = self.__DEFAULT['artist']

        # Get album name
        album = tags.getAlbum()
        if album is None or len(album) == 0:
            album = self.__DEFAULT['album']

        # Get track title
        title = tags.getTitle()
        if title is None or len(title) == 0:
            title = self.__DEFAULT['title']

        # Get track genre
        genre = str(tags.getGenre())
        if genre is None or len(genre) == 0:
            genre = self.__DEFAULT['genre']

        # Get track number
        tracknumber = tags.getTrackNum()[0]
        if tracknumber is None:
            tracknumber = 0

        # Get track comment
        comment = tags.getComment()
        if comment is None or len(comment) == 0:
            comment = ""

        # Get track release year
        year = tags.getYear()
        if year is None or len(year) == 0:
            year = 0

        db_row = (filename, title, artist, album, genre, length, tracknumber,
                  bitrate, comment, year)
        self.__db_cursor.execute(
            """INSERT INTO track(filename,
                                                      title,
                                                      artist,
                                                      album,
                                                      genre,
                                                      length,
                                                      tracknumber,
                                                      bitrate,
                                                      comment,
                                                      year)
                                    VALUES(?,?,?,?,?,?,?,?,?,?)""", db_row)
        self.__db_conn.commit()

        # Get song lyrics
        lyrics = tags.getLyrics()
        if len(lyrics) != 0:
            lyrics = str(lyrics[0])
            self.__db_cursor.execute(
                """UPDATE track
                                        SET lyrics=:lyrics
                                        WHERE filename=:fn""", {
                    "lyrics": lyrics,
                    "fn": filename
                })
            self.__db_conn.commit()

        # Get album art
        self.__searchAlbumArt(artist, album, filename)