From 533559136e04bed7ce72077baf2fbf5e41705463 Mon Sep 17 00:00:00 2001 From: Andrew Rogl Date: Fri, 7 May 2021 22:04:46 +1000 Subject: [PATCH 1/4] Add 7z file support #3906 --- beets/importer.py | 6 ++++++ docs/changelog.rst | 4 ++++ setup.py | 1 + test/rsrc/archive.7z | Bin 0 -> 2395 bytes test/test_importer.py | 6 ++++++ 5 files changed, 17 insertions(+) create mode 100644 test/rsrc/archive.7z diff --git a/beets/importer.py b/beets/importer.py index b7bfdb156..38d2a4e62 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -1054,6 +1054,12 @@ class ArchiveImportTask(SentinelImportTask): pass else: cls._handlers.append((is_rarfile, RarFile)) + try: + from py7zr import is_7zfile, SevenZipFile + except ImportError: + pass + else: + cls._handlers.append((is_7zfile, SevenZipFile)) return cls._handlers diff --git a/docs/changelog.rst b/docs/changelog.rst index 6caed75c6..b215ae7b2 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -214,6 +214,10 @@ Other new things: ``check_on_import`` config option. * :doc:`/plugins/export`: big speedups when `--include-keys` option is used Thanks to :user:`ssssam`. +* Added 7z support via the `py7zr`_ library + Thanks to :user:`arogl`. :bug:`3906` + + .. _py7zr: https://github.com/miurahr/py7zr Fixes: diff --git a/setup.py b/setup.py index 8191d3888..84b391a78 100755 --- a/setup.py +++ b/setup.py @@ -122,6 +122,7 @@ setup( 'responses>=0.3.0', 'requests_oauthlib', 'reflink', + 'py7zr', ] + ( # Tests for the thumbnails plugin need pathlib on Python 2 too. ['pathlib'] if (sys.version_info < (3, 4, 0)) else [] diff --git a/test/rsrc/archive.7z b/test/rsrc/archive.7z new file mode 100644 index 0000000000000000000000000000000000000000..6a09fdf4b55e37f8466560276c8b09f6677b1732 GIT binary patch literal 2395 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 Date: Fri, 7 May 2021 22:30:14 +1000 Subject: [PATCH 2/4] fix up setup --- setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 84b391a78..8765d4b52 100755 --- a/setup.py +++ b/setup.py @@ -122,7 +122,6 @@ setup( 'responses>=0.3.0', 'requests_oauthlib', 'reflink', - 'py7zr', ] + ( # Tests for the thumbnails plugin need pathlib on Python 2 too. ['pathlib'] if (sys.version_info < (3, 4, 0)) else [] @@ -131,7 +130,9 @@ setup( ] + [ 'discogs-client' if (sys.version_info < (3, 0, 0)) else 'python3-discogs-client' - ], + ] + ( + ['py7zr'] if (sys.version_info > (3, 5, 0)) else [] + ), 'lint': [ 'flake8', 'flake8-coding', From 9ce93faa22cda8c5aba62dc655ead0c06857f215 Mon Sep 17 00:00:00 2001 From: Andrew Rogl Date: Fri, 7 May 2021 22:33:11 +1000 Subject: [PATCH 3/4] Flake8 setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8765d4b52..ca0dc819d 100755 --- a/setup.py +++ b/setup.py @@ -131,7 +131,7 @@ setup( 'discogs-client' if (sys.version_info < (3, 0, 0)) else 'python3-discogs-client' ] + ( - ['py7zr'] if (sys.version_info > (3, 5, 0)) else [] + ['py7zr'] if (sys.version_info > (3, 5, 0)) else [] ), 'lint': [ 'flake8', From cff4ed59bfedacf92960ac8b6fd969d0030d8d77 Mon Sep 17 00:00:00 2001 From: Andrew Rogl Date: Sat, 8 May 2021 15:33:58 +1000 Subject: [PATCH 4/4] Update documentation --- docs/changelog.rst | 2 +- docs/reference/cli.rst | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index b215ae7b2..c81173209 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -217,7 +217,7 @@ Other new things: * Added 7z support via the `py7zr`_ library Thanks to :user:`arogl`. :bug:`3906` - .. _py7zr: https://github.com/miurahr/py7zr + .. _py7zr: https://pypi.org/project/py7zr/ Fixes: diff --git a/docs/reference/cli.rst b/docs/reference/cli.rst index 5d2b834b7..f7b68c4a8 100644 --- a/docs/reference/cli.rst +++ b/docs/reference/cli.rst @@ -67,7 +67,7 @@ albums (the latter case is true of typical Artist/Album organizations and many people's "downloads" folders). The path can also be a single song or an archive. Beets supports `zip` and `tar` archives out of the box. To extract `rar` files, install the `rarfile`_ package and the -`unrar` command. +`unrar` command. To extract `7z` files, install the `py7zr`_ package. Optional command flags: @@ -152,6 +152,7 @@ Optional command flags: beet import --set genre="Alternative Rock" --set mood="emotional" .. _rarfile: https://pypi.python.org/pypi/rarfile/2.2 +.. _py7zr: https://pypi.org/project/py7zr/ .. only:: html