And here's some quick RDF for the CMT plugins, which greatly
reduces the number of "Unknown" plugins on my system.

Plus a slightly improved script (it takes the plugin filename as an
argument now).

For a couple of plugins I invented a "SynthesizerPlugin" and
"SurroundPlugin", which are (not surprisingly) not recognized by Ardour.

Is there a list somewhere of valid ladpsa RDF plugin types?  I had a
look around the lrdf project page on sourceforge and didn't find
anything.

-- 

Paul Winkler
http://www.slinkp.com
#!/usr/bin/python

from cgi import escape
import os
import sys

HEADER = """<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE rdf:RDF [
        <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
        <!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
        <!ENTITY dc 'http://purl.org/dc/elements/1.1/'>
        <!ENTITY ladspa 'http://ladspa.org/ontology#'>
]>
<rdf:RDF xmlns:rdf='&rdf;'
         xmlns:rdfs='&rdfs;'
         xmlns:dc='&dc;'
         xmlns:ladspa='&ladspa;'>
"""

FOOTER = """
</rdf:RDF>
"""

plugin_template='''
  <ladspa:UnknownPlugin rdf:about="&ladspa;%(Plugin Unique ID)s">
    <dc:creator>%(Maker)s</dc:creator>
    <dc:rights>%(Copyright)s</dc:rights>
    <dc:title>%(Plugin Name)s</dc:title>
  </ladspa:UnknownPlugin>
'''

def find_plugin(filename):
    path = os.environ.get('LADSPA_PATH', '/usr/lib/ladspa').split(':')
    for p in path:
        maybe_file = os.path.join(p, filename)
        if os.path.exists(maybe_file):
            return maybe_file
    raise IOError, "Didn't find %s on path %s" % (filename, path)

def split_vals(line):
    try:
        label, val = line.split(':', 1)
    except ValueError:
        # we don't handle port information for now.
        return ()
    val = val.strip('\'" ')
    val = escape(val, 1)
    return label, val

def parse_plugin(astr):
    # icky quick hack
    lines = astr.split('\n')
    pairs = [split_vals(line) for line in lines]
    pairs = [p for p in pairs if p]
    info = dict(pairs)
    return info

def parse_plugins(path):
    info_str = os.popen('analyseplugin %s' % path).read()
    plugin_strings = info_str.split('\n\n')
    plugin_infos = [parse_plugin(s) for s in plugin_strings]
    plugin_infos = [i for i in plugin_infos if i]
    return plugin_infos

def make_rdf(parsed):
    plugins_rdf = [HEADER]
    # Sort by ID.
    sortable = [(d['Plugin Unique ID'], d) for d in parsed]
    parsed = [t[1] for t in sorted(sortable)]
    for info in parsed:
        plugin_template % info
    plugins_rdf.extend([plugin_template % info for info in parsed])
    plugins_rdf.append(FOOTER)
    return '\n'.join(plugins_rdf)


if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.stderr.write('Missing required plugin library file argument\n')
        sys.exit(1)
    filename = sys.argv[1]
    where = find_plugin(filename)
    parsed = parse_plugins(where)
    print make_rdf(parsed)

Attachment: cmt-plugins.rdf
Description: application/rdf

Reply via email to