示例#1
0
def musicbrainz(discid, country=None, record=False):
    """
    Based on a MusicBrainz disc id, get a list of DiscMetadata objects
    for the given disc id.

    Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4-

    @type  discid: str

    @rtype: list of L{DiscMetadata}
    """
    log.debug('musicbrainzngs', 'looking up results for discid %r', discid)
    import musicbrainzngs

    ret = []

    try:
        result = musicbrainzngs.get_releases_by_discid(
            discid, includes=["artists", "recordings", "release-groups"])
    except musicbrainzngs.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)
            else:
                log.debug('musicbrainzngs',
                          'received bad response from the server')

        raise MusicBrainzException(e)
示例#2
0
def main(argv):
    # load plugins

    from morituri.configure import configure
    pluginsdir = configure.pluginsdir
    homepluginsdir = os.path.join(os.path.expanduser('~'), '.morituri',
                                  'plugins')

    distributions, errors = pkg_resources.working_set.find_plugins(
        pkg_resources.Environment([pluginsdir, homepluginsdir]))
    if errors:
        log.warning('errors finding plugins: %r', errors)
    log.debug('mapping distributions %r', distributions)
    map(pkg_resources.working_set.add, distributions)

    # validate dependencies
    from morituri.common import deps
    h = deps.DepsHandler()
    h.validate()

    # set user agent
    from morituri.extern.musicbrainzngs import musicbrainz
    musicbrainz.set_useragent("morituri", configure.version,
                              'https://thomas.apestaart.org/morituri/trac')

    c = Rip()
    try:
        ret = c.parse(argv)
    except SystemError, e:
        sys.stderr.write('rip: error: %s\n' % e.args)
        return 255
示例#3
0
def musicbrainz(discid, country=None, record=False):
    """
    Based on a MusicBrainz disc id, get a list of DiscMetadata objects
    for the given disc id.

    Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4-

    @type  discid: str

    @rtype: list of L{DiscMetadata}
    """
    log.debug("musicbrainzngs", "looking up results for discid %r", discid)
    import musicbrainzngs

    ret = []

    try:
        result = musicbrainzngs.get_releases_by_discid(discid, includes=["artists", "recordings", "release-groups"])
    except musicbrainzngs.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)
            else:
                log.debug("musicbrainzngs", "received bad response from the server")

        raise MusicBrainzException(e)
示例#4
0
def musicbrainz(discid):
    """
    Based on a MusicBrainz disc id, get a list of DiscMetadata objects
    for the given disc id.

    Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4-

    @type  discid: str

    @rtype: list of L{DiscMetadata}
    """
    log.debug('musicbrainz', 'looking up results for discid %r', discid)
    #import musicbrainz2.disc as mbdisc
    import musicbrainz2.webservice as mbws

    results = []

    # Setup a Query object.
    service = mbws.WebService()
    query = mbws.Query(service)


    # Query for all discs matching the given DiscID.
    # FIXME: let mbws.WebServiceError go through for now
    try:
        rfilter = mbws.ReleaseFilter(discId=discid)
        results = query.getReleases(rfilter)
    except mbws.WebServiceError, e:
        raise MusicBrainzException(e)
示例#5
0
def musicbrainz(discid):
    """
    Based on a MusicBrainz disc id, get a list of DiscMetadata objects
    for the given disc id.

    Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4-

    @type  discid: str

    @rtype: list of L{DiscMetadata}
    """
    log.debug('musicbrainz', 'looking up results for discid %r', discid)
    #import musicbrainz2.disc as mbdisc
    import musicbrainz2.webservice as mbws

    results = []

    # Setup a Query object.
    service = mbws.WebService()
    query = mbws.Query(service)


    # Query for all discs matching the given DiscID.
    # FIXME: let mbws.WebServiceError go through for now
    try:
        rfilter = mbws.ReleaseFilter(discId=discid)
        results = query.getReleases(rfilter)
    except mbws.WebServiceError, e:
        raise MusicBrainzException(e)
示例#6
0
def musicbrainz(discid, record=False):
    """
    Based on a MusicBrainz disc id, get a list of DiscMetadata objects
    for the given disc id.

    Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4-

    @type  discid: str

    @rtype: list of L{DiscMetadata}
    """
    log.debug('musicbrainz', 'looking up results for discid %r', discid)
    from morituri.extern.musicbrainzngs import musicbrainz

    ret = []

    try:
        result = musicbrainz.get_releases_by_discid(discid,
            includes=["artists", "recordings", "release-groups"])
    except musicbrainz.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)

        raise MusicBrainzException(e)
示例#7
0
文件: main.py 项目: chadberg/whipper
def main(argv):
    # load plugins

    from morituri.configure import configure
    pluginsdir = configure.pluginsdir
    homepluginsdir = os.path.join(os.path.expanduser('~'),
        '.morituri', 'plugins')

    distributions, errors = pkg_resources.working_set.find_plugins(
        pkg_resources.Environment([pluginsdir, homepluginsdir]))
    if errors:
        log.warning('errors finding plugins: %r', errors)
    log.debug('mapping distributions %r', distributions)
    map(pkg_resources.working_set.add, distributions)

    # validate dependencies
    from morituri.common import deps
    h = deps.DepsHandler()
    h.validate()

    # set user agent
    import musicbrainzngs
    musicbrainzngs.set_useragent("morituri", configure.version,
        'https://thomas.apestaart.org/morituri/trac')


    c = Rip()
    try:
        ret = c.parse(argv)
    except SystemError, e:
        sys.stderr.write('rip: error: %s\n' % e.args)
        return 255
