class TestGetFiles(unittest.TestCase): """Test case for DownloadItem get_files method.""" def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"]) def test_get_files(self): path = os.path.join("/home", "user", "downloads") self.ditem.path = path self.ditem.filenames = ["file1", "file2"] self.ditem.extensions = [".mp4", ".m4a"] self.assertEqual(self.ditem.get_files(), [os.path.join(path, "file1" + ".mp4"), os.path.join(path, "file2" + ".m4a")]) def test_get_files_no_data(self): self.assertEqual(self.ditem.get_files(), [])
def test_clean_options(self): """External downloader options alway last options""" ditem = DownloadItem("url", ["-f", "flv"]) options = [ "--external-downloader", "ffmpeg", "--external-downloader-args", "-ss 70 -to 165", ] self.dlg = ClipDialog(cast("MainFrame", self.frame), ditem) self.dlg.download_item.options.extend(options) self.assertEqual(self.dlg.download_item.options, ["-f", "flv"] + options) self.dlg._clean_options() self.assertEqual(self.dlg.download_item.options, ["-f", "flv"])
def test_calc_post_proc_size(self): # REFACTOR Not an actual method # should transfer to TestUpdateStats ditem = DownloadItem("url", ["-f", "flv"]) ditem.update_stats({"filename": "file.f123", "extension": ".webm", "filesize": "10.00MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading", "path": "/home/user"}) ditem.update_stats({"filename": "file.f456", "extension": ".m4a", "filesize": "3.45MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading", "path": "/home/user"}) # Mimic youtube-dl post process behaviour ditem.update_stats({"filename": "file", "extension": ".webm", "percent": "100%", "speed": "", "eta": "", "status": "Post Processing"}) self.assertEqual(ditem.filesizes, [10485760.00, 3617587.20, 14103347.20]) self.assertEqual( ditem.progress_stats, {"filename": "file", "extension": ".webm", "filesize": "13.45MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Post Processing", "playlist_size": "", "playlist_index": ""} )
def test_set_stage(self): ditem = DownloadItem("url", ["-f", "flv"]) active_status = ["Pre Processing", "Downloading", "Post Processing"] complete_status = ["Finished", "Warning", "Already Downloaded"] error_status = ["Error", "Stopped", "Filesize Abort"] for status in active_status: ditem._set_stage(status) self.assertEqual(ditem.stage, "Active") for status in complete_status: ditem._set_stage(status) self.assertEqual(ditem.stage, "Completed") for status in error_status: ditem._set_stage(status) self.assertEqual(ditem.stage, "Error")
def test_clean_options_extra_args(self): """Clean options and extra args in the end""" ditem = DownloadItem("url", ["-f", "flv"]) options = [ "--external-downloader", "ffmpeg", "--external-downloader-args", "-ss 70 -to 165", "-R", "-keep-fragments", "-v", ] self.dlg = ClipDialog(cast("MainFrame", self.frame), ditem) self.dlg.download_item.options.extend(options) self.dlg._clean_options() self.assertEqual(self.dlg.download_item.options, ["-f", "flv", "-R", "-keep-fragments", "-v"])
def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"])
def test_equal_true(self): ditem1 = DownloadItem("url", ["-f", "flv"]) ditem2 = DownloadItem("url", ["-f", "flv"]) self.assertTrue(ditem1 == ditem2)
class TestReset(unittest.TestCase): """Test case for the DownloadItem reset method.""" def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"]) def test_reset_completed_stage(self): self.ditem._stage = "Completed" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file"] self.ditem.extensions = [".mp4"] self.ditem.filesizes = [123456.00] self.ditem.progress_stats = { "filename": "file", "extension": ".mp4", "filsize": "6.66MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Finished", "playlist_size": "", "playlist_index": "" } self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") self.assertEqual(self.ditem.path, "") self.assertEqual(self.ditem.filenames, []) self.assertEqual(self.ditem.extensions, []) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_reset_error_stage(self): self.ditem._stage = "Error" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file1", "file2", "file"] self.ditem.extensions = [".mp4", ".m4a", ".mp4"] self.ditem.filesizes = [1234.00, 3421.00, 4655.00] self.ditem.progress_stats = { "filename": "file", "extension": ".mp4", "filsize": "9.45MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Error", "playlist_size": "10", "playlist_index": "8" } self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") self.assertEqual(self.ditem.path, "") self.assertEqual(self.ditem.filenames, []) self.assertEqual(self.ditem.extensions, []) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_reset_paused_stage(self): self.ditem._stage = "Paused" # No need to change filanames, extension, etc # since everything in pause state has the default value self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") def test_reset_active_stage(self): self.ditem._stage = "Active" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file1"] self.ditem.extensions = [".mp4"] self.ditem.filesizes = [] self.ditem.progress_stats = { "filename": "file1", "extension": ".mp4", "filsize": "9.45MiB", "percent": "75.5%", "speed": "200.00KiB/s", "eta": "00:10", "status": "Downloading" } self.assertRaises(RuntimeError, self.ditem.reset)
class TestUpdateStats(unittest.TestCase): """Test case for DownloadItem update_stats method.""" def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"]) def test_update_stats(self): path = os.path.join("/home", "user") # 1st playlist item self.ditem.update_stats({"filename": "somefilename.f1", "extension": ".mp4", "filesize": "9.45MiB", "percent": "2.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "path": path, "playlist_size": "10", "playlist_index": "1"}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["somefilename.f1"]) self.assertEqual(self.ditem.extensions, [".mp4"]) # Do not update filesizes unless percentage is 100% # See https://github.com/MrS0m30n3/youtube-dl-gui/issues/162 self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "somefilename.f1", "extension": ".mp4", "filesize": "9.45MiB", "percent": "2.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "playlist_size": "10", "playlist_index": "1"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "9.45MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [9909043.20]) self.ditem.update_stats({"filename": "somefilename.f2", "extension": ".m4a", "filesize": "2.22MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:20", "status": "Downloading", "path": path}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["somefilename.f1", "somefilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [9909043.20]) self.assertEqual( self.ditem.progress_stats, {"filename": "somefilename.f2", "extension": ".m4a", "filesize": "2.22MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:20", "status": "Downloading", "playlist_size": "10", "playlist_index": "1"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "2.22MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [9909043.20, 2327838.72]) # Moving to the 2nd playlist item self.ditem.update_stats({"filename": "someotherfilename.f1", "extension": ".mp4", "filesize": "10.25MiB", "percent": "50.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "path": path, "playlist_size": "10", "playlist_index": "2"}) # We must reset filenames, extensions & filesizes lists when changing playlist index # else the filesizes for the post processed files will be wrong self.assertEqual(self.ditem.filenames, ["someotherfilename.f1"]) self.assertEqual(self.ditem.extensions, [".mp4"]) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f1", "extension": ".mp4", "filesize": "10.25MiB", "percent": "50.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "playlist_size": "10", "playlist_index": "2"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "10.25MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [10747904.0]) self.ditem.update_stats({"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:30", "status": "Downloading", "path": path}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["someotherfilename.f1", "someotherfilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [10747904.0]) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:30", "status": "Downloading", "playlist_size": "10", "playlist_index": "2"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "3.33MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [10747904.0, 3491758.08]) # Let's move to the 3rd playlist item # Here we mimic youtube-dl's "max downloads limit reached" # this line should not reset the filenames, extensions & filesizes lists # since we will lose the ability to play the last playlist item self.ditem.update_stats({"status": "Downloading", "playlist_size": "10", "playlist_index": "3"}) self.assertEqual(self.ditem.filenames, ["someotherfilename.f1", "someotherfilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [10747904.0, 3491758.08]) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Downloading", "playlist_size": "10", "playlist_index": "3"} ) def test_update_stats_invalid_input(self): self.assertRaises(AssertionError, self.ditem.update_stats, []) def test_update_stats_empty_strings(self): self.ditem.update_stats({"filename": "", "extension": "", "filesize": "", "percent": "", "speed": "", "eta": "", "status": "", "playlist_size": "", "playlist_index": ""}) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_update_stats_not_string(self): self.ditem.update_stats({"filename": None, "status": 1234, "eta": False}) self.assertEqual(self.ditem.progress_stats["filename"], "url") self.assertEqual(self.ditem.progress_stats["status"], "Queued") self.assertEqual(self.ditem.progress_stats["eta"], "-")
def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"])
class TestReset(unittest.TestCase): """Test case for the DownloadItem reset method.""" def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"]) def test_reset_completed_stage(self): self.ditem._stage = "Completed" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file"] self.ditem.extensions = [".mp4"] self.ditem.filesizes = [123456.00] self.ditem.progress_stats = { "filename": "file", "extension": ".mp4", "filsize": "6.66MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Finished", "playlist_size": "", "playlist_index": "" } self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") self.assertEqual(self.ditem.path, "") self.assertEqual(self.ditem.filenames, []) self.assertEqual(self.ditem.extensions, []) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_reset_error_stage(self): self.ditem._stage = "Error" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file1", "file2", "file"] self.ditem.extensions = [".mp4", ".m4a", ".mp4"] self.ditem.filesizes = [1234.00, 3421.00, 4655.00] self.ditem.progress_stats = { "filename": "file", "extension": ".mp4", "filsize": "9.45MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Error", "playlist_size": "10", "playlist_index": "8" } self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") self.assertEqual(self.ditem.path, "") self.assertEqual(self.ditem.filenames, []) self.assertEqual(self.ditem.extensions, []) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_reset_paused_stage(self): self.ditem._stage = "Paused" # No need to change filanames, extension, etc # since everything in pause state has the default value self.ditem.reset() self.assertEqual(self.ditem._stage, "Queued") def test_reset_active_stage(self): self.ditem._stage = "Active" self.ditem.path = os.path.join("/home", "user") self.ditem.filenames = ["file1"] self.ditem.extensions = [".mp4"] self.ditem.filesizes = [] self.ditem.progress_stats = { "filename": "file1", "extension": ".mp4", "filsize": "9.45MiB", "percent": "75.5%", "speed": "200.00KiB/s", "eta": "00:10", "status": "Downloading" } self.assertRaises(RuntimeError, self.ditem.reset)
class TestUpdateStats(unittest.TestCase): """Test case for DownloadItem update_stats method.""" def setUp(self): self.ditem = DownloadItem("url", ["-f", "flv"]) def test_update_stats(self): path = os.path.join("/home", "user") # 1st playlist item self.ditem.update_stats({"filename": "somefilename.f1", "extension": ".mp4", "filesize": "9.45MiB", "percent": "2.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "path": path, "playlist_size": "10", "playlist_index": "1"}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["somefilename.f1"]) self.assertEqual(self.ditem.extensions, [".mp4"]) # Do not update filesizes unless percentage is 100% # See https://github.com/MrS0m30n3/youtube-dl-gui/issues/162 self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "somefilename.f1", "extension": ".mp4", "filesize": "9.45MiB", "percent": "2.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "playlist_size": "10", "playlist_index": "1"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "9.45MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [9909043.20]) self.ditem.update_stats({"filename": "somefilename.f2", "extension": ".m4a", "filesize": "2.22MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:20", "status": "Downloading", "path": path}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["somefilename.f1", "somefilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [9909043.20]) self.assertEqual( self.ditem.progress_stats, {"filename": "somefilename.f2", "extension": ".m4a", "filesize": "2.22MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:20", "status": "Downloading", "playlist_size": "10", "playlist_index": "1"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "2.22MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [9909043.20, 2327838.72]) # Moving to the 2nd playlist item self.ditem.update_stats({"filename": "someotherfilename.f1", "extension": ".mp4", "filesize": "10.25MiB", "percent": "50.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "path": path, "playlist_size": "10", "playlist_index": "2"}) # We must reset filenames, extensions & filesizes lists when changing playlist index # else the filesizes for the post processed files will be wrong self.assertEqual(self.ditem.filenames, ["someotherfilename.f1"]) self.assertEqual(self.ditem.extensions, [".mp4"]) self.assertEqual(self.ditem.filesizes, []) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f1", "extension": ".mp4", "filesize": "10.25MiB", "percent": "50.0%", "speed": "200.00KiB/s", "eta": "00:38", "status": "Downloading", "playlist_size": "10", "playlist_index": "2"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "10.25MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [10747904.0]) self.ditem.update_stats({"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:30", "status": "Downloading", "path": path}) self.assertEqual(self.ditem.path, path) self.assertEqual(self.ditem.filenames, ["someotherfilename.f1", "someotherfilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [10747904.0]) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "33.0%", "speed": "200.00KiB/s", "eta": "00:30", "status": "Downloading", "playlist_size": "10", "playlist_index": "2"} ) # Since the percentage is 100% this should update the filesizes list self.ditem.update_stats({"filesize": "3.33MiB", "percent": "100%", "speed": "", "eta": "", "status": "Downloading"}) self.assertEqual(self.ditem.filesizes, [10747904.0, 3491758.08]) # Let's move to the 3rd playlist item # Here we mimic youtube-dl's "max downloads limit reached" # this line should not reset the filenames, extensions & filesizes lists # since we will lose the ability to play the last playlist item self.ditem.update_stats({"status": "Downloading", "playlist_size": "10", "playlist_index": "3"}) self.assertEqual(self.ditem.filenames, ["someotherfilename.f1", "someotherfilename.f2"]) self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"]) self.assertEqual(self.ditem.filesizes, [10747904.0, 3491758.08]) self.assertEqual( self.ditem.progress_stats, {"filename": "someotherfilename.f2", "extension": ".m4a", "filesize": "3.33MiB", "percent": "100%", "speed": "-", "eta": "-", "status": "Downloading", "playlist_size": "10", "playlist_index": "3"} ) def test_update_stats_invalid_input(self): self.assertRaises(AssertionError, self.ditem.update_stats, []) def test_update_stats_empty_strings(self): self.ditem.update_stats({"filename": "", "extension": "", "filesize": "", "percent": "", "speed": "", "eta": "", "status": "", "playlist_size": "", "playlist_index": ""}) self.assertEqual( self.ditem.progress_stats, {"filename": "url", "extension": "-", "filesize": "-", "percent": "0%", "speed": "-", "eta": "-", "status": "Queued", "playlist_size": "", "playlist_index": ""} ) def test_update_stats_not_string(self): self.ditem.update_stats({"filename": None, "status": 1234, "eta": False}) self.assertEqual(self.ditem.progress_stats["filename"], "url") self.assertEqual(self.ditem.progress_stats["status"], "Queued") self.assertEqual(self.ditem.progress_stats["eta"], "-")