Index: formats/mp3.py
===================================================================
--- formats/mp3.py	(revision 1597)
+++ formats/mp3.py	(working copy)
@@ -52,6 +52,7 @@
             "TMOO": "mood",
             "TBPM": "bpm",
             "TDRC": "date",
+            "UFID": "uuid", # not really used - see __init__
             "WOAR": "website",
             }
 
@@ -62,10 +63,21 @@
     except: pass # Uninitialized config...
     CODECS.append("iso-8859-1")
 
+    mbid = None
+
     def __init__(self, filename):
         try: tag = ID3hack(filename)
         except mutagen.id3.error: tag = {}
 
+        self.mbid = re.compile("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")
+
+        reverse_musicbrainz_txxx = {
+            "MusicBrainz Album Id" : "musicbrainz_albumid",
+            "MusicBrainz Artist Id" : "musicbrainz_artistid",
+            "MusicBrainz Album Artist Id" : "musicbrainz_albumartistid",
+            "MusicBrainz TRM Id" : "musicbrainz_trmid"
+        }
+        
         for frame in tag.values():
             if frame.FrameID == "APIC" and len(frame.data):
                 self["~picture"] = "y"
@@ -73,9 +85,18 @@
             elif frame.FrameID == "TCON":
                 self["genre"] = "\n".join(frame.genres)
                 continue
+            elif frame.FrameID == "UFID":
+                # ignore it if it doesn't match a MusicBrainz track id,
+                # musicbrainz_trackid otherwise
+                if self.mbid.match(frame.data):
+                    self["musicbrainz_trackid"] = frame.data
+                    continue
             elif frame.FrameID in ["COMM", "TXXX"]:
                 if frame.desc.startswith("QuodLibet::"):
                     name = frame.desc[11:]
+                # MusicBrainz support
+                elif frame.FrameID == "TXXX" and frame.desc in reverse_musicbrainz_txxx and self.mbid.match(frame.text):
+                    name = reverse_musicbrainz_txxx[frame.desc]
                 elif frame.desc == "ID3v1 Comment": continue
                 elif frame.desc == "": name = "comment"
                 else: continue
@@ -147,11 +168,21 @@
         return text
 
     def write(self):
+        musicbrainz_txxx = {
+            "musicbrainz_albumid" : "MusicBrainz Album Id",
+            "musicbrainz_artistid" : "MusicBrainz Artist Id",
+            "musicbrainz_albumartistid" : "MusicBrainz Album Artist Id",
+            "musicbrainz_trmid" : "MusicBrainz TRM Id"
+        }
+
         try: tag = mutagen.id3.ID3(self['~filename'])
         except mutagen.id3.error: tag = mutagen.id3.ID3()
         tag.delall("COMM:QuodLibet:")
         tag.delall("TXXX:QuodLibet:")
 
+        for val in musicbrainz_txxx.values():
+            tag.delall("TXXX:%s" % val)
+
         for key, id3name in self.SDI.items():
             tag.delall(id3name)
 
@@ -168,9 +199,24 @@
 
         dontwrite = ["genre", "comment", "replaygain_album_peak",
                      "replaygain_track_peak", "replaygain_album_gain",
-                     "replaygain_track_gain"]
-        for key in filter(lambda x: x not in self.SDI and x not in dontwrite,
-                          self.realkeys()):
+                     "replaygain_track_gain", "musicbrainz_trackid"]
+
+        for key in filter(lambda x: x in musicbrainz_txxx.keys(), self.realkeys()):
+            f = mutagen.id3.TXXX(
+                encoding=0, text=self[key],
+                desc=musicbrainz_txxx[key])
+            tag.loaded_frame(f)
+
+        if "musicbrainz_trackid" in self.realkeys():
+            if self.mbid.match(self["musicbrainz_trackid"]):
+                f = mutagen.id3.UFID(owner="http://musicbrainz.org",
+                      data=self["musicbrainz_trackid"])
+                tag.loaded_frame(f)
+            else:
+               print "mismatch with: %s" % self["musicbrainz_trackid"]
+            
+        for key in filter(lambda x: x not in self.SDI and x not in dontwrite 
+                          and x not in musicbrainz_txxx, self.realkeys()):
             if not isascii(self[key]): enc = 1
             else: enc = 3
             f = mutagen.id3.TXXX(
