0

Is it possible to list my .mp3 files by artist in my music folder?

I am not able to view any tag from a song (artist/album/title of the songs) in the preview...

1

There is a python script (here) by jmdsdf that adds some extra columns to nautilus that analyzes the Meta data of the MP3s and creates extra columns for viewing.

This is the script:

#!/usr/bin/python

# this script can installed to the current user account by running the following commands:

# sudo apt-get install python-nautilus python-mutagen python-pyexiv2 python-kaa-metadata  python-pypdf
# mkdir ~/.nautilus/python-extensions
# cp bsc-v2.py ~/.nautilus/python-extensions
# chmod a+x ~/.nautilus/python-extensions/bsc-v2.py

# alternatively, you can be able to place the script in:
# /usr/lib/nautilus/extensions-2.0/python/

# change log:
# geb666: original bsc.py, based on work by Giacomo Bordiga
# jmdsdf: version 2 adds extra ID3 and EXIF tag support
# jmdsdf: added better error handling for ID3 tags, added mp3 length support, distinguished
#         between exif image size and true image size
# SabreWolfy: set consistent hh:mm:ss format, fixed bug with no ID3 information 
#             throwing an unhandled exception
# jmdsdf: fixed closing file handles with mpinfo (thanks gueba)
# jmdsdf: fixed closing file handles when there's an exception (thanks Pitxyoki)
# jmdsdf: added video parsing (work based on enbeto, thanks!)
# jmdsdf: added FLAC audio parsing through kaa.metadata (thanks for the idea l-x-l)
# jmdsdf: added trackno, added mkv file support (thanks ENigma885)
# jmdsdf: added date/album for flac/video (thanks eldon.t)
# jmdsdf: added wav file support thru pyexiv2
# jmdsdf: added sample rate file support thru mutagen and kaa (thanks for the idea N'ko)
# jmdsdf: fix with tracknumber for FLAC, thanks l-x-l
# draxus: support for pdf files
# jmdsdf: added more error handling for imports (thanks for the idea draxus)

import os
import urllib
import nautilus

# for id3 support
try:
    from mutagen.easyid3 import EasyID3
    from mutagen.mp3 import MPEGInfo
except: print "Python Mutagen library not found?"
# for exif support
try: import pyexiv2
except: print "Python pyexiv2 library not found?"
# for reading videos. for future improvement, this can also read mp3!
try: import kaa.metadata
except: print "Python KAA library not found?"
# for reading image dimensions
try: from PIL import Image
except: print "Python Image library not found?"
# for reading pdf
try: from pyPdf import PdfFileReader
except: print "Python pyPDF library not found?"

