Child: [d89148] (diff)

Download this file

rclaudio    106 lines (88 with data), 3.3 kB

#!/usr/bin/env python

# Audio tag filter for Recoll, using mutagen

import sys
import os
import rclexecm

try:
    from mutagen import File
except:
    print("RECFILTERROR HELPERNOTFOUND python:mutagen")
    sys.exit(1);

# mp3:      album, title, artist, genre, date, tracknumber
# flac:     album, title, artist, genre, xxx, tracknumber
# oggvorbis:album, title, artist, genre, date, tracknumber
class AudioTagExtractor:
    def __init__(self, em):
        self.em = em
        self.currentindex = 0

    def extractone(self, params):
        #self.em.rclog("extractone %s %s" % (params["filename:"], params["mimetype:"]))
        docdata = ""
        ok = False
        if not "mimetype:" in params or not "filename:" in params:
            self.em.rclog("extractone: no mime or file name")
            return (ok, docdata, "", rclexecm.RclExecM.eofnow)
        filename = params["filename:"]
        mimetype = params["mimetype:"]
        try:
            mutf = File(filename, easy=True)
        except Exception as err:
            self.em.rclog("extractone: extract failed: [%s]" % err)
            return (ok, docdata, "", rclexecm.RclExecM.eofnow)

        minf = {}
        for prop,dflt in [('sample_rate', 44100), ('channels', 2),
                          ('bits_per_sample', 16), ('length', 0),
                          ('bitrate', 0)]:
            try:
                minf[prop] = getattr(mutf.info, prop)
            except Exception as e:
                #self.em.rclog("NO %s prop: %s" % (prop, e))
                minf[prop] = dflt

        if minf['bitrate'] == 0 and minf['length'] > 0:
            br = int(os.path.getsize(filename)* 8 / minf['length'])
            minf['bitrate'] = str(br)

        minf['duration'] = minf['length']
        del minf['length']
        for tag,val in minf.iteritems():
            minf[tag] = str(val)

        for tag,val in mutf.iteritems():
            try:
                val0 = val[0]
                if val0:
                    minf[tag.lower()] = val0
            except:
                pass
            
        self.em.setmimetype("text/plain")
        self.em.setfield("charset", 'utf-8')
        for tag,val in minf.iteritems():
            #self.em.rclog("%s -> %s" % (tag, val))
            self.em.setfield(tag, val)
            # Compat with old version
            if tag == 'artist':
                self.em.setfield('author', val)    

        docdata = mutf.pprint().encode('utf-8')

        ok = True
        return (ok, docdata, "", rclexecm.RclExecM.eofnext)

    ###### File type handler api, used by rclexecm ---------->
    def openfile(self, params):
        self.currentindex = 0
        return True

    def getipath(self, params):
        return self.extractone(params)
        
    def getnext(self, params):
        if self.currentindex >= 1:
            return (False, "", "", rclexecm.RclExecM.eofnow)
        else:
            ret= self.extractone(params)
            self.currentindex += 1
            return ret

def makeObject():
    print("makeObject");
    proto = rclexecm.RclExecM()
    print("makeObject: rclexecm ok");
    extract = AudioTagExtractor(proto)
    return 17

if __name__ == '__main__':
    proto = rclexecm.RclExecM()
    extract = AudioTagExtractor(proto)
    rclexecm.main(proto, extract)