def testGetRecording(self):
        musicbrainzngs.get_recording_by_id("93468a09-9662-4886-a227-56a2ad1c5246")
        self.assertEqual("http://musicbrainz.org/ws/2/recording/93468a09-9662-4886-a227-56a2ad1c5246", self.opener.get_url())

        # one include
        musicbrainzngs.get_recording_by_id("93468a09-9662-4886-a227-56a2ad1c5246", includes=["artists"])
        self.assertEqual("http://musicbrainz.org/ws/2/recording/93468a09-9662-4886-a227-56a2ad1c5246?inc=artists", self.opener.get_url())
    def testGetRecording(self):
        musicbrainzngs.get_recording_by_id("93468a09-9662-4886-a227-56a2ad1c5246")
        self.assertEqual("http://musicbrainz.org/ws/2/recording/93468a09-9662-4886-a227-56a2ad1c5246", self.opener.get_url())

        # one include
        musicbrainzngs.get_recording_by_id("93468a09-9662-4886-a227-56a2ad1c5246", includes=["artists"])
        self.assertEqual("http://musicbrainz.org/ws/2/recording/93468a09-9662-4886-a227-56a2ad1c5246?inc=artists", self.opener.get_url())
 def _recurse_relations(self, mb_track_id, oldest_release, relation_type):
     x = musicbrainzngs.get_recording_by_id(
         mb_track_id,
         includes=['releases', 'recording-rels'])
     if 'recording-relation-list' in x['recording'].keys():
         # recurse down into edits and remasters.
         # Note remasters are deprecated in musicbrainz, but some entries
         # may still exist.
         for subrecording in x['recording']['recording-relation-list']:
             if ('direction' in subrecording.keys() and
                     subrecording['direction'] == 'backward'):
                 continue
             (oldest_release, relation_type) = self._recurse_relations(
                 subrecording['target'],
                 oldest_release,
                 subrecording['type'])
     for release in x['recording']['release-list']:
         if 'date' not in release.keys():
             # A release without a date. Skip over it.
             continue
         release_date = self._make_date_values(release['date'])
         if (oldest_release['year'] is None or
                 oldest_release['year'] > release_date['year']):
             oldest_release = release_date
         elif oldest_release['year'] == release_date['year']:
             if ('month' in release_date.keys() and
                     'month' in oldest_release.keys() and
                     oldest_release['month'] > release_date['month']):
                 oldest_release = release_date
     return (oldest_release, relation_type)
 def _recurse_relations(self, mb_track_id, oldest_release, relation_type):
     x = musicbrainzngs.get_recording_by_id(
         mb_track_id, includes=['releases', 'recording-rels'])
     if 'recording-relation-list' in x['recording'].keys():
         # recurse down into edits and remasters.
         # Note remasters are deprecated in musicbrainz, but some entries
         # may still exist.
         for subrecording in x['recording']['recording-relation-list']:
             if ('direction' in subrecording.keys()
                     and subrecording['direction'] == 'backward'):
                 continue
             (oldest_release, relation_type) = self._recurse_relations(
                 subrecording['target'], oldest_release,
                 subrecording['type'])
     for release in x['recording']['release-list']:
         if 'date' not in release.keys():
             # A release without a date. Skip over it.
             continue
         release_date = self._make_date_values(release['date'])
         if (oldest_release['year'] is None
                 or oldest_release['year'] > release_date['year']):
             oldest_release = release_date
         elif oldest_release['year'] == release_date['year']:
             if ('month' in release_date.keys()
                     and 'month' in oldest_release.keys()
                     and oldest_release['month'] > release_date['month']):
                 oldest_release = release_date
     return (oldest_release, relation_type)
Exemple #5
0
def load_recording(url: str) -> MbRecording:
    prefix = 'https://musicbrainz.org/recording/'
    assert url.startswith(prefix)
    id = url[len(prefix):]
    print('loading ID:', id)
    return musicbrainzngs.get_recording_by_id(
        id, includes=['releases', 'artist-credits', 'isrcs'])['recording']
Exemple #6
0
    def stats_for_recording(self, recordingid):
        """ Given a recording id, get its work (if it exists) and
            the composer and lyricist of the work """
        self.recordings.add(recordingid)
        recording = mb.get_recording_by_id(recordingid, includes=["work-rels", "artist-rels"]) 
        recording = recording["recording"]
        for relation in recording.get("artist-relation-list", []):
            artist = relation.get("artist", {}).get("id")
            if artist:
                self.artists.add(artist)

        for relation in recording.get("work-relation-list", []):
            workid = relation.get("work", {}).get("id")
            self.works.add(workid)
            self.work_recording_counts[workid] += 1
            work = mb.get_work_by_id(workid, includes=["artist-rels"])
            work = work["work"]
            for artist in work.get("artist-relation-list", []):
                t = artist["type"]
                aid = artist.get("artist", {}).get("id")
                if aid:
                    if t == "composer":
                        self.composers.add(aid)
                    elif t == "lyricist":
                        self.lyricists.add(aid)
def get_recording(mbid):
    try:
        rec = musicbrainzngs.get_recording_by_id(
            mbid, includes=["releases", "artists"])
        return rec["recording"]
    except musicbrainzngs.ResponseError:
        return {}
def main():
    m.set_useragent("application", "0.01", "http://example.com")
    print(m.get_artist_by_id("952a4205-023d-4235-897c-6fdb6f58dfaa", []))
    print(m.get_label_by_id("aab2e720-bdd2-4565-afc2-460743585f16"))
    print(m.get_release_by_id("e94757ff-2655-4690-b369-4012beba6114"))
    print(m.get_release_group_by_id("9377d65d-ffd5-35d6-b64d-43f86ef9188d"))
    print(m.get_recording_by_id("cb4d4d70-930c-4d1a-a157-776de18be66a"))
    print(m.get_work_by_id("7e48685c-72dd-3a8b-9274-4777efb2aa75"))

    print(m.get_releases_by_discid("BG.iuI50.qn1DOBAWIk8fUYoeHM-"))
    print(m.get_recordings_by_puid("070359fc-8219-e62b-7bfd-5a01e742b490"))
    print(m.get_recordings_by_isrc("GBAYE9300106"))

    m.auth("", "")
    m.submit_barcodes(
        {"e94757ff-2655-4690-b369-4012beba6114": "9421021463277"})
    m.submit_tags(recording_tags={
        "cb4d4d70-930c-4d1a-a157-776de18be66a": ["these", "are", "my", "tags"]
    })
    m.submit_tags(
        artist_tags={"952a4205-023d-4235-897c-6fdb6f58dfaa": ["NZ", "twee"]})

    m.submit_ratings(
        recording_ratings={"cb4d4d70-930c-4d1a-a157-776de18be66a": 20})
    m.submit_echoprints(
        {"e97f805a-ab48-4c52-855e-07049142113d": "anechoprint1234567"})
def main(collectionid):
    # work -> list recordings
    mapping = collections.defaultdict(list)
    # map from an id to a name
    recordingnames = {}
    worknames = {}
    for i, releaseid in enumerate(compmusic.musicbrainz.get_releases_in_collection(collectionid)):
        print i, releaseid
        try:
            rel = mb.get_release_by_id(releaseid, includes=["recordings"])
        except:
            continue
        rel = rel["release"]

        for medium in rel.get("medium-list", []):
            for track in medium.get("track-list", []):
                recid = track["recording"]["id"]
                recordingnames[recid] = track["recording"]["title"]
                recording = mb.get_recording_by_id(recid, includes=["work-rels"])
                recording = recording["recording"]
                for work in recording.get("work-relation-list", []):
                    workid = work["work"]["id"]
                    worknames[workid] = work["work"]["title"]
                    mapping[workid].append(recid)

    data = []
    for k, v in mapping.items():
        data.append((k, v))
    data = sorted(data, key=lambda x: len(x[1]), reverse=True)
    all_d = {"recordingnames": recordingnames,
            "worknames": worknames,
            "data": data
            }
    json.dump(all_d, open("works_by_recording.json", "w"))
def get_album_name( recording_id,
                    log ):
    """
    `recording_id` should be a Musicbrainz ID value for a recording (track) as
    a string. Returns None on failure, else returns the recording's album's 
    name as it is most commonly known in the Musicbrainz DB as a string
    """
    try:
        result = musicbrainzngs.get_recording_by_id( recording_id, includes=['releases'] )
    except Exception as exc:
        log.warning("get_album_name(): web service call failed: %s" % exc)
        return None
    most_common_album_name = None
    try:
        # Find the most commonly occuring name for the release (album)
        release_name_occurences = dict()
        for release in result['recording']['release-list']:
            if release['title'] not in release_name_occurences:
                release_name_occurences[release['title']] = 1
            else:
                release_name_occurences[release['title']] += 1
        most_common_album_name = \
            max( release_name_occurences, key=release_name_occurences.get )        
    except Exception as e:
        log.warning("get_album_name(): result parsing failed: %s: %s\nresult was %s" % ( type(e), e, str(result) ))
        return None
    return most_common_album_name