示例#8
0
    def addOptions(self):
        # FIXME: is this the right place ?
        log.init()
        log.debug("morituri", "This is morituri version %s (%s)",
            configure.version, configure.revision)

        self.parser.add_option('-R', '--record',
                          action="store_true", dest="record",
                          help="record API requests for playback")
        self.parser.add_option('-v', '--version',
                          action="store_true", dest="version",
                          help="show version information")
示例#9
0
    def verifyTrack(self, runner, trackResult):
        # here to avoid import gst eating our options
        from morituri.common import checksum

        t = checksum.CRC32Task(trackResult.filename)

        runner.run(t)

        ret = trackResult.testcrc == t.checksum
        log.debug('program',
            'verifyTrack: track result crc %r, file crc %r, result %r',
            trackResult.testcrc, t.checksum, ret)
        return ret
示例#10
0
    def addOptions(self):
        # FIXME: is this the right place ?
        log.init()
        from morituri.configure import configure
        log.debug("morituri", "This is morituri version %s (%s)",
            configure.version, configure.revision)

        self.parser.add_option('-R', '--record',
                          action="store_true", dest="record",
                          help="record API requests for playback")
        self.parser.add_option('-v', '--version',
                          action="store_true", dest="version",
                          help="show version information")
示例#11
0
    def verifyTrack(self, runner, trackResult):
        # here to avoid import gst eating our options
        from morituri.common import checksum

        t = checksum.CRC32Task(trackResult.filename)

        runner.run(t)

        ret = trackResult.testcrc == t.checksum
        log.debug('program',
            'verifyTrack: track result crc %r, file crc %r, result %r',
            trackResult.testcrc, t.checksum, ret)
        return ret
示例#12
0
def removeAudioParsers():
    log.debug('gstreamer', 'Removing buggy audioparsers plugin if needed')

    import gst
    registry = gst.registry_get_default()

    plugin = registry.find_plugin("audioparsersbad")
    if plugin:
        # always remove from bad
        log.debug('gstreamer', 'removing audioparsersbad plugin from registry')
        registry.remove_plugin(plugin)

    plugin = registry.find_plugin("audioparsers")
    if plugin:
        log.debug('gstreamer', 'Found audioparsers plugin from %s %s',
            plugin.get_source(), plugin.get_version())

        # was fixed after 0.10.30 and before 0.10.31
        if plugin.get_source() == 'gst-plugins-good' \
            and plugin.get_version() > '0.10.30.1':
            return

        registry.remove_plugin(plugin)
示例#13
0
def removeAudioParsers():
    log.debug('gstreamer', 'Removing buggy audioparsers plugin if needed')

    import gst
    registry = gst.registry_get_default()

    plugin = registry.find_plugin("audioparsersbad")
    if plugin:
        # always remove from bad
        log.debug('gstreamer', 'removing audioparsersbad plugin from registry')
        registry.remove_plugin(plugin)

    plugin = registry.find_plugin("audioparsers")
    if plugin:
        log.debug('gstreamer', 'Found audioparsers plugin from %s %s',
                  plugin.get_source(), plugin.get_version())

        # was fixed after 0.10.30 and before 0.10.31
        if plugin.get_source() == 'gst-plugins-good' \
            and plugin.get_version() > '0.10.30.1':
            return

        registry.remove_plugin(plugin)
示例#14
0
def removeAudioParsers():
    log.debug("gstreamer", "Removing buggy audioparsers plugin if needed")

    import gst

    registry = gst.registry_get_default()

    plugin = registry.find_plugin("audioparsersbad")
    if plugin:
        # always remove from bad
        log.debug("gstreamer", "removing audioparsersbad plugin from registry")
        registry.remove_plugin(plugin)

    plugin = registry.find_plugin("audioparsers")
    if plugin:
        log.debug("gstreamer", "removing audioparsers plugin from %s %s", plugin.get_source(), plugin.get_version())

        # the query bug was fixed after 0.10.30 and before 0.10.31
        # the seek bug is still there though
        # if plugin.get_source() == 'gst-plugins-good' \
        #   and plugin.get_version() > '0.10.30.1':
        #    return

        registry.remove_plugin(plugin)
