Beispiel #1
0
    def do(self):
        try:
            discId = unicode(self.options.mbdiscid)
        except IndexError:
            print('Please specify a MusicBrainz disc id.')
            return 3

        metadatas = musicbrainz(discId)

        print('%d releases' % len(metadatas))
        for i, md in enumerate(metadatas):
            print('- Release %d:' % (i + 1, ))
            print('    Artist: %s' % md.artist.encode('utf-8'))
            print('    Title:  %s' % md.title.encode('utf-8'))
            print('    Type:   %s' %
                  md.releaseType.encode('utf-8'))  # noqa: E501
            print('    URL:    %s' % md.url)
            print('    Tracks: %d' % len(md.tracks))
            if md.catalogNumber:
                print('    Cat no: %s' % md.catalogNumber)
            if md.barcode:
                print('   Barcode: %s' % md.barcode)

                for j, track in enumerate(md.tracks):
                    print('      Track %2d: %s - %s' %
                          (j + 1, track.artist.encode('utf-8'),
                           track.title.encode('utf-8')))
Beispiel #2
0
    def do(self):
        try:
            discId = unicode(self.options.mbdiscid)
        except IndexError:
            sys.stdout.write('Please specify a MusicBrainz disc id.\n')
            return 3

        from whipper.common import mbngs
        metadatas = mbngs.musicbrainz(discId, record=self.options.record)

        sys.stdout.write('%d releases\n' % len(metadatas))
        for i, md in enumerate(metadatas):
            sys.stdout.write('- Release %d:\n' % (i + 1, ))
            sys.stdout.write('    Artist: %s\n' % md.artist.encode('utf-8'))
            sys.stdout.write('    Title:  %s\n' % md.title.encode('utf-8'))
            sys.stdout.write('    Type:   %s\n' %
                             md.releaseType.encode('utf-8'))
            sys.stdout.write('    URL: %s\n' % md.url)
            sys.stdout.write('    Tracks: %d\n' % len(md.tracks))
            if md.catalogNumber:
                sys.stdout.write('    Cat no: %s\n' % md.catalogNumber)
            if md.barcode:
                sys.stdout.write('   Barcode: %s\n' % md.barcode)

            for j, track in enumerate(md.tracks):
                sys.stdout.write('      Track %2d: %s - %s\n' %
                                 (j + 1, track.artist.encode('utf-8'),
                                  track.title.encode('utf-8')))
Beispiel #3
0
    def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None,
                       prompt=False):
        """
        @type  ittoc: L{whipper.image.table.Table}
        """
        # look up disc on MusicBrainz
        self._stdout.write('Disc duration: %s, %d audio tracks\n' % (
            common.formatTime(ittoc.duration() / 1000.0),
            ittoc.getAudioTracks()))
        logger.debug('MusicBrainz submit url: %r',
                     ittoc.getMusicBrainzSubmitURL())
        ret = None

        metadatas = None
        e = None

        for _ in range(0, 4):
            try:
                metadatas = mbngs.musicbrainz(mbdiscid,
                                              country=country,
                                              record=self._record)
                break
            except mbngs.NotFoundException, e:
                logger.warning("release not found: %r" % (e, ))
                break
            except musicbrainzngs.NetworkError, e:
                logger.warning("network error: %r" % (e, ))
                break
Beispiel #4
0
    def getMusicBrainz(self,
                       ittoc,
                       mbdiscid,
                       release=None,
                       country=None,
                       prompt=False):
        """
        @type  ittoc: L{whipper.image.table.Table}
        """
        # look up disc on musicbrainz
        self._stdout.write(
            'Disc duration: %s, %d audio tracks\n' % (common.formatTime(
                ittoc.duration() / 1000.0), ittoc.getAudioTracks()))
        logger.debug('MusicBrainz submit url: %r',
                     ittoc.getMusicBrainzSubmitURL())
        ret = None

        metadatas = None
        e = None

        for _ in range(0, 4):
            try:
                metadatas = mbngs.musicbrainz(mbdiscid,
                                              country=country,
                                              record=self._record)
                break
            except mbngs.NotFoundException, e:
                break
            except musicbrainzngs.NetworkError, e:
                self._stdout.write("Warning: network error: %r\n" % (e, ))
                break
Beispiel #5
0
    def do(self):
        try:
            discId = unicode(self.options.mbdiscid)
        except IndexError:
            sys.stdout.write('Please specify a MusicBrainz disc id.\n')
            return 3

        from whipper.common import mbngs
        metadatas = mbngs.musicbrainz(discId, record=self.options.record)

        sys.stdout.write('%d releases\n' % len(metadatas))
        for i, md in enumerate(metadatas):
            sys.stdout.write('- Release %d:\n' % (i + 1, ))
            sys.stdout.write('    Artist: %s\n' % md.artist.encode('utf-8'))
            sys.stdout.write('    Title:  %s\n' % md.title.encode('utf-8'))
            sys.stdout.write('    Type:   %s\n' % md.releaseType.encode('utf-8'))
            sys.stdout.write('    URL: %s\n' % md.url)
            sys.stdout.write('    Tracks: %d\n' % len(md.tracks))
            if md.catalogNumber:
                sys.stdout.write('    Cat no: %s\n' % md.catalogNumber)
            if md.barcode:
                sys.stdout.write('   Barcode: %s\n' % md.barcode)

            for j, track in enumerate(md.tracks):
                sys.stdout.write('      Track %2d: %s - %s\n' % (
                    j + 1, track.artist.encode('utf-8'),
                    track.title.encode('utf-8')))
Beispiel #6
0
    def do(self):
        try:
            mbid = str(self.options.mbid.strip())
        except IndexError:
            print('Please specify a MusicBrainz Disc ID or Release ID.')
            return 3

        releaseIdMatch = re.match(
            r'^[\dA-Fa-f]{8}-(?:[\dA-Fa-f]{4}-){3}[\dA-Fa-f]{12}$', mbid)
        discIdMatch = re.match(r'^[\dA-Za-z._]{27}-$', mbid)

        # see https://musicbrainz.org/doc/MusicBrainz_Identifier
        if releaseIdMatch:
            md = getReleaseMetadata(releaseIdMatch.group(0))
            if md:
                self._printMetadata(md)
        elif discIdMatch:
            metadatas = musicbrainz(discIdMatch.group(0))

            print('%d releases' % len(metadatas))
            for i, md in enumerate(metadatas):
                print('- Release %d:' % (i + 1, ))
                self._printMetadata(md)
        return None
Beispiel #7
0
    def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None,
                       prompt=False):
        """Look up disc on MusicBrainz and get the relevant metadata.

        :param ittoc:
        :type ittoc: L{whipper.image.table.Table}
        :param mbdiscid:
        :type mbdiscid:
        :param release:  (Default value = None)
        :type release:
        :param country:  (Default value = None)
        :type country:
        :param prompt:  (Default value = False)
        :type prompt:
        """
        # look up disc on MusicBrainz
        self._stdout.write('Disc duration: %s, %d audio tracks\n' % (
            common.formatTime(ittoc.duration() / 1000.0),
            ittoc.getAudioTracks()))
        logger.debug('MusicBrainz submit url: %r',
                     ittoc.getMusicBrainzSubmitURL())
        ret = None

        metadatas = None
        e = None

        for _ in range(0, 4):
            try:
                metadatas = mbngs.musicbrainz(mbdiscid,
                                              country=country,
                                              record=self._record)
                break
            except mbngs.NotFoundException as e:
                logger.warning("release not found: %r" % (e, ))
                break
            except musicbrainzngs.NetworkError as e:
                logger.warning("network error: %r" % (e, ))
                break
            except mbngs.MusicBrainzException as e:
                logger.warning("musicbrainz exception: %r" % (e, ))
                time.sleep(5)
                continue

        if not metadatas:
            self._stdout.write('Continuing without metadata\n')

        if metadatas:
            deltas = {}

            self._stdout.write('\nMatching releases:\n')

            for metadata in metadatas:
                self._stdout.write('\n')
                self._stdout.write('Artist  : %s\n' %
                                   metadata.artist.encode('utf-8'))
                self._stdout.write('Title   : %s\n' %
                                   metadata.title.encode('utf-8'))
                self._stdout.write('Duration: %s\n' %
                                   common.formatTime(metadata.duration /
                                                     1000.0))
                self._stdout.write('URL     : %s\n' % metadata.url)
                self._stdout.write('Release : %s\n' % metadata.mbid)
                self._stdout.write('Type    : %s\n' % metadata.releaseType)
                if metadata.barcode:
                    self._stdout.write("Barcode : %s\n" % metadata.barcode)
                if metadata.catalogNumber:
                    self._stdout.write("Cat no  : %s\n" %
                                       metadata.catalogNumber)

                delta = abs(metadata.duration - ittoc.duration())
                if delta not in deltas:
                    deltas[delta] = []
                deltas[delta].append(metadata)

            lowest = None

            if not release and len(metadatas) > 1:
                # Select the release that most closely matches the duration.
                lowest = min(deltas.keys())

                if prompt:
                    guess = (deltas[lowest])[0].mbid
                    release = raw_input(
                        "\nPlease select a release [%s]: " % guess)

                    if not release:
                        release = guess

            if release:
                metadatas = [m for m in metadatas if m.url.endswith(release)]
                logger.debug('Asked for release %r, only kept %r',
                             release, metadatas)
                if len(metadatas) == 1:
                    self._stdout.write('\n')
                    self._stdout.write('Picked requested release id %s\n' %
                                       release)
                    self._stdout.write('Artist : %s\n' %
                                       metadatas[0].artist.encode('utf-8'))
                    self._stdout.write('Title :  %s\n' %
                                       metadatas[0].title.encode('utf-8'))
                elif not metadatas:
                    self._stdout.write(
                        "Requested release id '%s', "
                        "but none of the found releases match\n" % release)
                    return
            else:
                if lowest:
                    metadatas = deltas[lowest]

            # If we have multiple, make sure they match
            if len(metadatas) > 1:
                artist = metadatas[0].artist
                releaseTitle = metadatas[0].releaseTitle
                for i, metadata in enumerate(metadatas):
                    if not artist == metadata.artist:
                        logger.warning("artist 0: %r and artist %d: %r "
                                       "are not the same" % (
                                           artist, i, metadata.artist))
                    if not releaseTitle == metadata.releaseTitle:
                        logger.warning("title 0: %r and title %d: %r "
                                       "are not the same" % (
                                           releaseTitle, i,
                                           metadata.releaseTitle))

                if (not release and len(deltas.keys()) > 1):
                    self._stdout.write('\n')
                    self._stdout.write('Picked closest match in duration.\n')
                    self._stdout.write('Others may be wrong in MusicBrainz, '
                                       'please correct.\n')
                    self._stdout.write('Artist : %s\n' %
                                       artist.encode('utf-8'))
                    self._stdout.write('Title :  %s\n' %
                                       metadatas[0].title.encode('utf-8'))

            # Select one of the returned releases. We just pick the first one.
            ret = metadatas[0]
        else:
            self._stdout.write(
                'Submit this disc to MusicBrainz at the above URL.\n')
            ret = None

        self._stdout.write('\n')
        return ret