Exemple #11
0
def main(path, fake_release_mbid):
    releases = {}
    #Get all the mbid of the recordings
    onlyfiles = [
        f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))
    ]
    for i in onlyfiles:
        head, tail = os.path.split(i)
        filename, file_extension = os.path.splitext(i)
        if file_extension == '.mp3':
            c = eyed3.load(os.path.join(path, i))
            mbid = c.tag.unique_file_ids.get(
                "http://musicbrainz.org").render()[33:]
            try:
                rel = mb.get_recording_by_id(mbid, includes=["releases"])
                release = None
                if len(rel['recording']['release-list']):
                    #create release
                    release = rel['recording']['release-list'][0]['id']
                else:
                    release = fake_release_mbid
                    #use *fake* release
                if release not in releases:
                    releases[release] = []
                releases[release].append(mbid)
            except:
                print "couldn't find a release for the recording %s" % mbid
                continue
    coll = Collection.objects.get(mbid="544f7aec-dba6-440c-943f-103cf344efbb")
    r = makam_importer.MakamReleaseImporter(coll)
    for i in releases.keys():
        r.import_release(i, "")
        for j in releases[i]:
            r.add_and_get_recording(j)
Exemple #12
0
def load_recording_attributes_from_music_brainz(mbid):
    """
    Loads attributes for the single recording.
    :param mbid: MBID
    :return: RecordingAttributes
    """
    mb.set_useragent("application", "0.01", "http://example.com")
    rec_attrs = mb.get_recording_by_id(
        id=mbid, includes=['artist-credits', 'artist-rels', 'work-rels'])
    lineup = {}
    composers = []
    recording_started = None
    recording_finished = None
    recording_year = None
    if 'artist-relation-list' in rec_attrs['recording'].keys():
        artist_relations = rec_attrs['recording']['artist-relation-list']
        recording_started, recording_finished, recording_year = estimate_recording_time(
            artist_relations)
        lineup = get_lineup(artist_relations)
    if 'work-relation-list' in rec_attrs['recording'].keys():
        composers = get_composers(rec_attrs['recording']['work-relation-list'])
    return RecordingAttributes(rec_attrs['recording']['title'],
                               rec_attrs['recording']['artist-credit-phrase'],
                               recording_year, recording_started,
                               recording_finished, lineup, composers)
def getRecrodingListForAWork( workMBID, m):
    
   
    # get list of recording IDa for work ID
    recordingIDsList = m.recordingids_for_work(workMBID)       
                       
        
               
    existingVocalRecordings = [];
    for recID in recordingIDsList:
        
        recording = mb.get_recording_by_id(recID, includes=["artist-rels", "releases"])

        # check if we have the realease of the recording in the database 
        listExistingReleases = getExistigReleasesForRecording(recording, recID)
        if len(listExistingReleases) == 0:
            continue
                
#         check if we have vocals                         
        if not isRecordingWithVocals(recording, recID):
                        print "no vocals in recording ID: ", recID
        else: 
            existingVocalRecordings.append(recID)            
                                
                        
                                  
 
    
    return existingVocalRecordings
Exemple #14
0
 def recording_parser(self, results):
     list_of_recordings = []
     #If Musicbrainz data is missing
     artist_name = ''
     title = ''
     rec_type = ''
     rec_type_title = ''
     status = ''
     recording_data = [
         'artists', 'releases', 'discids', 'media', 'artist-credits',
         'isrcs', 'annotation', 'aliases', 'tags', 'user-tags', 'ratings',
         'user-ratings', 'area-rels', 'artist-rels', 'label-rels',
         'place-rels', 'recording-rels', 'release-rels',
         'release-group-rels', 'url-rels', 'work-rels'
     ]
     # for recording in results['recording-list']:
     rec_result = mbz.get_recording_by_id(results, includes=recording_data)
     # list_of_recordings.append({'title': recording['title'],
     #                             'rec_id':recording['id'],
     #                             'rel_id':[rel['id'] for rel in rec_result['recording']['release-list']]})
     list_of_recordings = [
         rel['id'] for rel in rec_result['recording']['release-list']
     ]
     parsed_list_of_recordings = self.release_info(list_of_recordings)
     return parsed_list_of_recordings
Exemple #15
0
def main(path, fake_release_mbid):
    releases = {}
    # Get all the mbid of the recordings
    onlyfiles = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
    for i in onlyfiles:
        head, tail = os.path.split(i)
        filename, file_extension = os.path.splitext(i)
        if file_extension == '.mp3':
            c = eyed3.load(os.path.join(path, i))
            mbid = c.tag.unique_file_ids.get("http://musicbrainz.org").render()[33:]
            try:
                rel = mb.get_recording_by_id(mbid, includes=["releases"])
                release = None
                if len(rel['recording']['release-list']):
                    # create release
                    release = rel['recording']['release-list'][0]['id']
                else:
                    release = fake_release_mbid
                    # use *fake* release
                if release not in releases:
                    releases[release] = []
                releases[release].append(mbid)
            except:
                print("couldn't find a release for the recording %s" % mbid)
                continue
    coll = Collection.objects.get(mbid="544f7aec-dba6-440c-943f-103cf344efbb")
    r = makam_importer.MakamReleaseImporter(coll)
    for i in releases.keys():
        r.import_release(i, "")
        for j in releases[i]:
            r.add_and_get_recording(j)
Exemple #16
0
    def stats_for_recording(self, recordingid):
        """ Given a recording id, get its work (if it exists) and
            the composer and lyricist of the work """
        self.recordings.add(recordingid)
        recording = mb.get_recording_by_id(recordingid, includes=["work-rels", "artist-rels"])
        recording = recording["recording"]
        for relation in recording.get("artist-relation-list", []):
            artist = relation.get("artist", {}).get("id")
            if artist:
                self.artists.add(artist)

        for relation in recording.get("work-relation-list", []):
            workid = relation.get("work", {}).get("id")
            self.works.add(workid)
            self.work_recording_counts[workid] += 1
            work = mb.get_work_by_id(workid, includes=["artist-rels"])
            work = work["work"]
            for artist in work.get("artist-relation-list", []):
                t = artist["type"]
                aid = artist.get("artist", {}).get("id")
                if aid:
                    if t == "composer":
                        self.composers.add(aid)
                    elif t == "lyricist":
                        self.lyricists.add(aid)
def get_recording_by_id(mbid):
    recording = cache.get(mbid)
    if not recording:
        try:
            recording = musicbrainzngs.get_recording_by_id(mbid, includes=['artists', 'releases', 'media'])['recording']
        except ResponseError as e:
            raise DataUnavailable(e)
    cache.set(mbid, recording, time=CACHE_TIMEOUT)
    return recording
Exemple #18
0
def track_for_id(trackid):
    """Fetches a track by its MusicBrainz ID. Returns a TrackInfo object
    or None if no track is found.
    """
    try:
        res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
    except musicbrainzngs.ResponseError:
        log.debug('Track ID match failed.')
        return None
    return track_info(res['recording'])
def get_recording_by_id(mbid):
    mbid = str(mbid)
    recording = cache.get(mbid)
    if not recording:
        try:
            recording = musicbrainzngs.get_recording_by_id(mbid, includes=['artists', 'releases', 'media'])['recording']
        except ResponseError as e:
            raise DataUnavailable(e)
    cache.set(mbid, recording, time=CACHE_TIMEOUT)
    return recording
Exemple #20
0
def track_for_id(trackid):
    """Fetches a track by its MusicBrainz ID. Returns a TrackInfo object
    or None if no track is found.
    """
    try:
        res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
    except musicbrainzngs.ResponseError:
        log.debug('Track ID match failed.')
        return None
    return track_info(res['recording'])
    def make_query(self, params):

        if params["type"] == "artist":
            return musicbrainzngs.get_artist_by_id(params["mbid"])
        elif params["type"] == "album":
            return musicbrainzngs.get_release_by_id(params["mbid"])
        elif params["type"] == "tracklist":
            return musicbrainzngs.get_release_by_id(params["mbid"],
                                                    includes=["recordings"])["release"]["medium-list"][0]["track-list"]
        elif params["type"] == "track":
            return musicbrainzngs.get_recording_by_id(params["mbid"], includes=["artists"])
