Hello community, here is the log from the commit of package python-pymediainfo for openSUSE:Factory checked in at 2019-09-23 12:34:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pymediainfo (Old) and /work/SRC/openSUSE:Factory/.python-pymediainfo.new.7948 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pymediainfo" Mon Sep 23 12:34:04 2019 rev:6 rq:731753 version:4.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pymediainfo/python-pymediainfo.changes 2019-09-16 10:52:47.799153625 +0200 +++ /work/SRC/openSUSE:Factory/.python-pymediainfo.new.7948/python-pymediainfo.changes 2019-09-23 12:37:50.473605778 +0200 @@ -1,0 +2,7 @@ +Wed Sep 18 14:25:50 UTC 2019 - Luigi Baldoni <[email protected]> + +- Update to version 4.1 + * Added an argument to pass custom options to the parse method + (#71) + +------------------------------------------------------------------- Old: ---- pymediainfo-4.0.tar.gz New: ---- pymediainfo-4.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pymediainfo.spec ++++++ --- /var/tmp/diff_new_pack.NtJifU/_old 2019-09-23 12:37:50.845605716 +0200 +++ /var/tmp/diff_new_pack.NtJifU/_new 2019-09-23 12:37:50.849605716 +0200 @@ -16,9 +16,8 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-pymediainfo -Version: 4.0 +Version: 4.1 Release: 0 Summary: Python wrapper for the mediainfo library License: MIT ++++++ pymediainfo-4.0.tar.gz -> pymediainfo-4.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/PKG-INFO new/pymediainfo-4.1/PKG-INFO --- old/pymediainfo-4.0/PKG-INFO 2019-04-04 17:46:38.000000000 +0200 +++ new/pymediainfo-4.1/PKG-INFO 2019-09-18 14:58:03.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymediainfo -Version: 4.0 +Version: 4.1 Summary: A Python wrapper for the mediainfo library. Home-page: https://github.com/sbraz/pymediainfo Author: Louis Sautier diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/appveyor.yml new/pymediainfo-4.1/appveyor.yml --- old/pymediainfo-4.0/appveyor.yml 2019-04-04 17:46:33.000000000 +0200 +++ new/pymediainfo-4.1/appveyor.yml 2019-09-18 14:57:58.000000000 +0200 @@ -1,5 +1,5 @@ environment: - MEDIAINFO_VERSION: 18.12 + MEDIAINFO_VERSION: 19.09 TWINE_PASSWORD: secure: /EO8CxTxhQVNsGNZZvU51jjHwPW524rgddNlwOAyLoA= matrix: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/pymediainfo/__init__.py new/pymediainfo-4.1/pymediainfo/__init__.py --- old/pymediainfo-4.0/pymediainfo/__init__.py 2019-04-04 17:46:33.000000000 +0200 +++ new/pymediainfo-4.1/pymediainfo/__init__.py 2019-09-18 14:57:58.000000000 +0200 @@ -5,6 +5,7 @@ import json import ctypes import sys +import warnings from pkg_resources import get_distribution, DistributionNotFound import xml.etree.ElementTree as ET @@ -199,7 +200,11 @@ lib.MediaInfo_Delete.restype = None lib.MediaInfo_Close.argtypes = [ctypes.c_void_p] lib.MediaInfo_Close.restype = None - return lib + # Obtain the library version + lib_version_str = lib.MediaInfo_Option(None, "Info_Version", "") + lib_version_str = re.search(r"^MediaInfoLib - v(\S+)", lib_version_str).group(1) + lib_version = tuple(int(_) for _ in lib_version_str.split(".")) + return (lib, lib_version_str, lib_version) except OSError: # If we've tried all possible filenames if i == len(library_names): @@ -219,7 +224,7 @@ @classmethod def parse(cls, filename, library_file=None, cover_data=False, encoding_errors="strict", parse_speed=0.5, text=False, - full=True, legacy_stream_display=False): + full=True, legacy_stream_display=False, mediainfo_options=None): """ Analyze a media file using libmediainfo. If libmediainfo is located in a non-standard location, the `library_file` parameter can be used: @@ -243,6 +248,8 @@ :param bool full: display additional tags, including computer-readable values for sizes and durations. :param bool legacy_stream_display: display additional information about streams. + :param dict mediainfo_options: additional options that will be passed to the `MediaInfo_Option` function, + for example: ``{"Language": "raw"}`` :type filename: str or pathlib.Path :rtype: str if `text` is ``True``. :rtype: :class:`MediaInfo` otherwise. @@ -253,7 +260,7 @@ :raises RuntimeError: if parsing fails, this should not happen unless libmediainfo itself fails. """ - lib = cls._get_library(library_file) + lib, lib_version_str, lib_version = cls._get_library(library_file) if pathlib is not None and isinstance(filename, pathlib.PurePath): filename = str(filename) url = False @@ -265,9 +272,8 @@ # Test whether the file is readable with open(filename, "rb"): pass - # Obtain the library version - lib_version = lib.MediaInfo_Option(None, "Info_Version", "") - lib_version = tuple(int(_) for _ in re.search("^MediaInfoLib - v(\\S+)", lib_version).group(1).split(".")) + # Create a MediaInfo handle + handle = lib.MediaInfo_New() # The XML option was renamed starting with version 17.10 if lib_version >= (17, 10): xml_option = "OLDXML" @@ -275,10 +281,8 @@ xml_option = "XML" # Cover_Data is not extracted by default since version 18.03 # See https://github.com/MediaArea/MediaInfoLib/commit/d8fd88a1c282d1c09388c55ee0b46029e7330690 - if cover_data and lib_version >= (18, 3): - lib.MediaInfo_Option(None, "Cover_Data", "base64") - # Create a MediaInfo handle - handle = lib.MediaInfo_New() + if lib_version >= (18, 3): + lib.MediaInfo_Option(handle, "Cover_Data", "base64" if cover_data else "") lib.MediaInfo_Option(handle, "CharSet", "UTF-8") # Fix for https://github.com/sbraz/pymediainfo/issues/22 # Python 2 does not change LC_CTYPE @@ -286,14 +290,28 @@ if (sys.version_info < (3,) and os.name == "posix" and locale.getlocale() == (None, None)): locale.setlocale(locale.LC_CTYPE, locale.getdefaultlocale()) - lib.MediaInfo_Option(None, "Inform", "" if text else xml_option) - lib.MediaInfo_Option(None, "Complete", "1" if full else "") - lib.MediaInfo_Option(None, "ParseSpeed", str(parse_speed)) - lib.MediaInfo_Option(None, "LegacyStreamDisplay", "1" if legacy_stream_display else "") + lib.MediaInfo_Option(handle, "Inform", "" if text else xml_option) + lib.MediaInfo_Option(handle, "Complete", "1" if full else "") + lib.MediaInfo_Option(handle, "ParseSpeed", str(parse_speed)) + lib.MediaInfo_Option(handle, "LegacyStreamDisplay", "1" if legacy_stream_display else "") + if mediainfo_options is not None: + if lib_version < (19, 9): + warnings.warn("This version of MediaInfo ({}) does not support resetting all options to their default values, " + "passing it custom options is not recommended and may result in unpredictable behavior, " + "see https://github.com/MediaArea/MediaInfoLib/issues/1128".format(lib_version_str), + RuntimeWarning + ) + for option_name, option_value in mediainfo_options.items(): + lib.MediaInfo_Option(handle, option_name, option_value) if lib.MediaInfo_Open(handle, filename) == 0: raise RuntimeError("An eror occured while opening {}" " with libmediainfo".format(filename)) output = lib.MediaInfo_Inform(handle, 0) + # Reset all options to their defaults so that they aren't + # retained when the parse method is called several times + # https://github.com/MediaArea/MediaInfoLib/issues/1128 + if lib_version > (19, 7): + lib.MediaInfo_Option(handle, "Reset", "") # Delete the handle lib.MediaInfo_Close(handle) lib.MediaInfo_Delete(handle) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/pymediainfo.egg-info/PKG-INFO new/pymediainfo-4.1/pymediainfo.egg-info/PKG-INFO --- old/pymediainfo-4.0/pymediainfo.egg-info/PKG-INFO 2019-04-04 17:46:38.000000000 +0200 +++ new/pymediainfo-4.1/pymediainfo.egg-info/PKG-INFO 2019-09-18 14:58:02.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymediainfo -Version: 4.0 +Version: 4.1 Summary: A Python wrapper for the mediainfo library. Home-page: https://github.com/sbraz/pymediainfo Author: Louis Sautier diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/setup.cfg new/pymediainfo-4.1/setup.cfg --- old/pymediainfo-4.0/setup.cfg 2019-04-04 17:46:38.000000000 +0200 +++ new/pymediainfo-4.1/setup.cfg 2019-09-18 14:58:03.000000000 +0200 @@ -13,7 +13,7 @@ test = pytest [tool:pytest] -addopts = -vv +addopts = -vv -r a [bdist_wheel] universal = 1 Binary files old/pymediainfo-4.0/tests/data/sample.mkv and new/pymediainfo-4.1/tests/data/sample.mkv differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-4.0/tests/test_pymediainfo.py new/pymediainfo-4.1/tests/test_pymediainfo.py --- old/pymediainfo-4.0/tests/test_pymediainfo.py 2019-04-04 17:46:33.000000000 +0200 +++ new/pymediainfo-4.1/tests/test_pymediainfo.py 2019-09-18 14:57:58.000000000 +0200 @@ -120,16 +120,26 @@ class MediaInfoCoverDataTest(unittest.TestCase): def setUp(self): - self.mi = MediaInfo.parse( + self.cover_mi = MediaInfo.parse( os.path.join(data_dir, "sample_with_cover.mp3"), cover_data=True ) + self.no_cover_mi = MediaInfo.parse( + os.path.join(data_dir, "sample_with_cover.mp3") + ) def test_parse_cover_data(self): self.assertEqual( - self.mi.tracks[0].cover_data, + self.cover_mi.tracks[0].cover_data, "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACXBIWXMAAAAAAA" "AAAQCEeRdzAAAADUlEQVR4nGP4x8DwHwAE/AH+QSRCQgAAAABJRU5ErkJggg==" ) + def test_parse_no_cover_data(self): + _, lib_version_str, lib_version = MediaInfo._get_library() + if lib_version < (18, 3): + pytest.skip("Cover_Data option not supported by this library version " + "(v{} detected, v18.03 required)".format(lib_version_str) + ) + self.assertEqual(self.no_cover_mi.tracks[0].cover_data, None) class MediaInfoTrackParsingTest(unittest.TestCase): def test_track_parsing(self): @@ -181,3 +191,24 @@ def test_legacy_stream_display(self): self.assertEqual(self.mi.tracks[1].channel_s, 2) self.assertEqual(self.legacy_mi.tracks[1].channel_s, "2 / 1 / 1") + +class MediaInfoOptionsTest(unittest.TestCase): + def setUp(self): + _, lib_version_str, lib_version = MediaInfo._get_library() + if lib_version < (19, 9): + pytest.skip("Reset option not supported by this library version " + "(v{} detected, v19.09 required)".format(lib_version_str) + ) + self.raw_language_mi = MediaInfo.parse( + os.path.join(data_dir, "sample.mkv"), + mediainfo_options={"Language": "raw"}, + ) + # Parsing the file without the custom options afterwards + # allows us to check that the "Reset" option worked + # https://github.com/MediaArea/MediaInfoLib/issues/1128 + self.normal_mi = MediaInfo.parse( + os.path.join(data_dir, "sample.mkv"), + ) + def test_mediainfo_options(self): + self.assertEqual(self.normal_mi.tracks[1].other_language[0], "English") + self.assertEqual(self.raw_language_mi.tracks[1].language, "en")
