Alex Lancaster b5e8859
# -*- coding: utf-8 -*-
Alex Lancaster b5e8859
Alex Lancaster b5e8859
PLUGIN_NAME = u"Add Cluster As Release"
Alex Lancaster b5e8859
PLUGIN_AUTHOR = u"Lukáš Lalinský, Philip Jägenstedt"
Alex Lancaster b5e8859
PLUGIN_DESCRIPTION = ""
Alex Lancaster b5e8859
PLUGIN_VERSION = "0.2"
Alex Lancaster b5e8859
PLUGIN_API_VERSIONS = ["0.9.0", "0.10", "0.15.0"]
Alex Lancaster b5e8859
Alex Lancaster b5e8859
from picard.cluster import Cluster
Alex Lancaster b5e8859
from picard.util import webbrowser2
Alex Lancaster b5e8859
from picard.ui.itemviews import BaseAction, register_cluster_action
Alex Lancaster b5e8859
Alex Lancaster b5e8859
import codecs
Alex Lancaster b5e8859
import os
Alex Lancaster b5e8859
import tempfile
Alex Lancaster b5e8859
Alex Lancaster b5e8859
HTML_HEAD = """
Alex Lancaster b5e8859
<meta charset="UTF-8">
Alex Lancaster b5e8859
<title>Add Cluster As Release</title>
Alex Lancaster b5e8859
<form action="http://musicbrainz.org/release/add" method="post">
Alex Lancaster b5e8859
"""
Alex Lancaster b5e8859
HTML_INPUT = """<input type="hidden" name="%s" value="%s">
Alex Lancaster b5e8859
"""
Alex Lancaster b5e8859
HTML_TAIL = """<input type="submit" value="Add Release">
Alex Lancaster b5e8859
</form>
Alex Lancaster b5e8859
<script>document.forms[0].submit()</script>
Alex Lancaster b5e8859
"""
Alex Lancaster b5e8859
HTML_ATTR_ESCAPE = {
Alex Lancaster b5e8859
    "&": "&",
Alex Lancaster b5e8859
    '"': """
Alex Lancaster b5e8859
}
Alex Lancaster b5e8859
Alex Lancaster b5e8859
class AddClusterAsRelease(BaseAction):
Alex Lancaster b5e8859
    NAME = "Add Cluster As Release..."
Alex Lancaster b5e8859
Alex Lancaster b5e8859
    def callback(self, objs):
Alex Lancaster b5e8859
        if len(objs) != 1 or not isinstance(objs[0], Cluster):
Alex Lancaster b5e8859
            return
Alex Lancaster b5e8859
        cluster = objs[0]
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        (fd, fp) = tempfile.mkstemp(suffix=".html")
Alex Lancaster b5e8859
        f = codecs.getwriter("utf-8")(os.fdopen(fd, "w"))
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        def esc(s):
Alex Lancaster b5e8859
            return "".join(HTML_ATTR_ESCAPE.get(c, c) for c in s)
Alex Lancaster b5e8859
        # add a global (release-level) name-value
Alex Lancaster b5e8859
        def nv(n, v):
Alex Lancaster b5e8859
            f.write(HTML_INPUT % (esc(n), esc(v)))
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        f.write(HTML_HEAD)
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        nv("artist_credit.names.0.artist.name", cluster.metadata["artist"])
Alex Lancaster b5e8859
        nv("name", cluster.metadata["album"])
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        for i, file in enumerate(cluster.files):
Alex Lancaster b5e8859
            try:
Alex Lancaster b5e8859
                i = int(file.metadata["tracknumber"]) - 1
Alex Lancaster b5e8859
            except:
Alex Lancaster b5e8859
                pass
Alex Lancaster b5e8859
            try:
Alex Lancaster b5e8859
                m = int(file.metadata["discnumber"]) - 1
Alex Lancaster b5e8859
            except:
Alex Lancaster b5e8859
                m = 0
Alex Lancaster b5e8859
Alex Lancaster b5e8859
            # add a track-level name-value
Alex Lancaster b5e8859
            def tnv(n, v):
Alex Lancaster b5e8859
                nv("mediums.%d.track.%d.%s" % (m, i, n), v)
Alex Lancaster b5e8859
Alex Lancaster b5e8859
            tnv("name", file.metadata["title"])
Alex Lancaster b5e8859
            if file.metadata["artist"] != cluster.metadata["artist"]:
Alex Lancaster b5e8859
                tnv("artist_credit.names.0.name", file.metadata["artist"])
Alex Lancaster b5e8859
            tnv("length", str(file.metadata.length))
Alex Lancaster b5e8859
Alex Lancaster b5e8859
        f.write(HTML_TAIL)
Alex Lancaster b5e8859
        f.close()
Alex Lancaster b5e8859
        webbrowser2.open("file://"+fp)
Alex Lancaster b5e8859
Alex Lancaster b5e8859
register_cluster_action(AddClusterAsRelease())