Example #1
0
    def parse_tracks_from_xml(self, tracks_xml):
        """Extracts track information from XmlNode objects and stores that into Metadata objects.

        Args:
            tracks_xml -- list of XmlNode objects
        """
        for node in tracks_xml:
            if "release_list" in node.children and "release" in node.release_list[0].children:
                for rel_node in node.release_list[0].release:
                    track = Metadata()
                    recording_to_metadata(node, track)
                    release_to_metadata(rel_node, track)
                    rg_node = rel_node.release_group[0]
                    release_group_to_metadata(rg_node, track)
                    if "release_event_list" in rel_node.children:
                        # Extract contries list from `release_event_list` element
                        # Don't use `country` element as it contains information of a single release
                        # event and is basically for backward compatibility.
                        country = []
                        for re in rel_node.release_event_list[0].release_event:
                            try:
                                country.append(
                                        re.area[0].iso_3166_1_code_list[0].iso_3166_1_code[0].text)
                            except AttributeError:
                                pass
                        track["country"] = ", ".join(country)
                    self.search_results.append((track, node))
            else:
                # This handles the case when no release is associated with a track
                # i.e. the track is a NAT
                track = Metadata()
                recording_to_metadata(node, track)
                track["album"] = _("Standalone Recording")
                self.search_results.append((track, node))
Example #2
0
    def _parse_release(self, document):
        log.debug("Loading release %r ...", self.id)
        self._tracks_loaded = False

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            self.tagger.mbid_redirects[self.id] = release_node.id
            album = self.tagger.albums.get(release_node.id)
            if album:
                log.debug("Release %r already loaded", release_node.id)
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                return False
            else:
                del self.tagger.albums[self.id]
                self.tagger.albums[release_node.id] = self
                self.id = release_node.id

        # Get release metadata
        m = self._new_metadata
        m.length = 0

        rg_node = release_node.release_group[0]
        rg = self.release_group = self.tagger.get_release_group_by_id(
            rg_node.id)
        rg.loaded_albums.add(self.id)
        rg.refcount += 1

        release_group_to_metadata(rg_node, rg.metadata, rg)
        m.copy(rg.metadata)
        release_to_metadata(release_node, m, album=self)

        if self._discid:
            m['musicbrainz_discid'] = self._discid

        # Custom VA name
        if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID:
            m['albumartistsort'] = m['albumartist'] = config.setting['va_name']

        # Convert Unicode punctuation
        if config.setting['convert_punctuation']:
            m.apply_func(asciipunct)

        m['totaldiscs'] = release_node.medium_list[0].count

        # Add album to collections
        add_release_to_user_collections(release_node)

        # Run album metadata plugins
        try:
            run_album_metadata_processors(self, m, release_node)
        except:
            self.error_append(traceback.format_exc())

        self._release_node = release_node
        return True
Example #3
0
    def _parse_release(self, document):
        log.debug("Loading release %r ...", self.id)
        self._tracks_loaded = False

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            self.tagger.mbid_redirects[self.id] = release_node.id
            album = self.tagger.albums.get(release_node.id)
            if album:
                log.debug("Release %r already loaded", release_node.id)
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                return False
            else:
                del self.tagger.albums[self.id]
                self.tagger.albums[release_node.id] = self
                self.id = release_node.id

        # Get release metadata
        m = self._new_metadata
        m.length = 0

        rg_node = release_node.release_group[0]
        rg = self.release_group = self.tagger.get_release_group_by_id(rg_node.id)
        rg.loaded_albums.add(self.id)
        rg.refcount += 1

        release_group_to_metadata(rg_node, rg.metadata, rg)
        m.copy(rg.metadata)
        release_to_metadata(release_node, m, album=self)

        if self._discid:
            m['musicbrainz_discid'] = self._discid

        # Custom VA name
        if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID:
            m['albumartistsort'] = m['albumartist'] = config.setting['va_name']

        # Convert Unicode punctuation
        if config.setting['convert_punctuation']:
            m.apply_func(asciipunct)

        m['totaldiscs'] = release_node.medium_list[0].count

        # Add album to collections
        add_release_to_user_collections(release_node)

        # Run album metadata plugins
        try:
            run_album_metadata_processors(self, m, release_node)
        except:
            self.error_append(traceback.format_exc())

        self._release_node = release_node
        return True
