diff --git a/beets/art.py b/beets/art.py index 979a6f722..84c3a02d5 100644 --- a/beets/art.py +++ b/beets/art.py @@ -60,8 +60,8 @@ def embed_item(log, item, imagepath, maxwidth=None, itempath=None, log.info(u'Image not similar; skipping.') return if ifempty and get_art(log, item): - log.info(u'media file already contained art') - return + log.info(u'media file already contained art') + return if maxwidth and not as_album: imagepath = resize_image(log, imagepath, maxwidth) diff --git a/beets/autotag/__init__.py b/beets/autotag/__init__.py index 90d294c61..a71b9b0a6 100644 --- a/beets/autotag/__init__.py +++ b/beets/autotag/__init__.py @@ -142,34 +142,46 @@ def apply_metadata(album_info, mapping): # Compilation flag. item.comp = album_info.va - # Miscellaneous metadata. - for field in ('albumtype', - 'label', - 'asin', - 'catalognum', - 'script', - 'language', - 'country', - 'albumstatus', - 'albumdisambig', - 'releasegroupdisambig', - 'data_source',): - value = getattr(album_info, field) - if value is not None: - item[field] = value - if track_info.disctitle is not None: - item.disctitle = track_info.disctitle - - if track_info.media is not None: - item.media = track_info.media - - if track_info.lyricist is not None: - item.lyricist = track_info.lyricist - if track_info.composer is not None: - item.composer = track_info.composer - if track_info.composer_sort is not None: - item.composer_sort = track_info.composer_sort - if track_info.arranger is not None: - item.arranger = track_info.arranger - + # Track alt. item.track_alt = track_info.track_alt + + # Miscellaneous/nullable metadata. + misc_fields = { + 'album': ( + 'albumtype', + 'label', + 'asin', + 'catalognum', + 'script', + 'language', + 'country', + 'albumstatus', + 'albumdisambig', + 'releasegroupdisambig', + 'data_source', + ), + 'track': ( + 'disctitle', + 'lyricist', + 'media', + 'composer', + 'composer_sort', + 'arranger', + ) + } + + # Don't overwrite fields with empty values unless the + # field is explicitly allowed to be overwritten + for field in misc_fields['album']: + clobber = field in config['overwrite_null']['album'].as_str_seq() + value = getattr(album_info, field) + if value is None and not clobber: + continue + item[field] = value + + for field in misc_fields['track']: + clobber = field in config['overwrite_null']['track'].as_str_seq() + value = getattr(track_info, field) + if value is None and not clobber: + continue + item[field] = value diff --git a/beets/config_default.yaml b/beets/config_default.yaml index 26babde55..cf9ae6bf9 100644 --- a/beets/config_default.yaml +++ b/beets/config_default.yaml @@ -53,6 +53,9 @@ aunique: disambiguators: albumtype year label catalognum albumdisambig releasegroupdisambig bracket: '[]' +overwrite_null: + album: [] + track: [] plugins: [] pluginpath: [] diff --git a/beetsplug/discogs.py b/beetsplug/discogs.py index eeb87d311..5b11b9617 100644 --- a/beetsplug/discogs.py +++ b/beetsplug/discogs.py @@ -286,7 +286,7 @@ class DiscogsPlugin(BeetsPlugin): if va: artist = config['va_name'].as_str() if catalogno == 'none': - catalogno = None + catalogno = None # Explicitly set the `media` for the tracks, since it is expected by # `autotag.apply_metadata`, and set `medium_total`. for track in tracks: diff --git a/beetsplug/filefilter.py b/beetsplug/filefilter.py index 23dac5746..ea521d5f6 100644 --- a/beetsplug/filefilter.py +++ b/beetsplug/filefilter.py @@ -43,8 +43,8 @@ class FileFilterPlugin(BeetsPlugin): bytestring_path(self.config['album_path'].get())) if 'singleton_path' in self.config: - self.path_singleton_regex = re.compile( - bytestring_path(self.config['singleton_path'].get())) + self.path_singleton_regex = re.compile( + bytestring_path(self.config['singleton_path'].get())) def import_task_created_event(self, session, task): if task.items and len(task.items) > 0: diff --git a/beetsplug/hook.py b/beetsplug/hook.py index b6270fd50..de44c1b81 100644 --- a/beetsplug/hook.py +++ b/beetsplug/hook.py @@ -91,28 +91,28 @@ class HookPlugin(BeetsPlugin): def create_and_register_hook(self, event, command): def hook_function(**kwargs): - if command is None or len(command) == 0: - self._log.error('invalid command "{0}"', command) - return + if command is None or len(command) == 0: + self._log.error('invalid command "{0}"', command) + return - # Use a string formatter that works on Unicode strings. - if six.PY2: - formatter = CodingFormatter(arg_encoding()) - else: - formatter = string.Formatter() + # Use a string formatter that works on Unicode strings. + if six.PY2: + formatter = CodingFormatter(arg_encoding()) + else: + formatter = string.Formatter() - command_pieces = shlex_split(command) + command_pieces = shlex_split(command) - for i, piece in enumerate(command_pieces): - command_pieces[i] = formatter.format(piece, event=event, - **kwargs) + for i, piece in enumerate(command_pieces): + command_pieces[i] = formatter.format(piece, event=event, + **kwargs) - self._log.debug(u'running command "{0}" for event {1}', - u' '.join(command_pieces), event) + self._log.debug(u'running command "{0}" for event {1}', + u' '.join(command_pieces), event) - try: - subprocess.Popen(command_pieces).wait() - except OSError as exc: - self._log.error(u'hook for {0} failed: {1}', event, exc) + try: + subprocess.Popen(command_pieces).wait() + except OSError as exc: + self._log.error(u'hook for {0} failed: {1}', event, exc) self.register_listener(event, hook_function) diff --git a/beetsplug/ipfs.py b/beetsplug/ipfs.py index 9a9d6aa50..90ba5fdd0 100644 --- a/beetsplug/ipfs.py +++ b/beetsplug/ipfs.py @@ -32,6 +32,7 @@ class IPFSPlugin(BeetsPlugin): super(IPFSPlugin, self).__init__() self.config.add({ 'auto': True, + 'nocopy': False, }) if self.config['auto']: @@ -116,7 +117,10 @@ class IPFSPlugin(BeetsPlugin): self._log.info('Adding {0} to ipfs', album_dir) - cmd = "ipfs add -q -r".split() + if self.config['nocopy']: + cmd = "ipfs add --nocopy -q -r".split() + else: + cmd = "ipfs add -q -r".split() cmd.append(album_dir) try: output = util.command_output(cmd).split() @@ -174,7 +178,10 @@ class IPFSPlugin(BeetsPlugin): with tempfile.NamedTemporaryFile() as tmp: self.ipfs_added_albums(lib, tmp.name) try: - cmd = "ipfs add -q ".split() + if self.config['nocopy']: + cmd = "ipfs add --nocopy -q ".split() + else: + cmd = "ipfs add -q ".split() cmd.append(tmp.name) output = util.command_output(cmd) except (OSError, subprocess.CalledProcessError) as err: diff --git a/beetsplug/replaygain.py b/beetsplug/replaygain.py index 868800d9b..dba1f6baa 100644 --- a/beetsplug/replaygain.py +++ b/beetsplug/replaygain.py @@ -949,10 +949,10 @@ class ReplayGainPlugin(BeetsPlugin): if (any([self.should_use_r128(item) for item in album.items()]) and not all(([self.should_use_r128(item) for item in album.items()]))): - raise ReplayGainError( - u"Mix of ReplayGain and EBU R128 detected" - u" for some tracks in album {0}".format(album) - ) + raise ReplayGainError( + u"Mix of ReplayGain and EBU R128 detected" + u" for some tracks in album {0}".format(album) + ) if any([self.should_use_r128(item) for item in album.items()]): if self.r128_backend_instance == '': diff --git a/beetsplug/subsonicupdate.py b/beetsplug/subsonicupdate.py index 93c47e2de..bb9e8a952 100644 --- a/beetsplug/subsonicupdate.py +++ b/beetsplug/subsonicupdate.py @@ -78,7 +78,7 @@ class SubsonicUpdate(BeetsPlugin): 'v': '1.15.0', # Subsonic 6.1 and newer. 'c': 'beets' } - if contextpath is '/': + if contextpath == '/': contextpath = '' url = "http://{}:{}{}/rest/startScan".format(host, port, contextpath) response = requests.post(url, params=payload) diff --git a/docs/changelog.rst b/docs/changelog.rst index b896604c2..9cab4a1e0 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -63,6 +63,8 @@ New features: provider: you can match tracks and albums using the Spotify database. Thanks to :user:`rhlahuja`. :bug:`3123` +* :doc:`/plugins/ipfs`: The plugin now supports a ``nocopy`` option which passes that flag to ipfs. + Thanks to :user:`wildthyme`. Changes: diff --git a/docs/plugins/ipfs.rst b/docs/plugins/ipfs.rst index a9b5538df..141143ae7 100644 --- a/docs/plugins/ipfs.rst +++ b/docs/plugins/ipfs.rst @@ -70,3 +70,5 @@ Configuration The ipfs plugin will automatically add imported albums to ipfs and add those hashes to the database. This can be turned off by setting the ``auto`` option in the ``ipfs:`` section of the config to ``no``. + +If the setting ``nocopy`` is true (defaults false) then the plugin will pass the ``--nocopy`` option when adding things to ipfs. If the filestore option of ipfs is enabled this will mean files are neither removed from beets nor copied somewhere else. diff --git a/docs/reference/config.rst b/docs/reference/config.rst index 57cb6c295..684dea20c 100644 --- a/docs/reference/config.rst +++ b/docs/reference/config.rst @@ -303,6 +303,7 @@ The defaults look like this:: See :ref:`aunique` for more details. + .. _terminal_encoding: terminal_encoding diff --git a/tox.ini b/tox.ini index 154cd7655..eeacf2af5 100644 --- a/tox.ini +++ b/tox.ini @@ -31,7 +31,7 @@ deps = flake8-coding flake8-future-import flake8-blind-except - pep8-naming + pep8-naming~=0.7.0 files = beets beetsplug beet test setup.py docs [testenv]