Exemple #22
0
def lookup(musicbrainz_id):
    try:
        return musicbrainzngs.get_recording_by_id(musicbrainz_id,
                                                  includes=[
                                                      "artists", "releases",
                                                      "artist-credits", "tags",
                                                      "instrument-rels",
                                                      "media"
                                                  ])
    except musicbrainzngs.WebServiceError as web_service_error:
        raise MusicBrainzLookupError(
            f"Something went wrong with the request: {web_service_error}")
Exemple #23
0
def track_for_id(trackid):
    """Fetches a track by its MusicBrainz ID. Returns a TrackInfo object
    or None if no track is found. May raise a MusicBrainzAPIError.
    """
    try:
        res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
    except musicbrainzngs.ResponseError:
        log.debug("Track ID match failed.")
        return None
    except musicbrainzngs.MusicBrainzError as exc:
        raise MusicBrainzAPIError(exc, "get recording by ID", trackid, traceback.format_exc())
    return track_info(res["recording"])
Exemple #24
0
def track_for_id(trackid):
    """Fetches a track by its MusicBrainz ID. Returns a TrackInfo object
    or None if no track is found. May raise a MusicBrainzAPIError.
    """
    try:
        res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
    except musicbrainzngs.ResponseError:
        log.debug('Track ID match failed.')
        return None
    except musicbrainzngs.MusicBrainzError as exc:
        raise MusicBrainzAPIError(exc, 'get recording by ID', trackid,
                                  traceback.format_exc())
    return track_info(res['recording'])
Exemple #25
0
 def get_performance_credit_for_recording(self, recordingid):
     recording = mb.get_recording_by_id(recordingid, includes=["releases"])
     recording = recording["recording"]
     ret = []
     for release in recording.get("release-list", []):
         relid = release["id"]
         mbrelease = mb.get_release_by_id(relid, includes=["artist-credits", "recordings"])
         mbrelease = mbrelease["release"]
         for medium in mbrelease.get("medium-list", []):
             for track in medium.get("track-list", []):
                 if track["recording"]["id"] == recordingid:
                     ret.append(track["recording"]["artist-credit-phrase"])
     return list(set(ret))
def get_mb_recording_info(rmbid):
    '''  Get info related to the recording passed by input from Music Brainz

    :param rmbid: Music Brainz id of a recording
    :return: info from Music Brainz
    '''
    mb.set_useragent("andalusian_analysis_notebook", "0.1")
    json_file = mb.get_recording_by_id(rmbid, includes=["artist-rels"])
    if not json_file:
        print("Music Brainz return empty metadata")
    # replace inverted comma with inverted commas. Necessary to avoid parsing error
    json_file = replace_invertedcomma(str(json_file))
    return json_file
Exemple #27
0
 def get_mb_recording_by_id(self, mb_id):
     try:
         return m.get_recording_by_id(
             mb_id, includes=["url-rels"]
         )
     except WebServiceError as exc:
         log.error("requesting data from MusicBrainz: %s (WebServiceError)" % exc)
         log.debug("MODELS: get_mb_recording_by_id returns False.")
         return False
     except Exception as exc:
         log.error("requesting data from MusicBrainz: %s (Exception)" % exc)
         log.debug("MODELS: get_mb_recording_by_id returns empty dict.")
         return {}
 def get_performance_credit_for_recording(self, recordingid):
     recording = mb.get_recording_by_id(recordingid, includes=["releases"])
     recording = recording["recording"]
     ret = []
     for release in recording.get("release-list", []):
         relid = release["id"]
         mbrelease = mb.get_release_by_id(
             relid, includes=["artist-credits", "recordings"])
         mbrelease = mbrelease["release"]
         for medium in mbrelease.get("medium-list", []):
             for track in medium.get("track-list", []):
                 if track["recording"]["id"] == recordingid:
                     ret.append(track["recording"]["artist-credit-phrase"])
     return list(set(ret))
Exemple #29
0
def match_recording(mbids):
    release_list = []
    mbid_rec = {}
    for mbid in mbids:
        try:
            mbid_info = mb.get_recording_by_id(mbid,['artists','releases'],['official'])['recording']
        except mb.musicbrainz.ResponseError :
            logging.warning('{0} is an invalid MusicBrainz ID. Skipping...'.format(mbid))
            continue
        mbid_rlist = mbid_info['release-list']
        mbid_rec[mbid] = mbid_info
        for item in mbid_rlist:
            item['trackid'] = mbid
        release_list.extend(mbid_rlist)
    return (mbid_rec, release_list)
Exemple #30
0
    def get_musicbrainz(self, obj):

        results = []

        includes = ['releases','artists']
        
        for e in obj.results_acoustid:
            media_id = e['id']

            try:
                result = musicbrainzngs.get_recording_by_id(id=media_id, includes=includes)
                results.append(result)
            except Exception, e:
                print e
                pass
Exemple #31
0
    def from_musicbrainz(self, audio_in):
        try:  # audio file input
            mbid, duration, sampling_frequency, bit_rate = \
                Recording.get_file_metadata(audio_in)
            audio_meta = {
                'mbid': mbid,
                'path': audio_in,
                'duration': duration,
                'sampling_frequency': sampling_frequency,
                'bit_rate': bit_rate
            }
        except (IOError, AttributeError):
            audio_meta = {'mbid': audio_in}
        audio_meta['url'] = u'http://musicbrainz.org/recording/{}'.format(
            audio_meta['mbid'])

        meta = mb.get_recording_by_id(audio_meta['mbid'],
                                      includes=[
                                          'artists', 'artist-rels', 'releases',
                                          'tags', 'work-rels'
                                      ])['recording']
        audio_meta['title'] = meta['title']

        # releases
        audio_meta['releases'] = self._get_releases(meta)

        # artist credits
        audio_meta['artist_credits'] = self._get_artist_credits(meta)

        # performers
        audio_meta['artists'] = self._get_artist_relations(meta)

        # works
        if 'work-relation-list' in meta.keys():  # has work
            audio_meta['works'] = self._get_works(meta)

        # get makam/usul/for from work attributes
        if self.get_work_attributes and 'works' in audio_meta.keys():
            self._get_attributes_from_works(audio_meta)

        # get makam/usul/for tags
        self._get_recording_attribute_tags(audio_meta, meta)

        # infer voicing/instrumentation
        audio_meta['instrumentation_voicing'] = InstrumentationVoicing.\
            get_voicing_instrumentation(audio_meta)

        return audio_meta
Exemple #32
0
    def get_musicbrainz(self, obj):

        results = []

        includes = ['releases', 'artists']

        for e in obj.results_acoustid:
            media_id = e['id']

            try:
                result = musicbrainzngs.get_recording_by_id(id=media_id,
                                                            includes=includes)
                results.append(result)
            except Exception, e:
                print e
                pass
Exemple #33
0
def track_for_id(releaseid):
    """Fetches a track by its MusicBrainz ID. Returns a TrackInfo object
    or None if no track is found. May raise a MusicBrainzAPIError.
    """
    trackid = _parse_id(releaseid)
    if not trackid:
        log.debug(u'Invalid MBID ({0}).', releaseid)
        return
    try:
        res = musicbrainzngs.get_recording_by_id(trackid, TRACK_INCLUDES)
    except musicbrainzngs.ResponseError:
        log.debug(u'Track ID match failed.')
        return None
    except musicbrainzngs.MusicBrainzError as exc:
        raise MusicBrainzAPIError(exc, u'get recording by ID', trackid,
                                  traceback.format_exc())
    return track_info(res['recording'])
def get_recording_live_string(recording_id):
    log.debug("%s: get_recording_live_string cache size %d", PLUGIN_NAME,
              len(get_recording_live_string.cache))
    if recording_id in get_recording_live_string.cache:
        return get_recording_live_string.cache[recording_id]

    recording_info = musicbrainzngs.get_recording_by_id(
        recording_id, includes=['work-rels', 'place-rels'])['recording']
    live = False
    if 'disambiguation' in recording_info \
        and 'live' in recording_info['disambiguation']:
        live = True
    else:
        try:
            for work_rel in recording_info['work-relation-list']:
                for work_rel_attrib in work_rel['attribute-list']:
                    if work_rel_attrib == 'live':
                        live = True
                        break
        except:
            pass

    place_strings = []
    if 'place-relation-list' in recording_info:
        #assert len(recording_info['place-relation-list']) == 1
        for place_rel in recording_info['place-relation-list']:
            try:
                assert place_rel['begin'] == place_rel['end']
                if len(place_rel['begin']):
                    location_string = get_place_location_string(
                        place_rel['place']['id'])
                    live_loc_str = "live, " if live else "recorded, "
                    live_loc_str += "%s: %s" % (place_rel['begin'],
                                                location_string)
                    get_recording_live_string.cache[
                        recording_id] = live_loc_str
                    place_strings.append(live_loc_str)
            except:
                log.debug("Got confused by %s", repr(place_rel))
                pass
        place_strings.sort()
        return '; '.join(place_strings)
    return None