Example #4
0
 def test_1(self):
     config.setting = settings
     release = XmlNode(attribs={'id': '123'}, children={
         'title': [XmlNode(text='Foo')],
         'status': [XmlNode(text='Official')],
         'text_representation': [XmlNode(children={
             'language': [XmlNode(text='eng')],
             'script': [XmlNode(text='Latn')]
         })],
         'artist_credit': [XmlNode(children={
             'name_credit': [XmlNode(attribs={'joinphrase': ' & '}, children={
                 'artist': [XmlNode(attribs={'id': '456'}, children={
                     'name': [XmlNode(text='Foo Bar')],
                     'sort_name': [XmlNode(text='Bar, Foo')]
                 })]
             }), XmlNode(children={
                 'artist': [XmlNode(attribs={'id': '789'}, children={
                     'name': [XmlNode(text='Baz')],
                     'sort_name': [XmlNode(text='Baz')]
                 })]
             })]
         })],
         'date': [XmlNode(text='2009-08-07')],
         'country': [XmlNode(text='GB')],
         'barcode': [XmlNode(text='012345678929')],
         'asin': [XmlNode(text='B123456789')],
         'label_info_list': [XmlNode(attribs={'count': '1'}, children={
             'label_info': [XmlNode(children={
                 'catalog_number': [XmlNode(text='ABC 123')],
                 'label': [XmlNode(children={
                     'name': [XmlNode(text='ABC')]
                 })]
             })]
         })]
     })
     m = Metadata()
     release_to_metadata(release, m)
     self.assertEqual('123', m['musicbrainz_albumid'])
     self.assertEqual('456; 789', m['musicbrainz_albumartistid'])
     self.assertEqual('Foo', m['album'])
     self.assertEqual('official', m['releasestatus'])
     self.assertEqual('eng', m['~releaselanguage'])
     self.assertEqual('Latn', m['script'])
     self.assertEqual('Foo Bar & Baz', m['albumartist'])
     self.assertEqual('Bar, Foo & Baz', m['albumartistsort'])
     self.assertEqual('2009-08-07', m['date'])
     self.assertEqual('GB', m['releasecountry'])
     self.assertEqual('012345678929', m['barcode'])
     self.assertEqual('B123456789', m['asin'])
     self.assertEqual('ABC', m['label'])
     self.assertEqual('ABC 123', m['catalognumber'])
Example #5
0
 def test_1(self):
     config.setting = settings
     release = XmlNode(attribs={'id': '123'}, children={
         'title': [XmlNode(text='Foo')],
         'status': [XmlNode(text='Official')],
         'text_representation': [XmlNode(children={
             'language': [XmlNode(text='eng')],
             'script': [XmlNode(text='Latn')]
         })],
         'artist_credit': [XmlNode(children={
             'name_credit': [XmlNode(attribs={'joinphrase': ' & '}, children={
                 'artist': [XmlNode(attribs={'id': '456'}, children={
                     'name': [XmlNode(text='Foo Bar')],
                     'sort_name': [XmlNode(text='Bar, Foo')]
                 })]
             }), XmlNode(children={
                 'artist': [XmlNode(attribs={'id': '789'}, children={
                     'name': [XmlNode(text='Baz')],
                     'sort_name': [XmlNode(text='Baz')]
                 })]
             })]
         })],
         'date': [XmlNode(text='2009-08-07')],
         'country': [XmlNode(text='GB')],
         'barcode': [XmlNode(text='012345678929')],
         'asin': [XmlNode(text='B123456789')],
         'label_info_list': [XmlNode(attribs={'count': '1'}, children={
             'label_info': [XmlNode(children={
                 'catalog_number': [XmlNode(text='ABC 123')],
                 'label': [XmlNode(children={
                     'name': [XmlNode(text='ABC')]
                 })]
             })]
         })]
     })
     m = Metadata()
     release_to_metadata(release, m)
     self.assertEqual('123', m['musicbrainz_albumid'])
     self.assertEqual('456; 789', m['musicbrainz_albumartistid'])
     self.assertEqual('Foo', m['album'])
     self.assertEqual('official', m['releasestatus'])
     self.assertEqual('eng', m['~releaselanguage'])
     self.assertEqual('Latn', m['script'])
     self.assertEqual('Foo Bar & Baz', m['albumartist'])
     self.assertEqual('Bar, Foo & Baz', m['albumartistsort'])
     self.assertEqual('2009-08-07', m['date'])
     self.assertEqual('GB', m['releasecountry'])
     self.assertEqual('012345678929', m['barcode'])
     self.assertEqual('B123456789', m['asin'])
     self.assertEqual('ABC', m['label'])
     self.assertEqual('ABC 123', m['catalognumber'])
