Hello community, here is the log from the commit of package r128gain for openSUSE:Factory checked in at 2020-09-22 21:13:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/r128gain (Old) and /work/SRC/openSUSE:Factory/.r128gain.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "r128gain" Tue Sep 22 21:13:50 2020 rev:4 rq:835997 version:1.0.3 Changes: -------- --- /work/SRC/openSUSE:Factory/r128gain/r128gain.changes 2020-06-11 10:17:47.265678830 +0200 +++ /work/SRC/openSUSE:Factory/.r128gain.new.4249/r128gain.changes 2020-09-22 21:14:58.900128907 +0200 @@ -1,0 +2,7 @@ +Mon Sep 21 20:45:19 UTC 2020 - Martin Hauke <mar...@gmx.de> + +- Update to version 1.0.3: + * Fix race causing futures to be forgotten too early + * Read/write MP4 tags using lowercase key format (fixes #22) + +------------------------------------------------------------------- Old: ---- r128gain-1.0.2.tar.gz New: ---- r128gain-1.0.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ r128gain.spec ++++++ --- /var/tmp/diff_new_pack.Qzvn6W/_old 2020-09-22 21:15:00.012129879 +0200 +++ /var/tmp/diff_new_pack.Qzvn6W/_new 2020-09-22 21:15:00.016129882 +0200 @@ -18,7 +18,7 @@ Name: r128gain -Version: 1.0.2 +Version: 1.0.3 Release: 0 Summary: Fast audio loudness (ReplayGain / R128) scanner & tagger License: LGPL-2.0-only ++++++ r128gain-1.0.2.tar.gz -> r128gain-1.0.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/r128gain-1.0.2/r128gain/__init__.py new/r128gain-1.0.3/r128gain/__init__.py --- old/r128gain-1.0.2/r128gain/__init__.py 2020-06-08 01:23:45.000000000 +0200 +++ new/r128gain-1.0.3/r128gain/__init__.py 2020-09-21 21:44:01.000000000 +0200 @@ -2,7 +2,7 @@ """ Scan audio files and tag them with ReplayGain/R128 loudness metadata. """ -__version__ = "1.0.2" +__version__ = "1.0.3" __author__ = "desbma" __license__ = "LGPLv2" @@ -96,12 +96,6 @@ return r -def format_ffmpeg_filter(name, params): - """ Build a string to call a FFMpeg filter. """ - return "%s=%s" % (name, - ":".join("%s=%s" % (k, v) for k, v in params.items())) - - def get_r128_loudness(audio_filepaths, *, calc_peak=True, enable_ffmpeg_threading=True, ffmpeg_path=None, start_evt=None): """ Get R128 loudness loudness level and sample peak. """ @@ -391,11 +385,11 @@ isinstance(mf, mutagen.mp4.MP4)): # https://github.com/xbmc/xbmc/blob/9e855967380ef3a5d25718ff2e6db5e3dd2e2829/xbmc/music/tags/TagLoaderTagLib.cpp#L806-L812 if loudness is not None: - mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"] = mutagen.mp4.MP4FreeForm(("%.2f dB" % (RG2_REF_R128_LOUDNESS_DBFS - loudness)).encode()) - mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"] = mutagen.mp4.MP4FreeForm(("%.6f" % (peak)).encode()) + mf["----:com.apple.iTunes:replaygain_track_gain"] = mutagen.mp4.MP4FreeForm(("%.2f dB" % (RG2_REF_R128_LOUDNESS_DBFS - loudness)).encode()) + mf["----:com.apple.iTunes:replaygain_track_peak"] = mutagen.mp4.MP4FreeForm(("%.6f" % (peak)).encode()) if album_loudness is not None: - mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"] = mutagen.mp4.MP4FreeForm(("%.2f dB" % (RG2_REF_R128_LOUDNESS_DBFS - album_loudness)).encode()) - mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"] = mutagen.mp4.MP4FreeForm(("%.6f" % (album_peak)).encode()) + mf["----:com.apple.iTunes:replaygain_album_gain"] = mutagen.mp4.MP4FreeForm(("%.2f dB" % (RG2_REF_R128_LOUDNESS_DBFS - album_loudness)).encode()) + mf["----:com.apple.iTunes:replaygain_album_peak"] = mutagen.mp4.MP4FreeForm(("%.6f" % (album_peak)).encode()) else: raise RuntimeError("Unhandled '%s' tag format for file '%s'" % (mf.__class__.__name__, @@ -443,8 +437,8 @@ elif (isinstance(mf.tags, mutagen.mp4.MP4Tags) or isinstance(mf, mutagen.mp4.MP4)): - track = ("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN" in mf) and ("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK" in mf) - album = ("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN" in mf) and ("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK" in mf) + track = ("----:com.apple.iTunes:replaygain_track_gain" in mf) and ("----:com.apple.iTunes:replaygain_track_peak" in mf) + album = ("----:com.apple.iTunes:replaygain_album_gain" in mf) and ("----:com.apple.iTunes:replaygain_album_peak" in mf) else: logger().warning("Unhandled '%s' tag format for file %r" % (mf.__class__.__name__, @@ -598,10 +592,11 @@ # get results start_evt.set() pending_futures = futures + retained_futures = set() + while futures: done_futures, pending_futures = concurrent.futures.wait(pending_futures, return_when=concurrent.futures.FIRST_COMPLETED) - to_del_futures = set() for done_future in done_futures: other_dir_futures, _ = futures[done_future] @@ -610,16 +605,13 @@ # update progress progress.update(1) - # ignore futures already processed - if done_future in to_del_futures: - continue - # only tag when the whole directory is scanned - dir_futures = (done_future,) + other_dir_futures - if not all(f.done() for f in dir_futures): + if any(f not in retained_futures for f in other_dir_futures): + retained_futures.add(done_future) continue # get album filepaths + dir_futures = (done_future,) + other_dir_futures audio_filepaths = tuple(futures[f][1] for f in dir_futures if futures[f][1] != ALBUM_GAIN_KEY) # get analysis results for this directory @@ -673,12 +665,9 @@ e)) error_count += 1 - to_del_futures.add(done_future) - for f in other_dir_futures: - to_del_futures.add(f) - - for to_del_future in to_del_futures: - del futures[to_del_future] + retained_futures -= set(other_dir_futures) + for f in dir_futures: + del futures[f] executor.shutdown(True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/r128gain-1.0.2/r128gain/tqdm_logging.py new/r128gain-1.0.3/r128gain/tqdm_logging.py --- old/r128gain-1.0.2/r128gain/tqdm_logging.py 2020-06-08 01:23:45.000000000 +0200 +++ new/r128gain-1.0.3/r128gain/tqdm_logging.py 2020-09-21 21:44:01.000000000 +0200 @@ -1,12 +1,13 @@ -""" -Code to help using the logging module with tqdm progress bars. - -This not thread safe, and only works with single logging handlers. -""" +""" Code to help using the logging module with tqdm progress bars. """ import contextlib import logging +import threading + + +logging_handlers_lock = threading.Lock() + class TqdmLoggingHandler(logging.Handler): @@ -23,21 +24,25 @@ @contextlib.contextmanager def redirect_logging(tqdm_obj, logger=logging.getLogger()): - """ Context manager to redirect logging to a TqdmLoggingHandler object and then restore the original. """ - # remove current handler - assert(len(logger.handlers) == 1) - prev_handler = logger.handlers[0] - logger.removeHandler(prev_handler) - - # add tqdm handler - tqdm_handler = TqdmLoggingHandler(tqdm_obj) - if prev_handler.formatter is not None: - tqdm_handler.setFormatter(prev_handler.formatter) - logger.addHandler(tqdm_handler) + """ Context manager to redirect logging to a TqdmLoggingHandler object and then restore the original logging behavior. """ + with logging_handlers_lock: + # remove current handlers + prev_handlers = [] + for handler in logger.handlers.copy(): + prev_handlers.append(handler) + logger.removeHandler(handler) + + # add tqdm handler + tqdm_handler = TqdmLoggingHandler(tqdm_obj) + if prev_handlers[-1].formatter is not None: + tqdm_handler.setFormatter(prev_handlers[-1].formatter) + logger.addHandler(tqdm_handler) try: yield finally: - # restore handler - logger.removeHandler(tqdm_handler) - logger.addHandler(prev_handler) + # restore handlers + with logging_handlers_lock: + logger.removeHandler(tqdm_handler) + for handler in prev_handlers: + logger.addHandler(handler) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/r128gain-1.0.2/tests/__init__.py new/r128gain-1.0.3/tests/__init__.py --- old/r128gain-1.0.2/tests/__init__.py 2020-06-08 01:23:45.000000000 +0200 +++ new/r128gain-1.0.3/tests/__init__.py 2020-09-21 21:44:01.000000000 +0200 @@ -291,18 +291,18 @@ if delete_tags: mf = mutagen.File(self.m4a_filepath) - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN", mf) - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_track_gain", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_track_peak", mf) r128gain.tag(self.m4a_filepath, loudness, peak) mf = mutagen.File(self.m4a_filepath) self.assertIsInstance(mf.tags, mutagen.mp4.MP4Tags) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_gain"][0]).decode(), "%.2f dB" % (expected_track_gain_rg2)) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_peak"][0]).decode(), "%.6f" % (peak)) if delete_tags: @@ -425,26 +425,26 @@ mf = mutagen.File(self.m4a_filepath) self.assertIsInstance(mf.tags, mutagen.mp4.MP4Tags) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_gain"][0]).decode(), "%.2f dB" % (ref_loudness_rg2 - self.ref_levels[self.m4a_filepath][0])) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_peak"][0]).decode(), "%.6f" % (self.ref_levels[self.m4a_filepath][1])) if album_gain: - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_gain"][0]).decode(), "%.2f dB" % (ref_loudness_rg2 - self.ref_levels[r128gain.ALBUM_GAIN_KEY][0])) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_peak"][0]).decode(), "%.6f" % (self.ref_levels[self.max_peak_filepath][1])) elif i == 0: - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_peak", mf) mf = mutagen.File(self.flac_filepath) self.assertIsInstance(mf.tags, mutagen._vorbis.VComment) @@ -608,27 +608,27 @@ mf = mutagen.File(self.m4a_filepath) self.assertIsInstance(mf.tags, mutagen.mp4.MP4Tags) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_gain"][0]).decode(), "%.2f dB" % (ref_loudness_rg2 - self.ref_levels[self.m4a_filepath][0])) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_peak"][0]).decode(), "%.6f" % (self.ref_levels[self.m4a_filepath][1])) if album_gain: - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"]), 1) - self.assertValidGainStr(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"][0]).decode(), 2) - self.assertGainStrAlmostEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_gain"]), 1) + self.assertValidGainStr(bytes(mf["----:com.apple.iTunes:replaygain_album_gain"][0]).decode(), 2) + self.assertGainStrAlmostEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_gain"][0]).decode(), ref_loudness_rg2 - self.ref_levels[r128gain.ALBUM_GAIN_KEY][0]) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_peak"][0]).decode(), "%.6f" % (self.ref_levels[self.max_peak_filepath][1])) elif i == 0: - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_peak", mf) mf = mutagen.File(self.flac_filepath) self.assertIsInstance(mf.tags, mutagen._vorbis.VComment) @@ -727,26 +727,26 @@ mf = mutagen.File(album2_m4a_filepath) self.assertIsInstance(mf.tags, mutagen.mp4.MP4Tags) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_gain"][0]).decode(), "%.2f dB" % (ref_loudness_rg2 - self.ref_levels[self.m4a_filepath][0])) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_TRACK_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_track_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_track_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_track_peak"][0]).decode(), "%.6f" % (self.ref_levels[self.m4a_filepath][1])) if album_gain: - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_gain"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_gain"][0]).decode(), "%.2f dB" % (ref_loudness_rg2 - ref_levels_dir2[0])) - self.assertIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) - self.assertEqual(len(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"]), 1) - self.assertEqual(bytes(mf["----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK"][0]).decode(), + self.assertIn("----:com.apple.iTunes:replaygain_album_peak", mf) + self.assertEqual(len(mf["----:com.apple.iTunes:replaygain_album_peak"]), 1) + self.assertEqual(bytes(mf["----:com.apple.iTunes:replaygain_album_peak"][0]).decode(), "%.6f" % (ref_levels_dir2[1])) elif i == 0: - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_GAIN", mf) - self.assertNotIn("----:COM.APPLE.ITUNES:REPLAYGAIN_ALBUM_PEAK", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_gain", mf) + self.assertNotIn("----:com.apple.iTunes:replaygain_album_peak", mf) def test_oggopus_output_gain(self): # non opus formats should not be parsed successfully