def getOnlyVocalRecording(recordingIDsList):
    
    

    existingVocalRecordings = [];

    for recID in recordingIDsList:
        
        recording = mb.get_recording_by_id(recID, includes=["artist-rels", "releases"])

        # check if we have the realease of the recording in the database 
        listExistingReleases = getExistigReleasesForRecording(recording, recID)
        if len(listExistingReleases) == 0:
            continue
                
#         check if we have vocals                         
        if not isRecordingWithVocals(recording, recID):
                        print "no vocals in recording ID: ", recID
        else: 
            existingVocalRecordings.append(recID)         
Exemple #36
0
    def from_musicbrainz(self, audio_in):
        try:  # audio file input
            mbid, duration, sampling_frequency, bit_rate = \
                Recording.get_file_metadata(audio_in)
            audio_meta = {'mbid': mbid, 'path': audio_in, 'duration': duration,
                          'sampling_frequency': sampling_frequency,
                          'bit_rate': bit_rate}
        except (IOError, AttributeError):
            audio_meta = {'mbid': audio_in}
        audio_meta['url'] = u'http://musicbrainz.org/recording/{}'.format(
            audio_meta['mbid'])

        meta = mb.get_recording_by_id(audio_meta['mbid'], includes=['artists', 'artist-rels', 'releases', 'tags', 'work-rels'])['recording']
        audio_meta['title'] = meta['title']

        # releases
        audio_meta['releases'] = self._get_releases(meta)

        # artist credits
        audio_meta['artist_credits'] = self._get_artist_credits(meta)

        # performers
        audio_meta['artists'] = self._get_artist_relations(meta)

        # works
        if 'work-relation-list' in meta.keys():  # has work
            audio_meta['works'] = self._get_works(meta)

        # get makam/usul/for from work attributes
        if self.get_work_attributes and 'works' in audio_meta.keys():
            self._get_attributes_from_works(audio_meta)

        # get makam/usul/for tags
        self._get_recording_attribute_tags(audio_meta, meta)

        # infer voicing/instrumentation
        audio_meta['instrumentation_voicing'] = InstrumentationVoicing.\
            get_voicing_instrumentation(audio_meta)

        return audio_meta
Exemple #37
0
def tag_file(song_file):

    musicbrainzngs.auth(BRAINZ_USER, BRAINZ_PASS)
    musicbrainzngs.set_useragent("Auto tag script", "0.1", "http://localhost")

    #song = path.join(MP3_DIR, '3.mp3')
    print song_file
    for score, recording_id, title, artist in acoustid.match(
            APIKEY, song_file):
        # Get song data
        result_data = musicbrainzngs.get_recording_by_id(
            recording_id, includes=['artists', 'releases'])
        title = result_data['recording']['title']
        artist = result_data['recording']['artist-credit-phrase']
        print "%s - %s" % (title, artist)

        # Set ID3 tags
        audiofile = eyed3.load(song_file)
        audiofile.tag.artist = unicode(artist)
        audiofile.tag.title = unicode(title)

        # Get Cover Art
        if result_data['recording']['release-count']:
            try:
                imagedata = musicbrainzngs.get_image_front(
                    result_data['recording']['release-list'][0]['id'])
                print audiofile.tag.images.set(
                    eyed3.id3.frames.ImageFrame.FRONT_COVER, imagedata,
                    'image/jpeg')
                cover = open(
                    path.join(
                        COVER_DIR,
                        result_data['recording']['release-list'][0]['title'] +
                        '.jpg'), "w+")
                cover.write(imagedata)
                print "---"
            except musicbrainzngs.musicbrainz.ResponseError:
                pass

        audiofile.tag.save()
Exemple #38
0
def search_musicbrainz_by_id(data):
    musicbrainz.set_useragent("mer-ml", "0.1")
    for i, row in data.iterrows():
        if not row['fallback-id'] == '0-0':
            id = row['fallback-id']
            recording = musicbrainz.get_recording_by_id(id)
            recording = recording['recording']
            print(recording)
            match_recordings = musicbrainz.search_recordings(
                query=format_string(recording['title']))
            match_artist = find_closest_artist_from_recording(
                match_recordings['recording-list'], data['artist'])
            for rec in match_recordings['recording-list']:
                if format_string(recording['title']) == format_string(
                        rec['title']) and format_string(
                            rec['artist-credit-phrase']) == match_artist:
                    if has_audio_data(rec['id']):
                        data.at[i, 'id'] = rec[id]
                        break
                    else:
                        data.at[i, 'fallback-id'] = rec[id]
    return data
def recurse_relations(mb_track_id, oldest_release, relation_type):
    x = musicbrainzngs.get_recording_by_id(
        mb_track_id,
        includes=['releases', 'recording-rels'])

    if 'recording-relation-list' in x['recording'].keys():
        # recurse down into edits and remasters.
        # Note remasters are deprecated in musicbrainz, but some entries
        # may still exist.
        for subrecording in x['recording']['recording-relation-list']:
            if ('direction' in subrecording.keys() and
                    subrecording['direction'] == 'backward'):
                continue
            # skip new relationship category samples
            if subrecording['type'] not in relations:
                continue
            if 'artist' in x['recording'].keys() and x['recording']['artist'] != subrecording['artist']:
                print(f'Skipping relation with arist {subrecording["artist"]} that does not match {x["recording"]["artist"]}')
                continue
            (oldest_release, relation_type) = recurse_relations(
                subrecording['target'],
                oldest_release,
                subrecording['type'])
    for release in x['recording']['release-list']:
        if 'date' not in release.keys():
            # A release without a date. Skip over it.
            continue
        release_date = make_date_values(release['date'])
        if 'year' not in release_date.keys():
            continue
        if (oldest_release['year'] is None or
                oldest_release['year'] > release_date['year']):
            oldest_release = release_date
        elif oldest_release['year'] == release_date['year']:
            if ('month' in release_date.keys() and
                    'month' in oldest_release.keys() and
                    oldest_release['month'] > release_date['month']):
                oldest_release = release_date
    return (oldest_release, relation_type)
Exemple #40
0
 def _recording_details(recording_ids):
     '''
     We need to store more information . As of now , storing only release id to get the album art in future
     '''
     mbids = {}
     song_details = {}
     for rid in recording_ids:
         release_ids = []
         try:
             data  = musicbrainzngs.get_recording_by_id(rid,includes=['releases'])['recording']
             for i in data['release-list']:
                 try:
                     if i['status'] == 'Official':
                         release_ids.append(i['id'])
                 except:
                     pass
                 mbids[rid] = release_ids
                 song_details[rid] = data['release-list']
         except musicbrainzngs.WebServiceError as exc:
             print("Something went wrong with the request: %s" % exc)
             raise MusicUtilsException('4','Something wrong with the request. ')
     return (mbids,song_details)
Exemple #41
0
def scrape(query):
    mbid = query["mbid"]
    now = datetime.datetime.utcnow().isoformat()

    recording = mb.get_recording_by_id(mbid, includes=["artists",
                                                       "tags"])["recording"]

    artists, artist_map = artist_credits_to_artist_list(
        recording["artist-credit"])

    data = {
        "mbid": recording["id"],
        "name": recording["title"],
        "artist_credit": recording["artist-credit-phrase"],
        "tags": sort_tags(recording.get("tag-list", [])),
        "artists": sorted(artists),
        "last_updated": now
    }

    # Get release names + tags + artists + release groups
    release_ids = get_releases_for_recording(mbid)
    other_artists, release_map, release_group_map = get_metadata_for_releases(
        release_ids, now)

    # For any artists in `other_artists` which are not in `artists`, look them up
    remaining_artists = list(set(other_artists) - set(artists))
    if remaining_artists:
        new_artist_map = lookup_artists(remaining_artists)
        artist_map.update(new_artist_map)

    data["artist_map"] = artist_map

    data["releases"] = sorted(release_ids)
    data["release_map"] = release_map
    data["release_group_map"] = release_group_map

    return data