class ColumnExtension(nautilus.ColumnProvider, nautilus.InfoProvider):
    def __init__(self):
        pass

    def get_columns(self):
        return (
            nautilus.Column("NautilusPython::title_column","title","Title","Song title"),
            nautilus.Column("NautilusPython::album_column","album","Album","Album"),
            nautilus.Column("NautilusPython::artist_column","artist","Artist","Artist"),
            nautilus.Column("NautilusPython::tracknumber_column","tracknumber","Track","Track number"),
            nautilus.Column("NautilusPython::genre_column","genre","Genre","Genre"),
            nautilus.Column("NautilusPython::date_column","date","Date","Date"),
            nautilus.Column("NautilusPython::bitrate_column","bitrate","Bitrate","Audio Bitrate in kilo bits per second"),
            nautilus.Column("NautilusPython::samplerate_column","samplerate","Sample rate","Sample rate in Hz"),
            nautilus.Column("NautilusPython::length_column","length","Length","Length of audio"),
            nautilus.Column("NautilusPython::exif_datetime_original_column","exif_datetime_original","EXIF Dateshot ","Get the photo capture date from EXIF data"),
            nautilus.Column("NautilusPython::exif_software_column","exif_software","EXIF Software","EXIF - software used to save image"),
            nautilus.Column("NautilusPython::exif_flash_column","exif_flash","EXIF flash","EXIF - flash mode"),
            nautilus.Column("NautilusPython::exif_pixeldimensions_column","exif_pixeldimensions","EXIF Image Size","Image size - pixel dimensions as reported by EXIF data"),
            nautilus.Column("NautilusPython::pixeldimensions_column","pixeldimensions","Image Size","Image/video size - actual pixel dimensions"),
        )

    def update_file_info(self, file):
        # set defaults to blank
        file.add_string_attribute('title', '')
        file.add_string_attribute('album', '')
        file.add_string_attribute('artist', '')
        file.add_string_attribute('tracknumber', '')
        file.add_string_attribute('genre', '')
        file.add_string_attribute('date', '')
        file.add_string_attribute('bitrate', '')
        file.add_string_attribute('samplerate', '')
        file.add_string_attribute('length', '')
        file.add_string_attribute('exif_datetime_original', '')
        file.add_string_attribute('exif_software', '')
        file.add_string_attribute('exif_flash', '')
        file.add_string_attribute('exif_pixeldimensions', '')
        file.add_string_attribute('pixeldimensions', '')

        if file.get_uri_scheme() != 'file':
            return

        # strip file:// to get absolute path
        filename = urllib.unquote(file.get_uri()[7:])

        # mp3 handling
        if file.is_mime_type('audio/mpeg'):
            # attempt to read ID3 tag
            try:
                audio = EasyID3(filename)
                # sometimes the audio variable will not have one of these items defined, that's why
                # there is this long try / except attempt
                try: file.add_string_attribute('title', audio["title"][0])
                except: file.add_string_attribute('title', "[n/a]")
                try: file.add_string_attribute('album', audio["album"][0])
                except: file.add_string_attribute('album', "[n/a]")
                try: file.add_string_attribute('artist', audio["artist"][0])
                except: file.add_string_attribute('artist', "[n/a]")
                try: file.add_string_attribute('tracknumber', audio["tracknumber"][0])
                except: file.add_string_attribute('tracknumber', "[n/a]")
                try: file.add_string_attribute('genre', audio["genre"][0])
                except: file.add_string_attribute('genre', "[n/a]")
                try: file.add_string_attribute('date', audio["date"][0])
                except: file.add_string_attribute('date', "[n/a]")
            except:
                # [SabreWolfy] some files have no ID3 tag and will throw this exception:
                file.add_string_attribute('title', "[no ID3]")
                file.add_string_attribute('album', "[no ID3]")
                file.add_string_attribute('artist', "[no ID3]")
                file.add_string_attribute('tracknumber', "[no ID3]")
                file.add_string_attribute('genre', "[no ID3]")
                file.add_string_attribute('date', "[no ID3]")

            # try to read MP3 information (bitrate, length, samplerate)
            try:
                mpfile = open (filename)
                mpinfo = MPEGInfo (mpfile)
                file.add_string_attribute('bitrate', str(mpinfo.bitrate/1000) + " Kbps")
                file.add_string_attribute('samplerate', str(mpinfo.sample_rate) + " Hz")
                # [SabreWolfy] added consistent formatting of times in format hh:mm:ss
                # [SabreWolfy[ to allow for correct column sorting by length
                mp3length = "%02i:%02i:%02i" % ((int(mpinfo.length/3600)), (int(mpinfo.length/60%60)), (int(mpinfo.length%60)))
                mpfile.close()
                file.add_string_attribute('length', mp3length)
            except:
                file.add_string_attribute('bitrate', "[n/a]")
                file.add_string_attribute('length', "[n/a]")
                file.add_string_attribute('samplerate', "[n/a]")
                try:
                    mpfile.close()
                except: pass

        # image handling
        if file.is_mime_type('image/jpeg') or file.is_mime_type('image/png') or file.is_mime_type('image/gif') or file.is_mime_type('image/bmp'):
            # EXIF handling routines
            try:
                img = pyexiv2.Image(filename)
                img.readMetadata()
                file.add_string_attribute('exif_datetime_original',str(img['Exif.Photo.DateTimeOriginal']))
                file.add_string_attribute('exif_software',str(img['Exif.Image.Software']))
                file.add_string_attribute('exif_flash',str(img['Exif.Photo.Flash']))
                file.add_string_attribute('exif_pixeldimensions',str(img['Exif.Photo.PixelXDimension'])+'x'+str(img['Exif.Photo.PixelYDimension']))
            except:
                # no exif data?
                file.add_string_attribute('exif_datetime_original',"")
                file.add_string_attribute('exif_software',"")
                file.add_string_attribute('exif_flash',"")
                file.add_string_attribute('exif_pixeldimensions',"")
            # try read image info directly
            try:
                im = Image.open(filename)
                file.add_string_attribute('pixeldimensions',str(im.size[0])+'x'+str(im.size[1]))
            except:
                file.add_string_attribute('pixeldimensions',"[image read error]")

        # video/flac handling
        if file.is_mime_type('video/x-msvideo') | file.is_mime_type('video/mpeg') | file.is_mime_type('video/x-ms-wmv') | file.is_mime_type('video/mp4') | file.is_mime_type('audio/x-flac') | file.is_mime_type('video/x-flv') | file.is_mime_type('video/x-matroska') | file.is_mime_type('audio/x-wav'):
            try:
                info=kaa.metadata.parse(filename)
                try: file.add_string_attribute('length',"%02i:%02i:%02i" % ((int(info.length/3600)), (int(info.length/60%60)), (int(info.length%60))))
                except: file.add_string_attribute('length','[n/a]')
                try: file.add_string_attribute('pixeldimensions', str(info.video[0].width) + 'x'+ str(info.video[0].height))
                except: file.add_string_attribute('pixeldimensions','[n/a]')
                try: file.add_string_attribute('bitrate',str(round(info.audio[0].bitrate/1000)))
                except: file.add_string_attribute('bitrate','[n/a]')
                try: file.add_string_attribute('samplerate',str(int(info.audio[0].samplerate))+' Hz')
                except: file.add_string_attribute('samplerate','[n/a]')
                try: file.add_string_attribute('title', info.title)
                except: file.add_string_attribute('title', '[n/a]')
                try: file.add_string_attribute('artist', info.artist)
                except: file.add_string_attribute('artist', '[n/a]')
                try: file.add_string_attribute('genre', info.genre)
                except: file.add_string_attribute('genre', '[n/a]')
                try: file.add_string_attribute('tracknumber',info.trackno)
                except: file.add_string_attribute('tracknumber', '[n/a]')
                try: file.add_string_attribute('date',info.userdate)
                except: file.add_string_attribute('date', '[n/a]')                  
                try: file.add_string_attribute('album',info.album)
                except: file.add_string_attribute('album', '[n/a]')
            except:
                file.add_string_attribute('length','error')
                file.add_string_attribute('pixeldimensions','error')
                file.add_string_attribute('bitrate','error')
                file.add_string_attribute('samplerate','error')
                file.add_string_attribute('title','error')
                file.add_string_attribute('artist','error')
                file.add_string_attribute('genre','error')
                file.add_string_attribute('track','error')
                file.add_string_attribute('date','error')
                file.add_string_attribute('album','error')

        # pdf handling
        if file.is_mime_type('application/pdf'):
            try:
                f = open(filename, "rb")
                pdf = PdfFileReader(f)
                try: file.add_string_attribute('title', pdf.getDocumentInfo().title)
                except: file.add_string_attribute('title', "[n/a]")
                try: file.add_string_attribute('artist', pdf.getDocumentInfo().author)
                except: file.add_string_attribute('artist', "[n/a]")
                f.close()
            except:
                file.add_string_attribute('title', "[no info]")
                file.add_string_attribute('artist', "[no info]")

        self.get_columns()
  • can anyone, please, remember me the shortcut to open the command line (something like Ctrl+Alt+...?) – Ale Dec 28 '13 at 10:21
  • find it: To install type in terminal (Ctrl-Alt-T) – Ale Dec 28 '13 at 10:41
  • It gives me an error when I type the script in the installation box – Ale Dec 28 '13 at 10:44
  • Try to follow the directions in the python script. You may need to install a few python related packages as described by the lines that are commented out. – jmunsch Dec 28 '13 at 16:12
  • Can you give instructions on how to use this script? Where to save it? What to install? Cause I'm new at this. – SY_13 Sep 3 '15 at 7:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.