示例#15
0
def _getMetadata(release, discid):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r', release['id'])
    if not release['id']:
        log.warning('program', 'No id for release %r', release)
        return None

    assert release['id'], 'Release does not have an id'

    metadata = DiscMetadata()

    credit = release['artist-credit']

    artist = credit[0]['artist']

    if len(credit) > 1:
        log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit)

    for i, c in enumerate(credit):
        if isinstance(c, dict):
            credit[i] = c.get('name', c['artist'].get('name', None))

    albumArtistName = "".join(credit)

    # FIXME: is there a better way to check for VA
    metadata.various = False
    if artist['id'] == VA_ID:
        metadata.various = True

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    metadata.artist = albumArtistName
    metadata.sortName = artist['sort-name']
    # FIXME: is format str ?
    if not 'date' in release:
        log.warning('musicbrainzngs', 'Release %r does not have date', release)
    else:
        metadata.release = release['date']

    metadata.mbid = release['id']
    metadata.mbidArtist = artist['id']
    metadata.url = 'http://musicbrainz.org/release/' + release['id']

    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release['medium-list']:
        for disc in medium['disc-list']:
            if disc['id'] == discid:
                title = release['title']
                metadata.releaseTitle = title
                if 'disambiguation' in release:
                    title += " (%s)" % release['disambiguation']
                count = len(release['medium-list'])
                if count > 1:
                    title += ' (Disc %d of %d)' % (int(
                        medium['position']), count)
                if 'title' in medium:
                    title += ": %s" % medium['title']
                metadata.title = title
                for t in medium['track-list']:
                    track = TrackMetadata()
                    credit = t['recording']['artist-credit']
                    if len(credit) > 1:
                        log.debug('musicbrainzngs',
                                  'artist-credit more than 1: %r', credit)
                        # credit is of the form [dict, str, dict, ... ]
                    for i, c in enumerate(credit):
                        if isinstance(c, dict):
                            credit[i] = c.get('name',
                                              c['artist'].get('name', None))

                    trackArtistName = "".join(credit)

                    if not artist:
                        track.artist = metadata.artist
                        track.sortName = metadata.sortName
                        track.mbidArtist = metadata.mbidArtist
                    else:
                        # various artists discs can have tracks with no artist
                        track.artist = trackArtistName
                        track.sortName = artist['sort-name']
                        track.mbidArtist = artist['id']

                    track.title = t['recording']['title']
                    track.mbid = t['recording']['id']

                    # FIXME: unit of duration ?
                    track.duration = int(t['recording'].get('length', 0))
                    if not track.duration:
                        log.warning(
                            'getMetadata',
                            'track %r (%r) does not have duration' %
                            (track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    metadata.tracks.append(track)

                if not tainted:
                    metadata.duration = duration
                else:
                    metadata.duration = 0

    return metadata
示例#16
0
def _getMetadata(release, discid):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r',
        release['id'])
    if not release['id']:
        log.warning('program', 'No id for release %r', release)
        return None

    assert release['id'], 'Release does not have an id'

    metadata = DiscMetadata()

    credit = release['artist-credit']

    artist = credit[0]['artist']

    if len(credit) > 1:
        log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit)

    for i, c in enumerate(credit):
        if isinstance(c, dict):
            credit[i] = c.get(
                'name', c['artist'].get('name', None))

    albumArtistName = "".join(credit)

    # FIXME: is there a better way to check for VA
    metadata.various = False
    if artist['id'] == VA_ID:
        metadata.various = True

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    metadata.artist = albumArtistName
    metadata.sortName = artist['sort-name']
    # FIXME: is format str ?
    if not 'date' in release:
        log.warning('musicbrainzngs', 'Release %r does not have date', release)
    else:
        metadata.release = release['date']

    metadata.mbid = release['id']
    metadata.mbidArtist = artist['id']
    metadata.url = 'http://musicbrainz.org/release/' + release['id']

    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release['medium-list']:
        for disc in medium['disc-list']:
            if disc['id'] == discid:
                title = release['title']
                metadata.releaseTitle = title
                if 'disambiguation' in release:
                    title += " (%s)" % release['disambiguation']
                count = len(release['medium-list'])
                if count > 1:
                    title += ' (Disc %d of %d)' % (
                        int(medium['position']), count)
                if 'title' in medium:
                    title += ": %s" % medium['title']
                metadata.title = title
                for t in medium['track-list']:
                    track = TrackMetadata()
                    credit = t['recording']['artist-credit']
                    if len(credit) > 1:
                        log.debug('musicbrainzngs',
                            'artist-credit more than 1: %r', credit)
                        # credit is of the form [dict, str, dict, ... ]
                    for i, c in enumerate(credit):
                        if isinstance(c, dict):
                            credit[i] = c.get(
                                'name', c['artist'].get('name', None))


                    trackArtistName = "".join(credit)

                    if not artist:
                        track.artist = metadata.artist
                        track.sortName = metadata.sortName
                        track.mbidArtist = metadata.mbidArtist
                    else:
                        # various artists discs can have tracks with no artist
                        track.artist = trackArtistName
                        track.sortName = artist['sort-name']
                        track.mbidArtist = artist['id']

                    track.title = t['recording']['title']
                    track.mbid = t['recording']['id']

                    # FIXME: unit of duration ?
                    track.duration = int(t['recording'].get('length', 0))
                    if not track.duration:
                        log.warning('getMetadata',
                            'track %r (%r) does not have duration' % (
                                track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    metadata.tracks.append(track)

                if not tainted:
                    metadata.duration = duration
                else:
                    metadata.duration = 0

    return metadata
示例#17
0
        # FIXME: no way to compare against 'master' version after 0.10.15
        if gst.pygst_version >= (0, 10, 15):
            ret[gst.TAG_TRACK_NUMBER] = number
        if self.metadata:
            # works, but not sure we want this
            # if gst.pygst_version >= (0, 10, 15):
            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
            # hack to get a GstDate which we cannot instantiate directly in
            # 0.10.15.1
            # FIXME: The dates are strings and must have the format 'YYYY',
            # 'YYYY-MM' or 'YYYY-MM-DD'.
            # GstDate expects a full date, so default to
            # Jan and 1st if MM and DD are missing
            date = self.metadata.release
            if date:
                log.debug('metadata',
                    'Converting release date %r to structure', date)
                if len(date) == 4:
                    date += '-01'
                if len(date) == 7:
                    date += '-01'

                s = gst.structure_from_string('hi,date=(GstDate)%s' %
                    str(date))
                ret[gst.TAG_DATE] = s['date']

            # no musicbrainz info for htoa tracks
            if number > 0:
                ret["musicbrainz-trackid"] = mbidTrack
                ret["musicbrainz-artistid"] = mbidTrackArtist
                ret["musicbrainz-albumid"] = mbidAlbum
                ret["musicbrainz-albumartistid"] = mbidTrackAlbum
示例#18
0
    try:
        result = musicbrainz.get_releases_by_discid(discid,
            includes=["artists", "recordings", "release-groups"])
    except musicbrainz.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)

        raise MusicBrainzException(e)

    # No disc matching this DiscID has been found.
    if len(result) == 0:
        return None

    log.debug('musicbrainzngs', 'found %d releases for discid %r',
        len(result['disc']['release-list']),
        discid)
    _record(record, 'releases', discid, result)

    # Display the returned results to the user.

    for release in result['disc']['release-list']:
        log.debug('program', 'result %r: artist %r, title %r' % (
            release, release['artist-credit-phrase'], release['title']))

        # to get titles of recordings, we need to query the release with
        # artist-credits

        res = musicbrainz.get_release_by_id(release['id'],
            includes=["artists", "artist-credits", "recordings", "discids"])
        _record(record, 'release', release['id'], res)
示例#19
0
        # FIXME: no way to compare against 'master' version after 0.10.15
        if gst.pygst_version >= (0, 10, 15):
            ret[gst.TAG_TRACK_NUMBER] = number
        if self.metadata:
            # works, but not sure we want this
            # if gst.pygst_version >= (0, 10, 15):
            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
            # hack to get a GstDate which we cannot instantiate directly in
            # 0.10.15.1
            # FIXME: The dates are strings and must have the format 'YYYY',
            # 'YYYY-MM' or 'YYYY-MM-DD'.
            # GstDate expects a full date, so default to
            # Jan and 1st if MM and DD are missing
            date = self.metadata.release
            if date:
                log.debug('metadata',
                          'Converting release date %r to structure', date)
                if len(date) == 4:
                    date += '-01'
                if len(date) == 7:
                    date += '-01'

                s = gst.structure_from_string('hi,date=(GstDate)%s' %
                                              str(date))
                ret[gst.TAG_DATE] = s['date']

            # no musicbrainz info for htoa tracks
            if number > 0:
                ret["musicbrainz-trackid"] = mbidTrack
                ret["musicbrainz-artistid"] = mbidTrackArtist
                ret["musicbrainz-albumid"] = mbidAlbum
                ret["musicbrainz-albumartistid"] = mbidTrackAlbum
示例#20
0
    query = mbws.Query(service)


    # Query for all discs matching the given DiscID.
    # FIXME: let mbws.WebServiceError go through for now
    try:
        rfilter = mbws.ReleaseFilter(discId=discid)
        results = query.getReleases(rfilter)
    except mbws.WebServiceError, e:
        raise MusicBrainzException(e)

    # No disc matching this DiscID has been found.
    if len(results) == 0:
        return None

    log.debug('musicbrainz', 'found %d results for discid %r', len(results),
        discid)

    # Display the returned results to the user.
    ret = []

    for result in results:
        release = result.release
        log.debug('program', 'result %r: artist %r, title %r' % (
            release, release.artist.getName(), release.title))
        # The returned release object only contains title and artist, but no
        # tracks.  Query the web service once again to get all data we need.
        try:
            inc = mbws.ReleaseIncludes(artist=True, tracks=True,
                releaseEvents=True, discs=True)
            # Arid - Under the Cold Street Lights has getId() None
            if release.getId():
示例#21
0
 def parse(self, argv):
     log.debug("morituri", "rip %s" % " ".join(argv))
     logcommand.LogCommand.parse(self, argv)
示例#22
0
def _getMetadata(release):
    """
    @type  release: L{musicbrainz2.model.Release}

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r',
        release.getId())
    if not release.getId():
        log.warning('program', 'No id for release %r', release)
        return None

    assert release.id, 'Release does not have an id'

    metadata = DiscMetadata()

    isSingleArtist = release.isSingleArtistRelease()
    metadata.various = not isSingleArtist
    metadata.title = release.title
    # getUniqueName gets disambiguating names like Muse (UK rock band)
    metadata.artist = release.artist.name
    metadata.sortName = release.artist.sortName
    metadata.release = release.getEarliestReleaseDate()

    metadata.mbid = urlparse.urlparse(release.id)[2].split("/")[-1]
    metadata.mbidArtist = urlparse.urlparse(release.artist.id)[2].split("/")[-1]
    metadata.url = release.getId()

    tainted = False
    duration = 0

    for t in release.tracks:
        track = TrackMetadata()

        if isSingleArtist or t.artist == None:
            track.artist = metadata.artist
            track.sortName = metadata.sortName
            track.mbidArtist = metadata.mbidArtist
        else:
            # various artists discs can have tracks with no artist
            track.artist = t.artist and t.artist.name or release.artist.name
            track.sortName = t.artist.sortName
            track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1]

        track.title = t.title
        track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1]

        track.duration = t.duration
        if not track.duration:
            log.warning('getMetadata',
                'track %r (%r) does not have duration' % (
                    track.title, track.mbid))
            tainted = True
        else:
            duration += t.duration

        metadata.tracks.append(track)

    if not tainted:
        metadata.duration = duration
    else:
        metadata.duration = 0

    return metadata
示例#23
0
    except task.TaskException, e:
        if isinstance(e.exception, common.MissingDependencyException):
            sys.stderr.write('rip: error: missing dependency "%s"\n' %
                e.exception.dependency)
            return 255
        # FIXME: move this exception
        from morituri.program import cdrdao
        if isinstance(e.exception, cdrdao.DeviceOpenException):
            sys.stderr.write("""rip: error: cannot read CD from drive.
cdrdao says:
%s
""" % e.exception.msg)
            return 255

        if isinstance(e.exception, common.EmptyError):
            log.debug('main',
                "EmptyError: %r", log.getExceptionMessage(e.exception))
            sys.stderr.write(
                'rip: error: Could not create encoded file.\n')
            return 255

        raise
    except command.CommandError, e:
        sys.stderr.write('rip: error: %s\n' % e.output)
        return e.status

    if ret is None:
        return 0

    return ret

示例#24
0
        # FIXME: no way to compare against 'master' version after 0.10.15
        if gst.pygst_version >= (0, 10, 15):
            ret[gst.TAG_TRACK_NUMBER] = number
        if self.metadata:
            # works, but not sure we want this
            # if gst.pygst_version >= (0, 10, 15):
            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
            # hack to get a GstDate which we cannot instantiate directly in
            # 0.10.15.1
            # FIXME: The dates are strings and must have the format 'YYYY',
            # 'YYYY-MM' or 'YYYY-MM-DD'.
            # GstDate expects a full date, so default to Jan and 1st if MM and DD
            # are missing
            date = self.metadata.release
            if date:
                log.debug('metadata',
                    'Converting release date %r to structure', date)
                if len(date) == 4:
                    date += '-01'
                if len(date) == 7:
                    date += '-01'

                s = gst.structure_from_string('hi,date=(GstDate)%s' %
                    str(date))
                ret[gst.TAG_DATE] = s['date']

            # no musicbrainz info for htoa tracks
            if number > 0:
                ret["musicbrainz-trackid"] = mbidTrack
                ret["musicbrainz-artistid"] = mbidTrackArtist
                ret["musicbrainz-albumid"] = mbidAlbum
                ret["musicbrainz-albumartistid"] = mbidTrackAlbum
示例#25
0
    try:
        result = musicbrainz.get_releases_by_discid(
            discid, includes=["artists", "recordings", "release-groups"])
    except musicbrainz.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)

        raise MusicBrainzException(e)

    # No disc matching this DiscID has been found.
    if len(result) == 0:
        return None

    log.debug('musicbrainzngs', 'found %d releases for discid %r',
              len(result['disc']['release-list']), discid)
    _record(record, 'releases', discid, result)

    # Display the returned results to the user.

    for release in result['disc']['release-list']:
        log.debug(
            'program', 'result %r: artist %r, title %r' %
            (release, release['artist-credit-phrase'], release['title']))

        # to get titles of recordings, we need to query the release with
        # artist-credits

        res = musicbrainz.get_release_by_id(
            release['id'],
            includes=["artists", "artist-credits", "recordings", "discids"])
示例#26
0
        ret = c.parse(sys.argv[1:])
    except SystemError, e:
        sys.stderr.write('rip: error: %s\n' % e.args)
        return 255
    except ImportError, e:
        raise ImportError(e)
    except task.TaskException, e:
        if isinstance(e.exception, ImportError):
            raise ImportError(e.exception)
        elif isinstance(e.exception, common.MissingDependencyException):
            sys.stderr.write('rip: error: missing dependency "%s"\n' %
                             e.exception.dependency)
            return 255

        if isinstance(e.exception, common.EmptyError):
            log.debug('main', "EmptyError: %r",
                      log.getExceptionMessage(e.exception))
            sys.stderr.write('rip: error: Could not create encoded file.\n')
            return 255

        raise
    except command.CommandError, e:
        sys.stderr.write('rip: error: %s\n' % e.output)
        return e.status

    if ret is None:
        return 0

    return ret


class Rip(logcommand.LogCommand):
示例#27
0
    ret = []

    try:
        result = musicbrainzngs.get_releases_by_discid(discid, includes=["artists", "recordings", "release-groups"])
    except musicbrainzngs.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)
            else:
                log.debug("musicbrainzngs", "received bad response from the server")

        raise MusicBrainzException(e)

    # The result can either be a "disc" or a "cdstub"
    if result.get("disc"):
        log.debug("musicbrainzngs", "found %d releases for discid %r", len(result["disc"]["release-list"]), discid)
        _record(record, "releases", discid, result)

        # Display the returned results to the user.

        import json

        for release in result["disc"]["release-list"]:
            formatted = json.dumps(release, sort_keys=False, indent=4)
            log.debug(
                "program",
                "result %s: artist %r, title %r" % (formatted, release["artist-credit-phrase"], release["title"]),
            )

            # to get titles of recordings, we need to query the release with
            # artist-credits
示例#28
0
def _getMetadata(releaseShort, release, discid, country=None):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug("program", "getMetadata for release id %r", release["id"])
    if not release["id"]:
        log.warning("program", "No id for release %r", release)
        return None

    assert release["id"], "Release does not have an id"

    if "country" in release and country and release["country"] != country:
        log.warning("program", "%r was not released in %r", release, country)
        return None

    discMD = DiscMetadata()

    discMD.releaseType = releaseShort.get("release-group", {}).get("type")
    discCredit = _Credit(release["artist-credit"])

    # FIXME: is there a better way to check for VA ?
    discMD.various = False
    if discCredit[0]["artist"]["id"] == VA_ID:
        discMD.various = True

    if len(discCredit) > 1:
        log.debug("mbngs", "artist-credit more than 1: %r", discCredit)

    albumArtistName = discCredit.getName()

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    discMD.artist = albumArtistName
    discMD.sortName = discCredit.getSortName()
    # FIXME: is format str ?
    if not "date" in release:
        log.warning("mbngs", "Release %r does not have date", release)
    else:
        discMD.release = release["date"]

    discMD.mbid = release["id"]
    discMD.mbidArtist = discCredit.getIds()
    discMD.url = "https://musicbrainz.org/release/" + release["id"]

    discMD.barcode = release.get("barcode", None)
    lil = release.get("label-info-list", [{}])
    if lil:
        discMD.catalogNumber = lil[0].get("catalog-number")
    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release["medium-list"]:
        for disc in medium["disc-list"]:
            if disc["id"] == discid:
                title = release["title"]
                discMD.releaseTitle = title
                if "disambiguation" in release:
                    title += " (%s)" % release["disambiguation"]
                count = len(release["medium-list"])
                if count > 1:
                    title += " (Disc %d of %d)" % (int(medium["position"]), count)
                if "title" in medium:
                    title += ": %s" % medium["title"]
                discMD.title = title
                for t in medium["track-list"]:
                    track = TrackMetadata()
                    trackCredit = _Credit(t["recording"]["artist-credit"])
                    if len(trackCredit) > 1:
                        log.debug("mbngs", "artist-credit more than 1: %r", trackCredit)

                    # FIXME: leftover comment, need an example
                    # various artists discs can have tracks with no artist
                    track.artist = trackCredit.getName()
                    track.sortName = trackCredit.getSortName()
                    track.mbidArtist = trackCredit.getIds()

                    track.title = t["recording"]["title"]
                    track.mbid = t["recording"]["id"]

                    # FIXME: unit of duration ?
                    track.duration = int(t["recording"].get("length", 0))
                    if not track.duration:
                        log.warning("getMetadata", "track %r (%r) does not have duration" % (track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    discMD.tracks.append(track)

                if not tainted:
                    discMD.duration = duration
                else:
                    discMD.duration = 0

    return discMD
示例#29
0
    try:
        result = musicbrainzngs.get_releases_by_discid(
            discid, includes=["artists", "recordings", "release-groups"])
    except musicbrainzngs.ResponseError, e:
        if isinstance(e.cause, urllib2.HTTPError):
            if e.cause.code == 404:
                raise NotFoundException(e)
            else:
                log.debug('musicbrainzngs',
                          'received bad response from the server')

        raise MusicBrainzException(e)

    # The result can either be a "disc" or a "cdstub"
    if result.get('disc'):
        log.debug('musicbrainzngs', 'found %d releases for discid %r',
                  len(result['disc']['release-list']), discid)
        _record(record, 'releases', discid, result)

        # Display the returned results to the user.

        import json
        for release in result['disc']['release-list']:
            formatted = json.dumps(release, sort_keys=False, indent=4)
            log.debug(
                'program', 'result %s: artist %r, title %r' %
                (formatted, release['artist-credit-phrase'], release['title']))

            # to get titles of recordings, we need to query the release with
            # artist-credits

            res = musicbrainzngs.get_release_by_id(release['id'],
示例#30
0
def _getMetadata(releaseShort, release, discid, country=None):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r', release['id'])
    if not release['id']:
        log.warning('program', 'No id for release %r', release)
        return None

    assert release['id'], 'Release does not have an id'

    if 'country' in release and country and release['country'] != country:
        log.warning('program', '%r was not released in %r', release, country)
        return None

    discMD = DiscMetadata()

    discMD.releaseType = releaseShort.get('release-group', {}).get('type')
    discCredit = _Credit(release['artist-credit'])

    # FIXME: is there a better way to check for VA ?
    discMD.various = False
    if discCredit[0]['artist']['id'] == VA_ID:
        discMD.various = True

    if len(discCredit) > 1:
        log.debug('mbngs', 'artist-credit more than 1: %r', discCredit)

    albumArtistName = discCredit.getName()

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    discMD.artist = albumArtistName
    discMD.sortName = discCredit.getSortName()
    # FIXME: is format str ?
    if not 'date' in release:
        log.warning('mbngs', 'Release %r does not have date', release)
    else:
        discMD.release = release['date']

    discMD.mbid = release['id']
    discMD.mbidArtist = discCredit.getIds()
    discMD.url = 'https://musicbrainz.org/release/' + release['id']

    discMD.barcode = release.get('barcode', None)
    lil = release.get('label-info-list', [{}])
    if lil:
        discMD.catalogNumber = lil[0].get('catalog-number')
    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release['medium-list']:
        for disc in medium['disc-list']:
            if disc['id'] == discid:
                title = release['title']
                discMD.releaseTitle = title
                if 'disambiguation' in release:
                    title += " (%s)" % release['disambiguation']
                count = len(release['medium-list'])
                if count > 1:
                    title += ' (Disc %d of %d)' % (int(
                        medium['position']), count)
                if 'title' in medium:
                    title += ": %s" % medium['title']
                discMD.title = title
                for t in medium['track-list']:
                    track = TrackMetadata()
                    trackCredit = _Credit(t['recording']['artist-credit'])
                    if len(trackCredit) > 1:
                        log.debug('mbngs', 'artist-credit more than 1: %r',
                                  trackCredit)

                    # FIXME: leftover comment, need an example
                    # various artists discs can have tracks with no artist
                    track.artist = trackCredit.getName()
                    track.sortName = trackCredit.getSortName()
                    track.mbidArtist = trackCredit.getIds()

                    track.title = t['recording']['title']
                    track.mbid = t['recording']['id']

                    # FIXME: unit of duration ?
                    track.duration = int(t['recording'].get('length', 0))
                    if not track.duration:
                        log.warning(
                            'getMetadata',
                            'track %r (%r) does not have duration' %
                            (track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    discMD.tracks.append(track)

                if not tainted:
                    discMD.duration = duration
                else:
                    discMD.duration = 0

    return discMD
示例#31
0
文件: mbngs.py 项目: chadberg/whipper
def _getMetadata(releaseShort, release, discid, country=None):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r',
        release['id'])
    if not release['id']:
        log.warning('program', 'No id for release %r', release)
        return None

    assert release['id'], 'Release does not have an id'

    if 'country' in release and country and release['country'] != country:
        log.warning('program', '%r was not released in %r', release, country)
        return None

    discMD = DiscMetadata()

    discMD.releaseType = releaseShort.get('release-group', {}).get('type')
    discCredit = _Credit(release['artist-credit'])

    # FIXME: is there a better way to check for VA ?
    discMD.various = False
    if discCredit[0]['artist']['id'] == VA_ID:
        discMD.various = True


    if len(discCredit) > 1:
        log.debug('mbngs', 'artist-credit more than 1: %r', discCredit)

    albumArtistName = discCredit.getName()

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    discMD.artist = albumArtistName
    discMD.sortName = discCredit.getSortName()
    # FIXME: is format str ?
    if not 'date' in release:
        log.warning('mbngs', 'Release %r does not have date', release)
    else:
        discMD.release = release['date']

    discMD.mbid = release['id']
    discMD.mbidArtist = discCredit.getIds()
    discMD.url = 'https://musicbrainz.org/release/' + release['id']

    discMD.barcode = release.get('barcode', None)
    lil = release.get('label-info-list', [{}])
    if lil:
        discMD.catalogNumber = lil[0].get('catalog-number')
    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release['medium-list']:
        for disc in medium['disc-list']:
            if disc['id'] == discid:
                title = release['title']
                discMD.releaseTitle = title
                if 'disambiguation' in release:
                    title += " (%s)" % release['disambiguation']
                count = len(release['medium-list'])
                if count > 1:
                    title += ' (Disc %d of %d)' % (
                        int(medium['position']), count)
                if 'title' in medium:
                    title += ": %s" % medium['title']
                discMD.title = title
                for t in medium['track-list']:
                    track = TrackMetadata()
                    trackCredit = _Credit(t['recording']['artist-credit'])
                    if len(trackCredit) > 1:
                        log.debug('mbngs',
                            'artist-credit more than 1: %r', trackCredit)

                    # FIXME: leftover comment, need an example
                    # various artists discs can have tracks with no artist
                    track.artist = trackCredit.getName()
                    track.sortName = trackCredit.getSortName()
                    track.mbidArtist = trackCredit.getIds()

                    track.title = t['recording']['title']
                    track.mbid = t['recording']['id']

                    # FIXME: unit of duration ?
                    track.duration = int(t['recording'].get('length', 0))
                    if not track.duration:
                        log.warning('getMetadata',
                            'track %r (%r) does not have duration' % (
                                track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    discMD.tracks.append(track)

                if not tainted:
                    discMD.duration = duration
                else:
                    discMD.duration = 0

    return discMD
示例#32
0
    query = mbws.Query(service)


    # Query for all discs matching the given DiscID.
    # FIXME: let mbws.WebServiceError go through for now
    try:
        rfilter = mbws.ReleaseFilter(discId=discid)
        results = query.getReleases(rfilter)
    except mbws.WebServiceError, e:
        raise MusicBrainzException(e)

    # No disc matching this DiscID has been found.
    if len(results) == 0:
        return None

    log.debug('musicbrainz', 'found %d results for discid %r', len(results),
        discid)

    # Display the returned results to the user.
    ret = []

    for result in results:
        release = result.release
        log.debug('program', 'result %r: artist %r, title %r' % (
            release, release.artist.getName(), release.title))
        # The returned release object only contains title and artist, but no
        # tracks.  Query the web service once again to get all data we need.
        try:
            inc = mbws.ReleaseIncludes(artist=True, tracks=True,
                releaseEvents=True, discs=True)
            # Arid - Under the Cold Street Lights has getId() None
            if release.getId():
示例#33
0
        # FIXME: no way to compare against 'master' version after 0.10.15
        if gst.pygst_version >= (0, 10, 15):
            ret[gst.TAG_TRACK_NUMBER] = number
        if self.metadata:
            # works, but not sure we want this
            # if gst.pygst_version >= (0, 10, 15):
            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
            # hack to get a GstDate which we cannot instantiate directly in
            # 0.10.15.1
            # FIXME: The dates are strings and must have the format 'YYYY',
            # 'YYYY-MM' or 'YYYY-MM-DD'.
            # GstDate expects a full date, so default to
            # Jan and 1st if MM and DD are missing
            date = self.metadata.release
            if date:
                log.debug('metadata',
                    'Converting release date %r to structure', date)
                if len(date) == 4:
                    date += '-01'
                if len(date) == 7:
                    date += '-01'

                s = gst.structure_from_string('hi,date=(GstDate)%s' %
                    str(date))
                ret[gst.TAG_DATE] = s['date']

            # no musicbrainz info for htoa tracks
            if number > 0:
                ret["musicbrainz-trackid"] = mbidTrack
                ret["musicbrainz-artistid"] = mbidTrackArtist
                ret["musicbrainz-albumid"] = mbidAlbum
                ret["musicbrainz-albumartistid"] = mbidTrackAlbum
示例#34
0
def _getMetadata(release):
    """
    @type  release: L{musicbrainz2.model.Release}

    @rtype: L{DiscMetadata} or None
    """
    log.debug('program', 'getMetadata for release id %r',
        release.getId())
    if not release.getId():
        log.warning('program', 'No id for release %r', release)
        return None

    assert release.id, 'Release does not have an id'

    metadata = DiscMetadata()

    isSingleArtist = release.isSingleArtistRelease()
    metadata.various = not isSingleArtist
    metadata.title = release.title
    # getUniqueName gets disambiguating names like Muse (UK rock band)
    metadata.artist = release.artist.name
    metadata.sortName = release.artist.sortName
    metadata.release = release.getEarliestReleaseDate()

    metadata.mbid = urlparse.urlparse(release.id)[2].split("/")[-1]
    metadata.mbidArtist = urlparse.urlparse(
        release.artist.id)[2].split("/")[-1]
    metadata.url = release.getId()

    tainted = False
    duration = 0

    for t in release.tracks:
        track = TrackMetadata()

        if isSingleArtist or t.artist == None:
            track.artist = metadata.artist
            track.sortName = metadata.sortName
            track.mbidArtist = metadata.mbidArtist
        else:
            # various artists discs can have tracks with no artist
            track.artist = t.artist and t.artist.name or release.artist.name
            track.sortName = t.artist.sortName
            track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1]

        track.title = t.title
        track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1]

        track.duration = t.duration
        if not track.duration:
            log.warning('getMetadata',
                'track %r (%r) does not have duration' % (
                    track.title, track.mbid))
            tainted = True
        else:
            duration += t.duration

        metadata.tracks.append(track)

    if not tainted:
        metadata.duration = duration
    else:
        metadata.duration = 0

    return metadata
示例#35
0
        # FIXME: no way to compare against 'master' version after 0.10.15
        if gst.pygst_version >= (0, 10, 15):
            ret[gst.TAG_TRACK_NUMBER] = number
        if self.metadata:
            # works, but not sure we want this
            # if gst.pygst_version >= (0, 10, 15):
            #     ret[gst.TAG_TRACK_COUNT] = len(self.metadata.tracks)
            # hack to get a GstDate which we cannot instantiate directly in
            # 0.10.15.1
            # FIXME: The dates are strings and must have the format 'YYYY',
            # 'YYYY-MM' or 'YYYY-MM-DD'.
            # GstDate expects a full date, so default to
            # Jan and 1st if MM and DD are missing
            date = self.metadata.release
            if date:
                log.debug("metadata", "Converting release date %r to structure", date)
                if len(date) == 4:
                    date += "-01"
                if len(date) == 7:
                    date += "-01"

                s = gst.structure_from_string("hi,date=(GstDate)%s" % str(date))
                ret[gst.TAG_DATE] = s["date"]

            # no musicbrainz info for htoa tracks
            if number > 0:
                ret["musicbrainz-trackid"] = mbidTrack
                ret["musicbrainz-artistid"] = mbidTrackArtist
                ret["musicbrainz-albumid"] = mbidAlbum
                ret["musicbrainz-albumartistid"] = mbidTrackAlbum
                ret["musicbrainz-discid"] = mbDiscId
示例#36
0
 def parse(self, argv):
     log.debug("morituri", "rip %s" % " ".join(argv))
     logcommand.LogCommand.parse(self, argv)
示例#37
0
def _getMetadata(releaseShort, release, discid):
    """
    @type  release: C{dict}
    @param release: a release dict as returned in the value for key release
                    from get_release_by_id

    @rtype: L{DiscMetadata} or None
    """
    log.debug("program", "getMetadata for release id %r", release["id"])
    if not release["id"]:
        log.warning("program", "No id for release %r", release)
        return None

    assert release["id"], "Release does not have an id"

    metadata = DiscMetadata()

    metadata.releaseType = releaseShort.get("release-group", {}).get("type")
    credit = release["artist-credit"]

    artist = credit[0]["artist"]

    if len(credit) > 1:
        log.debug("musicbrainzngs", "artist-credit more than 1: %r", credit)

    for i, c in enumerate(credit):
        if isinstance(c, dict):
            credit[i] = c.get("name", c["artist"].get("name", None))

    albumArtistName = "".join(credit)

    # FIXME: is there a better way to check for VA
    metadata.various = False
    if artist["id"] == VA_ID:
        metadata.various = True

    # getUniqueName gets disambiguating names like Muse (UK rock band)
    metadata.artist = albumArtistName
    metadata.sortName = artist["sort-name"]
    # FIXME: is format str ?
    if not "date" in release:
        log.warning("musicbrainzngs", "Release %r does not have date", release)
    else:
        metadata.release = release["date"]

    metadata.mbid = release["id"]
    metadata.mbidArtist = artist["id"]
    metadata.url = "http://musicbrainz.org/release/" + release["id"]

    metadata.barcode = release.get("barcode", None)
    lil = release.get("label-info-list", [{}])
    if lil:
        metadata.catalogNumber = lil[0].get("catalog-number")
    tainted = False
    duration = 0

    # only show discs from medium-list->disc-list with matching discid
    for medium in release["medium-list"]:
        for disc in medium["disc-list"]:
            if disc["id"] == discid:
                title = release["title"]
                metadata.releaseTitle = title
                if "disambiguation" in release:
                    title += " (%s)" % release["disambiguation"]
                count = len(release["medium-list"])
                if count > 1:
                    title += " (Disc %d of %d)" % (int(medium["position"]), count)
                if "title" in medium:
                    title += ": %s" % medium["title"]
                metadata.title = title
                for t in medium["track-list"]:
                    track = TrackMetadata()
                    credit = t["recording"]["artist-credit"]
                    if len(credit) > 1:
                        log.debug("musicbrainzngs", "artist-credit more than 1: %r", credit)
                        # credit is of the form [dict, str, dict, ... ]
                    for i, c in enumerate(credit):
                        if isinstance(c, dict):
                            credit[i] = c.get("name", c["artist"].get("name", None))

                    trackArtistName = "".join(credit)

                    if not artist:
                        track.artist = metadata.artist
                        track.sortName = metadata.sortName
                        track.mbidArtist = metadata.mbidArtist
                    else:
                        # various artists discs can have tracks with no artist
                        track.artist = trackArtistName
                        track.sortName = artist["sort-name"]
                        track.mbidArtist = artist["id"]

                    track.title = t["recording"]["title"]
                    track.mbid = t["recording"]["id"]

                    # FIXME: unit of duration ?
                    track.duration = int(t["recording"].get("length", 0))
                    if not track.duration:
                        log.warning("getMetadata", "track %r (%r) does not have duration" % (track.title, track.mbid))
                        tainted = True
                    else:
                        duration += track.duration

                    metadata.tracks.append(track)

                if not tainted:
                    metadata.duration = duration
                else:
                    metadata.duration = 0

    return metadata