def main(collectionid):
    # work -> list recordings
    mapping = collections.defaultdict(list)
    # map from an id to a name
    recordingnames = {}
    worknames = {}
    for i, releaseid in enumerate(
            compmusic.musicbrainz.get_releases_in_collection(collectionid)):
        print i, releaseid
        try:
            rel = mb.get_release_by_id(releaseid, includes=["recordings"])
        except:
            continue
        rel = rel["release"]

        for medium in rel.get("medium-list", []):
            for track in medium.get("track-list", []):
                recid = track["recording"]["id"]
                recordingnames[recid] = track["recording"]["title"]
                recording = mb.get_recording_by_id(recid,
                                                   includes=["work-rels"])
                recording = recording["recording"]
                for work in recording.get("work-relation-list", []):
                    workid = work["work"]["id"]
                    worknames[workid] = work["work"]["title"]
                    mapping[workid].append(recid)

    data = []
    for k, v in mapping.items():
        data.append((k, v))
    data = sorted(data, key=lambda x: len(x[1]), reverse=True)
    all_d = {
        "recordingnames": recordingnames,
        "worknames": worknames,
        "data": data
    }
    json.dump(all_d, open("works_by_recording.json", "w"))
sys.path.append('../mopidy_remote')
from library import RemoteLibrary
import musicbrainzngs

config = {}
config['remote'] = {}
config['remote']['database'] = '/var/lib/mopidy/remote.db'

lib = RemoteplayLibrary(config)
musicbrainzngs.set_useragent('mopidy-headless', '0.0.1')
result = musicbrainzngs.search_releases(release="Dandy in the Underworld",
                                        artist="T. Rex")

import pdb
pdb.set_trace()
res = musicbrainzngs.search_artists(artist='T. Rex')
[(art['name'], art['ext:score']) for art in result['artist-list']
 if int(art['ext:score']) > 30]

result = musicbrainzngs.search_recordings(recording="Crimson Moon",
                                          release="Dandy in the Underworld",
                                          artist="T. Rex")
track = [t for t in result['recording-list'] if int(t['ext:score']) == 100][0]
musicbrainz_id = track['id']

rec = musicbrainzngs.get_recording_by_id(
    '9abfbf0b-ef05-4dfc-9177-17cc42dd3feb', includes=['artists', 'releases'])
track = rec['recording']
album = track['release-list'][0]['title']
artist = track['artist-credit-phrase']
Exemple #44
0
def getAlbumArtistNames(album,artist, apihandle, song=None):
  '''
  Given a supposed album and artist, determine the real ones
  '''
  def searchWhatAlbums(args):
    if len(args)==0:
      return []
    whatResponse = apihandle.request(action='browse',searchstr=args[0])
    if whatResponse['status']=='success':
      args.pop(0)
      return searchWhatAlbums(args)+[x for x in whatResponse['response']['results'] if 'artist' in x and 'groupName' in x]
    return []
  mbAlbums = []
  parens = re.compile('[\(\[].*[\)\]]')
  if song is not None:
    includes = ['recordings']
    artists = set(re.split(' &|and|ft\.?|featuring|feat\.? ',artist))
    if len(artists) > 1:
      artists.add(artist)
    for ar in artists:
      mbAlbums += [dict(list(x.items())+[("artist-credit-phrase", releases['artist-credit-phrase'])]) for releases in mb.search_recordings(query=song, limit=int(50*mbMultiplier), artistname=mbquote(ar), release=mbquote(album))['recording-list'] for x in releases['release-list']]
      mbAlbums += mb.search_releases(artist=mbquote(ar),query=mbquote(album),limit=int(25*mbMultiplier))['release-list']
      lastfmres = [x['mbid'] for x in lookup('lastfm','songsearch',{'artist':ar, 'song':song})['results']['trackmatches']['track'] if 'mbid' in x and len(x['mbid'])>0]
      if len(lastfmres)>0:
        for lastfmRecId in set(lastfmres):
          try:
            lastfmAlbum = mb.get_recording_by_id(id=lastfmRecId,includes=['releases','artist-credits'])
            for alb in lastfmAlbum['recording'].pop('release-list'):
              alb['medium-list'] = [{}]
              alb['medium-list'][0]['track-list'] = []
              alb['medium-list'][0]['track-list'].append(lastfmAlbum)
              alb['artist-credit-phrase'] = lastfmAlbum['recording']['artist-credit-phrase']
              mbAlbums.append(alb)
          except Exception as e:
            print(e)
  else:
    includes = []
    mbArtists = mb.search_artists(query=mbquote(artist),limit=int(40*mbMultiplier))['artist-list']
    mbAlbums += mb.search_releases(artist=mbquote(artist),query=mbquote(album),limit=int(50*mbMultiplier))['release-list']
    for mbArtist in mbArtists:
      if Levenshtein.ratio(artist.lower(),mbArtist['name'].lower()) > 0.75:
        mbAlbums+=[ dict(list(x.items())+[('artist-credit-phrase',mbArtist['name'])]) for x in mb.browse_releases(artist=mbArtist['id'],includes=includes,limit=25)['release-list']]
  if (len(album)<7 and ('/' in album or ' & ' in album) and 's' in album.lower() and 't' in album.lower()) or ('self' in album.lower() and 'titled' in album.lower()):
    mbAlbums += mb.search_releases(artist=mbquote(artist),query=mbquote(artist),limit=int(25*mbMultiplier))['release-list']
  temp = []
  for x in mbAlbums[:]:
    if x["id"] in temp and not ('medium-list' in x and len(x['medium-list'])>0 and all('track-list' in z and len(z['track-list'])>0 for z in x['medium-list'])):
      mbAlbums.remove(x)
    else:
      temp.append(x['id'])
  print("Done searching musicbrainz for album suggestions, have "+str(len(mbAlbums))+" to rank")
  
  ranks = {}
  for x in mbAlbums:
    ranks[x['id']] = Levenshtein.ratio(album.lower(),x['title'].lower())
    if song is not None:
      x['song'] = {}
      temp = ([(y['recording']['title'] if 'recording' in y else y['title'],
          int(float(
            y['recording']['length'] if 'recording' in y and 'length' in y['recording'] 
            else (y['track_or_recording_length'] if 'track_or_recording_length' in x 
            else y['length'] if 'length' in x else 0)
          )/1000.))
        for tracklist in x['medium-list']
        for y in tracklist['track-list']]
        if 'medium-list' in x and len(x['medium-list'])>0 and all('track-list' in z and len(z['track-list'])>0 for z in x['medium-list'])
        else getSongs(
          {"artist":x['artist-credit-phrase'], 
          "groupName":x['title']}))
      x['song']['name'], x['song']['duration'] = (max(temp, 
        key=lambda y: Levenshtein.ratio(y[0].lower(),song.lower())) if len(temp)>0 else ("",-1))
      if ranks[x['id']] < Levenshtein.ratio(x['song']['name'].lower(),song.lower()):
        ranks[x['id']] /= 6
        ranks[x['id']] +=  (Levenshtein.ratio(x['song']['name'].lower(),song.lower())
          + Levenshtein.ratio(parens.sub('',x['song']['name'].lower()),parens.sub('',song.lower())) )*5/12
      else:
        ranks[x['id']] /= 3
        ranks[x['id']] +=  (Levenshtein.ratio(x['song']['name'].lower(),song.lower())
          + Levenshtein.ratio(parens.sub('',x['song']['name'].lower()),parens.sub('',song.lower())) )/3
    ranks[x['id']] += Levenshtein.ratio(artist.lower(),x['artist-credit-phrase'].lower())*7/6
  if len(ranks) == 0:
    return None
  mbAlbumId, mbAlbumRank = max(ranks.items(),key=(lambda x:x[1]))
  mbAlbum = [x for x in mbAlbums if x['id']==mbAlbumId][0]
  print("For the artist and album derived from the provided dir ("+artist+" and "+album+" respectively),\nthe following artist and album was matched on musicbrains:")
  print("Artist: "+mbAlbum['artist-credit-phrase'])
  print("Album: "+mbAlbum['title'])
  whatAlbums = searchWhatAlbums([mbAlbum['title']+' '+mbAlbum['artist-credit-phrase'], artist+' '+album])
  if len(whatAlbums) == 0:
    whatAlbums = searchWhatAlbums([artist,album,mbAlbum['title'],mbAlbum['artist-credit-phrase']])
    if len(whatAlbums) == 0:
      return None
  whatAlbums = sorted(whatAlbums, key=(lambda x:
      Levenshtein.ratio(x['groupName'],mbAlbum['title'])
      +Levenshtein.ratio(x['groupName'].lower(),album.lower())*3/8
      +Levenshtein.ratio(x['artist'],mbAlbum['artist-credit-phrase'])
      +Levenshtein.ratio(x['artist'].lower(),artist.lower())*5/8),
    reverse=True)#[:min(10,len(whatAlbums))]
  whatAlbum = whatAlbums[0]
  whatAlbum['artist-credit-phrase'] = mbAlbum['artist-credit-phrase']
  if song is not None:
    whatAlbum['song'] = mbAlbum['song']
  print("For the album and artist found on musicbrainz, the following torrent group was found on what:")
  print("Artist: "+whatAlbum['artist'])
  print("Album: "+whatAlbum['groupName'])
  return whatAlbum
