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_INPUT = """ +""" +HTML_TAIL = """ +
+ +""" +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"]