Example #6
0
 def parse_releases_from_xml(self, release_xml):
     for node in release_xml:
         release = Metadata()
         release_to_metadata(node, release)
         rg_node = node.release_group[0]
         release_group_to_metadata(rg_node, release)
         if "medium_list" in node.children:
             medium_list = node.medium_list[0]
             release["format"] = media_formats_from_node(medium_list)
             release["tracks"] = medium_list.track_count[0].text
         countries = country_list_from_node(node)
         if countries:
             release["country"] = ", ".join(countries)
         self.search_results.append(release)
Example #7
0
    def _parse_release(self, document):
        self.log.debug("Loading release %r", self.id)
        self._tracks_loaded = False

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            self.tagger.mbid_redirects[self.id] = release_node.id
            album = self.tagger.albums.get(release_node.id)
            if album:
                self.log.debug("Release %r already loaded", release_node.id)
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                return False
            else:
                del self.tagger.albums[self.id]
                self.tagger.albums[release_node.id] = self
                self.id = release_node.id

        # Get release metadata
        m = self._new_metadata
        m.length = 0
        release_to_metadata(release_node, m, config=self.config, album=self)

        self.format_str = media_formats_from_node(release_node.medium_list[0])
        self.rgid = release_node.release_group[0].id
        if self._discid:
            m['musicbrainz_discid'] = self._discid

        # Custom VA name
        if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID:
            m['albumartistsort'] = m['albumartist'] = self.config.setting[
                'va_name']

        # Convert Unicode punctuation
        if self.config.setting['convert_punctuation']:
            m.apply_func(asciipunct)

        m['totaldiscs'] = release_node.medium_list[0].count

        # Run album metadata plugins
        try:
            run_album_metadata_processors(self, m, release_node)
        except:
            self.log.error(traceback.format_exc())

        self._release_node = release_node
        return True
Example #8
0
    def _parse_release(self, document):
        self.log.debug("Loading release %r", self.id)
        self._tracks_loaded = False

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            self.tagger.mbid_redirects[self.id] = release_node.id
            album = self.tagger.albums.get(release_node.id)
            if album:
                self.log.debug("Release %r already loaded", release_node.id)
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                return False
            else:
                del self.tagger.albums[self.id]
                self.tagger.albums[release_node.id] = self
                self.id = release_node.id

        # Get release metadata
        m = self._new_metadata
        m.length = 0
        release_to_metadata(release_node, m, config=self.config, album=self)

        self.format_str = media_formats_from_node(release_node.medium_list[0])
        self.rgid = release_node.release_group[0].id
        if self._discid:
            m['musicbrainz_discid'] = self._discid

        # Custom VA name
        if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID:
            m['albumartistsort'] = m['albumartist'] = self.config.setting['va_name']

        # Convert Unicode punctuation
        if self.config.setting['convert_punctuation']:
            m.apply_func(asciipunct)

        m['totaldiscs'] = release_node.medium_list[0].count

        # Run album metadata plugins
        try:
            run_album_metadata_processors(self, m, release_node)
        except:
            self.log.error(traceback.format_exc())

        self._release_node = release_node
        return True
Example #9
0
def _earliest_release_downloaded(album, metadata, original_id, document, http, error):
    try:
        if error:
            album.log.error("%r", unicode(http.errorString()))
        else:
            try:
                release_node = document.metadata[0].release[0]
                original_album = Album(original_id)
                release_to_metadata(release_node, original_album.metadata,
                                    config=album.config, album=original_album)
                get_earliest_release_date(original_album, metadata)
                for track in album._new_tracks:
                    track.metadata["originaldate"] = metadata["originaldate"]
            except:
                error = True
                album.log.error(traceback.format_exc())
    finally:
        album._requests -= 1
        album._finalize_loading(None)