def get_mb_recording(collection_mbid, output_file):
    # Get the collection from musicbrainz and extract the recordings
    print "Retrieving information from mb collection: %s" % collection_mbid
    rec_list = []
    collection = mb.get_releases_in_collection(collection_mbid)
    for rel in collection["collection"]["release-list"]:
        rel_mb =  mb.get_release_by_id(rel['id'], includes=["recordings"])
        for i in rel_mb["release"]["medium-list"]:
            for track in i["track-list"]:
                rec = track['recording']['id']
                if rec not in rec_list:
                    rec_list.append(rec)

    # Get the recording from musicbrainz and extract makam, form and usul
    for rec_mbid in rec_list:
        work_rels = mb.get_recording_by_id(rec_mbid, includes=["tags", "work-rels"])
        rec_tags = []
        if "tag-list" in work_rels["recording"]:
            rec_tags = work_rels["recording"]["tag-list"]
        
        works = []
        if "work-relation-list" in work_rels["recording"]:
            works = work_rels["recording"]["work-relation-list"]
        for w in works:
            print "Extracting work information from MB: %s" %  w["work"]["id"]
            
            work_tags = []
            work = mb.get_work_by_id(w["work"]["id"], includes=["tags", "artist-rels"])
            if "tag-list" in work["work"]:
                work_tags = work["work"]["tag-list"] 
            
            mu2 = get_symbtrmu2(work["work"]["id"])

            # get alias for each tag 
            try:
                rec_makam, rec_usul, rec_form = get_tags(rec_tags)
                work_makam, work_usul, work_form = get_tags(work_tags)
                mu2_makam = get_fuzzy("makam", mu2["makam"])
                mu2_form = get_fuzzy("form", mu2["form"])
                mu2_usul = get_fuzzy("usul", mu2["usul"])
                
                # compare results of 3 sources
                makam, usul, form = (None, None, None)
                if mu2_makam and mu2_usul and mu2_form:
                    #There is mu2 file with makam usul and form

                    if mu2_makam == rec_makam and mu2_usul == rec_usul and mu2_form == rec_form:
                        if work_makam == rec_makam and work_usul == rec_usul and work_form == rec_form:
                            makam = work_makam
                            usul = work_usul
                            form = work_form
                        elif not work_makam and not work_usul and not work_form:
                            # If mb work has no tag we only consider information from mu2 and mb recording
                            makam = rec_makam
                            usul = rec_usul
                            form = rec_form
                    else:
                        print "There's a difference between mu2 file and mb recording information."
                        print "Recording form: %s usul: %s makam: %s" % (rec_form, rec_usul, rec_makam)
                        print "Mu2 form: %s usul: %s makam: %s" % (mu2_form, mu2_usul, mu2_makam)
                elif (not work_makam and not work_usul and not work_form) or \
                        (work_makam == rec_makam and work_usul == rec_usul and work_form == rec_form):
                    # If theres no mu2 file we only consider mb information
                    makam = rec_makam
                    usul = rec_usul
                    form = rec_form
                
                if makam and usul and form:
                    try:
                        update_mb_work(work["work"]["id"], makam, form, usul, output_file)
                    except ElementNotFoundException, e:
                        print "Couldn't generate link because element not present in MB"
            except AliasNotFoundException, e:
                 print "Skipping work because alias not found on Dunya"
	mbid_list.append(MBID_name)
	print MBID_name


musicbrainzngs.auth("meghanasudhindra", "musicbrains123")

musicbrainzngs.set_useragent("Dunya", "0.1")
musicbrainzngs.set_hostname("beta.musicbrainz.org")

MBID_Song = open("MBID_Song.txt", "w")
#recordings = []
recording_id = []
recording_title = []
#artist_id = "4cc5200e-a3f7-4d5d-8b15-9b10a8f9a9a2"
for name_artist in mbid_list:
    result = musicbrainzngs.get_recording_by_id(name_artist)
    print result['recording']['id']
    print result['recording']['title']
    recording_id.append(result['recording']['id'])
    recording_title.append(result['recording']['title'])

for i in range(len(recording_id)):
    MBID_Song.write(recording_id[i] + '\t' + recording_title[i] + '\n')
MBID_Song.close()






Exemple #47
0
def extractItemFromUri( url, options ):

    exp = re.compile(r'/(\w+)/(.*)')
    match = exp.search(url)

    if not match:
        WebExtractor.error('Error parsing url: ' + url)
        return

    extractType = match.group(1)
    puid = match.group(2)

    WebExtractor.log('fetch :' + extractType + ' with id :' + puid)

    if extractType == 'release':
        #TODO extract all tracks from this relese
        WebExtractor.error('Full Album extraction not implemented: ')
        return

        try:
            musicbrainzngs.get_release_by_id

        except Exception as err:
            WebExtractor.error("Script error: \n" + str(err))

    else:
        # extract just the single track

        try:
            # get_recording_by_id need authorization :/
            result = musicbrainzngs.get_recording_by_id(puid, includes=["artists", "artist-credits", "releases", "media", "tags"])

            recording = result['recording']

            trackNumber = ""
            releaseType = ""
            date = ""
            albumName = ""
            albumArtist = ""
            albumId = ""
            genre = ""
            trackPerformer = ""
            coverUrl = ""

            for person in recording['artist-credit']:
                if 'artist' in person:
                    if trackPerformer != "":
                        trackPerformer = trackPerformer + '; '

                    trackPerformer = trackPerformer + person['artist']['name']

            if 'tag-list' in recording:
                genre = ';'.join(tag['name'] for tag in recording['tag-list'])

            if 'release-list' in recording:
                albumRelese = recording['release-list'][0]
                if albumRelese is not None:
                    albumName = albumRelese['title']
                    albumId = albumRelese['id']
                    #albumArtist = albumRelese['artist-credit-phrase']
                    for person in albumRelese['artist-credit']:
                        if 'artist' in person:
                            if albumArtist != "":
                                albumArtist = albumArtist + '; '
                            albumArtist = albumArtist + person['artist']['name']

                if 'date' in albumRelese:
                    date = albumRelese['date']

                #if 'type' in albumRelese['release-group']:
                #    releaseType = albumRelese['release-group']['type']

                if albumRelese['medium-list'][0] is not None:
                    if 'track-list' in albumRelese['medium-list'][0]:
                        trackNumber = albumRelese['medium-list'][0]['track-list'][0]['number']

            # try to get cover from the coverartarchive
            url = 'http://coverartarchive.org/release/' + str(albumId)
            try:
                data = json.load(urllib2.urlopen(url))
                for item in data['images']:
                    if 'Front' in item['types']:
                        coverUrl = item['image']
                        break;
            except Exception as err:
                WebExtractor.log("Cover could not be retrieved from: \n" + url + "\n Reason: \n" + str(err))


            trackDict = dict (
                                title = recording['title'],
                                performer = trackPerformer,#recording['artist-credit-phrase'],
                                number = trackNumber,
                                releasedate = date,
                                genre = genre,
                                musicbrainz = recording['id'],
                                seealso = url
                            )

            albumDict  = dict (
                                title = albumName,
                                #trackCount = track.releases[0].getTracksCount(),
                                performer = albumArtist,
                                #genre = ';'.join(tag.value for tag in track.tags),
                                musicbrainz = albumId,
                                #releasetype = releaseType,
                                cover = coverUrl,
                                tracks = [trackDict]
                            )
            # this is a workaround, because multiple nested dictionaries cause some problems with the names of the keys
            #WebExtractor.itemResults( 'music', trackDict )
            data_string = json.dumps(albumDict)
            WebExtractor.itemResultsJSON( 'music', data_string )

        except Exception as err:
            WebExtractor.error("Script error: \n" + str(err))