Beispiel #8
0
    def getMusicBrainz(self,
                       ittoc,
                       mbdiscid,
                       release=None,
                       country=None,
                       prompt=False):
        """
        :type  ittoc: whipper.image.table.Table
        """
        # look up disc on MusicBrainz
        print('Disc duration: %s, %d audio tracks' % (common.formatTime(
            ittoc.duration() / 1000.0), ittoc.getAudioTracks()))
        logger.debug('MusicBrainz submit url: %r',
                     ittoc.getMusicBrainzSubmitURL())

        metadatas = None

        for _ in range(0, 4):
            try:
                metadatas = mbngs.musicbrainz(mbdiscid,
                                              country=country,
                                              record=self._record)
                break
            except mbngs.NotFoundException as e:
                logger.warning("release not found: %r", (e, ))
                break
            except musicbrainzngs.NetworkError as e:
                logger.warning("network error: %r", (e, ))
                break
            except mbngs.MusicBrainzException as e:
                logger.warning("musicbrainz exception: %r", (e, ))
                time.sleep(5)
                continue

        if not metadatas:
            logger.warning('continuing without metadata')

        if metadatas:
            deltas = {}

            print('\nMatching releases:')

            for metadata in metadatas:
                print('\nArtist  : %s' % metadata.artist)
                print('Title   : %s' % metadata.title)
                print('Duration: %s' %
                      common.formatTime(metadata.duration / 1000.0))
                print('URL     : %s' % metadata.url)
                print('Release : %s' % metadata.mbid)
                print('Type    : %s' % metadata.releaseType)
                if metadata.barcode:
                    print("Barcode : %s" % metadata.barcode)
                # TODO: Add test for non ASCII catalog numbers: see issue #215
                if metadata.catalogNumber:
                    print("Cat no  : %s" % metadata.catalogNumber)

                delta = abs(metadata.duration - ittoc.duration())
                if delta not in deltas:
                    deltas[delta] = []
                deltas[delta].append(metadata)

            lowest = None

            if not release and len(metadatas) > 1:
                # Select the release that most closely matches the duration.
                lowest = min(list(deltas))

                if prompt:
                    guess = (deltas[lowest])[0].mbid
                    release = input("\nPlease select a release [%s]: " % guess)

                    if not release:
                        release = guess

            if release:
                metadatas = [m for m in metadatas if m.url.endswith(release)]
                logger.debug('asked for release %r, only kept %r', release,
                             metadatas)
                if len(metadatas) == 1:
                    logger.info('picked requested release id %s', release)
                    print('Artist: %s' % metadatas[0].artist)
                    print('Title : %s' % metadatas[0].title)
                elif not metadatas:
                    logger.warning(
                        "requested release id '%s', but none of "
                        "the found releases match", release)
                    return None
            else:
                if lowest:
                    metadatas = deltas[lowest]

            # If we have multiple, make sure they match
            if len(metadatas) > 1:
                artist = metadatas[0].artist
                releaseTitle = metadatas[0].releaseTitle
                for i, metadata in enumerate(metadatas):
                    if not artist == metadata.artist:
                        logger.warning(
                            "artist 0: %r and artist %d: %r are "
                            "not the same", artist, i, metadata.artist)
                    if not releaseTitle == metadata.releaseTitle:
                        logger.warning(
                            "title 0: %r and title %d: %r are "
                            "not the same", releaseTitle, i,
                            metadata.releaseTitle)

                if not release and len(list(deltas)) > 1:
                    logger.warning('picked closest match in duration. '
                                   'Others may be wrong in MusicBrainz, '
                                   'please correct')
                    print('Artist : %s' % artist)
                    print('Title :  %s' % metadatas[0].title)

            # Select one of the returned releases. We just pick the first one.
            ret = metadatas[0]
        else:
            print('Submit this disc to MusicBrainz at the above URL.')
            ret = None

        print('')
        return ret
