Hello community, here is the log from the commit of package python-pymediainfo for openSUSE:Factory checked in at 2017-11-12 18:10:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pymediainfo (Old) and /work/SRC/openSUSE:Factory/.python-pymediainfo.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pymediainfo" Sun Nov 12 18:10:19 2017 rev:2 rq:541007 version:2.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pymediainfo/python-pymediainfo.changes 2017-07-27 11:11:33.611268817 +0200 +++ /work/SRC/openSUSE:Factory/.python-pymediainfo.new/python-pymediainfo.changes 2017-11-12 18:10:22.167285391 +0100 @@ -1,0 +2,13 @@ +Sat Nov 11 23:21:26 UTC 2017 - aloi...@gmx.com + +- Update to version 2.2.0 + * Support MediaInfo v17.10 + * Make parse support non-standard library locations (#24) + * Make parse support pathlib objects (#40) + * Add PyPy and PyPy3 support + * Run tests with pytest instead of nose + +- Dropped python-pymediainfo-skip_URL_test.patch (skipping network + test from the command line now) + +------------------------------------------------------------------- Old: ---- pymediainfo-2.1.9.tar.gz python-pymediainfo-skip_URL_test.patch New: ---- pymediainfo-2.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pymediainfo.spec ++++++ --- /var/tmp/diff_new_pack.U4pFfp/_old 2017-11-12 18:10:23.163249158 +0100 +++ /var/tmp/diff_new_pack.U4pFfp/_new 2017-11-12 18:10:23.167249013 +0100 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-pymediainfo -Version: 2.1.9 +Version: 2.2.0 Release: 0 Summary: Python wrapper for the mediainfo library License: MIT @@ -26,9 +26,7 @@ Url: https://github.com/sbraz/pymediainfo Source0: https://files.pythonhosted.org/packages/source/p/pymediainfo/pymediainfo-%{version}.tar.gz Source99: %{name}-rpmlintrc -# PATCH-FIX-OPENSUSE python-pymediainfo-skip_URL_test.patch -Patch0: %{name}-skip_URL_test.patch -BuildRequires: %{python_module nose} +BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} BuildRequires: libmediainfo0 Requires: libmediainfo0 @@ -43,7 +41,6 @@ %prep %setup -q -n pymediainfo-%{version} -%patch0 -p1 rm -rf pymediainfo.egg-info %build @@ -55,7 +52,7 @@ %check export LANG=en_US.UTF-8 -%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} $python %{_bindir}/nosetests -v +%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} $python %{_bindir}/py.test -v -k 'not MediaInfoURLTest' %files %{python_files} %defattr(-,root,root,-) ++++++ pymediainfo-2.1.9.tar.gz -> pymediainfo-2.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/PKG-INFO new/pymediainfo-2.2.0/PKG-INFO --- old/pymediainfo-2.1.9/PKG-INFO 2017-03-21 23:51:58.000000000 +0100 +++ new/pymediainfo-2.2.0/PKG-INFO 2017-11-08 00:10:33.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymediainfo -Version: 2.1.9 +Version: 2.2.0 Summary: A Python wrapper for the mediainfo library. Home-page: https://github.com/sbraz/pymediainfo Author: Louis Sautier @@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/README.rst new/pymediainfo-2.2.0/README.rst --- old/pymediainfo-2.1.9/README.rst 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/README.rst 2017-11-08 00:10:07.000000000 +0100 @@ -7,11 +7,15 @@ .. image:: https://img.shields.io/pypi/pyversions/pymediainfo.svg :target: https://pypi.org/project/pymediainfo +.. image:: https://img.shields.io/pypi/implementation/pymediainfo.svg + :target: https://pypi.org/project/pymediainfo + .. image:: https://api.travis-ci.org/sbraz/pymediainfo.svg?branch=master :target: https://travis-ci.org/sbraz/pymediainfo This small package is a wrapper around the MediaInfo library. It works on Linux, Mac OS X and Windows. +It is tested on Python 2.6, 2.7, 3.4, 3.5, 3.6, PyPy and PyPy3. See https://pymediainfo.readthedocs.io/ for more information. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/docs/index.rst new/pymediainfo-2.2.0/docs/index.rst --- old/pymediainfo-2.1.9/docs/index.rst 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/docs/index.rst 2017-11-08 00:10:07.000000000 +0100 @@ -73,7 +73,7 @@ ======================= Please use the issue tracker in GitHub at https://github.com/sbraz/pymediainfo/issues -to report all feature requests or bug reports. Thanks! +to report all feature requests or bug reports. Thanks! Indices and tables diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/docs/pymediainfo.rst new/pymediainfo-2.2.0/docs/pymediainfo.rst --- old/pymediainfo-2.1.9/docs/pymediainfo.rst 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/docs/pymediainfo.rst 2017-11-08 00:10:07.000000000 +0100 @@ -7,4 +7,3 @@ .. automodule:: pymediainfo :members: :undoc-members: - :show-inheritance: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/pymediainfo/__init__.py new/pymediainfo-2.2.0/pymediainfo/__init__.py --- old/pymediainfo-2.1.9/pymediainfo/__init__.py 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/pymediainfo/__init__.py 2017-11-08 00:10:07.000000000 +0100 @@ -1,4 +1,5 @@ import os +import re import locale import json import sys @@ -6,6 +7,11 @@ import xml.etree.ElementTree as ET from ctypes import * +try: + import pathlib +except ImportError: + pathlib = None + if sys.version_info < (3,): import urlparse else: @@ -14,6 +20,30 @@ __version__ = get_distribution("pymediainfo").version class Track(object): + """ + An object associated with a media file track. + + Each :class:`Track` attribute corresponds to attributes parsed from MediaInfo's output. + All attributes are lower case. Attributes that are present several times such as Duration + yield a second attribute starting with `other_` which is a list of all alternative attribute values. + + When a non-existing attribute is accessed, `None` is returned. + + Example: + + >>> t = mi.tracks[0] + >>> t + <Track track_id='None', track_type='General'> + >>> t.duration + 3000 + >>> t.to_data()["other_duration"] + ['3 s 0 ms', '3 s 0 ms', '3 s 0 ms', + '00:00:03.000', '00:00:03.000'] + >>> type(t.non_existing) + NoneType + + All available attributes can be obtained by calling :func:`to_data`. + """ def __getattribute__(self, name): try: return object.__getattribute__(self, name) @@ -53,6 +83,19 @@ def __repr__(self): return("<Track track_id='{0}', track_type='{1}'>".format(self.track_id, self.track_type)) def to_data(self): + """ + Returns a dict representation of the track attributes. + + Example: + + >>> sorted(track.to_data().keys())[:3] + ['codec', 'codec_extensions_usually_used', 'codec_url'] + >>> t.to_data()["file_size"] + 5988 + + + :rtype: dict + """ data = {} for k, v in self.__dict__.items(): if k != 'xml_dom_fragment': @@ -61,19 +104,42 @@ class MediaInfo(object): + """ + An object containing information about a media file. + + + :class:`MediaInfo` objects can be created by directly calling code from + libmediainfo (in this case, the library must be present on the system): + + >>> pymediainfo.MediaInfo.parse("/path/to/file.mp4") + + Alternatively, objects may be created from MediaInfo's XML output. + XML output can be obtained using the `XML` output format on versions older than v17.10 + and the `OLDXML` format on newer versions. + + Using such an XML file, we can create a :class:`MediaInfo` object: + + >>> with open("output.xml") as f: + ... mi = pymediainfo.MediaInfo(f.read()) + + :param str xml: XML output obtained from MediaInfo + """ def __init__(self, xml): - self.xml_dom = MediaInfo.parse_xml_data_into_dom(xml) + self.xml_dom = MediaInfo._parse_xml_data_into_dom(xml) @staticmethod - def parse_xml_data_into_dom(xml_data): + def _parse_xml_data_into_dom(xml_data): try: return ET.fromstring(xml_data.encode("utf-8")) except: return None @staticmethod - def _get_library(): - if os.name in ("nt", "dos", "os2", "ce"): - return windll.MediaInfo + def _get_library(library_file=None): + if library_file is not None: + return CDLL(library_file) + elif os.name in ("nt", "dos", "os2", "ce"): + if library_file is None: + return windll.MediaInfo elif sys.platform == "darwin": try: return CDLL("libmediainfo.0.dylib") @@ -82,21 +148,41 @@ else: return CDLL("libmediainfo.so.0") @classmethod - def can_parse(cls): + def can_parse(cls, library_file=None): + """ + Checks whether media files can be analyzed using libmediainfo. + + :rtype: bool + """ try: - cls._get_library() + cls._get_library(library_file) return True except: return False @classmethod - def parse(cls, filename): - lib = cls._get_library() - url = urlparse.urlparse(filename) - # Test whether the filename is actually a URL - if url.scheme is None: - # Test file is readable - with open(filename, "rb"): - pass + def parse(cls, filename, library_file=None): + """ + Analyze a media file using libmediainfo. + If libmediainfo is located in a non-standard location, the `library_file` parameter can be used: + + >>> pymediainfo.MediaInfo.parse("tests/data/sample.mkv", + ... library_file="/path/to/libmediainfo.dylib") + + :param filename: path to the media file which will be analyzed. + :param str library_file: path to the libmediainfo library, this should only be used if the library cannot be auto-detected. + :type filename: str or pathlib.Path + :rtype: MediaInfo + """ + lib = cls._get_library(library_file) + if pathlib is not None and isinstance(filename, pathlib.PurePath): + filename = str(filename) + else: + url = urlparse.urlparse(filename) + # Test whether the filename is actually a URL + if url.scheme is None: + # Test whether the file is readable + with open(filename, "rb"): + pass # Define arguments and return types lib.MediaInfo_Inform.restype = c_wchar_p lib.MediaInfo_New.argtypes = [] @@ -111,6 +197,14 @@ lib.MediaInfo_Delete.restype = None lib.MediaInfo_Close.argtypes = [c_void_p] lib.MediaInfo_Close.restype = None + # Obtain the library version + lib_version = lib.MediaInfo_Option(None, "Info_Version", "") + lib_version = [int(_) for _ in re.search("^MediaInfoLib - v(\S+)", lib_version).group(1).split(".")] + # The XML option was renamed starting with version 17.10 + if lib_version >= [17, 10]: + xml_option = "OLDXML" + else: + xml_option = "XML" # Create a MediaInfo handle handle = lib.MediaInfo_New() lib.MediaInfo_Option(handle, "CharSet", "UTF-8") @@ -120,7 +214,7 @@ 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", "XML") + lib.MediaInfo_Option(None, "Inform", xml_option) lib.MediaInfo_Option(None, "Complete", "1") lib.MediaInfo_Open(handle, filename) xml = lib.MediaInfo_Inform(handle, 0) @@ -136,15 +230,36 @@ self._tracks.append(Track(xml_track)) @property def tracks(self): + """ + A list of :py:class:`Track` objects which the media file contains. + + For instance: + + >>> mi = pymediainfo.MediaInfo.parse("/path/to/file.mp4") + >>> for t in mi.tracks: + ... print(t) + <Track track_id='None', track_type='General'> + <Track track_id='1', track_type='Text'> + """ if not hasattr(self, "_tracks"): self._tracks = [] if len(self._tracks) == 0: self._populate_tracks() return self._tracks def to_data(self): + """ + Returns a dict representation of the object's :py:class:`Tracks <Track>`. + + :rtype: dict + """ data = {'tracks': []} for track in self.tracks: data['tracks'].append(track.to_data()) return data def to_json(self): + """ + Returns a json representation of the object's :py:class:`Tracks <Track>`. + + :rtype: str + """ return json.dumps(self.to_data()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/pymediainfo.egg-info/PKG-INFO new/pymediainfo-2.2.0/pymediainfo.egg-info/PKG-INFO --- old/pymediainfo-2.1.9/pymediainfo.egg-info/PKG-INFO 2017-03-21 23:51:58.000000000 +0100 +++ new/pymediainfo-2.2.0/pymediainfo.egg-info/PKG-INFO 2017-11-08 00:10:33.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: pymediainfo -Version: 2.1.9 +Version: 2.2.0 Summary: A Python wrapper for the mediainfo library. Home-page: https://github.com/sbraz/pymediainfo Author: Louis Sautier @@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/pymediainfo.egg-info/SOURCES.txt new/pymediainfo-2.2.0/pymediainfo.egg-info/SOURCES.txt --- old/pymediainfo-2.1.9/pymediainfo.egg-info/SOURCES.txt 2017-03-21 23:51:58.000000000 +0100 +++ new/pymediainfo-2.2.0/pymediainfo.egg-info/SOURCES.txt 2017-11-08 00:10:33.000000000 +0100 @@ -13,7 +13,7 @@ pymediainfo.egg-info/namespace_packages.txt pymediainfo.egg-info/not-zip-safe pymediainfo.egg-info/top_level.txt -tests/test.py +tests/test_pymediainfo.py tests/data/accentué.txt tests/data/invalid.xml tests/data/sample.mkv diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/setup.cfg new/pymediainfo-2.2.0/setup.cfg --- old/pymediainfo-2.1.9/setup.cfg 2017-03-21 23:51:58.000000000 +0100 +++ new/pymediainfo-2.2.0/setup.cfg 2017-11-08 00:10:33.000000000 +0100 @@ -9,8 +9,10 @@ [metadata] description-file = README.rst +[aliases] +test = pytest + [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/setup.py new/pymediainfo-2.2.0/setup.py --- old/pymediainfo-2.1.9/setup.py 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/setup.py 2017-11-08 00:10:07.000000000 +0100 @@ -2,7 +2,7 @@ setup( name='pymediainfo', - version='2.1.9', + version='2.2.0', author='Louis Sautier', author_email='sautier.lo...@gmail.com', url='https://github.com/sbraz/pymediainfo', @@ -12,8 +12,7 @@ include_package_data=True, zip_safe=False, license='MIT', - tests_require=["nose"], - test_suite="nose.collector", + tests_require=["pytest", "pytest-runner"], classifiers=[ "Development Status :: 5 - Production/Stable", "Programming Language :: Python :: 2.6", @@ -21,6 +20,8 @@ "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", "Operating System :: POSIX :: Linux", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/tests/test.py new/pymediainfo-2.2.0/tests/test.py --- old/pymediainfo-2.1.9/tests/test.py 2017-03-21 23:51:37.000000000 +0100 +++ new/pymediainfo-2.2.0/tests/test.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -import os -import sys -import unittest - -from pymediainfo import MediaInfo - -data_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") - -class MediaInfoTest(unittest.TestCase): - def setUp(self): - with open(os.path.join(data_dir, 'sample.xml'), 'r') as f: - self.xml_data = f.read() - self.mi = MediaInfo(self.xml_data) - def test_populate_tracks(self): - self.assertEqual(4, len(self.mi.tracks)) - def test_valid_video_track(self): - for track in self.mi.tracks: - if track.track_type == 'Video': - self.assertEqual('DV', track.codec) - self.assertEqual('Interlaced', track.scan_type) - break - def test_track_integer_attributes(self): - for track in self.mi.tracks: - if track.track_type == 'Audio': - self.assertTrue(isinstance(track.duration, int)) - self.assertTrue(isinstance(track.bit_rate, int)) - self.assertTrue(isinstance(track.sampling_rate, int)) - break - def test_track_other_attributes(self): - for track in self.mi.tracks: - if track.track_type == 'General': - self.assertEqual(5, len(track.other_file_size)) - self.assertEqual(4, len(track.other_duration)) - break - def test_load_mediainfo_from_string(self): - self.assertEqual(4, len(self.mi.tracks)) - def test_getting_attribute_that_doesnot_exist(self): - self.assertTrue(self.mi.tracks[0].does_not_exist is None) - -class MediaInfoInvalidXMLTest(unittest.TestCase): - def setUp(self): - with open(os.path.join(data_dir, 'invalid.xml'), 'r') as f: - self.xml_data = f.read() - def test_parse_invalid_xml(self): - mi = MediaInfo(MediaInfo.parse_xml_data_into_dom(self.xml_data)) - self.assertEqual(len(mi.tracks), 0) - -class MediaInfoLibraryTest(unittest.TestCase): - def setUp(self): - self.mi = MediaInfo.parse(os.path.join(data_dir, "sample.mp4")) - def test_can_parse_true(self): - self.assertTrue(MediaInfo.can_parse()) - def test_track_count(self): - self.assertEqual(len(self.mi.tracks), 3) - def test_track_types(self): - self.assertEqual(self.mi.tracks[1].track_type, "Video") - self.assertEqual(self.mi.tracks[2].track_type, "Audio") - def test_track_details(self): - self.assertEqual(self.mi.tracks[1].codec, "AVC") - self.assertEqual(self.mi.tracks[2].codec, "AAC LC") - self.assertEqual(self.mi.tracks[1].duration, 958) - self.assertEqual(self.mi.tracks[2].duration, 980) - -class MediaInfoUnicodeXMLTest(unittest.TestCase): - def setUp(self): - self.mi = MediaInfo.parse(os.path.join(data_dir, "sample.mkv")) - def test_parse_file_with_unicode_tags(self): - self.assertEqual( - self.mi.tracks[0].title, - "Dès Noël où un zéphyr haï me vêt de glaçons " - "würmiens je dîne d’exquis rôtis de bœuf au kir à " - "l’aÿ d’âge mûr & cætera !" - ) - -class MediaInfoUnicodeFileNameTest(unittest.TestCase): - def setUp(self): - self.mi = MediaInfo.parse(os.path.join(data_dir, "accentué.txt")) - def test_parse_unicode_file(self): - self.assertEqual(len(self.mi.tracks), 1) - -class MediaInfoURLTest(unittest.TestCase): - def setUp(self): - self.mi = MediaInfo.parse("https://github.com/sbraz/pymediainfo/blob/master/tests/data/sample.mkv?raw=true") - def test_parse_url(self): - self.assertEqual(len(self.mi.tracks), 2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pymediainfo-2.1.9/tests/test_pymediainfo.py new/pymediainfo-2.2.0/tests/test_pymediainfo.py --- old/pymediainfo-2.1.9/tests/test_pymediainfo.py 1970-01-01 01:00:00.000000000 +0100 +++ new/pymediainfo-2.2.0/tests/test_pymediainfo.py 2017-11-08 00:10:07.000000000 +0100 @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import os +import sys +import unittest + +import pytest + +from pymediainfo import MediaInfo + +data_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") + +class MediaInfoTest(unittest.TestCase): + def setUp(self): + with open(os.path.join(data_dir, 'sample.xml'), 'r') as f: + self.xml_data = f.read() + self.mi = MediaInfo(self.xml_data) + def test_populate_tracks(self): + self.assertEqual(4, len(self.mi.tracks)) + def test_valid_video_track(self): + for track in self.mi.tracks: + if track.track_type == 'Video': + self.assertEqual('DV', track.codec) + self.assertEqual('Interlaced', track.scan_type) + break + def test_track_integer_attributes(self): + for track in self.mi.tracks: + if track.track_type == 'Audio': + self.assertTrue(isinstance(track.duration, int)) + self.assertTrue(isinstance(track.bit_rate, int)) + self.assertTrue(isinstance(track.sampling_rate, int)) + break + def test_track_other_attributes(self): + for track in self.mi.tracks: + if track.track_type == 'General': + self.assertEqual(5, len(track.other_file_size)) + self.assertEqual(4, len(track.other_duration)) + break + def test_load_mediainfo_from_string(self): + self.assertEqual(4, len(self.mi.tracks)) + def test_getting_attribute_that_doesnot_exist(self): + self.assertTrue(self.mi.tracks[0].does_not_exist is None) + +class MediaInfoInvalidXMLTest(unittest.TestCase): + def setUp(self): + with open(os.path.join(data_dir, 'invalid.xml'), 'r') as f: + self.xml_data = f.read() + def test_parse_invalid_xml(self): + mi = MediaInfo(MediaInfo._parse_xml_data_into_dom(self.xml_data)) + self.assertEqual(len(mi.tracks), 0) + +class MediaInfoLibraryTest(unittest.TestCase): + def setUp(self): + self.mi = MediaInfo.parse(os.path.join(data_dir, "sample.mp4")) + def test_can_parse_true(self): + self.assertTrue(MediaInfo.can_parse()) + def test_track_count(self): + self.assertEqual(len(self.mi.tracks), 3) + def test_track_types(self): + self.assertEqual(self.mi.tracks[1].track_type, "Video") + self.assertEqual(self.mi.tracks[2].track_type, "Audio") + def test_track_details(self): + self.assertEqual(self.mi.tracks[1].codec, "AVC") + self.assertEqual(self.mi.tracks[2].codec, "AAC LC") + self.assertEqual(self.mi.tracks[1].duration, 958) + self.assertEqual(self.mi.tracks[2].duration, 980) + +class MediaInfoUnicodeXMLTest(unittest.TestCase): + def setUp(self): + self.mi = MediaInfo.parse(os.path.join(data_dir, "sample.mkv")) + def test_parse_file_with_unicode_tags(self): + self.assertEqual( + self.mi.tracks[0].title, + "Dès Noël où un zéphyr haï me vêt de glaçons " + "würmiens je dîne d’exquis rôtis de bœuf au kir à " + "l’aÿ d’âge mûr & cætera !" + ) + +class MediaInfoUnicodeFileNameTest(unittest.TestCase): + def setUp(self): + self.mi = MediaInfo.parse(os.path.join(data_dir, "accentué.txt")) + def test_parse_unicode_file(self): + self.assertEqual(len(self.mi.tracks), 1) + +class MediaInfoURLTest(unittest.TestCase): + def setUp(self): + self.mi = MediaInfo.parse("https://github.com/sbraz/pymediainfo/blob/master/tests/data/sample.mkv?raw=true") + def test_parse_url(self): + self.assertEqual(len(self.mi.tracks), 2) + +class MediaInfoPathlibTest(unittest.TestCase): + def setUp(self): + pathlib = pytest.importorskip("pathlib") + self.path = pathlib.Path(data_dir) / "sample.mp4" + def test_parse_pathlib_path(self): + mi = MediaInfo.parse(self.path) + self.assertEqual(len(mi.tracks), 3)