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

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()
6
  • can anyone, please, remember me the shortcut to open the command line (something like Ctrl+Alt+...?)
    – Ale
    Dec 28, 2013 at 10:21
  • find it: To install type in terminal (Ctrl-Alt-T)
    – Ale
    Dec 28, 2013 at 10:41
  • It gives me an error when I type the script in the installation box
    – Ale
    Dec 28, 2013 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, 2013 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, 2015 at 7:45

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .