[utils] Support xattr as well as pyxattr

Closes #9054

There are two xattr packages in Python, pyxattr [1] and xattr [2]. They
have different APIs.

In old days pyxattr supports Linux only and xattr supports Linux, Mac,
FreeBSD and Solaris, and pyxattr supports Linux only. Recently pyxattr
adds support for Mac OS X. [3]

An old version of [2] is shipped with Mac OS X. However, some Linux
distributions have pyxattr only, for example PLD-Linux [4] and old Arch
Linux. [5] As a result, supporting both is the way to go.

[1] https://github.com/iustin/pyxattr
[2] https://github.com/xattr/xattr
[3] https://github.com/iustin/pyxattr/pull/9
[4] https://github.com/rg3/youtube-dl/issues/5498
[5] https://git.archlinux.org/svntogit/community.git/commit/?id=427c4c76401e386d865ccddea4fbfdc74df80492
    https://git.archlinux.org/svntogit/community.git/commit/?id=59b40da7b69622a6761d364a8b07909e9cccaa56
    python-xattr is added on 2016/06/29 while pyxattr is there for more
    than 6 years
This commit is contained in:
Yen Chi Hsuan 2016-10-01 20:13:04 +08:00
parent d54739a2e6
commit 53a7e3d287
No known key found for this signature in database
GPG key ID: 3FDDD575826C5C30
2 changed files with 21 additions and 12 deletions

View file

@ -1,5 +1,9 @@
version <unreleased> version <unreleased>
Core
+ Support pyxattr as well as python-xattr for --xattrs and
--xattr-set-filesize (#9054)
Extractors Extractors
* [dctp] Fix extraction (#10734) * [dctp] Fix extraction (#10734)
+ [leeco] Recognize more Le Sports URLs (#10794) + [leeco] Recognize more Le Sports URLs (#10794)

View file

@ -3161,6 +3161,7 @@ def write_xattr(path, key, value):
# try the pyxattr module... # try the pyxattr module...
import xattr import xattr
if hasattr(xattr, 'set'): # pyxattr
# Unicode arguments are not supported in python-pyxattr until # Unicode arguments are not supported in python-pyxattr until
# version 0.5.0 # version 0.5.0
# See https://github.com/rg3/youtube-dl/issues/5498 # See https://github.com/rg3/youtube-dl/issues/5498
@ -3173,8 +3174,12 @@ def write_xattr(path, key, value):
'Falling back to other xattr implementations' % ( 'Falling back to other xattr implementations' % (
pyxattr_required_version, xattr.__version__)) pyxattr_required_version, xattr.__version__))
setxattr = xattr.set
else: # xattr
setxattr = xattr.setxattr
try: try:
xattr.set(path, key, value) setxattr(path, key, value)
except EnvironmentError as e: except EnvironmentError as e:
raise XAttrMetadataError(e.errno, e.strerror) raise XAttrMetadataError(e.errno, e.strerror)