From e2e8676e4db3e727cebc98a0d4a249c28d6de1e0 Mon Sep 17 00:00:00 2001 From: Eshan Singh Date: Sat, 30 Dec 2017 10:55:52 +0000 Subject: [PATCH 1/3] Enable connecting to a custom MusicBrainz server Under the new [musicbrainz] section in the config, you can set a server to connect to. Closes #172. --- README.md | 3 +++ whipper/command/main.py | 3 ++- whipper/common/config.py | 9 +++++++++ whipper/image/table.py | 4 ++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8c7db11..c9248ff 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,9 @@ The possible sections are: - Main section: `[main]` - `path_filter_fat`: whether to filter path components for FAT file systems - `path_filter_special`: whether to filter path components for special characters + +- MusicBrainz section: `[musicbrainz]` + - `server`: the MusicBrainz server to connect to, in `host:[port]` format. Defaults to `musicbrainz.org`. - Drive section: `[drive:IDENTIFIER]`, one for each configured drive. All these values are probed by whipper and should not be edited by hand. - `defeats_cache`: whether this drive can defeat the audio cache diff --git a/whipper/command/main.py b/whipper/command/main.py index 6e02547..88af530 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -10,7 +10,7 @@ import whipper from whipper.command import cd, offset, drive, image, accurip, debug from whipper.command.basecommand import BaseCommand -from whipper.common import common, directory +from whipper.common import common, directory, config from whipper.extern.task import task from whipper.program.utils import eject_device @@ -22,6 +22,7 @@ def main(): # set user agent musicbrainzngs.set_useragent("whipper", whipper.__version__, "https://github.com/JoeLametta/whipper") + musicbrainzngs.set_hostname(config.Config().get_musicbrainz_server()) # register plugins with pkg_resources distributions, _ = pkg_resources.working_set.find_plugins( pkg_resources.Environment([directory.data_path('plugins')]) diff --git a/whipper/common/config.py b/whipper/common/config.py index 30cdbea..4ff75e9 100644 --- a/whipper/common/config.py +++ b/whipper/common/config.py @@ -21,9 +21,11 @@ import ConfigParser import codecs import os.path +import re import shutil import tempfile import urllib +from urlparse import urlparse from whipper.common import directory @@ -72,6 +74,13 @@ class Config: def getboolean(self, section, option): return self._getter('boolean', section, option) + # musicbrainz section + + def get_musicbrainz_server(self): + server = self.get('musicbrainz', 'server') or 'musicbrainz.org' + server_url = server if re.match(r'^\D*//', server) else '//' + server + return urlparse(server_url).netloc + # drive sections def setReadOffset(self, vendor, model, release, offset): diff --git a/whipper/image/table.py b/whipper/image/table.py index 28dd04e..7761781 100644 --- a/whipper/image/table.py +++ b/whipper/image/table.py @@ -28,7 +28,7 @@ import urlparse import whipper -from whipper.common import common +from whipper.common import common, config import logging logger = logging.getLogger(__name__) @@ -390,7 +390,7 @@ class Table(object): return result def getMusicBrainzSubmitURL(self): - host = 'musicbrainz.org' + host = config.Config().get_musicbrainz_server() discid = self.getMusicBrainzDiscId() values = self._getMusicBrainzValues() From 04c25ca6448e0ceda1c3bdb7a2b4b80e207e5469 Mon Sep 17 00:00:00 2001 From: Eshan Singh Date: Thu, 4 Jan 2018 04:43:20 +0000 Subject: [PATCH 2/3] Add tests for get_musicbrainz_server --- whipper/test/test_common_config.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/whipper/test/test_common_config.py b/whipper/test/test_common_config.py index 26035fb..74f19a0 100644 --- a/whipper/test/test_common_config.py +++ b/whipper/test/test_common_config.py @@ -66,3 +66,26 @@ class ConfigTestCase(tcommon.TestCase): defeats = self._config.getDefeatsCache( 'PLEXTOR ', 'DVDR PX-L890SA', '1.05') self.assertEquals(defeats, True) + + def test_get_musicbrainz_server(self): + self.assertEquals(self._config.get_musicbrainz_server(), + 'musicbrainz.org', + msg='Default value is correct') + + self._config._parser.add_section('musicbrainz') + + self._config._parser.set('musicbrainz', 'server', + '192.168.2.141:5000') + self._config.write() + self.assertEquals(self._config.get_musicbrainz_server(), + '192.168.2.141:5000', + msg='Correctly returns user-set value') + + self._config._parser.set('musicbrainz', 'server', + '192.168.2.141:5000/hello/world') + self._config.write() + self.assertEquals(self._config.get_musicbrainz_server(), + '192.168.2.141:5000', + msg='Correctly strips out path after port number') + + self._config._parser.remove_section('musicbrainz') From 7d154a3cfecf58595d7a3ca97a12575c029a6f6d Mon Sep 17 00:00:00 2001 From: Eshan Singh Date: Fri, 5 Jan 2018 10:46:36 +0000 Subject: [PATCH 3/3] Refuse any url with a scheme or path --- whipper/command/main.py | 9 ++++++++- whipper/common/config.py | 7 ++++--- whipper/test/test_common_config.py | 9 ++++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/whipper/command/main.py b/whipper/command/main.py index 88af530..04530c3 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -22,7 +22,14 @@ def main(): # set user agent musicbrainzngs.set_useragent("whipper", whipper.__version__, "https://github.com/JoeLametta/whipper") - musicbrainzngs.set_hostname(config.Config().get_musicbrainz_server()) + + try: + server = config.Config().get_musicbrainz_server() + except KeyError, e: + sys.stderr.write('whipper: %s\n' % e.message) + sys.exit() + + musicbrainzngs.set_hostname(server) # register plugins with pkg_resources distributions, _ = pkg_resources.working_set.find_plugins( pkg_resources.Environment([directory.data_path('plugins')]) diff --git a/whipper/common/config.py b/whipper/common/config.py index 4ff75e9..2b7f7cb 100644 --- a/whipper/common/config.py +++ b/whipper/common/config.py @@ -21,7 +21,6 @@ import ConfigParser import codecs import os.path -import re import shutil import tempfile import urllib @@ -78,8 +77,10 @@ class Config: def get_musicbrainz_server(self): server = self.get('musicbrainz', 'server') or 'musicbrainz.org' - server_url = server if re.match(r'^\D*//', server) else '//' + server - return urlparse(server_url).netloc + server_url = urlparse('//' + server) + if server_url.scheme != '' or server_url.path != '': + raise KeyError('Invalid MusicBrainz server: %s' % server) + return server # drive sections diff --git a/whipper/test/test_common_config.py b/whipper/test/test_common_config.py index 74f19a0..cdfdbf2 100644 --- a/whipper/test/test_common_config.py +++ b/whipper/test/test_common_config.py @@ -84,8 +84,11 @@ class ConfigTestCase(tcommon.TestCase): self._config._parser.set('musicbrainz', 'server', '192.168.2.141:5000/hello/world') self._config.write() - self.assertEquals(self._config.get_musicbrainz_server(), - '192.168.2.141:5000', - msg='Correctly strips out path after port number') + self.assertRaises(KeyError, self._config.get_musicbrainz_server) + + self._config._parser.set('musicbrainz', 'server', + 'http://192.168.2.141:5000') + self._config.write() + self.assertRaises(KeyError, self._config.get_musicbrainz_server) self._config._parser.remove_section('musicbrainz')