def get_MB_releases(self): if self.is_audio_cd: try: from musicbrainzngs import musicbrainz, ResponseError, NetworkError except ImportError as imperr: print "musicbrainzngs not available" self.error = (100, "Import error: musicbrainzngs not available", imperr) raise disc_id = self.get_MB_disc_id() """MBhost = "mm.musicbrainz.org" query = urllib.urlencode({ "id": disc_id, "toc": " ".join([str(value) for value in self.__MB_full_toc]), "tracks": self.num_tracks, }) print urlparse.urlunparse(("http", MBhost, "/bare/cdlookup.html", "", query, ""))""" try: musicbrainz.set_useragent("xaudiocopy", "0.02.1") except: print "MusicBrainz user agent error" self.error = (101, "MusicBrainz user agent error", "") raise # Scarica le release del disco in base al Disc ID try: releases = musicbrainz.get_releases_by_discid(disc_id, includes=["artists", "recordings", "release-groups", "labels"]) except ResponseError as reserr: if reserr.cause.code == 404: print "Disc not found.", reserr self.error = (int(reserr.cause.code), "Disc not found.", reserr) raise elif reserr.cause.code == 400: print "Bad request to the MusicBrainz server.", reserr self.error = (400, "Bad response from the MB server.", reserr) raise else: print "Bad response from the MusicBrainz server.", reserr self.error = (int(reserr.cause.code), "Bad response from the MB server.", reserr) raise except NetworkError as neterr: print "Network connection error.", neterr self.error = (402, "Network connection error.", neterr) raise """ Eccezione non gestita nella versione 0.2 di musicbrainzngs except AuthenticationError as auterr: print "Receved a HTTP 401 response while accessing a protected resource." self.error = (auterr, "Receved a HTTP 401 response while accessing a protected resource.", auterr) raise""" i = 0 # Lista che contiene tutte le release MB_releases = [] for release in releases['disc']['release-list']: #res = musicbrainz.get_release_by_id(release['id'], # includes=["artists", "artist-credits", "recordings", "discids"]) # Dizionario che contiene le informazioni di ogni release MB_release = { "artist" : "", "album-title" : "", "album-id" : "", "barcode" : "", "catalog" : [], "packaging" : "", "date" : "", "country" : "", "disc-id" : disc_id, } # Artista if release.get("artist-credit-phrase"): MB_release["artist"] = release["artist-credit-phrase"] # Titolo if release.get("title"): MB_release["album-title"] = release["title"] # MusicBrainz ID if release.get("id"): MB_release["album-id"] = release["id"] # Codice a barre EAN/UPC if release.get("barcode"): MB_release["barcode"] = release["barcode"] # Label e numero di catalogo (dizionari in una lista) if release.get("label-info-list"): for info in release["label-info-list"]: catalog = {"label" : "", "catalog-number" : ""} if info.get("label"): catalog["label"] = info["label"]["name"] if info.get("catalog-number"): catalog["catalog-number"] = info["catalog-number"] MB_release["catalog"].append(catalog) else: MB_release["catalog"].append({"label" : "", "catalog-number" : ""}) # Packaging if release.get("packaging"): MB_release["packaging"] = release["packaging"] # Data if release.get("date"): MB_release["date"] = release["date"] # Nazione if release.get("country"): MB_release["country"] = release["country"] # Aggiunge la release alla lista MB_releases.append(MB_release) # Stampa di prova for rel in MB_releases: i+=1 print print "RELEASE %d" % i keys = rel.keys() for k in keys: print '%s = %s' % (k,rel[k]) return MB_releases else: return None
def get_MB_tracks_from_release(self, MB_release): try: from musicbrainzngs import musicbrainz, ResponseError, NetworkError except ImportError as imperr: print "musicbrainzngs not available" self.error = ("100", "Import error", imperr) raise try: musicbrainz.set_useragent("xaudiocopy", "0.02.1") except: self.error(101, "User agent error", "") raise # Scarica la release del disco in base all'ID try: release = musicbrainz.get_release_by_id(MB_release["album-id"], includes=["artists", "recordings", "release-groups", "labels"]) except ResponseError as reserr: if reserr.cause.code == 404: print "Disc not found", reserr self.error = (int(reserr.cause.code), "Disc not found", reserr) raise else: print "Bad response from the MB server", reserr self.error = (int(reserr.cause.code), "Bad response from the MB server", reserr) raise except NetworkError as neterr: print "Network connection error", neterr self.error = (402, "Network connection error", neterr) raise """ Eccezione non gestita nella versione 0.2 di musicbrainzngs except AuthenticationError as auterr: print "Receved a HTTP 401 response while accessing a protected resource" self.error = (auterr, "Receved a HTTP 401 response while accessing a protected resource", auterr) raise""" print release # La release è un dict con dentro un altro dict "release" # TODO Esistono release che hanno altri elementi? release = release["release"] tracks_list = [] # Per ogni disco presente (se presente) trova quello giusto if release["id"] == MB_release["album-id"]: for medium in release["medium-list"]: for track in medium["track-list"]: # Dizionario con i tag della canzone self.track = { "track-number" : int(track["position"]), "title" : track["recording"]["title"], "artist" : release["artist-credit"][0]["artist"]["name"], "artist-sort-name" : release["artist-credit"][0]["artist"]["sort-name"], "album" : release["title"], "recording-id" : track["recording"]["id"], "album-id" : release["id"], "artist-id" : release["artist-credit"][0]["artist"]["id"], #"lenght" : track["recording"]["lenght"], "release" : MB_release, } tracks_list.append(self.track) # Stampa di prova i = 0 for t in tracks_list: i+=1 print print "TRACK %d" % i keys = t.keys() for k in keys: print '%s = %s' % (k,t[k]) return tracks_list
import requests_cache from musicbrainzngs import musicbrainz as mb from requests.adapters import HTTPAdapter mb.set_useragent('trompa', '0.1') session = requests_cache.CachedSession() adapter = HTTPAdapter(max_retries=5) session.mount("https://", adapter) session.mount("http://", adapter) VIAF_REL = 'e8571dcc-35d4-4e91-a577-a3382fd84460' WIKIDATA_REL = '689870a4-a1e4-4912-b17f-7b2664215698' IMSLP_REL = '8147b6a2-ad14-4ce7-8f0a-697f9a31f68f' # Indicates that an artist gwas the composer of a work COMPOSER_REL = 'd59d99ea-23d4-4a80-b066-edca32ee158f' # Indicates that a work is a subpart of another work PARTS_REL = 'ca8d3642-ce5f-49f8-91f2-125d72524e6a' def get_artist_from_musicbrainz(artist_mbid): """ """ artist = mb.get_artist_by_id(artist_mbid, includes=['artist-rels'])['artist'] return artist
import userprefs import utils import extradata import shutil from datetime import datetime from collections import defaultdict import progressbar import logging logging.basicConfig(level=logging.INFO) overWriteAll = False # Have to give an identity for musicbrainzngs mb.set_useragent( "python-musicbrainz-ngs-catalog", "0.1", "https://github.com/rlhelinski/musicbrainz-catalog/", ) # Get the XML parsing exceptions to catch. The behavior chnaged with Python 2.7 # and ElementTree 1.3. import xml.etree.ElementTree as etree from xml.parsers import expat if hasattr(etree, 'ParseError'): ETREE_EXCEPTIONS = (etree.ParseError, expat.ExpatError) else: ETREE_EXCEPTIONS = (expat.ExpatError) def releaseSortCmp(a, b): return unicode.lower(a[1]) < unicode.lower(b[1])
logger.info("Using Plex backend.") plex = PlexServer(settings['backends']['plex']['server_address'], settings['backends']['plex']['server_token']) music = plex.library.section(settings['backends']['plex']['music_library_section']) settings['musicLibrary'] = music.locations[0] logger.debug("Starting plex alert listener.") # plex.startAlertListener(listen) # TODO Fix alert listener # Login manager configuration logger.debug("Creating login manager.") login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'users.login' logger.debug("Setting musicbrainz useragent.") musicbrainz.set_useragent('Plex Music Viewer', '0.1', 'https://github.com/JakeStanger/Plex-Music-Viewer') # TODO Proper version management @app.errorhandler(404) def page_not_found(e, custom_message=None): logger.debug("Throwing error 404 (%s)" % custom_message or e) return render_template('error.html', code=str(404), message=custom_message or e) app.jinja_env.globals.update(throw_error=throw_error) # Support login via API @login_manager.request_loader def request_loader(req): # Attempt login via URL arg
def setUp(self): self.orig_opener = musicbrainzngs.compat.build_opener musicbrainz.set_useragent("test_client", "1.0") musicbrainz.auth("user", "password")
def __init__(self, cache, interact): DataProvider.__init__(self, ['artist', 'album'], cache, None, interact) mb.set_useragent('whatlastgenre', __version__, 'http://github.com/YetAnotherNerd/whatlastgenre')