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 - [email protected]
+
+- 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='[email protected]',
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)