Example #10
0
 def parse_tracks_from_xml(self, tracks_xml):
     for node in tracks_xml:
         if "release_list" in node.children and "release" in node.release_list[0].children:
             for rel_node in node.release_list[0].release:
                 track = Metadata()
                 recording_to_metadata(node, track)
                 release_to_metadata(rel_node, track)
                 rg_node = rel_node.release_group[0]
                 release_group_to_metadata(rg_node, track)
                 countries = country_list_from_node(rel_node)
                 if countries:
                     track["country"] = ", ".join(countries)
                 self.search_results.append((track, node))
         else:
             # This handles the case when no release is associated with a track
             # i.e. the track is an NAT
             track = Metadata()
             recording_to_metadata(node, track)
             track["album"] = _("Standalone Recording")
             self.search_results.append((track, node))
Example #11
0
def _earliest_release_downloaded(album, metadata, original_id, document, http,
                                 error):
    try:
        if error:
            album.log.error("%r", unicode(http.errorString()))
        else:
            try:
                release_node = document.metadata[0].release[0]
                original_album = Album(original_id)
                release_to_metadata(release_node,
                                    original_album.metadata,
                                    config=album.config,
                                    album=original_album)
                get_earliest_release_date(original_album, metadata)
                for track in album._new_tracks:
                    track.metadata["originaldate"] = metadata["originaldate"]
            except:
                error = True
                album.log.error(traceback.format_exc())
    finally:
        album._requests -= 1
        album._finalize_loading(None)
Example #12
0
 def test_1(self):
     config.setting = settings
     release = XmlNode(
         attribs={"id": u"123"},
         children={
             "title": [XmlNode(text=u"Foo")],
             "status": [XmlNode(text=u"Official")],
             "text_representation": [
                 XmlNode(children={"language": [XmlNode(text=u"eng")], "script": [XmlNode(text=u"Latn")]})
             ],
             "artist_credit": [
                 XmlNode(
                     children={
                         "name_credit": [
                             XmlNode(
                                 attribs={"joinphrase": u" & "},
                                 children={
                                     "artist": [
                                         XmlNode(
                                             attribs={"id": u"456"},
                                             children={
                                                 "name": [XmlNode(text=u"Foo Bar")],
                                                 "sort_name": [XmlNode(text=u"Bar, Foo")],
                                             },
                                         )
                                     ]
                                 },
                             ),
                             XmlNode(
                                 children={
                                     "artist": [
                                         XmlNode(
                                             attribs={"id": u"789"},
                                             children={
                                                 "name": [XmlNode(text=u"Baz")],
                                                 "sort_name": [XmlNode(text=u"Baz")],
                                             },
                                         )
                                     ]
                                 }
                             ),
                         ]
                     }
                 )
             ],
             "date": [XmlNode(text=u"2009-08-07")],
             "country": [XmlNode(text=u"GB")],
             "barcode": [XmlNode(text=u"012345678929")],
             "asin": [XmlNode(text=u"B123456789")],
             "label_info_list": [
                 XmlNode(
                     attribs={"count": u"1"},
                     children={
                         "label_info": [
                             XmlNode(
                                 children={
                                     "catalog_number": [XmlNode(text=u"ABC 123")],
                                     "label": [XmlNode(children={"name": [XmlNode(text=u"ABC")]})],
                                 }
                             )
                         ]
                     },
                 )
             ],
         },
     )
     m = Metadata()
     release_to_metadata(release, m)
     self.assertEqual(u"123", m["musicbrainz_albumid"])
     self.assertEqual(u"456; 789", m["musicbrainz_albumartistid"])
     self.assertEqual(u"Foo", m["album"])
     self.assertEqual(u"official", m["releasestatus"])
     self.assertEqual(u"eng", m["~releaselanguage"])
     self.assertEqual(u"Latn", m["script"])
     self.assertEqual(u"Foo Bar & Baz", m["albumartist"])
     self.assertEqual(u"Bar, Foo & Baz", m["albumartistsort"])
     self.assertEqual(u"2009-08-07", m["date"])
     self.assertEqual(u"GB", m["releasecountry"])
     self.assertEqual(u"012345678929", m["barcode"])
     self.assertEqual(u"B123456789", m["asin"])
     self.assertEqual(u"ABC", m["label"])
     self.assertEqual(u"ABC 123", m["catalognumber"])