Exemple #48
0
	def album(self, mbid):
		dbcfg = self.mc.get('database')
		dl = _mysql.connect(host=dbcfg['host'],user=dbcfg['username'],passwd=dbcfg['password'],db=dbcfg['database'])
		query = "select * from Albums where MBID='" + _mysql.escape_string(mbid) + "';"
		dl.query(query)
		ret = {}
		r = dl.store_result()
		c = r.num_rows()
		for i in range(0, c):
			dd = r.fetch_row(1,1)[0]
			ret = dd

		if len(ret) == 0:
			try:
				info = musicbrainzngs.get_release_by_id(mbid, includes=['artists', 'url-rels', 'recordings'])
			except:
				info = {}
			if 'release' in info:
				rinfo = info['release']
				trackstoadd = []

				if 'medium-list' in rinfo:
					for disc in rinfo['medium-list']:
						if not('track-list' in disc):
							continue
						for trackinfo in disc['track-list']:
							item = trackinfo['recording']
							if 'number' in trackinfo:
								item['tracknumber'] = trackinfo['number']
							if 'position' in trackinfo:
								item['tracknumber'] = trackinfo['position']
							mbinfo = musicbrainzngs.get_recording_by_id(item['id'], includes=['artists'])
							try:
								item['artist'] = mbinfo['recording']['artist-credit'][0]['artist']['id']
							except:
								item['artist'] = ''
							trackstoadd.append(item)

				ret['Title'] = ""
				ret['MBID'] = ""
				ret['ASIN'] = ""
				if 'title' in rinfo:
					ret['Title'] = rinfo['title'].encode('utf8', 'ignore')
				if 'id' in rinfo:
					ret['MBID'] = rinfo['id'].encode('utf8', 'ignore')
				if 'asin' in rinfo:
					ret['ASIN'] = rinfo['asin'].encode('utf8', 'ignore')
				try:
					ret['ReleaseDate'] = rinfo['release-event-list'][0]['date'].encode('utf8', 'ignore')
				except:
					ret['ReleaseDate'] = ''
				try:
					artist_mbid = rinfo['artist-credit'][0]['artist']['id'].encode('utf8', 'ignore')
				except:
					artist_mbid = ''
				artist_info = self.artist(artist_mbid)
				query = "select ID from Artists where MBID='" + artist_mbid + "';"
				artist_id = "0"
				dl.query(query)
				r = dl.store_result()
				if r.num_rows() > 0:
					dd = r.fetch_row(1,1)[0]
					artist_id = dd['ID']
				query = "insert ignore into Albums (MBID, Title, Artist, ASIN, ReleaseDate) values ('" + _mysql.escape_string(ret['MBID']) + "', '" + _mysql.escape_string(ret['Title']) + "', '" + _mysql.escape_string(artist_id) + "', '" + _mysql.escape_string(ret['ASIN']) + "', '" + _mysql.escape_string(ret['ReleaseDate']) + "');"
				ret = {}
				dl.query(query)
				query = "select * from Albums where MBID='" + _mysql.escape_string(mbid) + "';"
				dl.query(query)
				ret = {}
				r = dl.store_result()
				c = r.num_rows()
				for i in range(0, c):
					dd = r.fetch_row(1,1)[0]
					ret = dd

				if 'ID' in ret:
					for trackinfo in trackstoadd:
						query = "select ID from Artists where MBID='" + trackinfo['artist'] + "';"
						dl.query(query)
						r = dl.store_result()
						artist_id = '0'
						if r.num_rows() > 0:
							dd = r.fetch_row(1,1)[0]
							artist_id = dd['ID']
						if 'length' in trackinfo:
							track_length = (int(trackinfo['length']) / 1000)
						else:
							track_length = 0
						query = "insert ignore into Tracks (MBID, Title, Length, TrackNo, LastFM, Artist, Album)"
						query = query + " values ('" + _mysql.escape_string(trackinfo['id']) + "', '" + _mysql.escape_string(trackinfo['title'].encode('utf8', 'ignore')) + "', '" + str(track_length) + "', '" + _mysql.escape_string(trackinfo['tracknumber']) + "', '', '" + artist_id + "', '" + ret['ID'] + "');"
						dl.query(query)
		tracks = []
		if 'ID' in ret:
			aid = ret['ID']
		else:
			aid = '0'
		query = "select * from Tracks where Album='" + str(aid) + "' order by TrackNo"
		dl.query(query)
		r = dl.store_result()
		c = r.num_rows()
		for i in range(0, c):
			dd = r.fetch_row(1,1)[0]
			del dd['ID']
			del dd['Album']
			del dd['Artist']
			tracks.append(dd)
		ret['tracks'] = tracks
		if 'Artist' in ret:
			aid = ret['Artist']
			query = "select * from Artists where ID='" + str(aid) + "';"
			dl.query(query)
			r = dl.store_result()
			c = r.num_rows()
			if c > 0:
				ret['Artist'] = r.fetch_row(1,1)[0]
				if 'ID' in ret['Artist']:
					del ret['Artist']['ID']
			else:
				del ret['Artist']
		if 'ID' in ret:
			del ret['ID']

		return ret
Exemple #49
0
# Login
mb.auth(user_name, user_pass)

# Set up an app
mb.set_useragent(app_name, app_version, app_url)

# Sign a host engine to search from
mb.set_hostname(host_url)

#====================================================================
#>>>>>>>>>>>>>>>>>>>>>>>[ SEARCH API ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#====================================================================

# -----------[ Get By ID ]------------------

# Get an artist
id = 'e86ab653-bec8-46f3-b4b6-a1a866919ef6'
artist = mb.get_artist_by_id(id)['artist']
print('[ Artist Name ]:', artist['name'])

# Get an album (Release)
id = 'ccd708f2-06f5-43d4-8396-032dc7eb1883'
album = mb.get_release_by_id(id)['release']
print('[ Album Title ]:', album['title'])

# Get a track (Recording)
id = 'c216f892-e329-4986-9373-6d95660801d6'
track = mb.get_recording_by_id(id)['recording']
print('[ Track Title ]:', track['title'])
Exemple #50
0
def scrape(mbid):
    try:
        recording = mb.get_recording_by_id(mbid, includes=["artists", "releases", "tags"])
        
        # Recording title
        recording_name = recording["recording"]["title"]
        
        artists = []
        releases = []
        release_groups = []
        
        
        for item in recording["recording"]["artist-credit"]:
            # Condition to skip join-phrase in multi-artists recordings
            if isinstance(item, dict):
                
                # Recording artist info
                artist_id = item["artist"]["id"]
                artist_name = item["artist"]["name"]
                # Check for recording artist tag-list
                if "tag-list" in item["artist"]:
                    artist_tags = item["artist"]["tag-list"]
                    artists.append({"id": artist_id, "name": artist_name, "tag-list": artist_tags})
                else:
                    artists.append({"id": artist_id, "name": artist_name})
        
        
        for item in recording["recording"]["release-list"]:
            
            # Request for release info
            release = mb.get_release_by_id(item["id"], includes = ["artists", "release-groups", "tags"])
            
            
            # Release group info
            release_group_id = release["release"]["release-group"]["id"]
            release_group_title = release["release"]["release-group"]["title"]
            release_group_first_release_date = release["release"]["release-group"]["first-release-date"]
            
            release_artists = []
            
            for item2 in release["release"]["artist-credit"]:
                # Condition to skip join-phrase in multi-artists releases
                if isinstance(item2, dict):
                    # Release artist info
                    release_artist_id = item2["artist"]["id"]
                    release_artist_name = item2["artist"]["name"]
                    
                    # Check for artist tag-list
                    if "tag-list" in item2["artist"]:
                        release_artist_tags = item2["artist"]["tag-list"]
                        release_artists.append({"id": release_artist_id, "name": release_artist_name, "tag-list": release_artist_tags})
                    else:
                        release_artists.append({"id": release_artist_id, "name": release_artist_name})
            
            
            
            # Release group tags check and first-release-date
            if "tag-list" in release["release"]["release-group"]:
                release_group_tags = release["release"]["release-group"]["tag-list"]
                release_group = {"id": release_group_id, "title": release_group_title, "firs-release-date": release_group_first_release_date, "tag-list": release_group_tags}
            else:
                release_group = {"id": release_group_id, "title": release_group_title, "firs-release-date": release_group_first_release_date}
            
            # Check if release group already stored - eliminate dublicates
            if release_group not in release_groups:
                release_groups.append(release_group)
            
            
            # Check for release tag-list
            if "tag-list" in release["release"]:
                release_tags = release["release"]["tag-list"]
                releases.append({"id": item["id"], "title": item["title"], "artist": release_artists, "date": item["date"], "tag-list": release_tags})
            else:
                releases.append({"id": item["id"], "title": item["title"], "artist": release_artists, "date": item["date"]})


    except mb.MusicBrainzError as ex:
        raise
    
    # Final result based on the existance of recording tags
    if "tag-list" in recording["recording"]:
        recording_tags = recording["recording"]["tag-list"]
        result = {"title": recording_name, "artist": artists, "releases": releases, "realease-groups": release_groups, "tag-list": recording_tags}
    else:
        result = {"title": recording_name, "artist": artists, "releases": releases, "realease-groups": release_groups}
    
    return result
def get_works_from_recording(recording):
    rec = mb.get_recording_by_id(recording, includes=["work-rels"])["recording"]
    return rec.get("work-relation-list", [])
