|
|
|
|
@@ -1,393 +0,0 @@
|
|
|
|
|
From f2db5237e435e788fc810353df8756e23e38ddd6 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Alexandre Detiste <alexandre.detiste@gmail.com>
|
|
|
|
|
Date: Sat, 23 Sep 2023 16:59:35 +0200
|
|
|
|
|
Subject: [PATCH] remove usage of six & __future__
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
mediafile.py | 61 ++++++++++++++++++-------------------
|
|
|
|
|
pyproject.toml | 1 -
|
|
|
|
|
setup.cfg | 9 +-----
|
|
|
|
|
test/__init__.py | 2 --
|
|
|
|
|
test/_common.py | 2 --
|
|
|
|
|
test/test_mediafile.py | 11 +++----
|
|
|
|
|
test/test_mediafile_edge.py | 11 +++----
|
|
|
|
|
7 files changed, 38 insertions(+), 59 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/mediafile.py b/mediafile.py
|
|
|
|
|
index b0c80a0..5f488d7 100644
|
|
|
|
|
--- a/mediafile.py
|
|
|
|
|
+++ b/mediafile.py
|
|
|
|
|
@@ -33,8 +33,6 @@
|
|
|
|
|
data from the tags. In turn ``MediaField`` uses a number of
|
|
|
|
|
``StorageStyle`` strategies to handle format specific logic.
|
|
|
|
|
"""
|
|
|
|
|
-from __future__ import division, absolute_import, print_function
|
|
|
|
|
-
|
|
|
|
|
import mutagen
|
|
|
|
|
import mutagen.id3
|
|
|
|
|
import mutagen.mp3
|
|
|
|
|
@@ -54,7 +52,6 @@
|
|
|
|
|
import math
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
-import six
|
|
|
|
|
import struct
|
|
|
|
|
import traceback
|
|
|
|
|
|
|
|
|
|
@@ -136,8 +133,8 @@ def mutagen_call(action, filename, func, *args, **kwargs):
|
|
|
|
|
try:
|
|
|
|
|
return func(*args, **kwargs)
|
|
|
|
|
except mutagen.MutagenError as exc:
|
|
|
|
|
- log.debug(u'%s failed: %s', action, six.text_type(exc))
|
|
|
|
|
- raise UnreadableFileError(filename, six.text_type(exc))
|
|
|
|
|
+ log.debug(u'%s failed: %s', action, str(exc))
|
|
|
|
|
+ raise UnreadableFileError(filename, str(exc))
|
|
|
|
|
except UnreadableFileError:
|
|
|
|
|
# Reraise our errors without changes.
|
|
|
|
|
# Used in case of decorating functions (e.g. by `loadfile`).
|
|
|
|
|
@@ -202,8 +199,8 @@ def _safe_cast(out_type, val):
|
|
|
|
|
# Process any other type as a string.
|
|
|
|
|
if isinstance(val, bytes):
|
|
|
|
|
val = val.decode('utf-8', 'ignore')
|
|
|
|
|
- elif not isinstance(val, six.string_types):
|
|
|
|
|
- val = six.text_type(val)
|
|
|
|
|
+ elif not isinstance(val, str):
|
|
|
|
|
+ val = str(val)
|
|
|
|
|
# Get a number from the front of the string.
|
|
|
|
|
match = re.match(r'[\+-]?[0-9]+', val.strip())
|
|
|
|
|
return int(match.group(0)) if match else 0
|
|
|
|
|
@@ -215,13 +212,13 @@ def _safe_cast(out_type, val):
|
|
|
|
|
except ValueError:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
- elif out_type == six.text_type:
|
|
|
|
|
+ elif out_type == str:
|
|
|
|
|
if isinstance(val, bytes):
|
|
|
|
|
return val.decode('utf-8', 'ignore')
|
|
|
|
|
- elif isinstance(val, six.text_type):
|
|
|
|
|
+ elif isinstance(val, str):
|
|
|
|
|
return val
|
|
|
|
|
else:
|
|
|
|
|
- return six.text_type(val)
|
|
|
|
|
+ return str(val)
|
|
|
|
|
|
|
|
|
|
elif out_type == float:
|
|
|
|
|
if isinstance(val, int) or isinstance(val, float):
|
|
|
|
|
@@ -230,7 +227,7 @@ def _safe_cast(out_type, val):
|
|
|
|
|
if isinstance(val, bytes):
|
|
|
|
|
val = val.decode('utf-8', 'ignore')
|
|
|
|
|
else:
|
|
|
|
|
- val = six.text_type(val)
|
|
|
|
|
+ val = str(val)
|
|
|
|
|
match = re.match(r'[\+-]?([0-9]+\.?[0-9]*|[0-9]*\.[0-9]+)',
|
|
|
|
|
val.strip())
|
|
|
|
|
if match:
|
|
|
|
|
@@ -289,7 +286,7 @@ def _sc_decode(soundcheck):
|
|
|
|
|
"""
|
|
|
|
|
# We decode binary data. If one of the formats gives us a text
|
|
|
|
|
# string, interpret it as UTF-8.
|
|
|
|
|
- if isinstance(soundcheck, six.text_type):
|
|
|
|
|
+ if isinstance(soundcheck, str):
|
|
|
|
|
soundcheck = soundcheck.encode('utf-8')
|
|
|
|
|
|
|
|
|
|
# SoundCheck tags consist of 10 numbers, each represented by 8
|
|
|
|
|
@@ -437,7 +434,7 @@ class Image(object):
|
|
|
|
|
def __init__(self, data, desc=None, type=None):
|
|
|
|
|
assert isinstance(data, bytes)
|
|
|
|
|
if desc is not None:
|
|
|
|
|
- assert isinstance(desc, six.text_type)
|
|
|
|
|
+ assert isinstance(desc, str)
|
|
|
|
|
self.data = data
|
|
|
|
|
self.desc = desc
|
|
|
|
|
if isinstance(type, int):
|
|
|
|
|
@@ -495,7 +492,7 @@ class StorageStyle(object):
|
|
|
|
|
"""List of mutagen classes the StorageStyle can handle.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
- def __init__(self, key, as_type=six.text_type, suffix=None,
|
|
|
|
|
+ def __init__(self, key, as_type=str, suffix=None,
|
|
|
|
|
float_places=2, read_only=False):
|
|
|
|
|
"""Create a basic storage strategy. Parameters:
|
|
|
|
|
|
|
|
|
|
@@ -520,8 +517,8 @@ def __init__(self, key, as_type=six.text_type, suffix=None,
|
|
|
|
|
self.read_only = read_only
|
|
|
|
|
|
|
|
|
|
# Convert suffix to correct string type.
|
|
|
|
|
- if self.suffix and self.as_type is six.text_type \
|
|
|
|
|
- and not isinstance(self.suffix, six.text_type):
|
|
|
|
|
+ if self.suffix and self.as_type is str \
|
|
|
|
|
+ and not isinstance(self.suffix, str):
|
|
|
|
|
self.suffix = self.suffix.decode('utf-8')
|
|
|
|
|
|
|
|
|
|
# Getter.
|
|
|
|
|
@@ -544,7 +541,7 @@ def deserialize(self, mutagen_value):
|
|
|
|
|
"""Given a raw value stored on a Mutagen object, decode and
|
|
|
|
|
return the represented value.
|
|
|
|
|
"""
|
|
|
|
|
- if self.suffix and isinstance(mutagen_value, six.text_type) \
|
|
|
|
|
+ if self.suffix and isinstance(mutagen_value, str) \
|
|
|
|
|
and mutagen_value.endswith(self.suffix):
|
|
|
|
|
return mutagen_value[:-len(self.suffix)]
|
|
|
|
|
else:
|
|
|
|
|
@@ -566,17 +563,17 @@ def serialize(self, value):
|
|
|
|
|
"""Convert the external Python value to a type that is suitable for
|
|
|
|
|
storing in a Mutagen file object.
|
|
|
|
|
"""
|
|
|
|
|
- if isinstance(value, float) and self.as_type is six.text_type:
|
|
|
|
|
+ if isinstance(value, float) and self.as_type is str:
|
|
|
|
|
value = u'{0:.{1}f}'.format(value, self.float_places)
|
|
|
|
|
value = self.as_type(value)
|
|
|
|
|
- elif self.as_type is six.text_type:
|
|
|
|
|
+ elif self.as_type is str:
|
|
|
|
|
if isinstance(value, bool):
|
|
|
|
|
# Store bools as 1/0 instead of True/False.
|
|
|
|
|
- value = six.text_type(int(bool(value)))
|
|
|
|
|
+ value = str(int(bool(value)))
|
|
|
|
|
elif isinstance(value, bytes):
|
|
|
|
|
value = value.decode('utf-8', 'ignore')
|
|
|
|
|
else:
|
|
|
|
|
- value = six.text_type(value)
|
|
|
|
|
+ value = str(value)
|
|
|
|
|
else:
|
|
|
|
|
value = self.as_type(value)
|
|
|
|
|
|
|
|
|
|
@@ -702,7 +699,7 @@ class MP4StorageStyle(StorageStyle):
|
|
|
|
|
|
|
|
|
|
def serialize(self, value):
|
|
|
|
|
value = super(MP4StorageStyle, self).serialize(value)
|
|
|
|
|
- if self.key.startswith('----:') and isinstance(value, six.text_type):
|
|
|
|
|
+ if self.key.startswith('----:') and isinstance(value, str):
|
|
|
|
|
value = value.encode('utf-8')
|
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
@@ -881,7 +878,7 @@ def fetch(self, mutagen_file):
|
|
|
|
|
|
|
|
|
|
def store(self, mutagen_file, value):
|
|
|
|
|
# This field type stores text data as encoded data.
|
|
|
|
|
- assert isinstance(value, six.text_type)
|
|
|
|
|
+ assert isinstance(value, str)
|
|
|
|
|
value = value.encode('utf-8')
|
|
|
|
|
|
|
|
|
|
frames = mutagen_file.tags.getall(self.key)
|
|
|
|
|
@@ -905,7 +902,7 @@ class MP3DescStorageStyle(MP3StorageStyle):
|
|
|
|
|
"""
|
|
|
|
|
def __init__(self, desc=u'', key='TXXX', attr='text', multispec=True,
|
|
|
|
|
**kwargs):
|
|
|
|
|
- assert isinstance(desc, six.text_type)
|
|
|
|
|
+ assert isinstance(desc, str)
|
|
|
|
|
self.description = desc
|
|
|
|
|
self.attr = attr
|
|
|
|
|
self.multispec = multispec
|
|
|
|
|
@@ -994,7 +991,7 @@ def __init__(self, key, pack_pos=0, **kwargs):
|
|
|
|
|
def _fetch_unpacked(self, mutagen_file):
|
|
|
|
|
data = self.fetch(mutagen_file)
|
|
|
|
|
if data:
|
|
|
|
|
- items = six.text_type(data).split('/')
|
|
|
|
|
+ items = str(data).split('/')
|
|
|
|
|
else:
|
|
|
|
|
items = []
|
|
|
|
|
packing_length = 2
|
|
|
|
|
@@ -1010,7 +1007,7 @@ def set(self, mutagen_file, value):
|
|
|
|
|
items[0] = ''
|
|
|
|
|
if items[1] is None:
|
|
|
|
|
items.pop() # Do not store last value
|
|
|
|
|
- self.store(mutagen_file, '/'.join(map(six.text_type, items)))
|
|
|
|
|
+ self.store(mutagen_file, '/'.join(map(str, items)))
|
|
|
|
|
|
|
|
|
|
def delete(self, mutagen_file):
|
|
|
|
|
if self.pack_pos == 0:
|
|
|
|
|
@@ -1277,7 +1274,7 @@ def __init__(self, *styles, **kwargs):
|
|
|
|
|
getting this property.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
- self.out_type = kwargs.get('out_type', six.text_type)
|
|
|
|
|
+ self.out_type = kwargs.get('out_type', str)
|
|
|
|
|
self._styles = styles
|
|
|
|
|
|
|
|
|
|
def styles(self, mutagen_file):
|
|
|
|
|
@@ -1317,7 +1314,7 @@ def _none_value(self):
|
|
|
|
|
return 0.0
|
|
|
|
|
elif self.out_type == bool:
|
|
|
|
|
return False
|
|
|
|
|
- elif self.out_type == six.text_type:
|
|
|
|
|
+ elif self.out_type == str:
|
|
|
|
|
return u''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1400,9 +1397,9 @@ def _get_date_tuple(self, mediafile):
|
|
|
|
|
"""
|
|
|
|
|
# Get the underlying data and split on hyphens and slashes.
|
|
|
|
|
datestring = super(DateField, self).__get__(mediafile, None)
|
|
|
|
|
- if isinstance(datestring, six.string_types):
|
|
|
|
|
- datestring = re.sub(r'[Tt ].*$', '', six.text_type(datestring))
|
|
|
|
|
- items = re.split('[-/]', six.text_type(datestring))
|
|
|
|
|
+ if isinstance(datestring, str):
|
|
|
|
|
+ datestring = re.sub(r'[Tt ].*$', '', str(datestring))
|
|
|
|
|
+ items = re.split('[-/]', str(datestring))
|
|
|
|
|
else:
|
|
|
|
|
items = []
|
|
|
|
|
|
|
|
|
|
@@ -1439,7 +1436,7 @@ def _set_date_tuple(self, mediafile, year, month=None, day=None):
|
|
|
|
|
date.append(u'{0:02d}'.format(int(month)))
|
|
|
|
|
if month and day:
|
|
|
|
|
date.append(u'{0:02d}'.format(int(day)))
|
|
|
|
|
- date = map(six.text_type, date)
|
|
|
|
|
+ date = map(str, date)
|
|
|
|
|
super(DateField, self).__set__(mediafile, u'-'.join(date))
|
|
|
|
|
|
|
|
|
|
if hasattr(self, '_year_field'):
|
|
|
|
|
diff --git a/pyproject.toml b/pyproject.toml
|
|
|
|
|
index 3ce8c9d..f558885 100644
|
|
|
|
|
--- a/pyproject.toml
|
|
|
|
|
+++ b/pyproject.toml
|
|
|
|
|
@@ -9,7 +9,6 @@ author-email = "adrian@radbox.org"
|
|
|
|
|
home-page = "https://github.com/beetbox/mediafile"
|
|
|
|
|
description-file = "README.rst"
|
|
|
|
|
requires = [
|
|
|
|
|
- "six>=1.9",
|
|
|
|
|
"mutagen>=1.46",
|
|
|
|
|
]
|
|
|
|
|
requires-python = ">=3.7"
|
|
|
|
|
diff --git a/setup.cfg b/setup.cfg
|
|
|
|
|
index 32d3e06..98d931f 100644
|
|
|
|
|
--- a/setup.cfg
|
|
|
|
|
+++ b/setup.cfg
|
|
|
|
|
@@ -10,11 +10,4 @@ min-version=2.7
|
|
|
|
|
# - E221: multiple spaces before operator (used to align visually)
|
|
|
|
|
# - E731: do not assign a lambda expression, use a def
|
|
|
|
|
# - C901: function/method complexity
|
|
|
|
|
-# `flake8-future-import` errors we ignore:
|
|
|
|
|
-# - FI50: `__future__` import "division" present
|
|
|
|
|
-# - FI51: `__future__` import "absolute_import" present
|
|
|
|
|
-# - FI12: `__future__` import "with_statement" missing
|
|
|
|
|
-# - FI53: `__future__` import "print_function" present
|
|
|
|
|
-# - FI14: `__future__` import "unicode_literals" missing
|
|
|
|
|
-# - FI15: `__future__` import "generator_stop" missing
|
|
|
|
|
-ignore=C901,E241,E221,E731,FI50,FI51,FI12,FI53,FI14,FI15
|
|
|
|
|
+ignore=C901,E241,E221,E731
|
|
|
|
|
diff --git a/test/__init__.py b/test/__init__.py
|
|
|
|
|
index f7fd0e2..40a96af 100644
|
|
|
|
|
--- a/test/__init__.py
|
|
|
|
|
+++ b/test/__init__.py
|
|
|
|
|
@@ -1,3 +1 @@
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
-
|
|
|
|
|
-from __future__ import division, absolute_import, print_function
|
|
|
|
|
diff --git a/test/_common.py b/test/_common.py
|
|
|
|
|
index e29c54a..16d126d 100644
|
|
|
|
|
--- a/test/_common.py
|
|
|
|
|
+++ b/test/_common.py
|
|
|
|
|
@@ -14,8 +14,6 @@
|
|
|
|
|
# included in all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
|
|
"""Some common functionality for mediafile tests."""
|
|
|
|
|
-from __future__ import division, absolute_import, print_function
|
|
|
|
|
-
|
|
|
|
|
import os
|
|
|
|
|
import tempfile
|
|
|
|
|
import shutil
|
|
|
|
|
diff --git a/test/test_mediafile.py b/test/test_mediafile.py
|
|
|
|
|
index 8105983..957187a 100644
|
|
|
|
|
--- a/test/test_mediafile.py
|
|
|
|
|
+++ b/test/test_mediafile.py
|
|
|
|
|
@@ -16,14 +16,11 @@
|
|
|
|
|
"""Automatically-generated blanket testing for the MediaFile metadata
|
|
|
|
|
layer.
|
|
|
|
|
"""
|
|
|
|
|
-from __future__ import division, absolute_import, print_function
|
|
|
|
|
-
|
|
|
|
|
import os
|
|
|
|
|
import shutil
|
|
|
|
|
import datetime
|
|
|
|
|
import time
|
|
|
|
|
import unittest
|
|
|
|
|
-from six import assertCountEqual
|
|
|
|
|
|
|
|
|
|
from test import _common
|
|
|
|
|
from mediafile import MediaFile, Image, \
|
|
|
|
|
@@ -269,7 +266,7 @@ class GenreListTestMixin(object):
|
|
|
|
|
|
|
|
|
|
def test_read_genre_list(self):
|
|
|
|
|
mediafile = self._mediafile_fixture('full')
|
|
|
|
|
- assertCountEqual(self, mediafile.genres, ['the genre'])
|
|
|
|
|
+ self.assertCountEqual(mediafile.genres, ['the genre'])
|
|
|
|
|
|
|
|
|
|
def test_write_genre_list(self):
|
|
|
|
|
mediafile = self._mediafile_fixture('empty')
|
|
|
|
|
@@ -277,7 +274,7 @@ def test_write_genre_list(self):
|
|
|
|
|
mediafile.save()
|
|
|
|
|
|
|
|
|
|
mediafile = MediaFile(mediafile.filename)
|
|
|
|
|
- assertCountEqual(self, mediafile.genres, [u'one', u'two'])
|
|
|
|
|
+ self.assertCountEqual(mediafile.genres, [u'one', u'two'])
|
|
|
|
|
|
|
|
|
|
def test_write_genre_list_get_first(self):
|
|
|
|
|
mediafile = self._mediafile_fixture('empty')
|
|
|
|
|
@@ -294,7 +291,7 @@ def test_append_genre_list(self):
|
|
|
|
|
mediafile.save()
|
|
|
|
|
|
|
|
|
|
mediafile = MediaFile(mediafile.filename)
|
|
|
|
|
- assertCountEqual(self, mediafile.genres, [u'the genre', u'another'])
|
|
|
|
|
+ self.assertCountEqual(mediafile.genres, [u'the genre', u'another'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ReadWriteTestBase(ArtTestMixin, GenreListTestMixin,
|
|
|
|
|
@@ -1116,7 +1113,7 @@ def test_known_fields(self):
|
|
|
|
|
'albumtypes', 'catalognums', 'languages', 'artists_credit',
|
|
|
|
|
'artists_sort', 'albumartists_credit', 'albumartists_sort')
|
|
|
|
|
)
|
|
|
|
|
- assertCountEqual(self, MediaFile.fields(), fields)
|
|
|
|
|
+ self.assertCountEqual(MediaFile.fields(), fields)
|
|
|
|
|
|
|
|
|
|
def test_fields_in_readable_fields(self):
|
|
|
|
|
readable = MediaFile.readable_fields()
|
|
|
|
|
diff --git a/test/test_mediafile_edge.py b/test/test_mediafile_edge.py
|
|
|
|
|
index 3119861..337c610 100644
|
|
|
|
|
--- a/test/test_mediafile_edge.py
|
|
|
|
|
+++ b/test/test_mediafile_edge.py
|
|
|
|
|
@@ -15,8 +15,6 @@
|
|
|
|
|
|
|
|
|
|
"""Specific, edge-case tests for the MediaFile metadata layer.
|
|
|
|
|
"""
|
|
|
|
|
-from __future__ import division, absolute_import, print_function
|
|
|
|
|
-
|
|
|
|
|
import os
|
|
|
|
|
import shutil
|
|
|
|
|
import unittest
|
|
|
|
|
@@ -25,7 +23,6 @@
|
|
|
|
|
from test import _common
|
|
|
|
|
|
|
|
|
|
import mediafile
|
|
|
|
|
-import six
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_sc = mediafile._safe_cast
|
|
|
|
|
@@ -130,8 +127,8 @@ def test_safe_cast_negative_string_to_float(self):
|
|
|
|
|
self.assertAlmostEqual(_sc(float, u'-1.234'), -1.234)
|
|
|
|
|
|
|
|
|
|
def test_safe_cast_special_chars_to_unicode(self):
|
|
|
|
|
- us = _sc(six.text_type, 'caf\xc3\xa9')
|
|
|
|
|
- self.assertTrue(isinstance(us, six.text_type))
|
|
|
|
|
+ us = _sc(str, 'caf\xc3\xa9')
|
|
|
|
|
+ self.assertTrue(isinstance(us, str))
|
|
|
|
|
self.assertTrue(us.startswith(u'caf'))
|
|
|
|
|
|
|
|
|
|
def test_safe_cast_float_with_no_numbers(self):
|
|
|
|
|
@@ -359,7 +356,7 @@ def test_v24_year_tag(self):
|
|
|
|
|
mf.year = 2013
|
|
|
|
|
mf.save()
|
|
|
|
|
frame = mf.mgfile['TDRC']
|
|
|
|
|
- self.assertTrue('2013' in six.text_type(frame))
|
|
|
|
|
+ self.assertTrue('2013' in str(frame))
|
|
|
|
|
self.assertTrue('TYER' not in mf.mgfile)
|
|
|
|
|
finally:
|
|
|
|
|
self._delete_test()
|
|
|
|
|
@@ -370,7 +367,7 @@ def test_v23_year_tag(self):
|
|
|
|
|
mf.year = 2013
|
|
|
|
|
mf.save()
|
|
|
|
|
frame = mf.mgfile['TYER']
|
|
|
|
|
- self.assertTrue('2013' in six.text_type(frame))
|
|
|
|
|
+ self.assertTrue('2013' in str(frame))
|
|
|
|
|
self.assertTrue('TDRC' not in mf.mgfile)
|
|
|
|
|
finally:
|
|
|
|
|
self._delete_test()
|