From 60227c48f5873fb827e37a99e171196f8f35eddb Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Tue, 16 May 2023 14:17:20 +0200 Subject: [PATCH 1/5] Add m3u per session feature to importfeeds plugin --- beetsplug/importfeeds.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/beetsplug/importfeeds.py b/beetsplug/importfeeds.py index ad6d84159..8d6d0c2b5 100644 --- a/beetsplug/importfeeds.py +++ b/beetsplug/importfeeds.py @@ -28,10 +28,21 @@ from beets import config M3U_DEFAULT_NAME = 'imported.m3u' +def _build_m3u_session_filename(basename): + """Builds unique m3u filename by putting current date between given + basename and file ending.""" + date = datetime.datetime.now().strftime("%Y%m%d_%Hh%M") + basename = re.sub(r"(\.m3u|\.M3U)", '', basename) + path = normpath(os.path.join( + config['importfeeds']['dir'].as_filename(), + basename + '_' + date + '.m3u' + )) + return path + + def _build_m3u_filename(basename): """Builds unique m3u filename by appending given basename to current date.""" - basename = re.sub(r"[\s,/\\'\"]", '_', basename) date = datetime.datetime.now().strftime("%Y%m%d_%Hh%M") path = normpath(os.path.join( @@ -70,6 +81,7 @@ class ImportFeedsPlugin(BeetsPlugin): self.register_listener('album_imported', self.album_imported) self.register_listener('item_imported', self.item_imported) + self.register_listener('import_begin', self.import_begin) def get_feeds_dir(self): feeds_dir = self.config['dir'].get() @@ -105,6 +117,10 @@ class ImportFeedsPlugin(BeetsPlugin): m3u_path = os.path.join(feedsdir, m3u_basename) _write_m3u(m3u_path, paths) + if 'm3u_session' in formats: + m3u_path = os.path.join(feedsdir, self.m3u_session) + _write_m3u(m3u_path, paths) + if 'm3u_multi' in formats: m3u_path = _build_m3u_filename(basename) _write_m3u(m3u_path, paths) @@ -125,3 +141,9 @@ class ImportFeedsPlugin(BeetsPlugin): def item_imported(self, lib, item): self._record_items(lib, item.title, [item]) + + def import_begin(self, session): + formats = self.config['formats'].as_str_seq() + if 'm3u_session' in formats: + self.m3u_session = _build_m3u_session_filename( + self.config['m3u_name'].as_str()) From c481670f1b51cd48c95f75400d7c43757d460a49 Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Tue, 25 Jul 2023 09:43:02 +0200 Subject: [PATCH 2/5] Add docs for new importfeeds list format in #4863 --- docs/plugins/importfeeds.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/plugins/importfeeds.rst b/docs/plugins/importfeeds.rst index 56dcce549..5f108db86 100644 --- a/docs/plugins/importfeeds.rst +++ b/docs/plugins/importfeeds.rst @@ -22,6 +22,9 @@ configuration file. The available options are: - **m3u**: Catalog the imports in a centralized playlist. - **m3u_multi**: Create a new playlist for each import (uniquely named by appending the date and track/album name). + - **m3u_session**: Create a new playlist for each import session. The file + is named as ``m3u_name`` appending the date and time the import session + was started. - **link**: Create a symlink for each imported item. This is the recommended setting to propagate beets imports to your iTunes library: just drag and drop the ``dir`` folder on the iTunes dock icon. @@ -29,7 +32,8 @@ configuration file. The available options are: file paths to the terminal. Default: None. -- **m3u_name**: Playlist name used by the ``m3u`` format. +- **m3u_name**: Playlist name used by the ``m3u`` format and as a prefix used + by the ``m3u_session`` format. Default: ``imported.m3u``. - **relative_to**: Make the m3u paths relative to another folder than where the playlist is being written. If you're using importfeeds From 411350cf2a032f955e226cf6ef349175a72205c6 Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Thu, 27 Jul 2023 07:56:50 +0200 Subject: [PATCH 3/5] Add changelog for #4863 --- docs/changelog.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 893b1edf2..8688669e5 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -104,6 +104,9 @@ New features: * :doc:`plugins/subsonicupdate`: Updates are now triggered whenever either the beets database is changed or a smart playlist is created/updated. :bug: `4862` +* :doc:`plugins/importfeeds`: Add a new output format allowing to save a + playlist once per import session. + :bug: `4863` Bug fixes: From 546e1b8751dc01d1de549bcabb25650a32e3dcd5 Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Thu, 27 Jul 2023 07:34:49 +0200 Subject: [PATCH 4/5] Add test for #4863 importfeeds m3u_session feature --- test/test_importfeeds.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/test_importfeeds.py b/test/test_importfeeds.py index 828960527..49b475e15 100644 --- a/test/test_importfeeds.py +++ b/test/test_importfeeds.py @@ -3,6 +3,7 @@ import os.path import tempfile import shutil import unittest +import datetime from beets import config from beets.library import Item, Album, Library @@ -54,6 +55,23 @@ class ImportfeedsTestTest(unittest.TestCase): self.assertTrue(os.path.isdir(playlist_subdir)) self.assertTrue(os.path.isfile(playlist)) + def test_playlist_per_session(self): + config['importfeeds']['formats'] = 'm3u_session' + config['importfeeds']['m3u_name'] = 'imports.m3u' + album = Album(album='album/name', id=1) + item_path = os.path.join('path', 'to', 'item') + item = Item(title='song', album_id=1, path=item_path) + self.lib.add(album) + self.lib.add(item) + + self.importfeeds.import_begin(self) + self.importfeeds.album_imported(self.lib, album) + date = datetime.datetime.now().strftime("%Y%m%d_%Hh%M") + playlist = os.path.join(self.feeds_dir, 'imports_' + date + '.m3u') + self.assertTrue(os.path.isfile(playlist)) + with open(playlist) as playlist_contents: + self.assertIn(item_path, playlist_contents.read()) + def suite(): return unittest.TestLoader().loadTestsFromName(__name__) From 342421a36c4e902700680dc82fb18ad86f23b438 Mon Sep 17 00:00:00 2001 From: J0J0 Todos <2733783+JOJ0@users.noreply.github.com> Date: Thu, 27 Jul 2023 20:14:39 +0200 Subject: [PATCH 5/5] Update beetsplug/importfeeds.py Co-authored-by: Adrian Sampson --- beetsplug/importfeeds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beetsplug/importfeeds.py b/beetsplug/importfeeds.py index 8d6d0c2b5..66e678af8 100644 --- a/beetsplug/importfeeds.py +++ b/beetsplug/importfeeds.py @@ -35,7 +35,7 @@ def _build_m3u_session_filename(basename): basename = re.sub(r"(\.m3u|\.M3U)", '', basename) path = normpath(os.path.join( config['importfeeds']['dir'].as_filename(), - basename + '_' + date + '.m3u' + f'{basename}_{date}.m3u' )) return path