Exemple #52
0
def get_tags_from_recording(recording):
    rec = mb.get_recording_by_id(recording, includes=["tags"])["recording"]
    return rec.get("tag-list", [])
Exemple #53
0
def get_recording(mbid):
    try:
        rec = musicbrainzngs.get_recording_by_id(mbid, includes=["releases", "artists"])
        return rec["recording"]
    except musicbrainzngs.ResponseError:
        return {}
Exemple #54
0
def get_mb_recording(collection_mbid, output_file):
    global symbtrmu2_url, count_matched_mu2, count_missing_mu2, count_missing_dunya
    # Get the collection from musicbrainz and extract the recordings
    print("Retrieving information from mb collection: %s" % collection_mbid)
    res = {"mu2": [], "mb": []}

    rec_list = []
    collection = mb.get_releases_in_collection(collection_mbid)
    for rel in collection["collection"]["release-list"]:
        rel_mb =  mb.get_release_by_id(rel['id'], includes=["recordings"])
        for i in rel_mb["release"]["medium-list"]:
            for track in i["track-list"]:
                rec = track['recording']['id']
                if rec not in rec_list:
                    rec_list.append(rec)

    # Get the recording from musicbrainz and extract makam, form and usul
    for rec_mbid in rec_list:
        work_rels = mb.get_recording_by_id(rec_mbid, includes=["tags", "work-rels"])
        rec_tags = []
        if "tag-list" in work_rels["recording"]:
            rec_tags = work_rels["recording"]["tag-list"]

        works = []
        if "work-relation-list" in work_rels["recording"]:
            works = work_rels["recording"]["work-relation-list"]
        for w in works:
            print("Extracting work information from MB: %s" %  w["work"]["id"])
            
            work_tags = []
            work = mb.get_work_by_id(w["work"]["id"], includes=["tags", "artist-rels"])
            if "tag-list" in work["work"]:
                work_tags = work["work"]["tag-list"] 
            
            mu2 = get_symbtrmu2(work["work"]["id"])
            title = work["work"]["title"].encode("utf-8")

            # get alias for each tag 
            try:
                rec_makam, rec_usul, rec_form = get_tags(rec_tags)
                work_makam, work_usul, work_form = get_tags(work_tags)
                mu2_makam = get_fuzzy("makam", mu2["makam"])
                mu2_form = get_fuzzy("form", mu2["form"])
                mu2_usul = get_fuzzy("usul", mu2["usul"])

                # compare results of 3 sources
                makam, usul, form = (None, None, None)
                if mu2_makam and mu2_usul and mu2_form:
                    #There is mu2 file with makam usul and form
                    count_matched_mu2 += 1

                    if mu2_makam == rec_makam and mu2_usul == rec_usul and mu2_form == rec_form:
                        if work_makam == rec_makam and work_usul == rec_usul and work_form == rec_form:
                            makam = work_makam
                            usul = work_usul
                            form = work_form
                        elif not work_makam and not work_usul and not work_form:
                            # If mb work has no tag we only consider information from mu2 and mb recording
                            makam = rec_makam
                            usul = rec_usul
                            form = rec_form
                    else:
                        print("There's a difference between mu2 file and mb recording information.")
                        print("Recording form: %s usul: %s makam: %s" % (rec_form, rec_usul, rec_makam))
                        print("Mu2 form: %s usul: %s makam: %s" % (mu2_form, mu2_usul, mu2_makam))

                    if makam and usul and form:
                        try:
                            new_link = update_mb_work(work["work"]["id"], title, makam, form, usul, symbtrmu2_url % work["work"]["id"])
                            if new_link:
                                res['mu2'].append(new_link)
                        except ElementNotFoundException as e:
                            print("Couldn't generate link because element not present in MB")

                elif (not work_makam and not work_usul and not work_form) or \
                        (work_makam == rec_makam and work_usul == rec_usul and work_form == rec_form):
                    # If theres no mu2 file we only consider mb information
                    count_missing_mu2 += 1
                    if rec_makam and rec_usul and rec_form:
                        try:
                            new_link = update_mb_work(work["work"]["id"], title, rec_makam, rec_form, rec_usul, None)
                            res['mb'].append(new_link)
                        except ElementNotFoundException as e:
                            print("Couldn't generate link because element not present in MB")

            except AliasNotFoundException as e:
                count_missing_dunya += 1
                print("Skipping work because alias not found on Dunya")

    with open(output_file, "a+") as append_file:
        append_file.write("<h1> List of links generated from MU2 files information </h1>")
        for i in res['mu2']:
            append_file.write(i)
        append_file.write("<h1> List of links generated from recording tags </h1>")
        for i in res['mb']:
            append_file.write(i)

    print("Completed with missing mu2 files: %d, matched mu2 files: %d, missing on dunya: %d" % \
            (count_missing_mu2, count_matched_mu2, count_missing_dunya))
def addRecordData(recId, relId):
	relResult = musicbrainzngs.get_release_by_id(relId)
	recResult = musicbrainzngs.get_recording_by_id(recId)
	recordDictionary[recId] = {'date': relResult["release"]["date"], 'title': recResult["recording"]["title"]}
Exemple #56
0
    def match(self, obj):

        log = logging.getLogger('util.match.match')
        log.info('matching: %s' % obj.title)

        for r in obj.results_mb:
            print '--'
            #print r

            mb_id = r['id']
            print mb_id

            match, created = Match.objects.get_or_create(request=obj, mb_id=mb_id)

            includes = [
                'artists',
                'releases',
                'artist-credits',
                'release-rels',
                'release-group-rels',
                'artist-rels',
                'annotation',
                'discids',
                'label-rels',
                'work-rels',
                'recording-rels',
                'media',
                'isrcs',
                ]


            try:

                mr = musicbrainzngs.get_recording_by_id(id=mb_id, includes=includes)
                mr = mr['recording']

                # self.pp.pprint(mr)

                match.title = mr['title']

                # match data as json
                match.results_mb = mr

                match.artist = mr['artist-credit-phrase']


                if 'length' in mr:
                    match.duration = mr['length']


                # compose cretits string
                if 'artist-credit' in mr:
                    credits = ''
                    for c in mr['artist-credit']:

                        try:
                            astr = c['artist']['name']
                            credits += astr + "\n"
                        except:
                            pass
                    match.artist_credits = credits

                # compose secondary cretits string
                if 'artist-relation-list' in mr:
                    credits = ''
                    for c in mr['artist-relation-list']:

                        try:
                            astr = c['artist']['name']

                            astr = '%s - [%s: %s]' % (astr, c['type'], ', '.join(c['attribute-list']))

                            credits += astr + "\n"
                        except Exception, e:
                            print e
                            pass

                    match.artist_credits_secondary = credits

                if 'isrc-list' in mr:
                    self.pp.pprint(mr['isrc-list'])

                    try:
                        isrcs = "\n".join(mr['isrc-list'])
                        match.isrc_list = isrcs
                    except Exception, e:
                        print e
                        pass


                # compose release string
                if 'release-list' in mr:
                    releases = ''
                    for r in mr['release-list']:

                        """
                        print '*******************************'
                        self.pp.pprint(r)
                        print '*******************************'
                        """

                        includes = ['labels','release-rels', 'work-rels']




                        #mr = mr['recording']

                        try:
                            pass
                        except:
                            pass

                        try:
                            rstr = r['title']

                            rstr = '%s - [%s | %s]' % (rstr, r['country'], r['date'])



                            if 'medium-list' in r:
                                try:
                                    rstr += ' - %s - Track# %s' % (r['medium-list'][0]['format'], r['medium-list'][0]['track-list'][0]['number'])
                                except:
                                    pass


                            try:

                                tstr = ''

                                if 'label-info-list' in mrel:
                                    lil = mrel['label-info-list'][0]
                                    self.pp.pprint(lil)


                                    if 'label' in lil:
                                        tstr += ' %s ' % lil['label']['name']

                                        if 'label-code' in lil['label']:
                                            tstr += '(%s) ' % lil['label']['label-code']


                                    if 'catalog-number' in lil:
                                        tstr += 'catno: %s' % lil['catalog-number']



                                print '****'
                                print tstr

                                rstr += ' [ ' + tstr + ' ] '

                            except Exception, e:
                                print e
                                pass



                            try:
                                mrel = musicbrainzngs.get_release_by_id(id=r['id'], includes=includes)
                                mrel = mrel['release']
                                # self.pp.pprint(mrel)

                                rstr += ' [barcode: %s]' % (mrel['barcode'])


                            except:
                                pass




                            releases += rstr + "\n"
                        except Exception, e:
                            print e
                            pass