Beispiel #9
0
    def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None,
                       prompt=False):
        """
        @type  ittoc: L{whipper.image.table.Table}
        """
        # look up disc on MusicBrainz
        self._stdout.write('Disc duration: %s, %d audio tracks\n' % (
            common.formatTime(ittoc.duration() / 1000.0),
            ittoc.getAudioTracks()))
        logger.debug('MusicBrainz submit url: %r',
                     ittoc.getMusicBrainzSubmitURL())
        ret = None

        metadatas = None
        e = None

        for _ in range(0, 4):
            try:
                metadatas = mbngs.musicbrainz(mbdiscid,
                                              country=country,
                                              record=self._record)
                break
            except mbngs.NotFoundException as e:
                logger.warning("release not found: %r" % (e, ))
                break
            except musicbrainzngs.NetworkError as e:
                logger.warning("network error: %r" % (e, ))
                break
            except mbngs.MusicBrainzException as e:
                logger.warning("musicbrainz exception: %r" % (e, ))
                time.sleep(5)
                continue

        if not metadatas:
            self._stdout.write('Continuing without metadata\n')

        if metadatas:
            deltas = {}

            self._stdout.write('\nMatching releases:\n')

            for metadata in metadatas:
                self._stdout.write('\n')
                self._stdout.write('Artist  : %s\n' %
                                   metadata.artist.encode('utf-8'))
                self._stdout.write('Title   : %s\n' %
                                   metadata.title.encode('utf-8'))
                self._stdout.write('Duration: %s\n' %
                                   common.formatTime(metadata.duration /
                                                     1000.0))
                self._stdout.write('URL     : %s\n' % metadata.url)
                self._stdout.write('Release : %s\n' % metadata.mbid)
                self._stdout.write('Type    : %s\n' % metadata.releaseType)
                if metadata.barcode:
                    self._stdout.write("Barcode : %s\n" % metadata.barcode)
                if metadata.catalogNumber:
                    self._stdout.write("Cat no  : %s\n" %
                                       metadata.catalogNumber)

                delta = abs(metadata.duration - ittoc.duration())
                if delta not in deltas:
                    deltas[delta] = []
                deltas[delta].append(metadata)

            lowest = None

            if not release and len(metadatas) > 1:
                # Select the release that most closely matches the duration.
                lowest = min(list(deltas))

                if prompt:
                    guess = (deltas[lowest])[0].mbid
                    release = raw_input(
                        "\nPlease select a release [%s]: " % guess)

                    if not release:
                        release = guess

            if release:
                metadatas = [m for m in metadatas if m.url.endswith(release)]
                logger.debug('Asked for release %r, only kept %r',
                             release, metadatas)
                if len(metadatas) == 1:
                    self._stdout.write('\n')
                    self._stdout.write('Picked requested release id %s\n' %
                                       release)
                    self._stdout.write('Artist : %s\n' %
                                       metadatas[0].artist.encode('utf-8'))
                    self._stdout.write('Title :  %s\n' %
                                       metadatas[0].title.encode('utf-8'))
                elif not metadatas:
                    self._stdout.write(
                        "Requested release id '%s', "
                        "but none of the found releases match\n" % release)
                    return
            else:
                if lowest:
                    metadatas = deltas[lowest]

            # If we have multiple, make sure they match
            if len(metadatas) > 1:
                artist = metadatas[0].artist
                releaseTitle = metadatas[0].releaseTitle
                for i, metadata in enumerate(metadatas):
                    if not artist == metadata.artist:
                        logger.warning("artist 0: %r and artist %d: %r "
                                       "are not the same" % (
                                           artist, i, metadata.artist))
                    if not releaseTitle == metadata.releaseTitle:
                        logger.warning("title 0: %r and title %d: %r "
                                       "are not the same" % (
                                           releaseTitle, i,
                                           metadata.releaseTitle))

                if (not release and len(list(deltas)) > 1):
                    self._stdout.write('\n')
                    self._stdout.write('Picked closest match in duration.\n')
                    self._stdout.write('Others may be wrong in MusicBrainz, '
                                       'please correct.\n')
                    self._stdout.write('Artist : %s\n' %
                                       artist.encode('utf-8'))
                    self._stdout.write('Title :  %s\n' %
                                       metadatas[0].title.encode('utf-8'))

            # Select one of the returned releases. We just pick the first one.
            ret = metadatas[0]
        else:
            self._stdout.write(
                'Submit this disc to MusicBrainz at the above URL.\n')
            ret = None

        self._stdout.write('\n')
        return ret