diff --git a/tubesync/sync/models.py b/tubesync/sync/models.py index 4f9de7f7..e23c91d5 100644 --- a/tubesync/sync/models.py +++ b/tubesync/sync/models.py @@ -514,10 +514,13 @@ class Source(models.Model): @property def type_directory_path(self): - if self.source_resolution == self.SOURCE_RESOLUTION_AUDIO: - return Path(settings.DOWNLOAD_AUDIO_DIR) / self.directory + if settings.SOURCE_DOWNLOAD_DIRECTORY_PREFIX: + if self.source_resolution == self.SOURCE_RESOLUTION_AUDIO: + return Path(settings.DOWNLOAD_AUDIO_DIR) / self.directory + else: + return Path(settings.DOWNLOAD_VIDEO_DIR) / self.directory else: - return Path(settings.DOWNLOAD_VIDEO_DIR) / self.directory + return Path(self.directory) def make_directory(self): return os.makedirs(self.directory_path, exist_ok=True) diff --git a/tubesync/sync/tests.py b/tubesync/sync/tests.py index 86a39366..6aa0ccb6 100644 --- a/tubesync/sync/tests.py +++ b/tubesync/sync/tests.py @@ -628,6 +628,25 @@ class FilepathTestCase(TestCase): ('no-fancy-stuff-title_test_720p-720x1280-opus' '-vp9-30fps-hdr.mkv')) + def test_directory_prefix(self): + # Confirm the setting exists and is valid + self.assertTrue(hasattr(settings, 'SOURCE_DOWNLOAD_DIRECTORY_PREFIX')) + self.assertTrue(isinstance(settings.SOURCE_DOWNLOAD_DIRECTORY_PREFIX, bool)) + # Test the default behavior for "True", forced "audio" or "video" parent directories for sources + settings.SOURCE_DOWNLOAD_DIRECTORY_PREFIX = True + self.source.source_resolution = Source.SOURCE_RESOLUTION_AUDIO + test_audio_prefix_path = Path(self.source.directory_path) + self.assertEqual(test_audio_prefix_path.parts[-2], 'audio') + self.assertEqual(test_audio_prefix_path.parts[-1], 'testdirectory') + self.source.source_resolution = Source.SOURCE_RESOLUTION_1080P + test_video_prefix_path = Path(self.source.directory_path) + self.assertEqual(test_video_prefix_path.parts[-2], 'video') + self.assertEqual(test_video_prefix_path.parts[-1], 'testdirectory') + # Test the default behavior for "False", no parent directories for sources + settings.SOURCE_DOWNLOAD_DIRECTORY_PREFIX = False + test_no_prefix_path = Path(self.source.directory_path) + self.assertEqual(test_no_prefix_path.parts[-1], 'testdirectory') + class MediaTestCase(TestCase): @@ -1661,7 +1680,7 @@ class FormatMatchingTestCase(TestCase): self.media.get_best_audio_format() def test_is_regex_match(self): - + self.media.metadata = all_test_metadata['boring'] self.media.save() expected_matches = { @@ -1689,7 +1708,9 @@ class FormatMatchingTestCase(TestCase): msg=f'Media title "{self.media.title}" checked against regex "{self.source.filter_text}" failed ' f'expected {expected_match_result}') + class TasksTestCase(TestCase): + def setUp(self): # Disable general logging for test case logging.disable(logging.CRITICAL) @@ -1716,31 +1737,3 @@ class TasksTestCase(TestCase): self.assertEqual(src1.media_source.all().count(), 3) self.assertEqual(src2.media_source.all().count(), 2) self.assertEqual(Media.objects.filter(pk=m22.pk).exists(), False) - -class TypeDirectoryPathTestCase(TestCase): - def setUp(self): - self.source = Source( - directory="test_directory", - source_resolution=Source.SOURCE_RESOLUTION_AUDIO, - ) - - def test_directory_prefix_default(self): - """ - Test that default directory prefix exist. - """ - os.environ['TUBESYNC_DIRECTORY_PREFIX'] = '' - self.assertEqual(self.source.type_directory_path, Path(settings.DOWNLOAD_AUDIO_DIR) / 'test_directory') - - def test_directory_prefix_true(self): - """ - Test that when TUBESYNC_DIRECTORY_PREFIX is set to true the directory prefix exist. - """ - os.environ['TUBESYNC_DIRECTORY_PREFIX'] = 'true' - self.assertEqual(self.source.type_directory_path, Path(settings.DOWNLOAD_AUDIO_DIR) / 'test_directory') - - def test_directory_prefix_false(self): - """ - Test that when TUBESYNC_DIRECTORY_PREFIX is set to false the directory prefix does not exist. - """ - os.environ['TUBESYNC_DIRECTORY_PREFIX'] = 'false' - self.assertEqual(self.source.type_directory_path, Path('.') / 'test_directory') \ No newline at end of file diff --git a/tubesync/tubesync/local_settings.py.container b/tubesync/tubesync/local_settings.py.container index 18b028b3..96a2e600 100644 --- a/tubesync/tubesync/local_settings.py.container +++ b/tubesync/tubesync/local_settings.py.container @@ -81,3 +81,6 @@ if BASICAUTH_USERNAME and BASICAUTH_PASSWORD: else: BASICAUTH_DISABLE = True BASICAUTH_USERS = {} + + +SOURCE_DOWNLOAD_DIRECTORY_PREFIX = os.getenv('TUBESYNC_DIRECTORY_PREFIX', 'True').strip().lower() diff --git a/tubesync/tubesync/settings.py b/tubesync/tubesync/settings.py index 7bb4b2a2..d08f2cdb 100644 --- a/tubesync/tubesync/settings.py +++ b/tubesync/tubesync/settings.py @@ -158,6 +158,14 @@ VIDEO_HEIGHT_CUTOFF = int(os.getenv("VIDEO_HEIGHT_CUTOFF", "240")) # Smallest r VIDEO_HEIGHT_IS_HD = 500 # Height in pixels to count as 'HD' + +# If True source directories are prefixed with their type (either 'video' or 'audio') +# e.g. /downloads/video/SomeSourceName +# If False, sources are placed directly in /downloads +# e.g. /downloads/SomeSourceName +SOURCE_DOWNLOAD_DIRECTORY_PREFIX = True + + YOUTUBE_DL_CACHEDIR = None YOUTUBE_DL_TEMPDIR = None YOUTUBE_DEFAULTS = {