diff --git a/contrib/plugins/addrelease.py b/contrib/plugins/addrelease.py
new file mode 100644
index 000000000..55ebcc832
--- /dev/null
+++ b/contrib/plugins/addrelease.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+
+PLUGIN_NAME = u"Add Cluster As Release"
+PLUGIN_AUTHOR = u"Lukáš Lalinský, Philip Jägenstedt"
+PLUGIN_DESCRIPTION = "Adds a plugin context menu option to clusters to help you quickly add a release into the MusicBrainz\
+ database via the website by pre-populating artists, track names and times."
+PLUGIN_VERSION = "0.3"
+PLUGIN_API_VERSIONS = ["1.0.0"]
+
+from picard.cluster import Cluster
+from picard.util import webbrowser2
+from picard.ui.itemviews import BaseAction, register_cluster_action
+
+import codecs
+import os
+import tempfile
+
+HTML_HEAD = """
+
+
Add Cluster As Release
+
+
+"""
+HTML_ATTR_ESCAPE = {
+ "&": "&",
+ '"': """
+}
+
+class AddClusterAsRelease(BaseAction):
+ NAME = "Add Cluster As Release..."
+
+ def callback(self, objs):
+ if len(objs) != 1 or not isinstance(objs[0], Cluster):
+ return
+ cluster = objs[0]
+
+ (fd, fp) = tempfile.mkstemp(suffix=".html")
+ f = codecs.getwriter("utf-8")(os.fdopen(fd, "w"))
+
+ def esc(s):
+ return "".join(HTML_ATTR_ESCAPE.get(c, c) for c in s)
+ # add a global (release-level) name-value
+ def nv(n, v):
+ f.write(HTML_INPUT % (esc(n), esc(v)))
+
+ f.write(HTML_HEAD)
+
+ nv("artist_credit.names.0.artist.name", cluster.metadata["albumartist"])
+ nv("name", cluster.metadata["album"])
+
+ for i, file in enumerate(cluster.files):
+ try:
+ i = int(file.metadata["tracknumber"]) - 1
+ except:
+ pass
+ try:
+ m = int(file.metadata["discnumber"]) - 1
+ except:
+ m = 0
+
+ # add a track-level name-value
+ def tnv(n, v):
+ nv("mediums.%d.track.%d.%s" % (m, i, n), v)
+
+ tnv("name", file.metadata["title"])
+ if file.metadata["artist"] != cluster.metadata["albumartist"]:
+ tnv("artist_credit.names.0.name", file.metadata["artist"])
+ tnv("length", str(file.metadata.length))
+
+ f.write(HTML_TAIL)
+ f.close()
+ webbrowser2.open("file://"+fp)
+
+register_cluster_action(AddClusterAsRelease())
diff --git a/contrib/plugins/old/addrelease.py b/contrib/plugins/old/addrelease.py
deleted file mode 100644
index df0784e0f..000000000
--- a/contrib/plugins/old/addrelease.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-
-PLUGIN_NAME = u"Add Cluster As Release"
-PLUGIN_AUTHOR = u"Lukáš Lalinský"
-PLUGIN_DESCRIPTION = "Enables you to add music files that have been clustered together to MusicBrainz"
-PLUGIN_VERSION = "0.1"
-PLUGIN_API_VERSIONS = ["0.9.0", "0.10"]
-
-
-from PyQt4 import QtCore
-from picard.cluster import Cluster
-from picard.util import webbrowser2, format_time
-from picard.ui.itemviews import BaseAction, register_cluster_action
-
-
-class AddClusterAsRelease(BaseAction):
- NAME = "Add Cluster As Release..."
-
- def callback(self, objs):
- if len(objs) != 1 or not isinstance(objs[0], Cluster):
- return
- cluster = objs[0]
-
- artists = set()
- for i, file in enumerate(cluster.files):
- artists.add(file.metadata["artist"])
-
- url = "http://musicbrainz.org/cdi/enter.html"
- if len(artists) > 1:
- url += "?hasmultipletrackartists=1&artistid=1"
- else:
- url += "?hasmultipletrackartists=0&artistid=2"
- url += "&artistedit=1&artistname=%s" % QtCore.QUrl.toPercentEncoding(cluster.metadata["artist"])
- url += "&releasename=%s" % QtCore.QUrl.toPercentEncoding(cluster.metadata["album"])
- tracks = 0
- for i, file in enumerate(cluster.files):
- try:
- i = int(file.metadata["tracknumber"]) - 1
- except:
- pass
- tracks = max(tracks, i + 1)
- url += "&track%d=%s" % (i, QtCore.QUrl.toPercentEncoding(file.metadata["title"]))
- url += "&tracklength%d=%s" % (i, QtCore.QUrl.toPercentEncoding(format_time(file.metadata.length)))
- if len(artists) > 1:
- url += "&tr%d_artistedit=1" % i
- url += "&tr%d_artistname=%s" % (i, QtCore.QUrl.toPercentEncoding(file.metadata["artist"]))
- url += "&tracks=%d" % tracks
- webbrowser2.open(url)
-
-
-register_cluster_action(AddClusterAsRelease())
-
diff --git a/picard/__init__.py b/picard/__init__.py
index 9fbc351e1..3af63ab45 100644
--- a/picard/__init__.py
+++ b/picard/__init__.py
@@ -28,5 +28,5 @@ else:
version_string = '%d.%d.%d%s%d' % version_info
__version__ = version_string
-api_versions = ["0.15.0", "0.15.1", "0.16.0"]
+api_versions = ["0.15.0", "0.15.1", "0.16.0", "1.0.0"]