Example #13
0
    def _parse_release(self, document):
        self.log.debug("Loading release %r", self.id)

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            album = self.tagger.get_album_by_id(release_node.id)
            self.tagger.albumids[self.id] = release_node.id
            self.id = release_node.id
            if album:
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                self.log.debug("Release %r already loaded", self.id)
                return False

        # Get release metadata
        m = self._new_metadata
        m.length = 0
        release_to_metadata(release_node, m, config=self.config, album=self)

        self.format_str = media_formats_from_node(release_node.medium_list[0])
        self.rgid = release_node.release_group[0].id
        if self._discid:
            m['musicbrainz_discid'] = self._discid

        # 'Translate' artist name
        if self.config.setting['translate_artist_names']:
            m['albumartist'] = translate_artist(m['albumartist'], m['albumartistsort'])

        # Custom VA name
        if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID:
            m['albumartistsort'] = m['albumartist'] = self.config.setting['va_name']

        ignore_tags = [s.strip() for s in self.config.setting['ignore_tags'].split(',')]
        first_artist = None
        compilation = False
        track_counts = []

        m['totaldiscs'] = release_node.medium_list[0].count

        self._metadata_processors = [partial(run_album_metadata_processors, self, m, release_node)]

        for medium_node in release_node.medium_list[0].medium:
            mm = Metadata()
            mm.copy(m)
            medium_to_metadata(medium_node, mm)
            track_counts.append(mm['totaltracks'])

            for track_node in medium_node.track_list[0].track:
                t = Track(track_node.recording[0].id, self)
                self._new_tracks.append(t)

                # Get track metadata
                tm = t.metadata
                tm.copy(mm)
                track_to_metadata(track_node, t, self.config)
                m.length += tm.length

                artist_id = tm['musicbrainz_artistid']
                if compilation is False:
                    if first_artist is None:
                        first_artist = artist_id
                    if first_artist != artist_id:
                        compilation = True
                        for track in self._new_tracks:
                            track.metadata['compilation'] = '1'
                else:
                    tm['compilation'] = '1'

                t._customize_metadata(ignore_tags)
                plugins = partial(run_track_metadata_processors, self, tm, release_node, track_node)
                self._metadata_processors.append(plugins)

        m["~totalalbumtracks"] = str(sum(map(int, track_counts)))
        self.tracks_str = " + ".join(track_counts)

        return True
Example #14
0
    def _parse_release(self, document):
        log.debug("Loading release %r", self.id)
        self._tracks_loaded = False

        release_node = document.metadata[0].release[0]
        if release_node.id != self.id:
            self.tagger.mbid_redirects[self.id] = release_node.id
            album = self.tagger.albums.get(release_node.id)
            if album:
                log.debug("Release %r already loaded", release_node.id)
                album.match_files(self.unmatched_files.files)
                album.update()
                self.tagger.remove_album(self)
                return False
            else:
                del self.tagger.albums[self.id]
                self.tagger.albums[release_node.id] = self
                self.id = release_node.id

        # Get release metadata
        m = self._new_metadata
        m.length = 0

        rg_node = release_node.release_group[0]
        rg = self.release_group = self.tagger.get_release_group_by_id(rg_node.id)
        rg.loaded_albums.add(self.id)
        rg.refcount += 1

        release_group_to_metadata(rg_node, rg.metadata, rg)
        m.copy(rg.metadata)
        release_to_metadata(release_node, m, album=self)

        if self._discid:
            m["musicbrainz_discid"] = self._discid

        # Custom VA name
        if m["musicbrainz_albumartistid"] == VARIOUS_ARTISTS_ID:
            m["albumartistsort"] = m["albumartist"] = config.setting["va_name"]

        # Convert Unicode punctuation
        if config.setting["convert_punctuation"]:
            m.apply_func(asciipunct)

        m["totaldiscs"] = release_node.medium_list[0].count

        # Add album to collections
        if "collection_list" in release_node.children:
            for node in release_node.collection_list[0].collection:
                if node.editor[0].text.lower() == config.setting["username"].lower():
                    if node.id not in user_collections:
                        user_collections[node.id] = Collection(node.id, node.name[0].text, node.release_list[0].count)
                    user_collections[node.id].releases.add(self.id)

        # Run album metadata plugins
        try:
            run_album_metadata_processors(self, m, release_node)
        except:
            self.error_append(traceback.format_exc())

        self._release_node = release_node
        return True